趁着暑假时间充裕,准备制作一辆简易的树莓派小车,让树莓派不再吃灰,写此文记录折腾的过程。
小车需求简要介绍
-
采用双轮差速方式移动
双轮方式需要的零件相对较少,省钱即是王道。
-
通过网络远程控制小车
可通过wifi远程控制,或者配置内网穿透实现任意地点控制。
-
能够实时传送图像
安装摄像头模块
-
超声波测距
安装超声波测距模块
-
小车的结构大致仿照微雪电子的Alphabot2,详见AlphaBot2 for micro:bit | Micro:bit轮式智能机器人 智能车套餐 (waveshare.net)
材料
- 树莓派4B
- N20减速电机 x 2
- 43MM橡胶轮胎 x 2
- 小车万向轮 x 2
- TB6612FNG驱动模块
- 摄像头模块
- 超声波测距模块
- 导线、面包板等
TB6612FNG驱动接口详解
TB6612FNG驱动如下图所示
接口说明:
- VM:电机驱动电源输入(2.74-10.8V)
- VCC:逻辑电平输入(5.0V)
- AO1和AO2:接直流电机A
- BO2和BO1:接直流电机B
- PWMA:控制电机A的转速
- AIN1和AIN2:控制电机A(停止、正转、反转)
- STBY:正常工作/待机状态控制端
- PWMB:控制电机B的转速
- BIN1和BIN2:控制电机B(停止、正转、反转)
- GND:接地
AIN1和AIN2用于控制电机A停止、正转、反转,真值表如下
AIN1 | 0 | 0 | 1 |
---|---|---|---|
AIN2 | 0 | 1 | 0 |
状态 | 停止 | 正转 | 反转 |
BIN1和BIN2的真值表同上
接线
附上树莓派40PIN引脚对照表
树莓派GPIO和TB6612FNG的接线情况如下表
树莓派GPIO接口(BCM编码) | TB6612FNG驱动接口 | 说明 |
---|---|---|
27 | STBY | 设置TB6612FNG驱动模块的状态(工作/待机) |
18 | PWMA | 基于PWM控制电机A转速 |
14 | AIN1 | 控制电机A停止、正转、反转 |
15 | AIN2 | 控制电机A停止、正转、反转 |
19 | PWMB | 基于PWM控制电机B转速 |
23 | BIN1 | 控制电机B停止、正转、反转 |
24 | BIN2 | 控制电机B停止、正转、反转 |
电机驱动和树莓派4B共用一个5V 3A的电源,具体接线图如下(接线图是我用Notability画的,略显粗糙,将就一下)
实际接线图
测试代码
小车需要有前进、后退、左转、右转、停止等5个动作,使用python编写测试代码如下
#motorTest.py
#导入 GPIO库
import RPi.GPIO as GPIO
import time
#设置 GPIO 模式为 BCM
GPIO.setmode(GPIO.BCM)
#定义引脚
STBY = 27
PWMA = 18
AIN1 = 14
AIN2 = 15
PWMB = 19
BIN1 = 23
BIN2 = 24
#设置 GPIO 的工作方式
GPIO.setup(STBY, GPIO.OUT)
GPIO.setup(PWMA, GPIO.OUT)
GPIO.setup(AIN1, GPIO.OUT)
GPIO.setup(AIN2, GPIO.OUT)
GPIO.setup(PWMB, GPIO.OUT)
GPIO.setup(BIN1, GPIO.OUT)
GPIO.setup(BIN2, GPIO.OUT)
pwma = GPIO.PWM(PWMA,300)
pwmb = GPIO.PWM(PWMB,300)
# 前进或后退(大于零前进,小于零后退)
def goForward(speed):
if(speed>=0):
GPIO.output(AIN1,GPIO.LOW)
GPIO.output(AIN2,GPIO.HIGH)
GPIO.output(BIN1,GPIO.LOW)
GPIO.output(BIN2,GPIO.HIGH)
pwma.start(speed)
pwmb.start(speed)
time.sleep(0.02)
else:
GPIO.output(AIN2,GPIO.LOW)
GPIO.output(AIN1,GPIO.HIGH)
GPIO.output(BIN2,GPIO.LOW)
GPIO.output(BIN1,GPIO.HIGH)
pwma.start(-speed)
pwmb.start(-speed)
time.sleep(0.02)
# 左转或右转(大于零左转,小于零右转)
def turnLeft(speed):
if(speed>=0):
GPIO.output(AIN2,GPIO.LOW)
GPIO.output(AIN1,GPIO.HIGH)
GPIO.output(BIN1,GPIO.LOW)
GPIO.output(BIN2,GPIO.HIGH)
pwma.start(speed)
pwmb.start(speed)
time.sleep(0.02)
else:
GPIO.output(AIN1,GPIO.LOW)
GPIO.output(AIN2,GPIO.HIGH)
GPIO.output(BIN2,GPIO.LOW)
GPIO.output(BIN1,GPIO.HIGH)
pwma.start(-speed)
pwmb.start(-speed)
time.sleep(0.02)
def motorStop():
GPIO.output(AIN1,GPIO.LOW)
GPIO.output(AIN2,GPIO.LOW)
GPIO.output(STBY,GPIO.HIGH)
#以60%的速度前进
goForward(60)
time.sleep(2)
#以60%的速度后退
goForward(-60)
time.sleep(2)
#左转
turnLeft(60)
time.sleep(2)
#右转
turnLeft(-60)
time.sleep(2)
#停止
motorStop()
pwma.stop()
pwmb.stop()
GPIO.cleanup()
测试结果
将上述代码保存到motorTest.py中,运行测试脚本python3 motorTest.py
测试结果视频见知乎DIY树莓派小车(一)树莓派4B+TB6612FNG驱动直流电机