上一篇介绍了树莓派控制直流电机,现在就可以做一个小车,通过远程来控制。
找有个小车底盘,将上一篇中用到的所有东西固定到小车底盘上,搭建一个小车,并将所有线路连接好。
小车需要实现基本的前进、后退、左转、右转以及停止的动作,主要通过两个电机来实现的。
电机 | 前进 | 后退 | 左转 | 右转 | 停止 |
---|---|---|---|---|---|
左电机 | 正转 | 反转 | 反转 | 正转 | 停 |
右电机 | 正转 | 反转 | 正转 | 反转 | 停 |
电机是通过L298电机驱动模块上的 IN1-4 接口来控制的,信号控制图如下
1、硬件按照上述连接好后,将树莓派上电,使用SSH远程连接树莓派
2、输入nano xiaoche.py,创建一个名为xiaoche的python文件
nano xiaoche.py
# -*- coding: utf-8 -*- #通过声明可以在程序中书写中文
import RPi.GPIO as GPIO #引入RPi.GPIO库函数命名为GPIO
import time #引入计时time函数
#接口定义
INT1 = 11 #将L298 INT1口连接到树莓派Pin11
INT2 = 12 #将L298 INT2口连接到树莓派Pin12
INT3 = 13 #将L298 INT3口连接到树莓派Pin13
INT4 = 15 #将L298 INT4口连接到树莓派Pin15
ENA = 16 #将L298 ENA口连接到树莓派Pin16
ENB = 18 #将L298 ENB口连接到树莓派Pin18
def init(): #定义一个初始化函数
GPIO.setmode(GPIO.BOARD) #将GPIO编程方式设置为BOARD模式
GPIO.setup(INT1,GPIO.OUT) #将相应接口设置为输出模式
GPIO.setup(INT2,GPIO.OUT)
GPIO.setup(INT3,GPIO.OUT)
GPIO.setup(INT4,GPIO.OUT)
GPIO.setup(ENA,GPIO.OUT)
GPIO.setup(ENB,GPIO.OUT)
def forward(): #定义前进函数
GPIO.output(INT1,GPIO.HIGH) #将INT1接口设置为高电压
GPIO.output(INT2,GPIO.LOW) #将INT2接口设置为低电压
GPIO.output(INT3,GPIO.HIGH) #将INT3接口设置为高电压
GPIO.output(INT4,GPIO.LOW) #将INT4接口设置为低电压
GPIO.cleanup() #释放配置过的gpio
def back(): #定义后退函数
GPIO.output(INT1,GPIO.LOW)
GPIO.output(INT2,GPIO.HIGH)
GPIO.output(INT3,GPIO.LOW)
GPIO.output(INT4,GPIO.HIGH)
GPIO.cleanup()
def left(): #定义左转函数
GPIO.output(INT1,GPIO.HIGH)
GPIO.output(INT2,GPIO.LOW)
GPIO.output(INT3,GPIO.LOW)
GPIO.output(INT4,GPIO.HIGH)
GPIO.cleanup()
def right(): #定义右转函数
GPIO.output(INT1,GPIO.LOW)
GPIO.output(INT2,GPIO.HIGH)
GPIO.output(INT3,GPIO.HIGH)
GPIO.output(INT4,GPIO.LOW)
GPIO.cleanup()
def stop(): #定义停止函数
GPIO.output(INT1,GPIO.LOW)
GPIO.output(INT2,GPIO.LOW)
GPIO.output(INT3,GPIO.LOW)
GPIO.output(INT4,GPIO.LOW)
GPIO.cleanup()
init() #调用初始化程序,进行初始化
pwma = GPIO.PWM(ENA,80) #创建一个pwma实例,控制左电机转速。两个参数:1、GPIO引脚(ENA即为引脚16);2、频率(设置为80)
pwmb = GPIO.PWM(ENB,80) #创建一个pwmb实例,控制右电机转速。
pwma.start(0) #以输出0%占空比开始
pwmb.start(0)
while 1: #1为真,永远成立,程序一直执行
res = raw_input() #将键盘输入字符赋值给res
if res == "w" or res =="W": #如果输入字符为W
forward() #调用前进函数,使小车前进
init()
pwma = GPIO.PWM(ENA,80)
pwmb = GPIO.PWM(ENB,80)
pwma.start(70)
pwmb.start(70)
elif res == "x" or res =="X":
back()
init()
pwma = GPIO.PWM(ENA,80)
pwmb = GPIO.PWM(ENB,80)
pwma.start(70)
pwmb.start(70)
if res == "a" or res =="A":
left()
init()
pwma = GPIO.PWM(ENA,80)
pwmb = GPIO.PWM(ENB,80)
pwma.start(35)
pwmb.start(35)
elif res == "d" or res =="d":
right()
init()
pwma = GPIO.PWM(ENA,80)
pwmb = GPIO.PWM(ENB,80)
pwma.start(35)
pwmb.start(35)
elif res == "s" or res =="S":
stop()
init()
pwma = GPIO.PWM(ENA,80)
pwmb = GPIO.PWM(ENB,80)
pwma.start(0)
pwmb.start(0)
4、保存退出文件并且执行程序
sudo python xiaoche.py
5、输入w/a/d/x/s,按回车便可控制下车运动。
6、现在控制小车,输入相应字符需要按回车键,小车才能运动,后面会加上键盘输入检测,不需要每个指令都按回车。