Nemo

Nemo

路漫漫其修远兮,吾将上下而求索。

Nemo

Nemo

关注TA

路漫漫其修远兮,吾将上下而求索。

  •  普罗旺斯
  • 负责帅就完事了
  • 写了1,452,949字

最近回复

该文章投稿至Nemo社区   搞机综合  板块 复制链接


自动驾驶小车基础:树莓派接入TB6612电机驱动板控制直流电机

发布于 2021/07/01 22:34 208浏览 0回复 4,671

这几天工作上有一些变动,稍微有了那么几天空闲的时间可以用来折腾一些自己喜欢的东西。

一直对物联网方面的运用比较感兴趣。

好几年以前整了个树莓派用来玩,之前做过一阵子的微型服务器,后来开始玩星际蜗牛机子后,树莓派也开始闲置下来。

最近忽然心血来潮,想改一个自动驾驶的智能小车玩玩,把闲置许久的树莓派用起来做智能控制中心。

于是稍微研究了下,定了一些实施方案。


树莓派上预留了40个gpio扩展针脚,用这些扩展针脚可以做很多好玩的事情,当然包括驱动控制小车用的电机、接入摄像头、接入各种传感器等。


关于电机的驱动部分,选用了TB6612。淘宝上可以找到很多,并且价格都不是很贵。

这个电机驱动可以同时驱动两个电机,这里暂时只有直流电机,还不确定步进电机或是其他电机是否可以同时控制,理论上应该可行。

这里主要简单聊一下直流电机的简单接线接入方法。

小车这边,如果需要实现驾驶控制,第一印象需要用到两个电机,一个用来控制转向,一个用来控制前行及后退。TB6612正好是可以满足这个需求的。

可以看到,我手头上的这个TB6612总共有16个针脚,其中有3个GND接地针脚,6个电机输入控制针脚(PWMA、AIN2、AIN1、BIN1、BIN2、PWMB),4个电机输出控制针脚(AO1、AO2、BO2、B01),1个5V电源输入针脚(VCC),1个12V电源输入针脚(VM),一个没啥用途的针脚(NC针脚,内部没有与其他电路相连,其他板子可能会有一个STBY针脚)。

GND接口就没啥可说的了,有接入电源(5V或是12V)的地方,都需要把接地也接一下,按说哪一个都可以。

电机输入控制针脚,可以分为两组:PWMA、AIN2、AIN1用来控制一个电机A,BIN1、BIN2、PWMB用来控制另一个电机B。

电机输出控制针脚,也可以分为两组:AO1、AO2负责A电机的输出,BO2、BO1负责B电机的输出。

TB6612的电机驱动需要单独的供电,也就是需要用到12V的外接电源针脚,另一个5V的电源输入针脚对应树莓派的5V电源输出针脚即可。


大致思路如上,接下来按这个思路找到对应树莓派上的针脚,用杜邦线接起来即可。

简单整理下树莓派、TB6612、外接电源、电机的针脚连接情况:


上述图还有一处没有标记出来,就是树莓派的电源。

目前方案中,树莓派的供电与TB6612的供电是分开的,也就是需要两个电源。

接下来会做电源方面的方案。


连接各种线之后,插上树莓派和TB6612的电源线,启动并登录到树莓派后,在树莓派的目录中新建一个python文件。

网络上随便找了个树莓派控制直流电机的代码简单测试一下,保存内容后,直接用python命令调用执行即可。

如无意外,此时电机会相应有一些动作变化。

import  RPi.GPIO as GPIO
import time

P1_PWMA = 16
P1_AIN1 = 21
P1_AIN2 = 20

P1_PWMB = 26
P1_BIN1 = 13
P1_BIN2 = 19

P1 = [P1_PWMA, P1_AIN1, P1_AIN2,
P1_PWMB, P1_BIN1, P1_BIN2]

P2_PWMA = 10
P2_AIN1 = 11
P2_AIN2 = 9

P2_PWMB = 12
P2_BIN1 = 5
P2_BIN2 = 6

P2 = [P2_PWMA, P2_AIN1, P2_AIN2,
P2_PWMB, P2_BIN1, P2_BIN2]
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(P1,GPIO.OUT)
GPIO.setup(P2,GPIO.OUT)

L_Up_Motor= GPIO.PWM(P2_PWMA,10000)
L_Up_Motor.start(0)

L_Down_Motor = GPIO.PWM(P2_PWMB,10000)
L_Down_Motor.start(0)

R_Up_Motor= GPIO.PWM(P1_PWMA,10000)
R_Up_Motor.start(0)

R_Down_Motor = GPIO.PWM(P1_PWMB,10000)
R_Down_Motor.start(0)
#停止
def t_stop(t_time):
GPIO.output(P2_AIN2,0) #AIN2 AIN为左后轮
GPIO.output(P2_AIN1,0) #AIN1
GPIO.output(P2_BIN2,0) #BIN2 BIN为左前轮
GPIO.output(P2_BIN1,0) #BIN1
GPIO.output(P1_AIN2,0) #AIN2 AIN为右前轮
GPIO.output(P1_AIN1,0) #AIN1
GPIO.output(P1_BIN2,0) #BIN2 BIN为右后轮
GPIO.output(P1_BIN1,0) #BIN1

L_Up_Motor.ChangeDutyCycle(0)
L_Down_Motor.ChangeDutyCycle(0)
R_Up_Motor.ChangeDutyCycle(0)
R_Down_Motor.ChangeDutyCycle(0)
time.sleep(t_time)

#前进
def t_up(speed,t_time):
GPIO.output(P2_AIN2,0) #AIN2 AIN为左后轮
GPIO.output(P2_AIN1,1) #AIN1
GPIO.output(P2_BIN2,1) #BIN2 BIN为左前轮
GPIO.output(P2_BIN1,0) #BIN1
GPIO.output(P1_AIN2,1) #AIN2 AIN为右前轮
GPIO.output(P1_AIN1,0) #AIN1
GPIO.output(P1_BIN2,0) #BIN2 BIN为右后轮
GPIO.output(P1_BIN1,1) #BIN1

L_Up_Motor.ChangeDutyCycle(speed)
L_Down_Motor.ChangeDutyCycle(speed)
R_Up_Motor.ChangeDutyCycle(speed)
R_Down_Motor.ChangeDutyCycle(speed)
time.sleep(t_time)

#后退
def t_down(speed,t_time):
GPIO.output(P2_AIN2,1) #AIN2 AIN为左后轮
GPIO.output(P2_AIN1,0) #AIN1
GPIO.output(P2_BIN2,0) #BIN2 BIN为左前轮
GPIO.output(P2_BIN1,1) #BIN1
GPIO.output(P1_AIN2,0) #AIN2 AIN为右前轮
GPIO.output(P1_AIN1,1) #AIN1
GPIO.output(P1_BIN2,1) #BIN2 BIN为右后轮
GPIO.output(P1_BIN1,0) #BIN1

L_Up_Motor.ChangeDutyCycle(speed)
L_Down_Motor.ChangeDutyCycle(speed)
R_Up_Motor.ChangeDutyCycle(speed)
R_Down_Motor.ChangeDutyCycle(speed)
time.sleep(t_time)
#左转
def t_left(speed,t_time):
GPIO.output(P2_AIN2,0) #AIN2 AIN为左后轮
GPIO.output(P2_AIN1,0) #AIN1
GPIO.output(P2_BIN2,0) #BIN2 BIN为左前轮
GPIO.output(P2_BIN1,0) #BIN1
GPIO.output(P1_AIN2,1) #AIN2 AIN为右前轮
GPIO.output(P1_AIN1,0) #AIN1
GPIO.output(P1_BIN2,0) #BIN2 BIN为右后轮
GPIO.output(P1_BIN1,1) #BIN1

L_Up_Motor.ChangeDutyCycle(speed)
L_Down_Motor.ChangeDutyCycle(speed)
R_Up_Motor.ChangeDutyCycle(speed)
R_Down_Motor.ChangeDutyCycle(speed)
time.sleep(t_time)
#右转
def t_right(speed,t_time):
GPIO.output(P2_AIN2,0) #AIN2 AIN为左后轮
GPIO.output(P2_AIN1,1) #AIN1
GPIO.output(P2_BIN2,1) #BIN2 BIN为左前轮
GPIO.output(P2_BIN1,0) #BIN1
GPIO.output(P1_AIN2,0) #AIN2 AIN为右前轮
GPIO.output(P1_AIN1,0) #AIN1
GPIO.output(P1_BIN2,0) #BIN2 BIN为右后轮
GPIO.output(P1_BIN1,0) #BIN1

L_Up_Motor.ChangeDutyCycle(speed)
L_Down_Motor.ChangeDutyCycle(speed)
R_Up_Motor.ChangeDutyCycle(speed)
R_Down_Motor.ChangeDutyCycle(speed)
time.sleep(t_time)

try:
while True:
t_up(50,3)
t_down(50,3)
t_left(50,3)
t_right(50,3)
t_stop(3)
except KeyboardInterrupt:
GPIO.cleanup()




就先到这里吧,peace!





点赞(1)
点了个评