Arduino使用TB6612电机驱动 循迹小车(附代码) | 您所在的位置:网站首页 › arduino控制器模块介绍 › Arduino使用TB6612电机驱动 循迹小车(附代码) |
感谢无言侠师兄的指导 Arduino循迹小车教程一----材料篇_arduino小车-CSDN博客 Arduino循迹小车教程二----组装篇_arduino小车组装图解_无言侠的博客-CSDN博客 Arduino循迹小车教程三----测试小车篇_arduino黑线循迹小车程序_无言侠的博客-CSDN博客 Arduino循迹小车教程四----代码篇_arduino循迹小车代码_无言侠的博客-CSDN博客 二、(正文)两种电机驱动模块介绍在师兄教程的基础上,我们将L298N电机驱动模块更换为TB6612电机驱动模块。 这个时候有的同学就会问了,L298N和TB6612的区别在哪里呢? (上网CV的) L298N介绍 L298N,是一款接受高电压的电机驱动器,直流电机和步进电机都可以驱动。一片驱动芯片可同时控制两个直流减速电机做不同动作,在6V到46V的电压范围内,提供2安培的电流,并且具有过热自断和反馈检测功能。L298N可对电机进行直接控制,通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动,操作简单、稳定性好,可以满足直流电机的大电流驱动条件。 TB6612介绍 TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。相比于 L298N的热耗性和外围二极管续流电路,TB6612FNG无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。对于PWM信号输入频率范围,通常采用10KHz的频率,并通过改变占空比调节电机的速度。 三、TB6612电机驱动模块接线(看右下角,这图被多少博客用过都说不清了) 首先,我们先从供电线开始讲起: 1、三个GND只需要接一个就可以了,模块内部是共地的。 2、VM是给电机供电的引脚,最大输入15V。 3、VCC是给TB6612电机驱动模块供电的引脚,接5V。(TB6612电机驱动模块自身工作也需要供电) 4、STBY是TB6612电机驱动模块的启动脚,顾名思义,就是控制电机驱动模块的启动与否;当STBY接5V时,电机驱动模块正常工作,当STBY接低电平时,电机驱动模块处于休眠状态(不工作)。 接着就是信号线,因为TB6612电机驱动模块可以同时驱动两路电机,所以信号线都分成两组,功能相同,对应两路电机。(两路电机不一定是两个电机哦) 输出口: 1、AO1和AO2(BO1和BO2)直接连接电机的两个引脚给电机供电,提供驱动。 输入口: 1、PWMA(PWMB),这个引脚连接Arduino(或者其他单片机),接收Arduino传出的PWM信号,控制电机的转速。【例:analogWrite(PWMA,0~255);】 2、AIN1和AIN2(BIN1和BIN2),这两个引脚连接Arduino(或者其他单片机),接收Arduino传出的高低电平,控制电机的转动方向。 【直接将对应引脚置高或置低即可,例:digitalWrite(AIN1,HIGH);】 当AIN1为高电平,AIN2为低电平时,电机正向转动(假设一个方向而已,方向都是相对的);而当AIN1为低电平,AIN2为高电平时,电机反向转动(相对上一种情况而言);当AIN1和AIN2同时为低电平或高电平时,电机不转动。 这四种情况可归结成下面的真值表: 注意:这一切的前提都是STBY引脚接上了5V,不然的话TB6612处于休眠状态时,你在IN1和IN2怎么给高低电平,电机都是不会转动的。 归结下来PWMA(PWMB)作为输入控制电机的转速,AIN1和AIN2(BIN1和BIN2)作为输入控制电机的转动方向;AO1和AO2(BO1和BO2)作为输出给电机提供驱动。 四、编写代码换了电机驱动,引脚不一样了,我们的代码自然也就不一样了。 不想写了,看啥时候想写我就补上(鸽王本王) 于2024/4/9 17:03补更,代码功能仅仅只是理论上的基础寻迹,实际使用需要自己添加判断情况。 //右路电机PWMA引脚11,左路电机PWMB引脚10,必须是有PWM功能的端口 #define PWMA 11 #define PWMB 10 // 右边电机引脚6-7,左边电机引脚8-9 #define AIN1 8 #define AIN2 9 #define BIN1 7 #define BIN2 6 // 循迹引脚 2-3-4-5,从车头方向的最左边开始排序 #define track1 2 //Arduino的2号引脚连接在循迹模块的D0口,以下同理 #define track2 3 #define track3 4 #define track4 5 int Sensor[4] = {0, 0, 0, 0}; //初始化循迹的值 void setup() { Serial.begin(9600); //串口初始化 Track_Init(); //循迹模块初始化 Motor_Init(); //电机引脚初始化 } void loop() { Sensor_Read(); //不断地读取循迹模块的高低电平 xun_ji(); //循迹函数 Print(); //打印循迹的高低电平 } void Track_Init() { //循迹模块D0引脚初始化,设置为输入模式 pinMode(track1, INPUT); pinMode(track2, INPUT); pinMode(track3, INPUT); pinMode(track4, INPUT); } void Motor_Init() { //电机引脚初始化,设置为输出模式 pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(PWMB, OUTPUT); } void Sensor_Read() { Sensor [0] = digitalRead(track1); //检测到黑线为高电平(1),白线为低电平(0) Sensor [1] = digitalRead(track2); Sensor [2] = digitalRead(track3); Sensor [3] = digitalRead(track4); } void Motor_Toward(int toward)//控制电机的前行模式 { if(toward==0){//右轮停止,左轮停止 digitalWrite(AIN1,0); digitalWrite(AIN2,0); digitalWrite(BIN1,0); digitalWrite(BIN2,0); }else if(toward==1){//右轮正转,左轮正转 digitalWrite(AIN1,HIGH); digitalWrite(AIN2,LOW); digitalWrite(BIN1,HIGH); digitalWrite(BIN2,LOW); }else if(toward==2){//右轮反转,左轮反转 digitalWrite(AIN1,0); digitalWrite(AIN2,1); digitalWrite(BIN1,0); digitalWrite(BIN2,1); } } void Motor_Speed(int Right_Speed, int Left_Speed) { analogWrite(PWMA, Right_Speed); //控制电机的速度,不同的车模,代码执行效果不同! analogWrite(PWMB, Left_Speed); } void xun_ji() //小车的速度可根据实际地图进行调节 { if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 1 && Sensor [3] == 0){ //0-1-0-0 小右转 Motor_Toward(1);//设置前进模式 Motor_Speed(50, 150); //右轮速度 50 左轮速度 120 }else if (Sensor [0] == 0 && Sensor [1] == 1 && Sensor [2] == 0 && Sensor [3] == 0){ //0-0-1-0 小左转 Motor_Toward(1);//设置前进模式 Motor_Speed(120, 50); //右轮速度 120 左轮速度 50 }else //除了左右转,就只剩下直走 Motor_Toward(1);//设置前进模式 Motor_Speed(80, 80); } void Print() //在串口打印循迹的高低电平 { Serial.print(Sensor [0]); Serial.print("---"); Serial.print(Sensor [1]); Serial.print("---"); Serial.print(Sensor [2]); Serial.print("---"); Serial.println(Sensor [3]); } |
CopyRight 2018-2019 实验室设备网 版权所有 |