ヒマな時間で、ちょこちょことやっている
「NXTとArduinoをRS485で通信しよう」プロジェクトですが・・・
なんとか通信はできるようになった・・・ような感じがする・・・
でも、謎(というか不具合)が2つ残っています。
①NXTの電源を切ると通信ができなくなる。
②データ化けが3%くらいの割合で発生する。
①は・・・電源を切ったら通信ができないのは当たり前です。 そうじゃなくて、電源を入れなおすと、それまで通信できていたのに、できなくなるってことです。
そうなった場合は、NXTで受信だけのプログラムを一回起動させると、送受信のプログラムが機能するようになるという・・・摩訶不思議な現象です。
でも、これは解決しました。
どうやったか・・・
プログラムの最初に
RS485Initialize( );
を入れました。
そうしたら、NXTの電源を入れなおしても、そのまま通信ができます。
このイニシャライズの関数は、
Initialize RS485 port.
Initialize the RS485 UART port to its default values. The baud rate is set to 921600 and the mode is set to 8N1 (8 data bits, no parity, 1 stop bit). Data cannot be sent or received over the RS485 port until the port is configured as as a hi-speed port, the port is turned on, and the UART is initialized.
こんな説明なのですが・・・よく判りません。 とにかくUARTの初期化をしているようです。
直接の原因は判ったのですが、根本的な原因はわかりません。
そこらへんが・・・ダメですねぇ。
すっきりしませんが・・・とにかく、使えるようにはなりました。
では、②についてです。
NXTからArduinoに1バイトのデータを送ります。
Arduinoは、受け取った1バイトのデータをそのままNXTに送り返します。
NXTは受け取った1バイトのデータと、最初に送った1バイトを比較します。
ということを、1000回繰り返してデータの同値性を調査します。
そうすると・・・
1000回ループで27個とか、32個とか・・・大体3%程度が化けます。
3%というのは、多いですよね。
いやっ、多すぎます。
これじゃあ、使い物にならないでしょう。 きっと!
ところどころに時間待ちをする Wait関数を埋め込んでも、単に処理が遅くなるだけです。
やっぱり、諦めた方が良いのでしょうか・・・
これも、結果的には解決しました。
2本の通信の信号線(黄色と青色の線)間に120Ωの抵抗を入れていたのですが・・・
これを外したら、データ化けが0になりました。
1000回ループでデータ化け無し!
なんで、120Ωを入れていたのかですが
秋月電子で購入したRS485トランシーバ LTC1485 の添付資料の図に
書いてあったので、良くわかんないけど、RS485通信の常識なんだろうと思って
いれときました!
この抵抗が必要無いのだったら、図に入れとかないで欲しいです。(笑)
とにかく・・・これで、やっと使えるかもしれない・・・
注)これは2011年に書いたけど、(なぜか)投稿しなかった古い記事です・・・ですので、今となっては役に立たない情報かもしれません・・・