介绍
由于项目原因需要使用树莓派连接串口,从串口获取机器人的信息同时也向机器人发送控制信息,因此串口在这里灰常重要。下面简单介绍下目前的方案:
方案介绍
旧方案: 借助串口模块(FT232、CH340模块等)。串口模块插在树莓派上。
-
缺点:
- 因为机器人要在室外工作,经常由于阳光的照射导致机器人、串口模块温度升高,从而导致串口工作不稳定。
- 因为串口模块插在树莓派的USB上,经常会由于机器人颠簸导致连接不良。
- 不同型号的模块用的串口通信芯片可能不一样,这个时候在配置.rules来固定串口时,需要对不同的串口模块分别配置单独的规则,详情请移步之前教程《串口绑定别名》。
- 串口和树莓派之间连接、串口和机器人之间连接都可能出现问题,导致系统问题出现问题的情况有点多,排查起来也比较麻烦。
-
优点:
- 串口插拔方便 ,坏了可以直接换。
- 用起来方便,不用很麻烦的配置环境。
-
新方案: 直接使用树莓派的GPIO中的串口,这样可以减少串口模块的使用,避免出现上述问题。
串口配置的各种坑
为了使用树莓派板上的GPIO串口,折腾了两天,虽然目前网上挺多资料的,但是由于系统的不同,各种问题:
- 树莓派硬件不一样,本教程里面用的是树莓派3B+,网上大多数都是树莓派3B的教程
- 系统不一样,本教程使用的是Ubuntu mate 16.04系统,网上大多数都是Debin、Centos等系统,反正就是没有Ubuntu mate的资料。(这个可以理解,毕竟树莓派3B+目前还没有官方的Ubuntu mate系统提供,当初我安装Ubuntu mate 16.04的时候也是各种坑,想用这个系统的请移步树莓派3B+ 安装Ubuntu mate 16.04教程)
主要就是上面这些问题啦,不过是真心难解决。下面给大家详细的解决方案:
配置步骤
首先大家可以使用命令看一下树莓派3b+支持的GPIO串口
ls -la /dev/
大家可以发现如下图所示,应该是没有红色框内的串口ttyS0,只有蓝色框内的串口ttyAMA0。其中/dev/ttyAMA0串口时给蓝牙模块使用的。另外一个ttyS0应该是对接的miniUART,不过不知道为啥这个不显示,而且不能直接用,需要进行配置。我看了有些文章里面说,需要将连接蓝牙的串口/dev/ttyAMA0映射到serial0,因此这个比较稳定(图中按着文章中的步骤配置完后serial0映射的是串口/dev/ttyS0),但是我测试了2个小时也没有看到串口/dev/ttyS0崩溃,而且运行时CPU占用率80%,所以就没必要来回切换映射咯。
![](https://i-blog.csdnimg.cn/blog_migrate/66295ea6d4a9ddbd477186496cd17858.png)
启用串口ttyS0
下面打开串口/dev/ttyS0,在命令框输入
sudo raspi-config
打开系统配置界面如下图,选择Inerfacing Options
![](https://i-blog.csdnimg.cn/blog_migrate/1bfb881c8273866d75031561e77fafb9.png)
然后选择 serial
![](https://i-blog.csdnimg.cn/blog_migrate/f6aaed17265767a21c6e88b970fcffd7.png)
选择No
![](https://i-blog.csdnimg.cn/blog_migrate/cec020157287765200c34a09714595d3.png)
然后Yes
![](https://i-blog.csdnimg.cn/blog_migrate/b63d34ee5c4d531c8ffa5ad93ee1e12d.png)
最后选择保存,退出即可。
这个时候在输入下面的命令就可以看到串口ttyS0,但是还是不能用,继续配置。
ls -la /dev/
关闭Console
在终端中输入:
sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service
然后配置cmdline.txt,使用的是vim,不会用的可以使用其他编辑器
sudo vim /boot/cmdline.txt
打开后你应该可以看到这个,我自己的系统打开后在root wait后面还有一长串,不过不影响
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes root wait
删掉里面的console=serial0,115200
,注意,其他的不要删掉,不管后面是什么,都只删掉中间的这一句话。
保存之后,重启树莓派。
然后,在此编辑cmdline.txt
sudo vim /boot/cmdline.txt
在里面输入console=serial0(or ttyAMA0),115200
,后面的不要动,在中间插入就行,没错,括号里的也要写上去不要乱改。
dwc_otg.lpm_enable=0 console=tty1 console=serial0(or ttyAMA0),115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
然后,再重启,就可以啦
测试
连线
树莓派串口接线如下图所示:
记得TX接RX,RX接TX
![](https://i-blog.csdnimg.cn/blog_migrate/ad57d928b4cd73c2bbba723834dc5deb.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/86b86fd5957ba8798a3ce255ab1f1485.png)
编辑文件
vim test.py
输入下面的代码(注意这里配置的串口波特率是9600):
import serial
serialport = serial.Serial("serial0", baudrate=9600, timeout=3.0)
while True:
serialport.write("rnSay something:")
rcv = serialport.read(10)
serialport.write("rnYou sent:" + repr(rcv))
运行代码
运行代码之前,需要先提升串口/dev/ttyS0的读写权限
sudo chmod 666 /dev/ttyS0
然后在运行代码
pythoin test.py
ttyS0串口权限
前面虽然已经把串口配置好,但是每次使用串口时需要运行sudo chmod 666 /dev/ttyS0
给串口权限,为了方便,下面介绍如何把串口/dev/ttyS0自动获取权限
先运行
sudo systemctl mask serial-getty@ttyS0.service
然后编写.rulrs
规则
sudo vim /etc/udev/rules.d/90-local.rules
然后在里面加上:
KERNEL=="ttyS0*", OWNER="root", GROUP="tty", MODE="0666"
这里简单解释下,其中KERNEL
是串口的名字,OWNER
是拥有者,对应下图中红色框,GROUP
是所属的群,对应下图中的蓝色框
![](https://i-blog.csdnimg.cn/blog_migrate/efcf659b501b05d68afbad42b7ced112.png)
然后,重启,完事儿~
如果想修改蓝牙和串口之间的映射,请参考下面的连接