0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UART通信 Raspberry Pi 4のGPIOでループバック編

Posted at

経緯

  • UART通信等の勉強にインタフェース2024年3月号を購入
  • Raspberry Pi Picoを未所有
  • UART-USB変換ICやケーブルも未所有

やったこと

  • とりあえず手元のRaspberry Pi 4でUART通信を試した
  • 対向機器を使わないで,GPIOを使ってループバックで通信をした
  • pythonプログラムで疎通確認ができた

1. Raspberry Pi 4のシリアルポートを有効化する

今回はRaspberry Pi 4のUART2とUART4を用います。公式ドキュメントを参考にしました。

  1. raspi-configを実行
  2. 「3 Interface Options」> 「P6 Serial Port」を選択
  3. シェルへのログインにシリアル通信を使うか聞かれるので「いいえ」を選択
  4. ハードウェアのシリアルポートを有効化するか聞かれるので「はい」を選択
  5. 確認画面で内容を確認して「了解」を選択
  6. Finishを選択し,reboot実行

2. UART2とUART4を有効化する

UART2とUART4を有効化します。公式ドキュメントを確認するとUART0とUART1はそれぞれ既にconsoleとBluetoothに割り当てられているので,今回はUART2とUART4を使います。
ラズパイのフォーラムを参考にしました。

  1. nanoで/boot/config.txtを開く
    nano /boot/config.txt
  2. [all]の後に以下を追加する
/boot/config.txt
[all]
dtoverlay=uart2
dtoverlay=uart4
enable_uart=1

再起動した後に以下のようにttyAMA1とttyAMA2がデバイスとして認識されていたらOKです。ttyAMA1がUART2,ttyAMA2がUART4のはずです。

> ls /dev/ | grep ttyAMA
ttyAMA0
ttyAMA1
ttyAMA2

3. pythonプログラムを作成する

公式ドキュメントを参考に適当に作りました。

uart2touart4.py
# -*- 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月号の内容を試したいと思います。
記事にはしません。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?