樹莓派3B+使用GPIO實現串口通信

https://www.circuits.dk/setup-raspberry-pi-3-gpio-uart/

介紹

  由於項目原因需要使用樹莓派連接串口,從串口獲取機器人的信息同時也向機器人發送控制信息,因此串口在這裏灰常重要。下面簡單介紹下目前的方案:

方案介紹

  舊方案: 藉助串口模塊(FT232、CH340模塊等)。串口模塊插在樹莓派上。

  • 缺點:

    1. 因爲機器人要在室外工作,經常由於陽光的照射導致機器人、串口模塊溫度升高,從而導致串口工作不穩定。
    2. 因爲串口模塊插在樹莓派的USB上,經常會由於機器人顛簸導致連接不良。
    3. 不同型號的模塊用的串口通信芯片可能不一樣,這個時候在配置.rules來固定串口時,需要對不同的串口模塊分別配置單獨的規則,詳情請移步之前教程《串口綁定別名》
    4. 串口和樹莓派之間連接、串口和機器人之間連接都可能出現問題,導致系統問題出現問題的情況有點多,排查起來也比較麻煩。
  • 優點:

    1. 串口插拔方便 ,壞了可以直接換。
    2. 用起來方便,不用很麻煩的配置環境。
  • 新方案: 直接使用樹莓派的GPIO中的串口,這樣可以減少串口模塊的使用,避免出現上述問題。

串口配置的各種坑

  爲了使用樹莓派板上的GPIO串口,折騰了兩天,雖然目前網上挺多資料的,但是由於系統的不同,各種問題:

  1. 樹莓派硬件不一樣,本教程裏面用的是樹莓派3B+,網上大多數都是樹莓派3B的教程
  2. 系統不一樣,本教程使用的是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是所屬的羣,對應下圖中的藍色框

然後,重啓,完事兒~

如果想修改藍牙和串口之間的映射,請參考下面的連接

參考文獻

How to setup the UART on Raspberry Pi 3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章