Arduino使用TB6612电机驱动 循迹小车(附代码) 您所在的位置:网站首页 arduino控制器模块介绍 Arduino使用TB6612电机驱动 循迹小车(附代码)

Arduino使用TB6612电机驱动 循迹小车(附代码)

2024-07-02 13:53| 来源: 网络整理| 查看: 265

一、前置资料

          感谢无言侠师兄的指导

          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 实验室设备网 版权所有