Category Archives: Uncategorized

Robocar控制器快速入门指南

Published by:

图片发布

需求

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

  • 具有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挑战赛

Published by:

如果不使用神经网络的参赛者仅需看第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自动驾驶

Published by:

选择“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游戏杆/键盘驾驶

Published by:

下载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

创想三维3D打印机使用教程

Published by:

随着3D打印行业和技术的成熟,以及设备价格的亲民化,3D打印机的个人和家庭应用市场逐渐崛起。但整体来看,仍有不少对3D打印兴趣浓厚的消费者,高估了3D打印机的操作使用难度,很多人望而却步。事实上,桌面级3D打印机使用起来,并没有我们想的那么复杂。

  当3D打印机安装并测试好后即可开始打印。3D打印机的打印方式有两种,一种是SD卡打印,一种是联机打印。SD卡打印较联机打印方便简单,最主要的是稳定性好。如果联机打印中电脑有故障或软件异常则容易影响打印,甚至导致打印失败。下面,小编分别详细说说创想三维3D打印机两种打印方式及打印机使用的注意事项。看完之后相信大家对3D打印机的操作有一个全新的认识。

  一、SD卡打印

  打印前将用切片软件导出的.gcode格式的文件复制到SD卡根目录中(注:.gcode文件的名字需为英文或数字,不能有中文字符)。

创想三维3D打印机使用教程

  当选择了文件开始打印的时候,打印机会先预热喷嘴和热床,当温度加热到打印温度后,打印机X轴、Y轴、Z轴会自动回原点,然后打印机就会开始打印。

  二、联机打印

  (一)驱动安装

  打印机安装并测试完成后先将配备的USB线将电脑和打印机连接。如果电脑右下角弹出提示驱动安装成功,则电脑与打印机连接成功(则可跳过驱动安装步骤),如果提示驱动安装失败,如下图所示:

创想三维3D打印机使用教程

  1.则需手动安装驱动,先打开电脑的设备管理器,可看到驱动安装失败的状态时,其他设备USBserialport有一个黄色的叹号,右击-选择更新驱动程序,如下图所示:

创想三维3D打印机使用教程

  2.选择更新驱动软件后,弹出更新驱动程序软件的两个更新方式1自动搜索更新驱动和2手动查找更新驱动,如下图所示:

创想三维3D打印机使用教程

  3.先选择自动更新,如无法自动安装,则关闭该对话框,如下图所示:

创想三维3D打印机使用教程

  4.则需选择上图中2手动查找更新驱动后弹出下图更新驱动的对话框,1先将驱动解压到桌面,2指定驱动位置为桌面,3单击下一步,则会弹出是否安装该驱动,4单击安装,驱动安装完成后5单击关闭如下图所示:

创想三维3D打印机使用教程
创想三维3D打印机使用教程
创想三维3D打印机使用教程

  5.驱动安装完成后即可,驱动安装完成后端口的状态如下图所示:

创想三维3D打印机使用教程

  (二)打印机参数设置

  1.驱动安装完成后打开切片软件单击1文件,选择2参数设置,则弹出参数设置对话框,3打印窗口设置选择专业模式,4单击ok即可。

创想三维3D打印机使用教程

  2.选择1单击文件,选择2打印机设置,则弹出打印机设置对话框,通讯设置中将4端口选择com3,将波特率选择Auto,再5单击确认即可。

创想三维3D打印机使用教程

  3.将切片参数设置好再单击1USB即可弹出2打印操作对话框3单击打印,待喷嘴和热床加热到设定温度后打印机将会开始打印,如下图所示:

创想三维3D打印机使用教程

  4.打印机联机打印中,如下图所示

创想三维3D打印机使用教程
创想三维3D打印机使用教程

  三、打印机使用注意事项

  打印前确保底板用夹子固定牢固,美纹纸贴平且美纹纸不重合!

  在有耗材且未打印的情况下尽量避免使喷嘴长时间处于高温的状态而使耗材碳化导致喷嘴堵塞!

  不使用受潮或长期高温导致变脆易断的耗材!

  长期不使用打印机时尽量将耗材取下密封并放于干燥处!

  机器推荐:创想三维Ender-3S千元级3D打印机

附录:用cure 联机打印过程的截图。

Go to manage printers in Cura, choose your printer, and hit Activate. Wait ten seconds, then slice your file. You should see Print over USB as an option. You may have to close and restart Cura or turn off your printer and turn it back on to get this to work, especially if you’ve been trying an failing to connect for a while.

Be sure to only have one instance of Cura open at once, and no other connections on that COM port active or Windows will not allow Cura to connect to the printer. I connect quadcopters to my PC to adjust the settings over USB and unless I unplug them I cannot print over USB.

树莓派机器人制作笔记:第8章 树莓派控制伺服电机(舵机)

Published by:

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

  • 伺服电机的基础知识。
  • 控制伺服电机的基本原理。
  • 使用树莓派控制伺服电机的实践。
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)

Published by:

   直流电机是机器人行走机构的理想选择之一,我们通常使用直流电机来驱动机器人行走。在第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桥直流电机驱动模块来控制一个直流电机的转向和转速的电路、思路和程序等知识。

后记

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

树莓派机器人制作笔记:第6章 树莓派与脉冲宽度调制(PWM)

Published by:

   上一章我們介紹瞭如何用樹莓派點亮和熄滅一個LED,但如何控制LED燈的亮度呢?脈衝寬度調製(Pulse Width Modulation, PWM)能很好的解決這個問題。脈衝寬度調製是一種簡單、高效、應用廣泛的控制方式,還可以用於控制直流電機的轉速、舵機的轉角角度等,本章將介紹樹莓派與脈衝寬度調製(PWM)的相關知識,主要內容如下。

  • 脈衝寬度調製(PWM)的基本概念和基本原理。
  • 樹莓派RPi.GPIO庫產生和控制PWM的方法。
  • 在樹莓派上使用LED演示和驗證使用PWM。

6.1 脈衝寬度調製(PWM)

   脈衝寬度調製(PWM)是一種高效的數字電壓控制技術,它利用微處理器的數字輸出來對模擬電路進行控制,通過控制固定電壓的直流電源開關頻率,改變負載兩端的電壓,進而達到控制要求的一種電壓調整方法。爲更好的理解和使用PWM,我們首先需要了解以下兩個概念。

  • 頻率,以Hz爲單位,一個脈衝信號時間週期的倒數。如果PWM的輸出頻率比較低,例如只有5Hz,那麼在控制一個LED時候,LED就會一閃一閃的,較高的頻率可以讓運行更爲平滑,但PWM的輸出頻率並不能無限的高,而且在高頻情況下,測定的PWM頻率會與作爲樹莓派參數提供的頻率略有出入。因此,在使用PWM時,應該選擇一個合適的頻率,對於控制一個LED亮度來說,一般100Hz就足夠了。
  • 佔空比,就是輸出的PWM脈衝信號中,高電平保持的時間與該PWM的時鐘週期的時間之比。如圖6.1所示,假設PWM脈衝的頻率爲1000Hz,那麼它的時鐘週期T就是1ms(即1000us),如果高電平持續時間t1爲200us,低電平的時間t2爲800us,那麼佔空比就是200:1000(即1:5)。

   從應用的角度,我們可以簡單的將PWM理解爲通過改變脈衝信號的頻率和高電平的持續時間(或佔空比)來實現電壓控控制的一種方法。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓爲3.3V),第一個信號是一個佔空比爲20%的PWM輸出,即在信號週期中,20%的時間爲高電平(邏輯1),其餘80%的時間爲低電平(邏輯0),對應的電壓爲滿幅值的20%(0.66V)。第二、三個信號分別是佔空比爲50%和80%的PWM輸出,對應的電壓分別爲1.65V和2.64V。

6.2 樹莓派操控PWM

   在樹莓派上,可以通過對GPIO的編程來實現PWM,RPi.GPIO庫就提供了一個PWM功能,以下是使用RPi.GPIO庫的PWM功能的方法。

  • 創建一個PWM實例
pwm = GPIO.PWM(channel, frequency)  

channel:指定要輸出PWM信號的GPIO引腳;
frequency:指定PWM信號的初始頻率,單位爲Hz,其值應大於0.0。

  • 啓用PWM
pwm.start(dc)  

dc:指定PWM信號的初始佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 更改PWM頻率
pwm.ChangeFrequency(freq)  

freq:指定PWM的新頻率,單位爲Hz,其值應大於0.0。

  • 更改PWM佔空比
pwm.ChangeDutyCycle(dc)  

dc:指定PWM的新佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 停止PWM
pwm.stop()  

6.3 PWM驗證實驗

   接下來,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗裏,您將可以手動改變LED的亮度,一方面我們將儘可能用上RPi.GPIO庫中PWM的相關函數,讓您更好了解這些函數的使用,另一方面讓您更爲直觀的理解PWM的基本原理。

6.3.1 實驗電路

   本實驗的電路及所用到的材料與第五章“點亮LED燈”實驗完全一樣,我們不需要做任何變動。

6.3.2 程序思路

   與第五章“點亮LED燈”實驗相比,本實驗最大的不同在於程序代碼,以下是本實驗的基本思路。

BEGIN  
    引入GPIO庫  
    將GPIO19設置爲輸出模式  
    
    創建PWM對象,並指定初始頻率  
    啓動PWM,並指定初始佔空比  

    等待輸入新PWM頻率  
    將PWM的頻率修改爲新頻率  
    
    DO FOREVER  
        等待輸入新LED亮度(PWM佔空比)  
        改變LED亮度(PWM佔空比)  
    ENDO  
    停止PWM  
    清理釋放GPIO資源  
END  

6.3.2 程序代碼

   按照第4章介紹的方法新建一個項目,然後按照第五章的方法輸入運行以下代碼,程序的詳細說明見註釋。

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

if __name__ == '__main__':
    LedPin = 19
    freq = 100                          # 存放PWM頻率變量,這裏初始值爲100,可以根據實際需要修改
    dc = 0                              # 存放PWM佔空比變量,這裏初始值爲0,可以根據實際需要修改

    GPIO.setmode(GPIO.BCM)              # 使用BCM編號方式
    GPIO.setup(LedPin, GPIO.OUT)        # 將GPIO19設置爲輸出模式

    pwm = GPIO.PWM(LedPin, freq)        # 創建PWM對象,並指定初始頻率
    pwm.start(dc)                       # 啓動PWM,並指定初始佔空比

    try:
        freq = int(input("Please input the frequency of PWM(1-2000Hz): "))  # 等待輸入新PWM頻率
        pwm.ChangeFrequency(freq)       # 改變PWM頻率
        while True:
            dc = int(input("Please input the duty cycle(0-100): "))         # 等待輸入新PWM佔空比
            pwm.ChangeDutyCycle(dc)     # 改變PWM佔空比
    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理釋放GPIO資源,將GPIO復位

   程序運行後,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間),然後您可以通過不斷的輸入新的PWM佔空比來改變LED的狀態。例如,當您輸入的PWM頻率爲100時,然後分別輸入10、30、50、80、100的PWM佔空比,您將看到LED會一次比一次亮;當您輸入的PWM頻率爲5時,LED會不斷的閃爍,輸入不同的佔空比只會改變LED點亮的時間長度,而亮度基本不變,當佔空比爲100時,LED長亮。

6.4 本章小結

   本章首先介紹了脈衝寬度調製(PWM)的基本概念和基本原理,其次介紹樹莓派產生和控制PWM的方法,最後通過一個PWM實驗演示如何使用樹莓派操作PWM,以更爲直觀的方式體驗PWM。

树莓派机器人制作笔记:第5章 用树莓派点亮LED灯

Published by:

   用树莓派点亮一个LED灯是非常简单的事情,但却非常重要,是利用GPIO控制外部硬件设备的基础,机器人的大部分功能都可以通过操纵GPIO来实现的。换句话说,能控制一个LED灯,就能让机器人动起来。本章将的主要内容如下。

  • 搭建一个树莓派多功能实验平台的材料及其功能用途。
  • 树莓派的GPIO引脚功能和基本用法。
  • 点亮一个LED灯的电路、程序设计思路和代码。

5.1 搭建实验平台

   为便于后续的实验,我们首先需要搭建一个多功能实验平台(见图5.1,含本章所需材料),各部件的功能用途如下。

图 5.1 多功能实验平台

  • 1:树莓派3B+型主板(含电源)
       一块树莓派3B+型主板(含电源),该主板应配备有一张已经安装好Raspbian系统的MicroSD卡。
  • 2:面包板
       实验过程中,面包板非常适用于电子电路的组装和调试,各种电子元器件可以根据需要随意插入或拔出,而无需焊接,节省了电路的组装时间,而且元件可以重复使用。
  • 3:T型GPIO扩展版
       GPIO扩展版上标有GPIO引脚的功能,与面包板配合使用非常便于对GPIO进行外接。
  • 4:40P排线
       用于连接树莓派与T型GPIO扩展版,长度适中即可。
  • 5:实验平台底座
       使用一块亚克力板作为实验平台的底座,用于固定树莓派主板和面包板,以便于实验操作,同时对树莓派主板形成一定的保护。
  • 6:万用表
       在进行GPIO硬件控制调试的时候,如果实验结果不是事先所预计的,那么我们可以使用万用表对电路进行简单的测试,排查问题。
  • 7:LED灯
       发光二极管LED是一种廉价和高效的光源,常在电路及仪器中作为指示灯,或者组成文字或数字显示。LED灯非常便于显示GPIO引脚的输出状态,在开发树莓派外部硬件控制程序时,可以先使用LED灯确定GPIO引脚输出正确后再连接要控制的硬件,避免由于GPIO输出错误而导致外部硬件损坏。本章我们需要用到到一个红色的LED灯,需要注意的是LED较长的引脚为正极,较短的引脚为负极。
  • 8:电阻
       实验过程中,请根据实际选择必要的电阻,本章需要用到一个470Ω或1kΩ的电阻。
  • 9:杜邦线
       用于连接各电子元件,无需焊接,本章仅需要用到两根公对公的杜邦线。为便于识别,建议遵循有关规范,连接电源(GPIO引脚)的线采用红色线连接,接地端使用黑色线连接。

5.2 GPIO引脚

   前面我们讲过,树莓派与普通计算机最大的区别就在于它拥有若干个可编程的GPIO,可以用来控制外部设备、从外部设备获取信息或是和硬件进行数据交互等,因此了解各个GPIO引脚的功能和使用方法是非常重要的。树莓派GPIO接口已发布了3个版本,原始的两个版本仅有26个引脚,“+”型树莓派版本有40个引脚,本章及后续章节我们将主要介绍“+”型树莓派版本的GPIO。
   树莓派GPIO接口有BOARD、BCM和wiringPi三种编号方式,三种编码方式的对应关系如表5.1所示。

表 5.1 树莓派40Pin引脚对照表

  • BOARD
       BOARD编号方式是树莓派主板上P1接头上的的引脚号,从左到右,从上到下进行编号,左边为奇数,右边为偶数,支持BOARD编号方式的库主要有RPi.GPIO、WiringPi-Go。
  • BCM
       BCM编号侧重于CPU寄存器,是根据Broadcom SOC的GPIO寄存器编号的,支持的库比较多,用的也比较多,是后续章节主要使用的编号方式。为便于使用BCM编号方式,建议采用类似“T型GPIO扩展版”或“GPIO参考卡片”等配件,让引脚功能一目了然。
  • wiringPi
       wiringPi编号侧重于实现逻辑,GPIO端口从0开始编号,WiringPi库是支持wiringPi编号方式的最主要GPIO库。

   B+型树莓派主板的40个引脚提供了17个GPIO专用接口,1个UART总线接口、1个SPI总线接口、1个I2C总线接口、2个5V电源接口、2个3.3V电源接口、8个地接口,使用的时候一定先要清楚选择了那套编号方式,相应的库是否支持。

提示:

  • 通电后不要使用金属物体(如螺丝刀等)接触GPIO接口,或短接GPIO引脚。
  • 外接输入输出设备时,要先仔细了解设备的额定功率(含电压和电流),不要直接连接高功耗元件(如直流电机等),或输出电压超3.3V的设备。当使用低功率LED时,最好在LED的正极串联一个限流电阻。
  • GPIO工作在3.3V逻辑电平上,0V表示逻辑0,3.3V则表示逻辑1。调试GPIO程序时,可以使用万用表测试GPIO引脚电压,判断输出是否正确。
  • GPIO接口仅提供数字的输入和输出,当需要用到模拟输入时,可以使用ADC芯片或采用电阻式传感器来实现。

5.3 点亮LED灯

   在前面的章节中,我们已经介绍了大量的基础理论,接下来我们将进入实战,开始有趣的实验。本节将介绍如何使用树莓派控制一个LED灯,您将看到一个LED灯在树莓派的控制下不停的闪烁。

5.3.1 实验电路

   本实验的电路原理图如图5.2所示,一个红色发光二极管正极通过一个限流电阻串连到树莓派的GPIO19上,负极则连接到树莓派的GND上,从而形成一个完整的回路。

图 5.2 树莓派点亮LED电路图

   GPIO引脚的输出电压约为3.3V,高于LED上约1.7V的压降,如果直接串联,会有一个非常大的电流通过LED,这个电流通常大到可以损坏LED,甚至供电设备。因此,需要在LED和电源(GPIO引脚)间串联一个电阻限制电流,从而对LED和为其供电的GPIO引脚提供保护。不同厂家,不同颜色压降略有区别,我们假设所用LED的压降为1.8V,GPIO引脚的电流为3mA,限流电阻大小的计算方法如下:

R = ( 3.3V - 1.8V ) / 3mA = 500Ω  

   因此,我们选择使用一个1kΩ的电阻。该电路的最终实物连线图如图5.3所示。

图 5.3 电路实物连接图

提示:

  • 除了使用以上的方法计算限流电阻的值,您还可以访问类似实用工具大全http://tool.520101.com/网站,使用网站提供的LED限流电阻计算器进行计算。实际上,这个网站还提供了不少实用的电子电路计算工具,非常有助于我们后续章节的学习。
  • 限流电阻的阻值不应太小,也不能太大。太小,则起不到限流的作用;太大,则LED的亮度会比较暗。
  • 为保障树莓派主板和电子元件的安全,连线工作应在为断电的情况下进行,并在确定线路连接无误后再通电。

5.3.2 程序思路

   程序的基本设计思路如下:

BEGIN  
    引入GPIO库  
    引入time库  
    将GPIO19设置为输出模式  
    DO FOREVER  
        点亮LED
        等待1秒钟
        熄灭LED
        等待1秒钟
    ENDO
    清理释放GPIO资源
END

5.3.3 程序代码

   Python操作GPIO需要用到RPi.GPIO库,Raspbian系统默认未安装这个库,所以请先使用XShell远程登录树莓派运行以下命令安装RPi.GPIO库。

sudo apt install python3-rpi.gpio  

   RPi.GPIO库安装完毕后,按照第4章介绍的方法新建一个项目,然后输入以下代码并运行,运行效果如图5.4所示。程序的详细说明见注释,这里我们使用了try: Finally: 结构捕捉异常,确保当我们中断程序时(如使用Ctrl+C或者操作系统提供的方法),GPIO.cleanup()函数能被执行,以清理释放GPIO资源。在Pycharm下运行程序时,点击工具栏上的Stop按钮也可以中断程序。

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

GPIO.setmode(GPIO.BCM)                  # 使用BCM编号方式  

GPIO.setup(19, GPIO.OUT)                # 将GPIO19设置为输出模式  

if __name__ == '__main__':
    try:
        while True:                     # 无限循环  
            GPIO.output(19, True)       # 将GPIO19设置为高电平,点亮LED  
            time.sleep(1)               # 等待1秒钟  
            GPIO.output(19, False)      # 将GPIO19设置为低电平,熄灭LED  
            time.sleep(1)               # 等待1秒钟  
    finally:
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位  

图 5.4 实验运行效果

5.4 本章小结

   本章首先介绍搭建一个树莓派多功能实验平台所需的材料及其功能用途,然后详细介绍了树莓派GPIO引脚的三种编号方式、功能和使用注意事项,最后介绍用树莓派点亮一个LED灯的电路、程序设计思路和代码。