Raspberry Pi (以降raspi)にolimexのUSB-RS485変換アダプタ(strawberry linuxで購入)を挿し、一方二個で1k円以下という格安RS485モジュールの接続をテストした覚書。
ラズベリーパイのUARTは他で使うので、USBシリアル変換タイプを試す
このアダプタにはCH340というUSBシリアル変換ICが使われている。raspiOSにドライバがロードされていれば、PnPで使えるはずです。まずそれを調べました。
また、格安RS485モジュール(Amazonで購入)は自動フロー回路と記載されていますが、回路図が公開されていないので回路を調査しました。
CH340ドライバを調べる。ドライバはロードされていた。
ターミナルで調査し、デバイス名を得る。ttyUSB0に割り付けられている。
あっけなく調査終了!
ちなみにFTDI系のUSBシリアルの場合は、
lsmod | grep ftdi です。
そして、CH340系とFTDI系同時に挿入したときは、ttyUSB0と1が使えますが、抜き差ししてみないとどちらかわからないのは、Windowsと同じです。
RS485モジュールを調べる。
このモジュールは3.3VLDO搭載で、インバータ4069とMAX485は3.3Vに接続されている。自動フロー制御回路の当たりを追う。
DIを反転してREとDEに入っている。立下りディレイはヒゲ防止か。CはLCRメータでインサーキット測定では80pと出ていたが、SGで動作させて信号遅延を確認。
遅延から換算して8pF程度と推測。インバータが4069なのでTxDから数百nsすでに遅延しているハズ。これらの遅延は超高速のレスポンスでもない限り問題なし。
回路はOKだが、MAX485は3.3V対応ではない。交換予定
Amazonの該当ページでは「動く」というレビューが多いが、ICの記名は「MAX485ESA」。セカンドソースはいっぱいあるがこの型番は普通5V仕様。動くかもしれないけど治具として使うには3.3V品に交換しないといけない。
また、5V系と接続可能みたいな仕様でしたが、ICが3.3V駆動である以上、5Vの信号をTxDにいれてはまずい気がする。電源はmax33Vとうたっているが、LDOはmax26V。調べないとうかつに使えないのである。
というわけで、後日MAX3485に交換予定。
簡単な送受信プログラム
IC交換前だが、動作確認。本番は9600か19.2kbps程度で使う予定ですが、115.2kbpsにて。
RS485モジュール側には秋月「AE-FT234X」(3.3V系)で受け、teratermで表示。
import serial
import time
# シリアルポート設定
ser = serial.Serial('/dev/ttyUSB0', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None)
try:
data_to_send = b'Hello, World!'
ser.write(data_to_send) # データを送信
while True: # 受信データのモニタ
if ser.in_waiting > 0:
received_data = ser.read(ser.in_waiting)
print(f'Received: {received_data.decode("utf-8")}')
time.sleep(1) # 1秒ごとに受信を確認
except KeyboardInterrupt:
print("abort")
finally:
ser.close()
動作的には、すんなり動きました。