ラズパイでRS485通信してみる(1)

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端子に指示する必要がありますので、そこを踏まえて双方向にする必要があります。
また次の機会に。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です