【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG

在这里插入图片描述

DRV8833电机驱动模块电原理图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Arduino DRV8833电机控制器库
https://codeload.github.com/TheArduinist/DRV8833/zip/master

https://cfhcable.dl.sourceforge. … ler_library-0.2.zip

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG

Arduino实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
*/#define mode_pin  10
#define IN1_PIN 9
#define IN4_PIN 6
#define IN3_PIN 5
#define IN4_PIN 3void setup() {pinMode(IN1_PIN, OUTPUT);pinMode(IN4_PIN, OUTPUT);pinMode(IN3_PIN, OUTPUT);pinMode(IN4_PIN, OUTPUT);pinMode(mode_pin, INPUT);digitalWrite(IN1_PIN, LOW);digitalWrite(IN4_PIN, LOW);digitalWrite(IN3_PIN, LOW);digitalWrite(IN4_PIN, LOW);
}void loop() {int sensorValue = analogRead(A0);int sensorValue1 = analogRead(A1);if (digitalRead(mode_pin) == LOW){digitalWrite(IN3_PIN, LOW);analogWrite(IN4_PIN, sensorValue);digitalWrite(IN1_PIN, LOW);analogWrite(IN4_PIN, sensorValue1);}if (digitalRead(mode_pin) == HIGH){digitalWrite(IN4_PIN, LOW);analogWrite(IN3_PIN, sensorValue);digitalWrite(IN4_PIN, LOW);analogWrite(IN1_PIN, sensorValue1);}        
}

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG

Arduino实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
*/// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5void setup(void){// Set all the motor control inputs to OUTPUTpinMode(MOT_A1_PIN, OUTPUT);pinMode(MOT_A2_PIN, OUTPUT);pinMode(MOT_B1_PIN, OUTPUT);pinMode(MOT_B2_PIN, OUTPUT);// Turn off motors - Initial statedigitalWrite(MOT_A1_PIN, LOW);digitalWrite(MOT_A2_PIN, LOW);digitalWrite(MOT_B1_PIN, LOW);digitalWrite(MOT_B2_PIN, LOW);// Initialize the serial UART at 9600 baudSerial.begin(9600);
}void loop(void){// Generate a fixed motion sequence to demonstrate the motor modes.// Ramp speed up.for (int i = 0; i < 11; i++) {spin_and_wait(25*i, 25*i, 500);}// Full speed forward.spin_and_wait(255,255,2000);// Ramp speed into full reverse.for (int i = 0; i < 21 ; i++) {spin_and_wait(255 - 25*i, 255 - 25*i, 500);}// Full speed reverse.spin_and_wait(-255,-255,2000);// Stop.spin_and_wait(0,0,2000);// Full speed, forward, turn, reverse, and turn for a two-wheeled base.spin_and_wait(255, 255, 2000);spin_and_wait(0, 0, 1000);spin_and_wait(-255, 255, 2000);spin_and_wait(0, 0, 1000);spin_and_wait(-255, -255, 2000);spin_and_wait(0, 0, 1000);spin_and_wait(255, -255, 2000);spin_and_wait(0, 0, 1000);
}/// Set the current on a motor channel using PWM and directional logic.
///
/// \param pwm    PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN  pin number xIN1 for the given channel
/// \param IN2_PIN  pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{if (pwm < 0) {  // reverse speedsanalogWrite(IN1_PIN, -pwm);digitalWrite(IN2_PIN, LOW);} else { // stop or forwarddigitalWrite(IN1_PIN, LOW);analogWrite(IN2_PIN, pwm);}
}/// Set the current on both motors.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);// Print a status message to the console.Serial.print("Set motor A PWM = ");Serial.print(pwm_A);Serial.print(" motor B PWM = ");Serial.println(pwm_B);
}/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{set_motor_currents(pwm_A, pwm_B);delay(duration);
}

代码说明:
Arduino代码相当简单。它不需要任何库即可工作。草图首先声明连接到 DRV8833 控制引脚的 Arduino 引脚。

// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5

代码的设置部分初始化硬件。它将所有电机控制引脚配置为数字输出,并将其设置为低电平,以最初禁用两个电机。然后,它以 9600 的波特率初始化串行通信。

void setup(void){// Set all the motor control inputs to OUTPUTpinMode(MOT_A1_PIN, OUTPUT);pinMode(MOT_A2_PIN, OUTPUT);pinMode(MOT_B1_PIN, OUTPUT);pinMode(MOT_B2_PIN, OUTPUT);// Turn off motors - Initial statedigitalWrite(MOT_A1_PIN, LOW);digitalWrite(MOT_A2_PIN, LOW);digitalWrite(MOT_B1_PIN, LOW);digitalWrite(MOT_B2_PIN, LOW);// Initialize the serial UART at 9600 baudSerial.begin(9600);
}

代码的循环部分生成一个固定的运动序列来演示电机模式。

它首先逐渐增加电机的速度,然后进入全速,再次减速并反转方向到全速,最后停止。

// Ramp speed up.
for (int i = 0; i < 11; i++) {spin_and_wait(25*i, 25*i, 500);
}
// Full speed forward.
spin_and_wait(255,255,2000);// Ramp speed into full reverse.
for (int i = 0; i < 21 ; i++) {spin_and_wait(255 - 25*i, 255 - 25*i, 500);
}// Full speed reverse.
spin_and_wait(-255,-255,2000);// Stop.
spin_and_wait(0,0,2000);

停止后,它演示了两轮机器人底座的转弯操作,其中一个轮子向前移动,另一个轮子向后移动,导致机器人转动。在演示了所有这些动作之后,循环重复。

// Full speed, forward, turn, reverse, and turn for a two-wheeled base.
spin_and_wait(255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, -255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(255, -255, 2000);
spin_and_wait(0, 0, 1000);

此草图中使用了三个用户定义的函数:

set_motor_pwm()set_motor_currents()spin_and_wait()

该功能使用 PWM 和方向逻辑设置电机通道上的电流。如果该值为负,则电机沿一个方向旋转。如果值为 0 或正,则电机停止或向另一个方向旋转。

set_motor_pwm()pwmpwm
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{if (pwm < 0) {  // reverse speedsanalogWrite(IN1_PIN, -pwm);digitalWrite(IN2_PIN, LOW);} else { // stop or forwarddigitalWrite(IN1_PIN, LOW);analogWrite(IN2_PIN, pwm);}
}

该函数使用前面的函数来设置两个电机上的电流。它将每个电机的当前PWM值打印到串行监视器。

set_motor_currents()
void set_motor_currents(int pwm_A, int pwm_B)
{set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);// Print a status message to the console.Serial.print("Set motor A PWM = ");Serial.print(pwm_A);Serial.print(" motor B PWM = ");Serial.println(pwm_B);
}

该函数设置速度并等待指定的时间量,然后再移动到下一个命令。它使用该函数为两个电机设置PWM值,然后等待指定的毫秒。

spin_and_wait()set_motor_currents()duration
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{set_motor_currents(pwm_A, pwm_B);delay(duration);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python开发环境Spyder介绍

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 Spyder简介 Spyder (前身是 Pydee) 是一个强大的交互式 Python 语言开发环境&#xff0c; 提供高级的代码编辑、交互测试、调试等特性&#xff0c;支持包括 Windows、Linux 和 OS X 系统。 &#x1f447; &#x1f44…

Keil MDK环境下FreeModebus移植踩坑记录

Keil MDK环境下FreeModebus移植踩坑记录 文章目录 Keil MDK环境下FreeModebus移植踩坑记录armcc (arm compiler v5)环境实验一&#xff1a;实验二&#xff1a; armclang (arm compiler v6)环境实验一&#xff1a;实验二&#xff1a;实验三&#xff1a;实验四 总结 armcc (arm c…

探索OLED透明屏的参数及其在不同领域的应用

OLED透明屏作为一种创新的显示技术&#xff0c;具有高透明度、色彩鲜艳、观感独特等特点&#xff0c;正逐渐成为各个领域的热门选择。 为帮助您更好地了解和选择适合自己需求的OLED透明屏&#xff0c;尼伽便给您详细介绍一下OLED透明屏的参数&#xff0c;包括屏幕尺寸、分辨率…

JMeter压力测试记录

最近在学习redis解决高并发下导致数据库数据不准确的问题&#xff0c;使用到了一些工具&#xff0c;包括Jmeter&#xff0c;Redis-desktop-manager.。Jmeter用于模拟高并发情景&#xff0c;Redis-desktop-manager是redis数据库的GUI界面。 一、单元测试生成测试数据 1)插入20…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

【数据分享】2013-2020年全国10km分辨率的逐年SO2栅格数据(全国/分省/免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们分享了来自于Zendo平台的1km分辨率的PM2.5、PM10栅格数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff1a; 2000-2021年全国1km分辨率的逐日PM2.5栅格数据2000-2021年全国1km分辨率的逐月PM…

记一次ubuntu16误删libc.so.6操作的恢复过程

背景 操作系统&#xff1a;ubuntu16 glibc版本&#xff1a;2.23 修改原因&#xff1a; 经过一系列报错和手工构建之后&#xff0c;vulkansdk成功安装&#xff08;起码运行./vulkansdu成功&#xff09;&#xff0c;在进行./vulkaninfo进行验证时&#xff0c;报错&#xff1a…

【ChatGLM_02】LangChain知识库+Lora微调chatglm2-6b模型+提示词Prompt的使用原则

经验沉淀 1 知识库1.1 Langchain知识库的主要功能(1) 配置知识库(2) 文档数据测试(3) 知识库测试模式(4) 模型配置 2 微调2.1 微调模型的概念2.2 微调模型的方法和步骤(1) 基于ptuning v2 的微调(2) 基于lora的微调 3 提示词3.1 Prompts的定义及原则(1) Prompts是什么&#xf…

jsqlparser 安装和使用

jsqlparser是sql语句解析工具&#xff0c;可以解析sql并分析语法。 安装 <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.3</version> </dependency>使用 String s …

刷脸登录(人工智能)

刷脸登录 理解刷脸登录的需求 理解刷脸登录的开发流程实现刷脸登录功能 浅谈人工智能 人工智能的概述 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门…

无人机航测技术有何特点?主要应用在哪些方面?

无人机航测是航空摄影测量的一种&#xff0c;主要面向低空遥感领域&#xff0c;具有成本低、快速高效、适用范围广等特点。目前&#xff0c;无人机航测主要应用于地形测绘、城市数字化建设、工程建设等方面。 无人机航测技术的特点 1、作业成本低 传统的人工测量技术主要利用…

python中*与**的使用

文章目录 前言一、*与**在函数定义时二、*与**在函数调用时 前言 在python中*与**的使用要区分是在函数定义时还是在函数调用时。 一、*与**在函数定义时 def deng(*args,**kwargs):print(args)print(kwargs)deng(1,2,3,a 4,b 5)在函数定义时参数前面使用*&#xff0c;代表…