这虽然是个成熟的课题,但真的实践起来还是很多坑,如重复购买不同的硬件,因为之前并不知道这些细节。而且结果也未必让你满意,不过是效仿,抄些代码,别无价值!
因此我想写这篇文章,希望你能花费更少的时间和金钱,拥有底层的可移置代码、更高端的控制理念,得到一个可持续研发的智能小车方案。
智能小车真的很重要,它不仅是能够把代码与实践连接起来的简单实例,而且在即将到来的智能时代,也将是最先广泛使用的智能产品,现在已经开始使用的物流仓库智能车方案已经看到它的身影。
先来说说我们要实现的功能:前进、后退、左右转向,调速,程序调试,手机遥控,避障,测距,定位,视觉,寻迹,程控等,最终能简单执行你的任务吧!
智能小车区别于其它项目的很关键一点是你的控制器是移动的,这里控制器选择了树莓派,也就是说我们不能像编写其它程序那样,将树莓派连接到显示器上。解决的办法是安装远程桌面,并在树莓派上编写一个调试窗口,这样我们就可方便的在电脑或手机上编写和调试我们的智能小车程序了。但在这里我也要提醒大家,因为远程桌面的通讯速度实在不敢恭维,以后想要获得更好的灵敏度,采用遥控手柄或编写通讯程序是必不可少的。
驱动部分的代码(motor.py):
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from tkinter import*
import RPi.GPIO as GPIO
import time
#定义 GPIO 引脚
MotorL=[11,12] #树莓派pin11、pin12接L298N管脚IN1、IN2,控制左侧电机正转、反转、停止
MotorR=[13,15] #树莓派pin13、pin15接L298N管脚IN3、IN4,控制右侧电机正转、反转、停止
MotorL_PWM = 16 #树莓派pin16接L298N管脚ENA,控制左侧电机调速
MotorR_PWM = 18 #树莓派pin18接L298N管脚ENB,控制右侧电机调速
#设置 GPIO 模式为 BOARD
GPIO.setmode(GPIO.BOARD)
#设置 GPIO 的工作方式
GPIO.setup(MotorL, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(MotorR, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(MotorL_PWM, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(MotorR_PWM, GPIO.OUT,initial=GPIO.LOW)
#创建并启动脉宽调制,频率50HZ,将初始占空比设为0
PWML = GPIO.PWM(MotorL_PWM, 50)
PWMR = GPIO.PWM(MotorR_PWM, 50)
PWML.start(0)
PWMR.start(0)
#电机停止
def Motor_Stop():
GPIO.output(MotorL,GPIO.LOW)
GPIO.output(MotorR,GPIO.LOW)
#电机正转
def Motor_Fwd(duty1,duty2,runtime):
PWML.ChangeDutyCycle(duty1)
PWMR.ChangeDutyCycle(duty2)
# 发送高电平到正转引脚
GPIO.output(MotorL,(GPIO.HIGH,GPIO.LOW))
GPIO.output(MotorR,(GPIO.HIGH,GPIO.LOW))
time.sleep(runtime)
Motor_Stop()
#电机反转
def Motor_Rev(duty1,duty2,runtime):
PWML.ChangeDutyCycle(duty1)
PWMR.ChangeDutyCycle(duty2)
# 发送高电平到反转引脚
GPIO.output(MotorL,(GPIO.LOW,GPIO.HIGH))
GPIO.output(MotorR,(GPIO.LOW,GPIO.HIGH))
time.sleep(runtime)
Motor_Stop()
#释放管脚,销毁窗口
def myDestory():
GPIO.cleanup() #释放管脚
myWindow.destroy() #销毁进程
#初始化Tk()
myWindow = Tk()
#设置标题
myWindow.title('树莓派智能小车')
Button(myWindow, text='前进', command= lambda:Motor_Fwd(15,15,3)).grid(row=0, column=1,sticky=W, padx=5, pady=5)
Button(myWindow, text='后退', command= lambda:Motor_Rev(15,15,3)).grid(row=2, column=1, sticky=W, padx=5, pady=5)
Button(myWindow, text='左转', command= lambda:Motor_Fwd(15,25,1)).grid(row=1, column=0,sticky=W, padx=5, pady=5)
Button(myWindow, text='右转', command= lambda:Motor_Fwd(25,15,1)).grid(row=1, column=2, sticky=W, padx=5, pady=5)
#指定窗口关闭时,调用销毁函数
myWindow.protocol("WM_DELETE_WINDOW",myDestory)
#进入消息循环
myWindow.mainloop()
接下来,我们就可以在电脑端通过 Xshell 6 远程登录树莓派(记得要安装 Xmanager 6),并在命令行下使用 python3 motor.py 命令运行以上代码,得到以下一个简单的调试窗口(如下图),现在可以通过窗口控制你的小车行走了。
调试窗口:
远程桌面软件有很多,我们也可以使用 VNC View,它不仅可以在电脑上运行,还可以在手机上运行,也就是说你也可以在手机上运行驱动代码,来控制你的小车。但之所以选择 Xshell 6 ,因为它会调用 Xmanager 6 打开程序窗口(如上图),而不是远程桌面,相对来说速度要快一些。
驱动部分的硬件构成:
树莓派:这里选择了Raspberry Pi 3B+,啰嗦一下,玩树莓派,扇热片和风扇是必不可少的。
小车底板:网上卖的很多,也可以根据自己的喜好制作。建议是双层的,空间更容易布置。
小车车轮:4个
小车电机:这里选择了4台带减速机的直流12V电机,其实两驱也可以,但感觉四驱动力充足些。
电机驱动板:L298N
电池:这里选择了12V锂电包。也可以选择电池盒自己组装12V电源,但感觉锂电包充电方便些。容量当然越大越好。
直流电压转换板:这里选择了LM2596,这是一个可调的直流电源转方案。我们将电池的12V电压降到5.2V左右,用于树莓派及一些传感器的供电。
驱动部分的电路: