前の記事はこちら EV3ねた その14 いよいよArduinoとの接続
Arduino と EV3 を接続するのに、ArduinoのSDA(ポートA4)とSCL(ポートA5)を使用してしまうと、Arudinoに I2Cのセンサー(例えば TPA-81)を接続することができません。
つまり EV3 <-- (I2C) --> Arduino <--(I2C)--> TPA-81 としたいのですが・・・Arduino には1組のI2Cしかないので、片側にしか使えません・・・
そこで、nicosensor のソフトI2Cを片側に使って
EV3 <-- (ソフトI2C) --> Arduino <--(I2C)--> TPA-81
の接続の実験をしてみます。
nicosensor のページに掲載されているサンプルプログラムを改造して、TPA-81の値をArduinoで読み出して、その読み出した値をEV3に持ってこようとするのですが・・・全然うまく行きません。
いや、これで、(貴重な)一日をつぶしました。
まず、ハード的な接続ですが・・・
EV3とarduinoの間の接続は
EV3 Arduino
青 SDA <---> D2 (100kΩの抵抗をプルアップ接続)
緑 SCL <---> D3 (100kΩの抵抗をプルアップ接続)
黄 VBUS <---> +5V
赤 GRND <---> GND
ArduinoとTPA-81の接続は
Arduino TPA-81
A4 <---> SDA (10kΩの抵抗をプルアップ接続)
A5 <---> SCL (10kΩの抵抗をプルアップ接続)
+5v <---> +5V
GND <---> GND
こんな感じです。
最初は、プルアップ抵抗を100kΩにしていたのですが、EV3から給電すると、通信ができなくなったので、いろいろと実験をして10kΩに変更しました。
で・・・
①EV3:ArduinoにI2Cで通信を送ります。
②Arduino:EV3からの信号を受け取ります。
③Arduino:TPA-81の値を読み出します。
④Arduino:TPA-81から読み出した値をEV3に返答します。
⑤EV3:Arduinoから送られた値を受け取ります。
という筋書きなのですが・・・うまくいきません。
要所要所で、LCDに値を表示したり、LEDを光らせて原因を追究していくと・・・
EV3から一組のI2C通信をするには時間が長すぎるようです。(「ようです」というのは、はっきりした原因が分からないからです てへっ)
①⑤の間に②~④の時間が掛かりすぎて、①⑤のI2C通信がきちんと認識されていない感じです。
で・・・過去の自分がどうしたかを確認するために、NXTとArduinoを接続する実験をしたころのプログラムを発掘して確認すると・・・やっぱり、1つのI2C通信で完結できずに、複数の通信に分けていました。
どう解決したかというと
①EV3:ArduinoにI2Cで「センサーの値を読み出せ」の通信を送ります。
②Arduino:EV3からの通信を受け取ります。
③Arduino:EV3に「受け取ったよ」と返信します。
④EV3:Arduinoが受け取ったことを確認します。
⑤Arduino:TPA-81の値を読み出します。
⑥EV3:ArduinoにI2Cで「読み出した値を送れ」の通信を送ります。
⑦Arduino:EV3からの通信を受け取ります。
⑧Arduino:TPA-81から読み出した値をEV3に返答します。
⑨EV3:Arduinoから送られた値を受け取ります。
という複雑なやりとりで、TPA-81の値をEV3で受け取ることができました。
(つまり、①~⑤でTPA-81の値を読ませて、⑥~⑨で読んだ値を転送する)
ここまでしないとセンサーの外付けができないとなると、面倒ですね。
(NXTは、RS-485通信ができるので、こんな複雑なことをしなくても良かったのですが・・・)
EV3はUSBでのシリアル通信ができるらしいので、そっちを研究した方が良いのかも・・・ですね。
と・・・ここまで書いてから・・・
あれっ!? EV3の指示が来てからセンサーを読むから時間がかかるんだよね。
じゃあ、普段から(無駄だけど)常にセンサーを読み出しておいて、EV3から指示が来たら読み出しておいた値を転送すれば済むんじゃない・・・と気が付きました。(それができるかは、今後の研究ですかねぇ、ROBOTCの試用期間も過ぎてししまったので・・・)
そういえば、他のチームのロボットの超音波センサーは、常に動いていたなぁ・・・