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]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值