かみやんの技術者ブログ

主にプログラムの話です

つくばチャレンジ第二回試走会まであと1日!

やー、切羽詰ってます。
明日が試走会です。ここ数日、あと3日!あと2日!と焦っていましたが、なかなかはかどりません。
昨日は、C#で作ったAibiUIというコントロールソフトからH8/3069Fマイコンへシリアル送信。最初、H8マイコンのデータシートをみてシリアル通信について勉強。いざ実装しようと思ったときに、よく考えたらToppersのsyslog()関数で、マイコンから
PCへの送信はできている。ということは、Toppersにシリアルライブラリがあるかも?と思ってToppersのソースを検索したらありました。

次に、PCからマイコンへのデータのフォーマットですが、バイナリフォーマットとしました。

  • コマンドID(16bit)+データ長(16bit)+データ(n byte)

という感じ。
C#だとMemoryStream(JavaでいうByteArrayOutputStream)クラスを使ってPacketクラスを作成。PCからマイコンへデータを送信してみたところ、syslog()の受信が文字化け。。(ハマリその1)よくよく調べてみるとToppersのdocフォルダにuser.txtという説明書があり、そこにシリアル通信ライブラリの説明がありました。そこに、デフォルトでエコーバックがONになっていました。PCからバイナリを送っているのでエコーバックで文字化けが起こっていました。ioctrl()みたいな関数があったのでそれでエコーバックをOFFにしました。

つぎにマイコン側でデータがうまく取れないな〜(ハマリその2)と思っていたら、どうも6byteのコマンドを受信するはずが、64byteのデータを受信している。調べたら、C#のMemoryStreamクラスのGetBuffer()で得られるbyte配列は、バッファそのものであり、Write()した量ではなかった。6byteのパケットを組み立てるのにWrite()しているのは6byteだがMemoryStreamクラス内部では可変長配列なので、それより大き目のメモリを確保しているというのが原因でした。JavaのByteArrayOutputStreamでは、正味のデータのbyte配列を返してくれていたのでハマリました。MemoryStreamのLengthプロパティで調べるのが正しかったです。

次にマイコン側で10パケットのうち1〜2パケットが取りこぼすという問題に遭遇(ハマリその3)。前回、プログラム本体を無手順でPCからマイコンに送信するプログラムではまったく問題ないので、物理的にデータを取りこぼしているとは考えにくい。が、調べる余裕がなかったので、未知のコマンドID、データ長だったらスキップする。という処理をいれて何とか動くようになった。本来、99.9%と取りこぼしがなくても、そう実装しておくべきところなので、ま、これでいいか。余裕ができたらちゃんと原因を調べたい。

これで何とか、ロボットにノートPCを載せて、ノートPCにつないだジョイパッドで操縦〜!と思ったらタイヤがスリップして動かない。そして、なんかまだマイコン側の走行プログラムにバグがあるっぽい動き。。
タイヤがスリップするのは、名古屋の事務所で走らせたときは、床がカーペットだった。が、東京の事務所は、床がなんかつるつる滑るやつ。まぁ、道路で走らせたら滑らないと期待して、まずは放置。
マイコン側のプログラムのバグを直さないとな。

あと、6Vのニッケル水素バッテリー2個を直列につないで、Top-URGをつないでみた。とりあえず、Top-URGのサンプルを動かしてみた。動いたには動いたが20分ぐらいでバッテリー切れ(だと思う)。なんと今、電圧計が手元にない。先日壊れたのだが買いなおしていなかった。こんな基本的な道具がなくて大丈夫か。

さてさて、時間がないです。焦ります。今0:41。朝までに動くようにしたい。今日は徹夜だ。や、2時間ぐらいは寝たい。
マイコン側のバグを取って、ちゃんと走ることを確認したい。
あとTop-URGを固定する工作。Top-URGのプログラムは書く余裕がないので、サンプルでログをとりたい。