MAX485の通信モジュールを入手したので、2台のラズパイをRS485通信でシリアル通信してみました。
まだ送信側と受信側の一方通行の動作確認のみです。
ラズパイでシリアル通信の準備
GPIO
ラズパイのGPIOにはUARTが用意されています。
GPIO 14 (UART_TXD) 8 pin
GPIO 15 (UART_RXD) 10 pin
他にVccとして 5V(または3.3V)GNDの計4本使用します。
raspi-config
ラズパイでシリアルポートを使用するにはraspi-configで設定が必要です。
$ sudo raspi-config で起動し、
Interfacing Options – Serial から
Sould you like a login shell to be accessible over serial? – No
Would you like the serial port hardware to be enabled? – Yes
シリアルポート名
これで以下のポート名でシリアルポートが使用できます。
ラズパイ B: /dev/ttyAMA0
ラズパイ3 B: /dev/ttyS0
MAX485通信モジュール
Amazonで159円と安かったので買ってみたら、2個セットの値段でした。1個80円です。aliexpres並みかも。
KKHMF MAX485 RS-485 TTL-RS-485モジュールコンバータ
接続
Fritzingで描きました。左が受信、右が送信側です。
送信側
回路図はラズパイ3ですが、旧モデルのラズパイBを使用しています。
ラズパイ – MAX485モジュール
———————————–
5V 2pin – Vcc
GND 6pin – GND
GPIO14 (UART_TXD) 8pin – DI
GPIO4 7pin – DE, RE
DEとREは相互接続し、送信時にラズパイのGPIO4でONにすることで送信可能になります。
受信側
ラズパイ3 – MAX485モジュール
———————————–
5V 2pin – Vcc
GND 6pin – GND, DE, RE
GPIO15 (UART_RXD) 10pin – RO を510Ω抵抗x3により2/3に分圧(5V x 2/3 = 3.3V)
DEとREは相互接続し、GNDに接続することで常時受信可能になります。
MAX485は5V動作、ラズパイのGPIOは3.3Vなので、受信信号の5Vを3.3Vに分圧してGPIOに入力しています。
RS485接続
MAX485モジュールのRS485端子のA, Bを送受信間で接続。
GNDも相互接続。
一応120Ωの終端抵抗をそれぞれのAB間に接続。
送受信プログラム
送信側
pythonで16バイトの固定文字列を10回送信してみました。
ラズパイBなのでシリアルポートは /dev/ttyAMA0 です。
送信前にGPIO4をONにしてMAX485のDEをEnableにしています。
import serial
import time
import RPi.GPIO as GPIO
ser = serial.Serial('/dev/ttyAMA0', 19200, timeout=None)
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.output(4, True)
for i in range(10):
msg = "0123456789abcdef"
data = bytes(msg, 'utf-8')
ser.write(data)
print(msg)
time.sleep(1.0)
GPIO.cleanup()
ser.close
実行結果
pi@raspione:~ $ python3 write_serial_test.py 0123456789abcdef 0123456789abcdef ..... 0123456789abcdef 0123456789abcdef
受信側
cuツールを使用しました。
$ sudo chmod 666 /dev/ttyS0 $ sudo cu -l /dev/ttyS0 -s 19200 Connected. 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
cu の終了方法
「~.」を入力
結果
正常に送信できました。
pythonのプログラムの代わりに送信側も cu ツールを起動してキーボード入力すると受信側に表示されました。
120Ωの終端抵抗が無くても通信できました。10cmぐらいの距離なんで大丈夫ですね。
RX受信波形16バイト
RX受信波形1バイト (0x31)
RS485 AB間信号波形 終端抵抗あり
RS485 AB間信号波形 終端抵抗なし
MAX485をVcc 3.3Vで動作させてみる
MAX485 はVcc 5Vです。Vcc 3.3V用にはMAX3485があるので本来の仕様外ですがラズパイの3.3VをVccにして試しました。
一応これでも動作しました。
AB間の信号Vpp 1.3程度とは小さくなりましたが、RS485のケーブル距離が10cm程度なので通信はできました。
RS-485 AB間の波形。送受信端 120Ω終端抵抗あり
Vcc 5Vの場合: Vpp 3V
Vcc 3.3Vの場合: Vpp 1.36V
まとめ
まずはMAX485モジュールの動作確認を兼ねて、一方通行ですが、ラズパイをRS485通信してみました。
RS485は半2重通信で送受信の切換えをRE,DE端子に指示する必要がありますので、そこを踏まえて双方向にする必要があります。
また次の機会に。