https://www.circuits.dk/setup-raspberry-pi-3-gpio-uart/
介紹
由於項目原因需要使用樹莓派連接串口,從串口獲取機器人的信息同時也向機器人發送控制信息,因此串口在這裏灰常重要。下面簡單介紹下目前的方案:
方案介紹
舊方案: 藉助串口模塊(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
大家可以發現如下圖所示,應該是沒有紅色框內的串口ttyS0,只有藍色框內的串口ttyAMA0。其中/dev/ttyAMA0串口時給藍牙模塊使用的。另外一個ttyS0應該是對接的miniUART,不過不知道爲啥這個不顯示,而且不能直接用,需要進行配置。我看了有些文章裏面說,需要將連接藍牙的串口/dev/ttyAMA0映射到serial0,因此這個比較穩定(圖中按着文章中的步驟配置完後serial0映射的是串口/dev/ttyS0),但是我測試了2個小時也沒有看到串口/dev/ttyS0崩潰,而且運行時CPU佔用率80%,所以就沒必要來回切換映射咯。
啓用串口ttyS0
下面打開串口/dev/ttyS0,在命令框輸入
sudo rasp-config
打開系統配置界面如下圖,選擇Inerfacing Options
然後選擇 serial
選擇No
然後Yes
最後選擇保存,退出即可。
這個時候在輸入下面的命令就可以看到串口ttyS0,但是還是不能用,繼續配置。
ls -la
關閉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
編輯文件
vim test.py
輸入下面的代碼(注意這裏配置的串口波特率是9600):
import serial
serialport = serial.Serial("serial0", baudrate=9600, timeout=3.0)
while True:
serialport.write("rnSay something:")
rcv = port.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 mark 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
是所屬的羣,對應下圖中的藍色框
然後,重啓,完事兒~
如果想修改藍牙和串口之間的映射,請參考下面的連接