毎日コミュニケーションズ刊 吉野耕司 著 「60日でできる!二足歩行ロボット自作入門」 で例として製作したロボット「Pen4」について、書籍の中での完成状態を起点とした 追加の製作や試行錯誤の記録を記した製作日誌です。
うまくいった試行については、製作記事のページとしてまとめる予定です。 新しい物から古い物の順で書いています。
ざっと17日目の記事にそって作業してみましたが、特に違和感ありませんでした。
最終状態のpen4_vbをVB2008で開いてみました。自動変換の過程を経た後、簡単にテストした範囲では 以前と同様にプログラムは動作しました。
ソースコードの一部が読み込まれなかったり、コメントの日本語が 化けてしまう等、読み込んだ後、そのままでは動きませんでした。足りない部分を手で足すと動くように なりました。これは仕様ではなく、そのうちサービスパックで直りそうな気がしますが、どんなものでしょう?
11/25のところでも触れたように、評価版コンパイラを使った場合と比べてmotファイルの サイズが倍以上になりますので、AKI−H8/3067FではRAMの容量不足のため動かせません。 しかし、今日の結果を見たところでは、浮動小数点計算の場所を整数計算に書き換え、より計算の高速化を志向した コーディングを心がければ、I/Oボード1でもI/Oボード2でも動かせるプログラムが出来そうだと思いました。
これで59日目のプログラムを評価版Var1、評価版Var2、h8300−hms−gcc 2.95.3 の3種類のコンパイラで試したことになります。そして、Var1だけで問題が出ました。ちなみに評価版Var1と gccでは同じローダーでプログラムに起動をかけています。簡単に考えてVar1に問題がありそうだと思いました。
試しに「C言語でH8マイコンを使いこなす」に付属のアセンブラ、コンパイラ、モニタ(マイコンボードの メモリマップにあわせてソースコードからのビルドが必要)、専用ターミナルの組み合わせで同じプログラムを 試してみたところ正常に動きました。画面はこんな感じです。
ちなみにこれらのH8開発用ソフトは「60日でできる!二足歩行ロボット自作入門」で使ったものより 新しいバージョンのものです。まだローダーに問題があるのかもしれませんが、とりあえずPen4号用にC言語で 作ったプログラムや、回路には問題がないようなので、この問題はおいおい考えてゆくとして、ここまでの ドキュメント類を公開しようと思います。
I/Oボード2回路図集
以上2点を試してみましたが、ほぼ変化なしでした。そこで、そもそも3067のほうでは問題がなかった プログラムなので、その他の違う場所として自分で作ったローダーのアセンブラ部分を見直してみました。
なんだか怪しいと思いつつも数年来使ってきたモジュールなので問題ないだろうと思っていましたが、 アセンブラのマニュアルをよく読みなおすと、スタックポインタを奇数番地にセットして システムをスタートしてはいけない様だということが分かりました。そこでそのように直したところ gccでコンパイルしたプログラムまで含めて正しく動くようになりました。
思えば8008、8080、Z80、6502、8085、8086、80286、68000あたりまでは まじめに本を読んでいたのですが、みんな同じに思えてきてH8のマニュアルはあまりよく読んでいませんでした。
やはり説明書はよく読まないといけませんね。
とりあえず分かったのは、結果が保存されない型キャストとfloatの計算を無くせば動く ということでした。変更が比較的小規模ならば、本のサンプルを全てgcc用に書き換えようかと 思っていましたが、gccに不慣れで挙動がつかめないため、書き直しの5倍くらいの時間が かかりそうです。そこで、ひとまず試したことをまとめたら公開し、本トライについては終了することとしました。
ロボット作りに関しては、ドライバが未対応なため「USB-シリアル変換ケーブル」が使えない だけで、あとは特に問題ありませんでした。 VB2005、VC2005、Dos窓用コンパイラ、CYGWINとgcc、ターミナルソフト等、一通り使ってみた感じでは特に問題なく 動いています。(CYGWINはインストールで警告が出ましたがOKでした)簡単にVistaのPCに乗り換えることが分かって よかったです。「USB-シリアル変換ケーブル」についても、当然そのうちにVista対応の機種が発売されると思う ので、まあ問題にならないでしょう。
Pen4号製作のブログ
「吉野家のロボットを作ろう」http://yassy7.blog44.fc2.com/
私も時々読ませていただこうと思っています。(個人的には誤記情報が有難いです。(笑))
同じ53日目のプログラムをAKI−H8/3067F用にもコンパイルしてマイコンに ロードしてみました。コンパイル済のプログラムをよく見ると、MOTファイルの時点で 本で使ったコンパイラの倍以上のファイルサイズになっており、3067で動くPen4号 に「プログラムエリア」として確保してあるメモリーのエリアに収まりませんでした。
一番簡単なLEDを点滅するプログラムで調べたところ、浮動小数点(float)型 の変数を使うと大きくなることが分かりました。I/Oボード1にgccを適用するときは 上記の変数の挙動の違いに留意するとともに、floatを使わない形に書き換えれば使えそうだと 思いました。(完全な作り直しに近いですね・・・)
以前読んだ本ですが、コンパイラではまっているので、県立図書館から借りてきて読みなおしました。
(まだ売っています)
H8以外のCPUやPCでC言語とアセンブラの知識がある方にお勧めです。H8固有のことが分かって
「なるほど〜」と思われることでしょう。
各関節がとんでもない方向に動くため、Pen4号を壊さないようにマイコンを フレームから取り出し、RCサーボ向けの信号をオシロスコープで見ながら、プログラムの 色々なところを書き換えては様子を見るということを繰り返して調べました。
その結果、コンパイルする時に何気無く付けていた最適化オプションが影響して、PAポートに 出力するビットパターンが変わってしまっている事が分かりました。 (RCサーボの信号を作っているforループの中が最適化されてしまっていました。)
その後プログラムは、最適化オプションを止めてから正しく動くようになりました。
そして53日目(自律行動プログラム)のソースコード編集を終えて、動作確認したところ関数 に変数の中身が渡らない現象にあいました。W6の自律プログラムを書いているときも同じような 現象にあい、その時は構造体を大きくしてゆく途中で問題が出たので、構造体を分割してその場を しのぎました。
同じプログラムがH8/3067F用としては動いているので、本当のところ何が原因なのか分かり ませんが、本で使ったコンパイラの入手状況も悪くなってきたので、この際AKI−H8/3069F キットについてくる。(秋月で500円で別売りもしているフリーソフト)H8用gccを使う方向 で、使い方を調べ始めました。
AKI−H8/3069FキットについてくるCDのH8/OS用サンプルプログラムの、LED点滅 プログラムを参考にしてmakeファイルとRAMコントロールファイルを作り、本の一番初め(8日目) で作ったLED点滅プログラムをコンパイルし、上手く動くことを確認しました。
I/Oボード2の回路図追記
SW3のところにプルアップ抵抗を書き忘れていたので追記しました。
出来上がったので、少なくとも記事の最後までは問題が無いか、使ってみながらテスト中です。 10日目のところまで使ってみたところでは特に問題なく、自分で言うのもなんですが、なかなか 良い感じです。テストを終えたら使い方を書いてアップします。
組立前==>
完成
A/CアダプターのジャックとCOM0用のピンヘッダは使わないので付けませんでした。
マイコンボード裏面についている3端子レギュレータについても、5V電源をI/Oボード2
側から供給するため使わないので足を切っておきます。
ディップスイッチと集合抵抗が干渉して基板に付けられなかったので、ディップスイッチ側を
少しカッターで削りました。
H8/3067Fボード用に作ったケーブル(本では6日目の記事)を使おうと思いましたが
H8/3067FボードのJ5とH8/3069FボードCOM1はピンの配置が違いました。
違いを吸収するためCOM1から線を延ばしてピン配置を入れ替えました。
ここまでは同じ。ここから先は
回路図
に沿って配線しました。
記事に合わせる為「本で使っているモニタ」と同じ使い方のローダーを用意する方向で 進めてきましたが、 ロードする機能の方は、ここしばらくトライしていたプログラム (いつもモーションデータなどを受け取るのに使っているプログラムの派生型) ではターミナルソフトからの送信を受けられないことがだいたい分かりました。
回避策としてアセンブラで作ることも考えましたが、私がアセンブラで作ろうと思うととても時間がかかりそうです。
そこで方針を変えて、PC側はフラッシュライター風のGUIのソフトをVB2005で作り、 マイコン側はモーションデータを受け取るソフトをモディファイしたものを作ろうと思いました。
主な相違点や特徴は以下のとおりです。
「I/Oボード1」と「I/Oボード2」
I/Oボード2(右側)は部品を並べてみただけです。
「60日でできる!二足歩行ロボット自作入門」は一応「入門書」を標榜していますので 「適当に読み替えて作ってください・・・」というのはちょっと不親切な気がしました。 これから1年くらいは仕事が忙しい予定なので、すぐにとはいきませんが別のマイコンキット をのせた時の回路図や、そのマイコン用に書き換えた制御ソフトを公開しようかと、検討を はじめました。
代替マイコンは通販コードK-204のAKI−H8/3069Fマイコンボードキットです。 このキット用にはモニタプログラムがありませんので、代わりになるようなソフトを作る ところから作業を始めました。
プロトタイプのテストとして、W6のメインCPUを使って、
ターミナルソフトから送られてくるSフォーマットのプログラムを
指定のアドレスに展開する機能をCで書いて試してみました。
が、実行速度不足でバッファオーバーラン
エラーでした。
というわけで次のプロトタイプはテキストデータを一度ワークエリアに素通しして、
後でバイナリデータに変換したり、チェックサムを計算したりする様にする予定です。
部品の変更は ナショナルセミコンダクタLM2940CT-5.0 → コーセル SUS1R50505C です。 秋葉原のマルツパーツ館で購入しました。 カタログ上は5Vを出力できる入力電圧が4.5V程度に下がるので、効果があると期待しています。 結果は実際に動かしてみてのお楽しみです。
のせてみたのは秋月電子通商製のモジュールで、センサはKionix製KXM52-1050です。値段は 元の約1/6(\800-)と安価です。ただモジュールの「使用上の注意」に2gを超える加速度や 衝撃を加えると、異常な出力値を示したまま戻らなくなるなるなど、気になることが書いて ありました。HAAM-313Bは「衝撃に強い」ことがデータシートにアピールされていたのとは 大違いです。
でも実際にI/Oボードにのせて、動作中にI/Oボードで机を軽く叩いてみましたが 普通に動いていたので、「実用上は問題ない」という結果になることを期待してこのまま 使ってみることにしました。
※モジュールは浅草ギ研製、センサは北陸電気工業製 HAAM-313Bです。