つまり、ロボットとしてのメイン制御部分はRPiに担当させ、Arduinoにはセンサーの監視とハードのコントロールを担当させる構想です。
本店と支店の関係というか、野球監督とキャッチャーの関係というか。
まあ、そんな役割分担です。
それには理由があります。
- Arduinoはセンサーからのアナログデータを読み取れるが、RPiにはできない。
- RPiはマルチタスクに対応できるが、Arduinoはシングルタスクしかできない。
主にいうと、この二つです。
どちらも致命的なポイントであり、何らかの拡張ハードを持ちこまない限り、単独では対応しきれない弱点になっています。
ゆえに、RPi+Arduinoという組み合わせがとても魅力的なものである訳です。
お互いの弱点を、見事にカバーすることができます。
なので、Ras2構築時にはRPi上でマルチタスクの制御ループを走らせ、Arduinoからの各種情報に基づき、適切な動作を行うよう条件設定する予定です。
しかしながら、それはまだ先の話。
現在は、ほんの初期の原理試作としてロボット・カーを自律走行させようとしているところ。
まだArduinoの勉強中で、RPiを登場させるまでもない段階にいます。
よって、「EZ5(イージーゴー)」と呼ぶことにした簡易お掃除ロボットは、Arduinoだけで制御するつもりです。
そうなると、Arduino上で制御ループを回さなければなりません。当然ですね。
しかし、マルチタスクに対応できないということは、動作即応性の点で問題になるのです。
たとえば、「右に曲がれ」という命令を実行している間は、障害物センサーからの信号に対応できない=物体に衝突する、というようなことが起こります。
制御コマンドへの反応が遅れるというケースも出現します。
これでは困ります。
そこで、マルチタスクに対応できないArduinoではありますが、疑似的にマルチタスクもどきを行わせるというテクニックが必要になります。
理屈としてはそれほど複雑なことではなく、A、B、Cという三つのタスクがあるとしたら、できるだけすばやくA、B、C間で処理を切り替えるということを、ソフト的に実現してやることになります。
プログラム上は、面倒くさいことになる訳ですが。
幸いなことに、このような工夫は既にいくつもされており、先人が築き上げたライブラリが存在します。
凡人である我らは、自分の用途に適した(と思われる)ライブラリを探して、スケッチに取り込めばいいという訳です。
ありがたや。
なので、自律走行アルゴリズムをフローチャート化した上で、疑似マルチタスクのテクニックをコードに応用していく方針で進めたいと思います。