経緯
- UART通信等の勉強にインタフェース2024年3月号を購入
- Raspberry Pi Picoを未所有
- UART-USB変換ICやケーブルも未所有
やったこと
- とりあえず手元のRaspberry Pi 4でUART通信を試した
- 対向機器を使わないで,GPIOを使ってループバックで通信をした
- pythonプログラムで疎通確認ができた
1. Raspberry Pi 4のシリアルポートを有効化する
今回はRaspberry Pi 4のUART2とUART4を用います。公式ドキュメントを参考にしました。
- raspi-configを実行
- 「3 Interface Options」> 「P6 Serial Port」を選択
- シェルへのログインにシリアル通信を使うか聞かれるので「いいえ」を選択
- ハードウェアのシリアルポートを有効化するか聞かれるので「はい」を選択
- 確認画面で内容を確認して「了解」を選択
- Finishを選択し,reboot実行
2. UART2とUART4を有効化する
UART2とUART4を有効化します。公式ドキュメントを確認するとUART0とUART1はそれぞれ既にconsoleとBluetoothに割り当てられているので,今回はUART2とUART4を使います。
ラズパイのフォーラムを参考にしました。
- nanoで/boot/config.txtを開く
nano /boot/config.txt
- [all]の後に以下を追加する
[all]
dtoverlay=uart2
dtoverlay=uart4
enable_uart=1
再起動した後に以下のようにttyAMA1とttyAMA2がデバイスとして認識されていたらOKです。ttyAMA1がUART2,ttyAMA2がUART4のはずです。
> ls /dev/ | grep ttyAMA
ttyAMA0
ttyAMA1
ttyAMA2
3. pythonプログラムを作成する
公式ドキュメントを参考に適当に作りました。
# -*- coding: utf_8 -*-
import serial
#インスタンス生成
serUart2 = serial.Serial('/dev/ttyAMA1', 9600, timeout = 0.5);
serUart4 = serial.Serial('/dev/ttyAMA2', 9600, timeout = 0.5);
#データ送信
serUart2.write("Hello World")
#データ受信
data = serUart4.readline()
#データ出力
print('uart4 recv data : {0}'.format(data))
# ポートのクローズ
serUart2.close()
serUart4.close()
4. GPIOを接続する
ジャンパワイヤを使ってPIN21とPIN27,PIN24とPIN28を接続します。
以下のコマンドでUART2(TXD2とRXD2)がGPIO0とGPIO1に,UART4(TXD4とRXD4)がGPIO8とGPIO9に割り当てられていることが確認できます。
> raspi-gpio get
BANK0 (GPIO 0 to 27):
GPIO 0: level=1 fsel=3 alt=4 func=TXD2 pull=NONE
GPIO 1: level=1 fsel=3 alt=4 func=RXD2 pull=UP
GPIO 2: level=1 fsel=4 alt=0 func=SDA1 pull=UP
GPIO 3: level=1 fsel=4 alt=0 func=SCL1 pull=UP
GPIO 4: level=1 fsel=0 func=INPUT pull=UP
GPIO 5: level=1 fsel=0 func=INPUT pull=UP
GPIO 6: level=1 fsel=0 func=INPUT pull=UP
GPIO 7: level=1 fsel=0 func=INPUT pull=UP
GPIO 8: level=1 fsel=3 alt=4 func=TXD4 pull=NONE
GPIO 9: level=1 fsel=3 alt=4 func=RXD4 pull=UP
GPIO 10: level=0 fsel=0 func=INPUT pull=DOWN
===以下略===
また,以下のコマンドでGPIOとPINの対応が確認できます。
> pinout
===前略===
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
===以下略===
5. 実行
pythonプログラムを実行すると,以下のようにUARTループバック通信の疎通が確認できました。
> python uart2touart4.py
uart4 recv data : Hello World
まとめ
とりあえずUART通信ができました。「raspi×UART」は何番煎じだよって感じですが,意外とループバックで通信してみた人はあまりいないんじゃないでしょうか。
次はPicoを購入してインタフェース2024年3月号の内容を試したいと思います。
記事にはしません。