Raspberry PiでRS485通信しようとしてRS485トランシーバの選択を間違えて苦労した話.USB-RS485変換器を使えばこういうことはないはず.
Raspberry PiのP1端子にはシリアルポートが出ているのでここにRS485トランシーバをつなげれば簡単にRS485の機器と話せるようになるはずだった.
RS485で通信する機器のマニュアルには4線式,半2重と書いてあったが,トランシーバを選択するときに半2重だけ注目してしまい,MAX3485を選んだ.物が届いて,データシートやPythonの資料を読み直して,Raspberry PiにはMAX3485の送信モードと受信モードを簡単に切り替える方法がないことに気が付いた.もちろんGPIOでRE,DE端子を制御することはできるが,送信データがすべて出力されたことをソフト側で正確に知る方法がないのだ.
しょうがないので,通信速度と送信バイト数から送信時間を計算して,それに合わせてRE,DE端子を制御することにした.1バイトの送信にはスタートビット,ストップビット合わせて10ビット必要だから(送信時間)=(1ビットの送信時間)×(送信バイト数)×(10ビット)で求まる.
なお,RE,DE端子は両方とも制御する必要がある.データシートを見ると送信時のRE端子はXになっているため,REを0に固定してDEだけ制御すれば送受信を切り替えられるように思える.しかしこの方法だとDE=1において受信も有効になっており,送信したデータがそのままエコーバックされる.これを避けるには送信時にRE=1,DE=1とし,受信時はRE=0,DE=0としなくてはいけない.
今回の失敗:半2重には半2重しかつながらないと勘違いしていたこと.今回の機器は通信手順が半2重でも4線式なのでトランシーバに全2重のMAX3490を選べば,送受信モードを気にせずそのままつなげられたはずである.