2011年10月1日土曜日

とうロボを機にマイコンについて考える 其ノ弐

其ノ壱を書いた勢いで其ノ弐を書いたのだが、保存したはずのテキストファイルが見つからず、アレだけの長文を書き直すとなるとモチベーションを高くしないと書けないので其ノ弐を投稿するのが長くなってしまった。

前回の話を振り返るととにかく現状ではAVRマイコンが最も使いやすいのではないかと言う結論になったがそれがどうしてなのか、「そもそもお前は何をしたのか?」といった事を書いておきたい。

まず、具体的な話になるが、今回のロボコンで自分が使ったマイコンはATMEGA168Pである。ちなみにお値段は秋月電子通商さんで1個200円であり、最近何かとよく名前を聞くArduinoのArduino Diecimilaでも使用されているマイコンで有るのでその入手性の良さや使いやすさには問題は無いはずである。
ちなみにスペック的にはFlashROM:16kバイト、RAM:1kバイトでマイコンのピン数は28ピンである。ここで其ノ壱を読んでいただいた人は「『64kバイトまでしか…』、『I/Oピンは100本くらいは…』とかお前は言っていたじゃないか」とお思いでしょう。その通りで、ポートも3ポートくらいしか無く、このままでは簡単なライントレーサくらいしか作れない(アイデア次第でもっとイロイロとできるが)。

半年くらい前にどうしようかと考えていたところ、先輩がたまたまFPGAとマイコンをシリアル通信させて動作させるという仕事をしているのを見て、その時「You,通信しちゃいナよ!!」という天の声が聞こえたとか、聞こえなかったとか。単純にマイコンの数を増やしてしまえばポート数が増えるじゃないかという安易な思いつきであるが。確実に自分の中でその瞬間「それダァッ」とは思った。

そこで実際にマイコンを通信させようとなるが、もちろんそこはシリアル通信である。(そもそもピンの数が足りないっていうのにパラレルで通信するようなヤツは居ない。)しかし簡単に通信と言ってもその手順はキッチリと規格化されているので、それに従わなければならない。今回はI2C(アイ・スクエアド・シー)という通信方法で通信してみた。なぜかといえば過去にEEPROMとマイコン間でI2Cを使って通信したことがあり、ある程度は把握していたからであるのと、1対1の通信というよりも1対多、1つのMasterに対して複数のSlaveを接続できるのでその方が多くのマイコンを同時に制御できるのではと思ったからであった。I2Cとはシリアルデータ (SDA) とシリアルクロック (SCL)という2本の線だけで通信が可能な通信方式で上記の様に2本のI2Cバス上でMasterと複数のSlaveが繋がっている。

MEGA168でプログラムを書き始めようと色々と調べてみるとI2Cに関してはマイコンに機能として含まれている事がわかった。場合によってはすべてプログラムでソフトウェア的に書かなければと身構えていたのでそこは意外とラッキーであった。実際にプログラムを書いてみると思っていたよりもすんなりと通信ができてしまった。(通信が出来なかった場合にそれをデコード、解析できるようなオシロスコープなんて持ち合わせてないので出来なかった時の方が問題ではあるが…)
プログラムに関してはエレキジャックの中尾司さん記事のソースを参考にしました。
ちなみに、I2Cがどのように通信しているかはこの連載を読んで頂いたほうが、自分が説明するよりも解りやすいと思います。
ちなみに2、エレキジャックと言えば高校時代の恩師がインドアプレーンに関して書いていたりするのでよろしくお願いします。m(_ _)m

大会ではセンサーを受けるためのSlaveとしてのマイコンとモータードライブを動かすためのSlaveとしてのマイコンそれらをまとめるためのMasterのマイコンという形にしてみました。通信内容もセンサー側のマイコンで3ポートの状態をそのまま3バイトの値として送り、モータードライブ側のマイコンの出力もそのままポートの状態を受けるというものでした。
本来であれば通信内容(データ)に意味をもたせる、あるいは仕様をを決める、例えばセンサー側ではA/D変換した値を送る、モーター側ではPWMのデューティー比を受けそれに応じた出力をするといった、Slave側にもう少し処理をさせるような、言い換えれば仕様さえ決めてしまえばあとはそれに合わせて通信するだけでイイといったような形に出来ればよかったのかと思いますが、結果として自分だけだったということ、そこまで時間が無かったといった事で出来ませんでした。

またMaster側ではありふれた処理としてwhile文で処理を行わたりさせますがその間while文の処理の中で通信処理をさせておかないと、そもそもwhile文を抜ける条件に至らない、待ってる間にモーターが暴走するといった事になり、1回完全にはまってしまったのでそれだけは気を付けなければなりません。

っと、言った感じに今回のロボコンではポートの数が足りないマイコンでその数を増やし、マイコン間で通信してしまおうという事をコンセプトにやった見ました。ある意味回路とプログラムを一人でやったので思うように出来たということかもしれませんが。

さて、また長くなってしまったので其ノ参へ続く。
どうしても長い文章は書き慣れていないので。グダグダと書いてすいません。