Robocar控制器快速入门指南

图片发布

需求

在开始之前,您需要满足以下条件:

  • 具有iOS或Android的手机

安装移动应用

Robocar Controller在Apple的App Store和Google Play商店均可使用。只需在手机上安装此应用即可。

图片发布

用预先建立的映像刷新SD卡

  1. 下载Etcher
  2. 在此处下载我们的预制图像
  3. 将图像刷入SD卡
  4. 将卡插入Pi

将手机连接到热点

  1. 打开Raspberry Pi
  2. 等到绿灯停止闪烁。第一次可能最多需要2-3分钟。Pi会重新启动1-2次,直到准备就绪为止。
  3. 转到手机的Wifi设置屏幕。您将看到一个名为“ donkey-xxxxxx”的热点。在离开设置屏幕之前,请确保已连接到该热点。

首次设置

  1. 启动应用程序。首次使用时,请同意条款。
  2. 该应用程序将在网络中搜索汽车。您的汽车应显示IP 192.168.50.1。
  3. 点击显示的汽车。您将进入首次设置屏幕。
  4. 选择您正在使用的控制器类型。最有可能您将使用PCA9685。MM1用户请选择MM1。
  5. 选择您所在的国家。我们需要此信息,因为wpa请求者需要此信息以符合国家/地区特定的Wifi规则。如果选择了不正确的国家/地区,则可能会发生意外的wifi连接问题。
  6. 设置wifi连接。搜索附近的wifi网络,然后选择要让Pi连接的wifi网络。输入密码,然后点击完成。
  7. 查看设置。如果一切正常,请点按“完成”,然后Pi将禁用热点并连接到Wifi网络。此时,您会看到您的手机已从热点断开连接,因为Pi在成功连接到Wifi后会禁用它。您的手机很可能会回退并连接到原来用于连接的Wifi网络。确保您的手机与Pi连接到相同的网络。
  8. 您将被重定向回车辆搜索屏幕。您应该看到您的汽车随Wifi网络分配的IP一起出现。
  9. 点击汽车,然后转到汽车的控制面板。

图片发布

校准

完成首次设置后,您可能要做的第一件事就是校准汽车。点击进入校准屏幕。将显示两个选项卡以配置转向和油门:

图片发布

PCA9685的校准屏幕

驾驶

校准后,点击驾驶按钮以开始驾驶汽车。系统将询问您是否要使用虚拟游戏杆或物理游戏杆。现在选择虚拟游戏杆。此外,系统还会要求您分享您的当前位置。该应用程序将此位置(经度,纬度)添加到浴缸的meta.json文件中。

图片发布

图片发布

图片发布

数据

数据视图显示您在树莓派上收集的所有数据(数据桶)。

图片发布

图片发布

培养

截至今天,我们为移动应用程序用户提供免费的培训服务。

图片发布

图片发布

图片发布

自动驾驶仪

您可以通过两种方式启动自动驾驶仪。一种方法是在火车功能内启动自动驾驶仪。就像上面显示的屏幕截图一样,您可以直接从那里启动自动驾驶仪。另一种方法是使用控制面板上的“自动驾驶”功能。该应用程序将列出Pi内的所有型号。换句话说,您可以将模型复制到Pi中,但仍可以使用该应用程序启动自动驾驶仪。

图片发布

进阶设定

Doneky汽车软件带有多种配置,您可以进行试验。我们提供了一些您可能想要更改的常用选项。

  • 训练配置
  • 传动系设置

图片发布

结论

本文向您展示如何在不键入单个命令的情况下将Robocar控制器与Donkey汽车软件一起使用。我们希望这将简化并降低每个人尝试Donkey Car的技术障碍。感谢您阅读并访问Donkey Discord,以告诉我们您使用该应用程序的经验。

未来的增强功能和错误报告

如果您有任何建议或只是想报告错误,请随时在此处提交问题

商业用途

如果您打算使用此应用程序来赚钱,请遵循驴车指南,让我们知道

原文:https://medium.com/robocar-store/robocar-controller-quick-start-guide-bdf8cb16d7ce

DonkeySim挑战赛

如果不使用神经网络的参赛者仅需看第4与第5部分内容!
1.0 DonkeyCar的安装
1.1安装miniconda Python 3.7
安装miniconda Python 3.7 64位。
安装方法参见:Windows 10下安装Miniconda3

1.2安装git 64 bit
安装git 64 bit。
安装方法参见:GIT -2.18.0-64.bit 的安装与使用

1.3创建项目目录
从开始菜单启动Anaconda Prompt
创建并更改为您希望用作项目的目录
C:\Users\adminitrator>d:
D:\>mkdir projects
D:\>cd projects
1
2
3
1.4从Github获取最新的Donkeycar
git clone https://github.com/autorope/donkeycar
cd donkeycar
git checkout master
1
2
3
1.5更换国内源
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config –set show_channel_urls yes
1
2
3
1.6更新与删除
conda update -n base -c defaults conda
conda env remove -n donkey
1
2
1.7创建Python Anaconda环境
conda env create -f install\envs\windows.yml
conda activate donkey
pip install -e .[pc]
1
2
3
1.8安装Tensorflow GPU(可选)
如果你有NVidia卡,你应该更新到最新的驱动程序并安装Cuda SDK。

conda install tensorflow-gpu==1.13.1
1
1.9创建工作目录
donkey createcar –path D:/mycar
1
安装keras-vis

pip install keras-vis
1
2.0安装DonkeySim
d:
cd projects
git clone https://github.com/tawnkramer/gym-donkeycar
conda activate donkey
pip install -e gym-donkeycar
1
2
3
4
5
3.0修改相应文件
3.1修改dtypes.py
文件位置:D:\Miniconda3\envs\donkey\lib\site-packages\tensorflow\python\framework\dtypes.py。
修改dtpes.py文件的第526~530、535行。
原:

_np_qint8 = np.dtype([(“qint8”, np.int8, 1)])
_np_quint8 = np.dtype([(“quint8”, np.uint8, 1)])
_np_qint16 = np.dtype([(“qint16”, np.int16, 1)])
_np_quint16 = np.dtype([(“quint16”, np.uint16, 1)])
_np_qint32 = np.dtype([(“qint32”, np.int32, 1)])
np_resource = np.dtype([(“resource”, np.ubyte, 1)])
1
2
3
4
5
6
修改为:

_np_qint8 = np.dtype([(“qint8”, np.int8, (1,))])
_np_quint8 = np.dtype([(“quint8”, np.uint8, (1,))])
_np_qint16 = np.dtype([(“qint16”, np.int16, (1,))])
_np_quint16 = np.dtype([(“quint16”, np.uint16, (1,))])
_np_qint32 = np.dtype([(“qint32”, np.int32, (1,))])
np_resource = np.dtype([(“resource”, np.ubyte, (1,))])
1
2
3
4
5
6
3.2修改train.py文件
文件位置:D:\projects\gym-donkeycar\examples
\supervised_learning\train.py
修改train.py文件的第29行:
原:

matplotlib.use(‘Agg’)
1
修改为:

matplotlib.use(‘TkAgg’)
1
4.0 DonkeySim模拟器的使用
4.1下载DonkeySim模拟器
从Donkey Gym Release下载并解压主机PC平台上可运行的模拟器(DonkeySimWindows.zip)。
将模拟器放在合适的位置。如:~/projects/DonkeySimWindows。

可使用游戏杆/键盘手动驾驶、自动驾驶还可使用训练好的神经网络驾驶,运行界面如下:

选择窗口大小,点击“Play!”进入。

点击“Log dir”可设置记录数据目录。

在主界面点击“Generated Track”,进入我们挑战赛的赛道环境。

可以选择右侧的各种驾驶模式。

这是速度、转向和PD参数设置界面,在自动驾驶时,要设置这些参数,取得好成绩。

4.2设置验证
打开Anaconda Prompt。
使用示例模型来验证设置。

conda activate donkey
d:
cd projects\gym-donkeycar\examples\supervised_learning
python evaluate.py –model=models/example_model.h5
1
2
3
4
启动“DonkeySim”环境。单击“NN Control over Network”按钮。

4.3获取自己的训练数据
现在,你可以尝试根据自己的数据来训练自己的模型。
在模拟器中,按“Exit”进入主菜单。
单击“log dir”按钮并指定一个日志目录以保存数据。例如,你可以选择d:/projects/gym-donkeycar/examples/supervised_learning/log文件夹。
选择Generated Track环境。
单击“Auto Drive w Rec”或“Joystick/Keyboard w Rec”。记录约1万个样本(一圈以上)。查看左下角以查看日志计数。
完成后,单击“Stop”。

4.4训练模型
conda activate donkey
d:
cd projects\gym-donkeycar\examples\supervised_learning
python train.py –inputs=log/*.jpg –model=models/model.h5
1
2
3
4
模型结构可根据自己需要进行修改。
取消train.py文件的第208行注释,显示模型信息。
修改models.py文件(可设置学习率):
在第7行增加:

from tensorflow import keras
1
第57行修改为:

model.compile(optimizer=keras.optimizers.Adam(lr=0.0001), loss=’mse’, metrics=[‘acc’])
1
4.5评估模型
conda activate donkey
d:
cd projects\gym-donkeycar\examples\supervised_learning
python evaluate.py –model=models/model.h5
1
2
3
4
启动模拟器。选择Generated Track环境。单击“NN Control over Network”。

5.0 DonkeySim挑战赛
5.1 DonkeySim挑战赛类别
参加DonkeySim挑战赛的车必须连续不间断跑3圈以上,小车不能压到草坪,不能撞到障碍物,挑战赛共分为三大类:

游戏杆/键盘驾驶(Joystick/Keyboard)
自动驾驶(Auto Drive)
神经网络驾驶(NN Control over Network)
5.2 DonkeySim参赛者提交文件
参加DonkeySim挑战赛的选手,参赛作品必须提交以下文件、数据和视频。

5.2.1选手与作品简介
年龄和性别要真实(便于以后进一步的赛果分类),其他介绍可自由发挥;
参赛者首先应根据已公开(如该类别没有人提交或提交数少于10个)的其他参赛者提交的文件自行进行测试对比,成绩在前十名之内的即可提交,否则请不要提交。
5.2.2数据文件
自行测试成绩以文本文件方式提交;
数据要真实,不得人为编辑修改;
游戏杆/键盘驾驶参赛者提交压缩的原始数据记录(log)文件;
自动驾驶参赛者提交压缩的原始数据记录(log)文件和速度/转向/PD参数截图;
神经网络驾驶参赛者提交文件:
压缩的原始训练数据记录(log)文件
D:\projects\gym-donkeycar\examples\supervised_learning目录下的conf.py和models.py文件
D:\projects\gym-donkeycar\examples\supervised_learning\models目录下的model.h5和model.h5loss.png文件
5.2.3视频文件
游戏杆/键盘驾驶与自动驾驶参赛者提交原始数据记录(log)文件转成的.mp4格式文件,转换方法如下:
首先将DonkeySim内要转换为视频的记录数据(log),复制到D:\mycar\logs文件夹下,并运行下列命令:
conda activate donkey
d:
cd mycar
donkey makemovie –tub=D:\mycar\logs\log –out=log_movie.mp4
1
2
3
4
输出文件名为log_movie,mp4
神经网络驾驶参赛者视频文件的提交是可选的,也必须是.mp4格式的视频文件,请自行用合适的办法解决(参赛者如有好的方法,请共享出来,让大家享用)。
5.3 DonkeySim挑战赛评比方式
DonkeySim挑战赛公开参赛者提交的所有文件,采用自测与公示的方式进行评比,比赛成绩及时更新。比赛规则根据实施情况,听取大家的意见,不定时的更新,所有的原始数据尽量可靠的保存。
————————————————
版权声明:本文为CSDN博主「平衡-JL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wujingyu67971348/java/article/details/101982829

DonkeySim自动驾驶

选择“Auto Drive No Rec”或“Auto Drive w Rec”即可进入DonkeySim的自动驾驶模式,开始测试时用“Auto Drive No Rec”方式,不记录数据,等调试稳定后再用“Auto Drive w Rec”方式运行,并记录数据,记录数据时如“DonkeySim游戏杆/键盘驾驶”一文选择记录数据文件夹。

在自动驾驶方式中需要调节如下图所描述的PID控制参数。

自动驾驶“Auto Drive w Rec”方式如下图所示。

————————————————
版权声明:本文为CSDN博主「平衡-JL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wujingyu67971348/java/article/details/102326899

DonkeySim游戏杆/键盘驾驶

下载DonkeySim:从Donkey Gym Release下载并解压主机PC平台上可运行的模拟器(DonkeySimWindows.zip)。
解压并将模拟器放在合适的位置。如:D:/projects/DonkeySimWindows。

运行DonkeySim:双击可执行文件DonkeySim.exe即可进入DonkeySim启动界面。

如果取消“Windowed”前面的“勾选”,点击“Play!”进入的是“全屏”界面,否则可在“Screen resolution”下拉列表中选择你想要的分辨率后再点击“Play!”进入。

点击“Log dir”选择记录数据文件夹。

点击“Generated Track”进入赛道环境。

点击“Joystick/Keyboard No Rec”进入“游戏杆/键盘”驾驶操作状态。

按键盘上的“A,S,D,W”键或“上,下,左,右”箭头键即可操控小车的运动,按下“Stop”停止小车的运动,按下“Exit”退出比赛环境。按下“Quit”退出DonkeySim程序。

等熟练操作小车运动后,点击“Joystick/Keyboard w Rec”进入“游戏杆/键盘”驾驶操并记录驾驶数据,录下视频,提交文件,参加DonkeySim挑战赛了。

左下角的“Log”后面的数值为记录的帧数。
————————————————
版权声明:本文为CSDN博主「平衡-JL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wujingyu67971348/java/article/details/102312971

第8章 树莓派控制伺服电机(舵机)

   伺服电机主要适用于那些需要角度不断变化并可以保持的控制系统,我们常见的的机械臂、多足机器人、摄像头云台等都可以用伺服电机来实现,是机器人驱动系统常见的重要实现方式。本章将介绍伺服电机的有关基础知识,主要内容如下。

  • 伺服电机的基础知识。
  • 控制伺服电机的基本原理。
  • 使用树莓派控制伺服电机的实践。
0^。
180^。

   本章我们将继续使用第5章搭建的多功能实验平台。此外,还需要一个伺服电机( ~ )和一个1kΩ的电阻。知识储备方面,需要读者对脉冲宽度调制(PWM)有一定的了解,具体可以参考第6章

8.1 伺服电机(舵机)

8.1.1 结构及工作原理

   伺服电机也叫舵机,英文servo,是由直流电机、减速齿轮组、电位器和控制电路组成,并封装在一个便于安装的外壳里的伺服单位,能够根据输入信号比较准确的转动到给定的角度,典型的伺服电机及其组成如图8.1所示。

图 8.1 伺服电机及其结构

   如图8.2所示,伺服电机的基本工作原理:1、控制电路接收来自信号源的控制信号,并驱动直流电机转动;2、减速齿轮组按倍数降低直流电机转速,并将直流电机的输出扭矩放大到相应倍数,然后输出;3、电位器和减速齿轮组一起转动,测量伺服电机轴转动角度;4、控制电路检测并根据电位器判断伺服电机转动角度,然后控制伺服电机转动到目标角度或保持在目标角度。

图 8.2 伺服电机基本工作原理

8.1.2 规格和选型

   伺服电机的种类繁多,选择一款合适的型号不是一件容易的事,我们在选型的时候要对以下几方面综合考虑。

  • 角度
       伺服电机不像普通直流电机只能机械的转圈,它可以根据指令在旋转到一定的角度后停下来,常见的旋转范围有 ~  、 ~  、  ~ 等。
  • 转矩
       转矩也就是伺服电机的力量大小,能够带动多重的物体,单位为kg.cm,如9g.cm、15kg.cm、20kg.cm等。
  • 转速
       转速是指伺服电机在空载的情况下转过角所需的时间,常见伺服电机的速度一般在 ~ 。
  • 电压
       伺服电机的工作电压对性能有重大的影响,较高的电压可以提高伺服电机的转矩和转速,一般的推荐电压为4.8V和6V。
  • 尺寸、重量
       尺寸、重量也是伺服电机选型时需要考虑的一个重要指标。一般来说,伺服电机的功率与其尺寸、重量成正比,功率大的,尺寸、重量也相对较大。
  • 材质
       伺服电机的外壳一般是塑料的,也有金属的。金属外壳的散热性更好,伺服电机内的直流电机功率可以更高,以输出更高的扭矩。
       减速齿轮的材质有塑料、金属和混合等3种。塑料齿轮的成本低、噪音小,其强度也较低,在超出极限负载时塑料齿轮可能会崩齿。金属齿轮强度高、成本也高,在装配精度一般的情况下噪声会很大,金属齿轮可以长时间超负载而不会损坏,但会导致直流电机过热损坏或外壳变形,且无法修复。

   综上所述,选型时一般先计算伺服电机的转矩和转速,并确定电压,转矩应留有一定的富余,避免过载,然后确定旋转范围、尺寸、重量和材质等。

8.1.3 连接件

   使用伺服电机时,还需要一些连接配件,一是能把伺服电机固定到基座上的支架,二是能将驱动轴和物体连在一起的连接装置。伺服电机常见的连接件如图8.3所示。

图 8.3 伺服电机连接件

   伺服电机一般都带有可以上螺丝的安装孔,如果基座也带有合适的安装位置,就可以直接进行安装,但大多数情况下还是需要使用到各种支架才能固定到基座上。
   购买伺服电机的时候,一般会附带一些带有小孔的圆盘,这就是舵盘。舵盘可以套在伺服电机的驱动轴上,上面的小孔就可以用于安装各类物体,如摄像头、超声波传感器等。当然了,一般还是需要一些连接支架才能把物体连接到舵盘上。

8.2 伺服电机控制原理

0^。
180^。
0^。
90^。
180^。
0^。
90^。
0^。
270^。

   伺服电机有地线、电源线和控制线(信号线)3条连接线,中间的一条线通常为电源线。通过控制线发送一个脉冲宽度调制(PWM)信号可以控制伺服电机转动到一个角度,这个PWM信号必须周期性发送,否则伺服电机就会转到一个任意的角度。通常,控制伺服电机的PWM信号周期为20ms(50HZ),宽度在0.5ms-2.5ms之间(对应最小角度和最大角度)
   如图8.4所示,以 ~ 伺服电机为例,展示了伺服电机角度、脉冲宽度和占空比的关系。当角度为时,脉冲宽度为0.5ms(占空比为2.5%);当角度为时,脉冲宽度为1.5ms(占空比为7.5%);当角度为时,脉冲宽度为2.5ms(占空比为12.5%)。对于  ~ 、 ~ 等的伺服电机可以依此类推。

图 8.4 伺服电机角度、脉冲宽度和占空比的关系

duty=k*direction+b(k,b是常数,k≠0)
0^。
180^。
duty=1/18*direction+2.5

   树莓派没有提供专门控制伺服电机角度的功能,我们只能使用RPi.GPIO库的PWM功能来控制伺服电机,然而RPi.GPIO库也只是提供了控制PWM信号占空比的功能,想要控制伺服电机的角度还需进行一定的转换。
   假设direction为角度,duty为占空比,很明显角度和占空比之间存在一次函数关系。如图8.5所示,当伺服电机的旋转角度为 ~ 时,可计算出k=1/18,b=2.5,即。

图 8.5 伺服电机角度与PWM信号占空比关系

   对于其它旋转角度的伺服电机的角度-占空比转换可以依次类推。从本质上讲,树莓派控制树莓派实际上是对PWM信号占空比的控制。

8.3 伺服电机控制实践

   下面我们进行树莓派控制伺服电机的实验。这个实验您允许输入一个大于等于0且小于等于180的数字,控制伺服电机旋转到这个数字指定的角度。

8.3.1 实验电路

   实验的电路原理图如图8.6所示。控制线与GPIO26引脚串联了一个1kΩ的电阻,可以防止伺服电机发生故障时,控制信号的瞬间高强电流对GPIO引脚造成损害,但这不是必不可少的。这里使用的伺服电机的电压仅4.8V,因此可以直接从树莓派上取电,如果使用伺服电机的电压较高,那就需要采用外置电源为其供电。

图 8.6 伺服电机控制电路图

   实验的电路实物连接图如图8.7所示。该款伺服电机的控制线为橘色,电源线为红色,地线为棕色。

图 8.7 伺服电机控制电路实物连接图

8.3.2 程序思路

   前面我们说过树莓派控制伺服电机实际上是对PWM信号占空比的控制,因此程序的思路与第6章类似,具体如下。

BEGIN  
    引入GPIO库  
    将GPIO26设置为输出模式,用于输出伺服电机控制信号  
    
    创建PWM对象,并设置初始频率为50Hz(周期为20ms)  
    启动PWM,并设置初始占空比为0  

    DO FOREVER  
        等待输入伺服电机要旋转的角度  
        将角度转换为占空比
        更改PWM信号占空比,将伺服电机旋转到指定角度
    ENDO  
    停止PWM  
    清理释放GPIO资源  
END  

8.3.3 程序代码

   以下为本实验的程序代码,详细说明见注释。

import RPi.GPIO as GPIO                 # 引入GPIO模块

if __name__ == '__main__':
    ServoPin = 26
    PWMFreq = 50                        # PWM信号频率

    GPIO.setmode(GPIO.BCM)              # 使用BCM编号方式
    GPIO.setup(ServoPin, GPIO.OUT)      # 将GPIO19设置为输出模式
    pwm = GPIO.PWM(ServoPin, PWMFreq)   # 创建PWM对象,并设置频率为50
    pwm.start(0)                        # 启动PWM,并设置初始占空比0

    try:
        while True:
            # 等待输入一个0到180的角度
            direction = float(input("Pleas input the direction: "))
            if direction < 0 or direction > 180:
                print("Please input a direction between 0 an 180.")
                continue

            duty = (1/18) * direction + 2.5   # 将角度转换为占空比
            pwm.ChangeDutyCycle(duty)         # 改变PWM占空比
    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位

8.4 本章小结

   本章首先介绍了伺服电机的的结构及工作原理、规格和选型、连接件等基础知识。其次,介绍伺服电机控制原理,重点讲解了伺服电机角度和PWM信号占空比的转换。最后,通过一个实验让读者了解如何使用树莓派控制伺服电机。读者在学完这章后,应该对伺服电机有一定的了解,并能使用伺服电机。

后记

  1. 在败家中又完成了一篇,不到半小时烧坏了3个伺服电机,大几十块就没了,为了能把东西讲清楚还把初中数学一次函数知识给复习了一遍,画图画到手抽筋。
  2. 感觉这篇写得要比上一篇好,希望能用最简洁的语言把要表达的东西说清楚。
  3. 2019年6月24日树莓派出第四代。

第7章 用树莓派控制直流电机(L298N)

   直流电机是机器人行走机构的理想选择之一,我们通常使用直流电机来驱动机器人行走。在第5章第6章您已经了解到如何用树莓派控制一个LED灯,本章我们将进一步介绍如何用树莓派控制直流电机,主要内容如下。

  • 直流电机的基本知识。
  • L298N双H桥直流电机驱动模块相关知识。
  • 如何控制直流电机的转向和转速。

   本章我们将继续使用第5章搭建的多功能实验平台。此外,还需要以下材料:

  • 一个小型直流电机。
  • 一个可以为小型直流电机供电的电源,为便于后续的实验,我们这里使用一个3V-24V的直流可调电源。
  • 一个L298N直流电机驱动模块。

7.1 直流电机

   直流电机是一种将直流电能转换为机械能的装置,被广泛的用于驱动各种设备,如电风扇、遥控小车、电动车窗等,非常适合作为机器人的行走机构,您可以很容易的在网上购买到,价格也不是很贵。
   小型直流电机的的电压范围通常是1.5V~30V,使用两根导线连接到直流电源上就能让电机转动起来,电压越高转得就越快。每个直流电机都有一个推荐电压,超出推荐电压太多容易导致电机被烧毁,而供电电压太低则转不起来。通过交换两根连接在电机上的导线顺序(实际上是改变电源的正负极),可以改变电机的转向。前面章节我们说过,直流电机属于高功耗元件,不可以直接使用树莓派进行驱动,因此我们需要使用一个外部电源。
   小型直流电机通常输出很高的转速和较低的扭矩,在作为机器人的驱动装置时,一般需要连接一个变速器,将其转换为低转速、高扭矩,使之有足够的力量驱动机器人。图7.1是典型的带变速器的小型直流电机,建议变速器和电机一起购买。

图 7.1 带变速器的小型直流电机

7.2 双H桥直流电机驱动模块(L298N)

   H桥(H-Bridge)是控制直流电机的常用电路,因其电路形状酷似字母H而得名,可以控制直流电机的转速和方向,典型的H桥芯片有L293D、L298N等,以下我们以L298N为例进行介绍。实际使用的时候,为提高芯片的安全性、可靠性和方便性,我们一般会给芯片外接一些保护电路,并把输入输出引脚引接到排针上,从而形成一个功能模块。图7.2是一款典型的L298N双H桥直流电机驱动模块,可以很容易从网上购买到,价格也便宜。该模块的主要特点如下:

图 7.2 L298N双H桥直流电机驱动模块

  • 采用L298N双桥直流电机驱动芯片
  • 工作电压范围5V35V,如果需要从模块内取电,则供电范围为7V35V
  • 峰值输出电流2A
  • 每个通道有一个使能输入端
  • 可以驱动两个直流电机或者一个四线步进电机

   L298N双H桥直流电机驱动模块的引脚可以归纳成电源、控制和输出等三大类,下面是各类引脚的功能说明。

  • 电压类引脚

   +12V输入:L298N芯片的电源正极,模块上标称+12V,但实际范围可以是5V35V,如果需从模块内取电,则其范围为7V35V。
   GND:L298N芯片的电源地,使用的时候应该把树莓派的GND接到这里,即两者需要共地。
   +5V输出:L298N芯片输出的5V电源,可以给外部设备供电,使用的时候需要用跳线把5V输出使能端短接起来。

  • 控制类引脚

   ENA、ENB:A、B通道的使能端,高电平有效,可以用PWM来实现调速。使用时,可以接到树莓派的GPIO上,实现用程序进行控制。
   IN1、IN2、IN3、IN4:IN1、IN2为A通道的控制输入,IN3、IN4为B通道的控制输入。

  • 输出类引脚

   OUT1、OUT2、OUT3、OUT4:OUT1、OUT2由A通道输出,OUT3、OUT4由B通道输出,可以用于连接直流电机等设备。

   控制直流电机的转向和转速实际是通过给控制类引脚设置不同的值来实现的,表7.1是使用通道A的控制直流电机的真值表,通道B与此类似。

表 7.1 通道A的控制直流电机的真值表

提示:

您购买到的L298N双H桥直流电机驱动模块可能与本章介绍的存在一定的差异,但这一类功能模块大同小异,请跟商家索要相应的技术资料了解更多的使用细节。

7.3 让直流电机动起来

   下面进入实战环节,我们将用树莓派通过L298N双H桥直流电机驱动模块控制一个电机的转向和转速。为了能让读者更好的理解,我们首先演示如何控制电机的转向,然后再进一步介绍如何控制电机转速。

7.3.1 实验电路

   图7.3所示的是树莓派、L298N双H桥直流电机驱动模块和电机间连接的电路图,最终实物连线图如图7.4所示。我们使用树莓派的GPIO13、GPIO19和GPIO26等3个引脚,分别连接到L298N双H桥直流电机驱动模块的ENA、IN1和IN2,通过输入表7.1所示的不同电平组合就可以实现对电机的操纵。控制电机的转向和转速都是使用该电路,向ENA输入不同占空比的PWM脉冲信号就可以控制电机的转速。

图 7.3 小型直流电机控制电路图

图 7.4 小型直流电机控制实物连接

   尽管L298N双H桥直流电机驱动模块能驱动两个直流电机,但我们只演示如何驱动一个。驱动两个电机使用的是相同的技术,如果在您的项目中需要用到两个,也可以很容易地扩展它。

7.3.2 程序思路

   控制电机转向和转速可以使用同一个电路,但程序思路上我们分两个程序来演示,具体思路如下:

  • 控制电机转向思路
BEGIN  
    引入GPIO库  
    将连接ENA的GPIO引脚设置为输出模式
    将连接IN1的GPIO引脚设置为输出模式
    将连接IN2的GPIO引脚设置为输出模式
    
    DO FOREVER  
        将IN1设置为0,IN2设置为1,将电机设置为正向转动  
        将ENA设置为1,驱动A通道电机转动  
        等待5秒  

        将ENA设置为0,停止电机转动  
        等待2秒  

        将IN1设置为1,IN2设置为0,将电机设置为反向转动  
        将ENA设置为1,驱动A通道电机转动  
        等待5秒  

        将ENA设置为0,停止电机转动  
        等待2秒
    ENDO  
    停止PWM  
    清理释放GPIO资源  
END  

提示:

除了采用将ENA置0的方法来让电机停止转动,将IN1和IN2同时设置为0或1也可以让电机停止下来。

  • 控制电机转速思路
BEGIN  
    引入GPIO库  
    将连接ENA的GPIO引脚设置为输出模式
    将连接IN1的GPIO引脚设置为输出模式
    将连接IN2的GPIO引脚设置为输出模式

    设置ENA输入一定频率的PWM脉冲信号,创建PWM对象  
    开始向ENA输入占空比为0的PWM脉冲信号  
    
    DO FOREVER  
        将IN1设置为0,IN2设置为1,将电机设置为正向转动  
        将ENA设置为1,驱动A通道电机转动  
        
        speed = 0
        DOWHILE speed < 100  
            将输入ENA的PWM脉冲信号的占空比修改为speed
            speed += 5
            等待1秒
        ENDDO

        将IN1设置为1,IN2设置为0,将电机设置为反向转动  
        将ENA设置为1,驱动A通道电机转动  
        
        speed = 0
        DOWHILE speed < 100  
            将输入ENA的PWM脉冲信号的占空比修改为speed
            speed += 5
            等待1秒
        ENDDO
    ENDO  
    
    停止PWM  
    清理释放GPIO资源  
END  

   电机的转向控制和转速控制的程序思路的最大区别在于ENA输入信号的不同。控制电机转向的程序思路只是简单的通过将ENA设置为1或0来启动和停止电机。对于电机转速控制,ENA输入的PWM脉冲信号,通过改变PWM脉冲信号的占空比来改变电机转速,占空比越大速度就越快,占空比为100%时相当于输入1(高电平),占空比为0%时相当于输入0(低电平)。

7.3.3 程序代码

   以下是直流电机转向和转速控制程序,程序的详细说明见注释。

  • 控制电机转向程序
import RPi.GPIO as GPIO         # 引入GPIO模块
import time                     # 引入time模块

ENA = 13                        # 设置GPIO13连接ENA
IN1 = 19                        # 设置GPIO19连接IN1
IN2 = 26                        # 设置GPIO26连接IN2

if __name__ == '__main__':
    try:
        # 初始化
        GPIO.setmode(GPIO.BCM)          # 使用BCM编号方式
        GPIO.setup(ENA, GPIO.OUT)       # 将连接ENA的GPIO引脚设置为输出模式
        GPIO.setup(IN1, GPIO.OUT)       # 将连接IN1的GPIO引脚设置为输出模式
        GPIO.setup(IN2, GPIO.OUT)       # 将连接IN2的GPIO引脚设置为输出模式

        while True:
            # 驱动电机正向旋转5秒
            GPIO.output(IN1, False)     # 将IN1设置为0
            GPIO.output(IN2, True)      # 将IN2设置为1
            GPIO.output(ENA, True)      # 将ENA设置为1,启动A通道电机
            time.sleep(5)               # 等待电机转动5秒

            # 电机停止2秒
            GPIO.output(ENA, False)     # 将ENA设置为0
            time.sleep(2)               # 等待电机停止2秒

            # 驱动电机反向旋转5秒
            GPIO.output(IN1, True)      # 将IN1设置为1
            GPIO.output(IN2, False)     # 将IN2设置为0
            GPIO.output(ENA, True)      # 将ENA设置为1,启动A通道电机
            time.sleep(5)               # 等待电机转动5秒

            # 电机停止2秒
            GPIO.output(ENA, False)     # 将ENA设置为0
            time.sleep(2)               # 等待电机停止2秒

    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位

   运行这个程序后,您将看到直流电机反复的正向转动5秒后,停止两秒,再反向转动5秒后,停止2秒。

  • 控制电机转速程序
import RPi.GPIO as GPIO         # 引入GPIO模块
import time                     # 引入time模块

ENA = 13                        # 设置GPIO13连接ENA
IN1 = 19                        # 设置GPIO19连接IN1
IN2 = 26                        # 设置GPIO26连接IN2

if __name__ == '__main__':
    try:
        # 初始化
        GPIO.setmode(GPIO.BCM)              # 使用BCM编号方式
        GPIO.setup(ENA, GPIO.OUT)           # 将ENA对应的GPIO引脚设置为输出模式
        GPIO.setup(IN1, GPIO.OUT)           # 将IN1对应的GPIO引脚设置为输出模式
        GPIO.setup(IN2, GPIO.OUT)           # 将IN2对应的GPIO引脚设置为输出模式

        freq = 500
        speed = 0
        pwm = GPIO.PWM(ENA, freq)           # 设置向ENA输入PWM脉冲信号,频率为freq并创建PWM对象
        pwm.start(speed)                    # 以speed的初始占空比开始向ENA输入PWM脉冲信号

        while True:
            # 将电机设置为正向转动
            GPIO.output(IN1, False)         # 将IN1设置为0
            GPIO.output(IN2, True)          # 将IN2设置为1

            # 通过改变PWM占空比,让电机转速不断加快
            for speed in range(0, 100, 5):
                pwm.ChangeDutyCycle(speed)  # 改变PWM占空比
                time.sleep(1)

            # 将电机设置为反向转动
            GPIO.output(IN1, True)          # 将IN1设置为1
            GPIO.output(IN2, False)         # 将IN2设置为0

            # 通过改变PWM占空比,让电机转速不断加快
            for speed in range(0, 100, 5):
                pwm.ChangeDutyCycle(speed)  # 改变PWM占空比
                time.sleep(1)
    finally:
        pwm.stop()                          # 停止PWM
        GPIO.cleanup()                      # 清理释放GPIO资源,将GPIO复位

   运行这个程序后,您将看到直流电机首先正向转动,转动速度不断增加,在达到最大转速后,直流电机短暂停止转动,然后反向转动,转动速度不断增加,如此反复运动。

7.4 本章小结

   本章首先介绍了直流电机的基本知识,然后介绍了L298N双H桥直流电机驱动模块的相关基础知识,最后介绍了使用树莓派和L298N双H桥直流电机驱动模块来控制一个直流电机的转向和转速的电路、思路和程序等知识。

后记

   最近工作太忙,项目在赶进度,几乎每周都有几天要跑现场,这两周又增加网络安全的事情,断断续续写了一个多月,乘着端午小长假陪完家人还有点时间,好不容易才把这篇给完成了。写这篇文章的成本算是较低,就烧坏了两个一块多钱的小直流电机。另外,把十几年没用过的烙铁又整了出来,居然还能焊得上,且没烧东西,算是对得起当年的老师哈!