256(JiGoRo)-Series 日記 (3)  

SEMB1200A のページを適宜更新中です。


ゴールデンウィークなので、そこそこ捗るかな?ということで、Webも新規ページを用意して製作ネタを書いてみようと思います。 今回は、電子コンパス。 今まで、活用していなかったので、搭載に際して不具合が気がつきませんでした(考えてみれば当たり前ですが。。。)。

「電子コンパスをサーボモータの側を避けて配置すること」

JiGoRoHP の場合、頭部に3Dモーションセンサを配置しています。 そこに搭載されている電子コンパスは、X,Y,Zの3軸に対して北の方角を向くと信号が強くなる仕様です。 しかし、何故か Y,Z の2軸の信号が振れません。 おかしいなぁ、と思い調べました(初めは壊れたのかと思い、かなりブルー入りましたが。。。)。

 ・ Mag-X はロボットの前後方向の軸
 ・ Mag-Y, Mag-Z はロボットの左右、上下方向の軸
 ・ 横軸は時間に相当しますが、適当に動かした時の動作なので意味なし
 ・ Mag-X は振幅が小さく、Mag-Y と Mag-Z は無反応

ロボットのボディ(頭部)から取り外しセンサの動作チェックをしたところ、問題なくセンサ値を得ることができたので、故障ではないことを確認。
試しに、センサをロボットに近づけていくと、サーボの側に近付くと磁気センサだけが反応が鈍くなり、「あ、そっか。 磁気の問題ね」とここで気が付く。
サーボを多様しているロボットの場合、磁気センサは配置箇所が非常に問題になります。 当たり前のことですが、覚えておきましょう。

可能な限りサーボから距離を置いて配置して、再度確認。 今回も、正確に時間を測ったり、動作を一定スピードで行っていないので、横軸は適当。

 ・ 軸定義は上グラフと同じ。
 ・ Mag-Z が微妙に波打っている。 ロボットの水平置きしていなかった為。
 ・ 非常に感度良く得られている(サーボ電源 ON 時のノイズまで乗っている)
 ・ サーボ通電に関わらず振幅は同じ。

よしよし、これで1歩前進。 ROBO-ONE 参加者が「リングには魔物がいる」と、コメントされてますが、きっと磁気センサも他のロボットと交戦すると外乱をうけ異常値を出すんだろうなぁ。

(久々、ちょっと余談)
Windowsマシーンを新調し快適なコンピューティングをしていましたが、思わぬ落とし穴がありました。
Webチェックすればたくさん記事が出ていますが、Office2007 が遅い
特に、グラフで規定書式から変更した際に、極端に遅くなる。
操作性は慣れれば良い話だが、大きなファイルを扱える代償はとてつもなく大きい。 

(2008年4月30日)


今日は画像取り込み。 現在市販されていませんが、10M画素のDMR-C1を使って、画像取り込みを行いました。
Treva と同じ CLK と DATA のみのシンプルなインターフェイスのため、プログラミングは容易なので重宝しています。
(エラー時の復帰のさせ方だけ知りたいところです)

2004年10月24日以降に書きはじめましたが、どこで触れたか忘れた(探しきれなかったので)復習です。
DMR-C1は(Trevaも)、CLK同期型のシリアル・インターフェイスと言えます。 つまり、CSI(SPI)です。
SEMB1200A でも、SH-2でも、V850でも、備わっているシリアル・インターフェイスなので、CLKを H/L に切り替えて、タイミングを合わせてDATAを読むという動作をハードウェアで処理させることができます。 そこでハードウェアに任せるとして、CLK はどの程度まで高速にできるのでしょうか? また、ココでも書きましたが、CSI(SPI) 機器を操作する場合、バイトデータ間のウェイトが重要になります。 それは、ハードウェアでCSI(SPI)を処理する場合でも、データのつなぎに関しては、次のデータを設定するというアクションが送信機側のマイコンのスピード(アルゴリズムやFIFOの有無などのハードウェア)に依存するからです。

いろいろとテストしてみた結果ですが、DMR-C1 の場合、CLK は 8MHz であっても良いことがわかりました。 また、厳密に測定していませんが、バイトデータ間の待ち時間も非常に小さくできるようで、600MHz 動作の状態で、

uint8 data[352*288*2];

*(volatile uint16 *)CSI_SOTBREG = 0x00FF;       // 1つ目のデータ送信指示
for( xy = 0; xy < 352*288*2; xy++ ) {
    uint8   c;

    while( ( *(volatile uint16 *)CSI_CNTREG & CSI_CNTREG_SIRB_V ) == 0 ) ;
    data[xy] = *(volatile uint16 *)CSI_SIRBREG; // データ読み込み
    *(volatile uint16 *)CSI_SOTBREG = 0x00FF;   // 次のデータ送信指示
}

というデータ送受信を行いましたが、取りこぼしはほどんど無いようです。 ほとんど、というのは、たまにランダムに1列だけ無効データ(0xFF)を返してきてしまうことがありました。 割込みなどの影響かもしれません。

簡単にプログラムの説明をしておきますと、data[] は、DMR-C1 からの画像情報。 画素数 352 x 288 で、2バイトで1画素構成です。 画素数分繰り返し処理をおこなうわけですが、データ送信指示として、0xFF を送っていますが、値は何でもよいです。 CSI の出力端子を DMR-C1 に接続していないため、意味はなく、CLK を 8bit 分出すことだけが目的です。 while() はCSIの状態をチェックし、8bit分のCLKを送りデータを受信し終えたかの確認をしています。 UX1200E の場合、CSIは16ビットデータとして取り扱うため、uint16が目立ちますが、CSIの初期設定でCSIデータは8bitとして取り扱う様初期化部にて指定することで、CLKは8bit分でいったん止まることになります。

繰り返し動作や、データの取り込みなどありますので、実際には、0.03〜0.1秒程度は1画像取り込みに時間を要しているようです。 ロボットが動きながら取り込むには、まだまだ時間が長すぎるところですが、キョロキョロ周りをみて、考えて動く、という程度のものであれば実使用上は大丈夫かもしれません。

ですが、やっぱり欲張って浅草ギ研さんのコレ(イメージセンサ)が欲しくなっているのでした。 センサのコネクタ位置が基板辺の中央であれば即買いなのですが。。。rev.2 とか企画されませんかねぇ。。。(あと、もう1まわり基板サイズも小さく)

(2008年5月1日)


2,3メモ程度に記録を書いておきます。

@ SEMB1200A での処理時間の計測結果
 運動計算を 600MHz 動作で行うと、exp() などしっかり使った計算方法でも、次の足角度計算は、50usec.あれば十分におつりがくる速さで終えています。 現在、KRS-401x を1個のUARTに対して4つずつ、足裏センサも同じUARTデージーチェーン上に乗せているため、シリアル通信は5個分行っています。 5個分の設定周期は12msec.としているので、実に 12msec - 50usec = 11.950msec もの時間を無駄に待たせていることになります。 うれしい悩みですね。 そこで、センサフィードバック計算や、歩行とは別の動作(腕の動作など)、画像処理や、おしゃべりのためのADPCM処理など、ふんだんに時間が使える計算になります。

A 動歩行計算を軽くするには
 Interface誌には紙面の都合上書きませんでしたが、動歩行計算が重いと感じるCPUの場合、次の方法で軽くして動歩行計算で動かすことができます。 サーボ設定周期毎の角度計算のためにexp()などの関数を使わないで、連続再生動作と同じ、状態を決めたい動作(角度)だけをちゃんと動歩行計算により求めて、その間のサーボ周期時の角度計算は、内挿補完を3次か4次、多くても5次関数でフィッティングすれば結構軽くて、かつ、的確に計算できます。 動歩行は中編、補間計算は後編にありますので、組み合わせて使ってみてください。 参考までに、V850ES/JG2 20MHzの場合は、サーボ制御周期で1動歩行演算を終えていました。(ただし、レジスタ等の設定やfloat型演算という制約を設けています)。

B 足すっきリンク
 あまねちゃん日記、いや、nisiken2002の日記で見せていただいた脚部リンク(写真追加、ありがとうございました)。 確かに角度動作範囲は狭くなるデメリットはありますが、直行軸をコンパクトに作る上では非常に良いですね。 森永さんのところで拝見していて、「あれっ? あれっ? あれっ?」のまま、あたまが硬直していましたが、すっきりしました。 小型ロボットで、特に足裏を小さく作りたい場合は、特に小さくできて良いですね。 (しかし、時代はヘビー級?。。。 サーボの大人買いについていける人だけが生き残れる?。。。)

C あ〜やっぱり「趣味で」ロボット作ってる(電子工作&プログラミング)のが楽しい
 以上、補足説明なし。

(2008年5月2日)


家族サービス継続中。 本日、雨上がりの高尾山へ。 教訓1)雨上がりの6号コースはやめる。 教訓2)高尾山、ケーブルカーを使わない場合、なめてはいけない(特に運動不足な場合)。

(2008年5月4日)


メモ
 ・ P板ドットコムに発注する場合、Vカット指定をして工夫すれば安く仕上がる。
 ・ P板ドットコムのユーザーサポートは電話が好き。 メールは苦手みたい。 仕事中でもガンガン電話が鳴る。
 ・ P板ドットコムの実装は、抵抗やコンデンサがタダで手に入る。 事前に調べて設計するとよい。
 ・ P版ドットコムの実装は、たくさん行う場合は高い。 どこか安いところはないものだろうか。。。(やはり会社相手でないと商売してもらえないのだろうか。。。)

宣伝しても安くはしてもらえないだろうなぁ。。。


ようやく梅雨が始まった感じですね。
不発だった Eagle ワークはちょっと日記から削除しまして(いずれ世に出します)、JiGoRoHPネタを書きます。

SEMB1200AにHOSv4.0 を但馬さんにより移植されていましたが、このたび、FPUもタスク中に使っても問題ないように書き換えてみました。 Sourceforge の使い方がわからないので直にアップロードできませんが、デバッグがてら手伝っていただける方、差分をメール等でお送りしますので、連絡ください。

JiGoRoHP の一部フレームを城南通信機さんに加工&アルマイト処理を行っていただきました。 若干の不整地程度なら難なく前後左右、方向転換までできるようになりました。 あとは、叩かれても若干の坂道でも歩けるようにチューニングしていこうと思います。

残念なことに、数々のイベントがあるのですが、ことごとく仕事や旅行計画に引っかかってしまっていて参加ができないさみしい状況が続いていますが、まだまだロボット作りはやめません。 ヘビー級のロボットは懐が付いていけないので断念かなぁ。。。

(2008年6月21日)


HOSv4.0 のパッチを sourceforge にアップロードしてみました。 開発者のみ見えるのかな? ちと不安。。。
不安なままではいけないので、但馬さんにお願いして CVS 更新していただきました。 ありがとうございます。

次は、例外処理を記述していきます。 少なくとも、SEMB1200Aで拡張された PWM, UART3 と、UX1200E の UART1, 2, CSI は記述しておこうと思います。

(2008年6月22日)


Interface 6月号に掲載された「脳ちょこっトレーニング」ですが、皆様のおかげで、読者の人気記事アンケートの1位を頂きました。 ありがとうございました。
V850 ロボット記事での1位、1位、3位、につづいて、1位をいただきましたこと、大変うれしく思います。 数年前は素人だったのに、記事を書かせていただく機会を与えていただきましたこと、興味をもっていただきました読者の皆様にお礼申し上げます。 ありがとうございました。

(2008年6月26日)


いつもONOの電脳壁新聞ありがとうございます。 ロボットのネタを書かなきゃ、と思いつつも、ご無沙汰してしまっている中、久々に書き込んでも拾っていただけるのは、とっても励みになります。

HOSv4SEMB1200A への移植状況です。 FPU周りは大丈夫そうなので、続いて例外処理(割込み)について開始しました。 MIPS のCPUなので、割込み毎にベクタが定義されていないので、割込みフラグを1つずつ確認して、ベクタ定義とベクタアドレスに分岐するのをひたすら書く作業になりましたが、なんとかできそうな感じがしてきました。 あとは、どのようにHOSv4の作法にあわせて表現するか、だけだと思います。
SEMB1200A で拡張されている FPGA の PWM, UART3 も定義しておきましたので、割込みベクタに処理させたい関数を通常の関数と同じ感覚で書いておけば良いだけになっています。
わからないところは、割込みはどのタスクが走っているときに生じるかが保障されていないので、スタックがあふれたりしないのかなぁ。。。ということですね。 割込み毎にスタックを持たせるのかな?? HOS の開発メンバーと一緒にこのあたりは解決していこうとおもいますので、しばらくお待ちください。。。 テスト協力いただける方いらっしゃいましたら、連絡ください。

(2008年6月28日)


HOSv4 の例外処理について若干変更。

2週間ほど前に製造依頼したものが届きました。 大きさ比較のため、3つ並べてありますが、左下が今回の製造分。 左上は Interface誌付録基板、右上はCPUのクラスとしては同じくらいのベステクさんのSH2/7145F ボード(←FLASH-ROMを載せてこのサイズなので、すごいと思います)。 QFP 100pin の必要なものを出すだけで 2.54mmピッチのピン配置で面積を取ってしまうので、ピンヘッダ・フレームを使うことを前提とするとこれがギリギリのサイズでしょう。 あとは、動くのか。。。(って大丈夫か?) 

ということで、動かしました。 無事、1発で動作を確認できました。 今回のCPUは外部クロック4MHz で内部 32MHz で動作するもの。 よしよし。

(2008年7月5日)


ようやくできたかな? HOSv4 の例外処理と浮動小数点演算処理、さらに、キャッシュのサポート。 長い道のり?というか、いろいろと手をだしていたので、仕上げが遅れてしましました。。。
SourceForge.jp の HOS で CVS checkout を使ってダウンロードいただければ、皆さんも使えると思います。 何か気がついたところがありましたら、連絡いただけると幸いです。

結局、割込みベクタを変えたので、先日書いたものではなく、hos-v4/document/mips.txt を参照ください。

(2008年7月9日)


いつも壁新聞でお世話になっている、denno_ono さん公開講演されるそうです。 頑張ってくださいね。 田町、水曜日、となると聞きにいけないなぁ。。。
この3連休、無駄に過ごせないな、と思った初日から、ぐ〜たら、寝ていました。 いかん。 あと2日、がんばる。
 @ Eagle 使って、基板お絵かき。
 A Inventor 使って、フレームのお絵かき。
 B ロボットモーションを考える。
こんなところかな?

そういえば、城間さん Eagle のパーツを探されている、というメッセージがあったような。 解決されたのでしょうか。
Eagle の抵抗・コンデンサのパーツは、標準ライブラリ rcl.lbr にありますが、その他拡張としては、ココからダウンロードできます。 rcl2.lbr, rc-master.lbr, rc-master-smd.lbr などあります。 が、探されている 1015, 1815 は無いみたいです。→(追記) 1015, 1815 というのは、トランジスタのことだったのですね。 それなら、トランジスタのライブラリで同じパッケージのものを選べば良いでしょう(TO-92とかの名前で探す。)。 R_EU_???? がチップ抵抗(SMD抵抗)で、C_EU_???? がチップコンデンサ(SMDコンデンサ)。
ちなみに、抵抗の1608はどこにもないので、コンデンサの1608からコピーして抵抗のパッケージ登録し、使っています。 あとは、無いものは作る、ですかね。

そうそう、そういえば2。
P板.COM さんからメールが届いていた。 なるほど、アンケートに書いたことを丁寧にコメントいただけている。 すばらしいです。 また、お願いしたくなりました。

(2008年7月20日)


汎用マイコン V850ES の奥は深い。 使い始めて1年が経ちますが、今更ながらに気がつきました。

外部メモリ空間のバスですが、マルチプレクス・バス・モードと、セパレート・バス・モードがあります。 普段、何気にイメージしているのは、セパレート・バス・モードであって、マルチプレクス・バス・モードにすると、データ・バスとアドレス・バスが兼用になっていて、マイコンの外部端子を節約できるという仕様。 直接SRAMなどのメモリに接続する場合(間にバッファなど入れない場合)は、セパレート・バス・モードを選択せざるを得ないですが、CPLDやFPGAを介してローカルバスを構築する場合は、マルチプレクス・バス・モードですね。

マルチプレクス・バス・モードは、データ・バスをアドレス・バスとして使うものですが、1クロック目がアドレス、2クロック目がデータ、のようになっているため、1クロック余分にかかることになります。 しかし、データバス幅を16ビットとすると、アドレス・バスの16ビット分が汎用端子、もしくは機能端子として使えるメリットが出ます。 特に、ピン数の少ない汎用マイコンではUART(1組)、CSI(2組)、 I2C(1組)、タイマ端子(8ピン)などが解放されるため、1クロック遅延よりもメリットが上回る感じがします。

参考までに、マルチプレクス・バス・モードのタイミングと、解放されるアドレス・バス16ビット分の機能端子一覧についてV850ES/JG2マニュアルからの抜粋を挙げておきます。

今更ながら DesignWave付録のSpartan3Eの基板を動かしてみたのですが、うまく動作してくれない。 ダウンロードはできていると思うのですが、LEDチカチカすらできない。 ダウンロードの端子にオシロを当ててみるが、ただしく信号がでている。 外部クロックとかなく、LEDが付きっぱなしになるようにしてみるが、これでもダメ。 ダウンロードできていないということでしょう。 何が悪いのか。。。同じダウンロード手法で、CPLDは大丈夫なんだけど。。。 ここでハマってしまうと、3連休予定がどんどん時間がなくなっていく。。。

 @ Eagle 使って、基板お絵かき。 ・・・ 25%完了。 FPGAを書いて大丈夫か?
 A Inventor 使って、フレームのお絵かき。 ・・・ 90%完了。 あとは、DXFファイルにするだけ。
 B ロボットモーションを考える。 ・・・ 10%未満 やっぱり、手が回らない。。。

(2008年7月21日)


雨季でも行けるときに行こう、ということでグアムへ4泊5日の旅行に行ってきました。 外へ出かけたとき、遊んでいるときは、全く雨なく、部屋で休んでいる時だけスコールがありました。 いやぁ、よかった。 日焼けして背中がヒリヒリと痛かったですが、もう治ったみたいで、大丈夫。
ホテル前のビーチでも、たくさんの魚がいてびっくり。 あれなら泳げない子供でも楽しめますね。 色とりどりの魚たちに家族全員興奮状態でした。 水中撮影用のカメラが発売されているわけがわかった気がします。

ふと気がついたのですが、手相の生命線って伸びるのでしょうか? 手、特に親指を動かせば、しわ?も深く大きくなるようにも思えるので、手相が変わるのもわかるような。。。 生命線が、以前より少なくとも1cm(正しい表現?)は伸びた感じがします。

(2008年8月1日)


夏休みに(きっとそんなに時間がとれないはずなので、それ以降も含めて)遊ぶためにいろいろと発注。 その1)城南通信機さんに脚部フレーム追加。 その2)Xilinx HW-USB-II-G (Platform Cable USB II) をマルツさんに発注。 その3)ねじ浅井さんにチタンネジ発注。

その1)フレームは、サンドブラスト+茶色のアルマイト処理をしていただくことにしています。 以前、頭部を作っていただいた際に、とっても良い感じに仕上げていただけたので、同じ手法で。 今回は、脚部のフレームを変更。 MARU Family さんのサーボクーラーを参考に(そのまんま?)取り付けてみました。 6mm厚のファンも見つけたので問い合わせてみたのですが、最小ロットが500個ということで諦めました。 6mmだと現状のフレームでも搭載できたのですが、10mm厚なので、足の長さを長くして搭載することにしました。 ファンを取り付けるネジはM3です。 1.5mm厚のアルミ板にしたので、バーリングタップにしました。 コレを購入するよりも若干お安く仕上がったので大満足です。 (Webトップページがリニューアルした)城南通信機さんに感謝です。

ただし、1点迷いが残ります。 ファンの電源をどこからとるか? 多くの方はサーボ用信号&電源線はマイコンと1対1で接続されているようですので、KRS-401x の端子が1つ余っていることが多く、そこにファンの電源をとればよいようです。 ですが、ジゴローくんは、デージーチェーンでサーボを結線しているので、空きがありません。 また、ファンのように定常的に電流を消費するものとサーボを一緒の線に乗せて良いのか?というのも気になります。 バッテリーから直接とろうかなぁ。。。というところです。

その2) 時は金なり。 いろいろと挑戦する時間が惜しいので、純正品を買うことにしました。 他のプログラマでも良かったのですが、純正品の新しいのが比較的安かったのと、ポイントが溜まっているマルツさんで在庫があったので買ってしまうことにしました。 これで、晴れてWindowsパソコンのパラレルポートから卒業です。

その3) これは、その1をネタを書いていて気がついたのですが、M2x20mm長のものが手持ちでなかったので、あわてて注文です。 ついでにファンの取り付けも低頭ネジで。

(2008年8月2日)


昨日のその3) ねじ浅井さんから連絡をいただく。 大変ご丁寧なメールを頂き、感謝いたします。 教訓:ネジの種類を把握してから板金依頼を行うこと。 今回は、M3ネジでファンを取り付けようとしたのですが、なかなか10mmのファン厚みを固定するということを甘く見てしまってネジの入手性を悪化させてしまいました。 これからはネジのことも考えてフレーム作りをしよう。

昨日のその2) マルツさんから届きました、HW-USB-II-G。 さすが、というか、当たり前ですが、純正品なだけに、接続するだけでちゃんと FPGA, FLASH-ROM の書き込みができました。 使い慣れるまでに多少の時間はかかるでしょうけど、動けばなんとかなる、はず。

あれも、これも、やりたいこと、積み残したことがたくさんあります。 しかし、眠気と映画鑑賞(DVD)、子供の相手をしていると時間がとれないですね。

(2008年8月3日)


北京オリンピックも始まりました。
(株)城南通信機さんから板金加工&アルマイト処理依頼品が届くということで、急遽、家族サービス・プールお出かけの後、秋葉原へ。
九十九・ロボット王国では、関東組みロボット練習会の真っ最中。 まずは、欲しいパーツを手に入れようと、買い物、買い物。。。あ、売り切れている。
急いで、RTさんへ。 あ、あった。 やはり、いろんなお店がある秋葉原は良いですね。 久しぶりに、中川社長ともお話しをさせていただきました。
買い出しが終わったところで、練習会へ。

いしかわさんはじめ、皆さんに挨拶をして、いしかわさんの構想を伺う。 すばらしいです。 ロボットも持たないで行った自分が情けない。。。
そうこうしているうちに、写真のロボットが登場。

すごすぎる。 体長80cmで、しっかりと歩いている。 40cmほどのロボット3体が技を決めるが倒れない。 起き上がり実演の際も、他のロボットが妨害してもちゃんと起き上がる。。。 時代は着実に変わっている。 小さい1kg級を狙うか、いまの40cm級を狙うか、巨大ロボを狙うか。。。

(2008年8月9日)


機動戦士ガンダム、Zガンダムを見ながらロボットを製作。

@ 城南通信機さんから届いたパーツに入れ替えです。 その際についでに行ったのが、ピッチ軸の KRS-4014 を 4013 化すること。 メタルギアセット3を使えば、ギア比が変わって、フルに買い替えなくても 4013にできる(はず)。 ついでに、アルミアッパーケースにも変更するのですが、何個かに1つ回転がやけに重たくなるものがありました。 モーターと1つ目にギアのかみ合わせが固いみたいです。 どうすればいいのでしょう。。。(そもそもメーカー保証外の使い方のはずなので、問い合わせてもダメだろうなぁ。。。)

A HOSv4 の SEMB1200A 版のお勉強。 移植はしたものの、HOSv4 (ITRON) をマスターしていないので、勉強、勉強。 現状のままだと、Eclipse 環境に乗せようとしても hos4cfg がうまく動作できないのですが、どなたかテクニックご存じありませんか? プリプロセッサとして foo.cfg を kernel_cfg.c と kernel_id.h を作り出すものなのですが、これも gcc でコンパイルされて、リンクさせたい。 解決するまでは、地道に cygwin で進めますかねぇ。。。 一応、メモを残して。。。

まず、gcc のプリプロセッサ部分だけを使って、注釈分を削除しているみたいです。
gcc -E -x c -Wall -pipe foo.cfg > te.txt
その後、hos4cfg で kernel_cfg.c, kernel_id.h が作られます。 なるほど、良くできていますね。

foo.cfg te.txt




/* HOS 独自の設定 */
HOS_KERNEL_HEAP(4096); /* カーネルヒープの設定(省略時 0) */
HOS_TIM_TIC(1, 1); /* タイムティックの設定(省略時 1/1 ) */
HOS_MAX_TPRI(16); /* 最大優先度(省略時 16) */
HOS_MIN_INTNO(0); /* 割り込み番号の最小値(省略時 0) */
HOS_MAX_INTNO(255); /* 割り込み番号の最大値(省略時 0) */
HOS_MAX_TSKID(16); /* 最大タスクID番号(省略時静的生成に必要なだけ) */

/* アイドルタスク用スタックの確保 */
HOS_IDL_STK(4096, NULL); /* 1024 */

/* 割り込みハンドラ用スタックの確保 */
HOS_INT_STK(4096, NULL); /* 1024 */

/* インクルードファイルの指定 */
INCLUDE("\"sample.h\"");
INCLUDE("\"ostimer.h\"");
INCLUDE("\"irq_sample.h\"");
INCLUDE("\"mips/vect.h\"");

/* OSタイマ用 */
ATT_ISR({TA_HLNG, 0, HOS_VN_IP7, ostim_hdr});
ATT_ISR({TA_HLNG, 0, HOS_VN_IP2, int2_main});

/* 初期化ルーチンの登録 */
ATT_INI({TA_HLNG, 0, sample_init});
ATT_INI({TA_HLNG, 0, ostim_init});
ATT_INI({TA_HLNG, 0, int2_init});

/* サンプルタスクの生成 */
CRE_TSK(TSKID_SAMPLE_1, {TA_HLNG, 1, sample_task_1, 1, 4096, NULL}); /* 1024 */
CRE_TSK(TSKID_SAMPLE_2, {TA_HLNG, 2, sample_task_2, 2, 4096, NULL}); /* 1024 */

/* セマフォの生成 */
CRE_SEM(SEMID_SAMPLE_1, {TA_TFIFO, 0, 1});

/* 周期タイマの生成 */
CRE_CYC(CYCID_SAMPLE_1, {TA_HLNG, 0, sample_cycle_handler, 1000, 0});
# 1 "system.cfg"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "system.cfg"

HOS_KERNEL_HEAP(4096);
HOS_TIM_TIC(1, 1);
HOS_MAX_TPRI(16);
HOS_MIN_INTNO(0);
HOS_MAX_INTNO(255);
HOS_MAX_TSKID(16);


HOS_IDL_STK(4096, NULL);


HOS_INT_STK(4096, NULL);


INCLUDE("\"sample.h\"");
INCLUDE("\"ostimer.h\"");
INCLUDE("\"irq_sample.h\"");
INCLUDE("\"mips/vect.h\"");


ATT_ISR({TA_HLNG, 0, HOS_VN_IP7, ostim_hdr});
ATT_ISR({TA_HLNG, 0, HOS_VN_IP2, int2_main});


ATT_INI({TA_HLNG, 0, sample_init});
ATT_INI({TA_HLNG, 0, ostim_init});
ATT_INI({TA_HLNG, 0, int2_init});


CRE_TSK(TSKID_SAMPLE_1, {TA_HLNG, 1, sample_task_1, 1, 4096, NULL});
CRE_TSK(TSKID_SAMPLE_2, {TA_HLNG, 2, sample_task_2, 2, 4096, NULL});


CRE_SEM(SEMID_SAMPLE_1, {TA_TFIFO, 0, 1});


CRE_CYC(CYCID_SAMPLE_1, {TA_HLNG, 0, sample_cycle_handler, 1000, 0});

B マイコン基板製作中。 V850ES をコアにミニ基板は終わり。 次なる構想は、Spartan3E+4Mbit-SRAM 搭載のボード。 1基板に搭載するか、別基板にするか。

  同一基板の場合は、ローカルバス(AD0-21, etc.) は外には出さない代わりに、FPGA のI/O 41本を全て出すとしようかな。 FPGA を V850 のバス上に載せれば、内蔵 BLOCK-RAM もV850のメモリ空間上に配置したり、汎用I/Oの制御用データもメモリ空間上に配置できそう。 ひさびさに VHDL を勉強して書いてみることから開始でしょうかね。

(2008年8月11日)


HOSv4 による制御プログラムを考え中。
サーボの制御や、コントローラやセンサなどの外部機器通信、運動学による計算、それらの合成。。。イメージがはっきりと決まらない。 PPT2007に慣れるため?フローを書き出してみる。 図にはできるのですが、コントローラや加速度センサ、PCによるデバッグの部分が上手に表現ができないのです。 もう少し悩んでみよう。。。

あと、お知らせ?ですが、SEMB1200A の CPU(UX1200E)の割込みなどの技術がわからない、という方、HOSv4 の中に例を挙げてありますので、参考に(hos/hos-v4/sample/mipsgcc/irq_sample.c)。 これはHOSを使わない場合でも同じ記述にできますので悩み解消できるのでは?と思います。

(2008年8月14日)

メモ) いつも忘れる案件を。
・ cygwin bash の ~/.bashrc を有効にする方法
  /etc/profile の末尾に "test -f ~/.bashrc && . ~/.bashrc" を書く。


HOSv4 のタスク管理方法がなんとなくわかってきた感じがします(間違ってるよ、ということでしたら、メール頂けると助かります)。

まず、system.cfg とタスク(概略)についてそれぞれ記します。

system.cfg (一部抜粋)
1:  ATT_INI( {TA_HLNG, 0, init_task} );
2:
3:  CRE_TSK( TSKID_SENSOR,       {TA_HLNG, 1, task_sensor,       1, 4096, NULL} );
4:  CRE_TSK( TSKID_SERVO,        {TA_HLNG, 2, task_servo,        2, 4096, NULL} );
5:  CRE_TSK( TSKID_DYNAMIC_WALK, {TA_HLNG, 3, task_dynamic_walk, 3, 4096, NULL} );
6:  CRE_TSK( TSKID_MAIN,         {TA_HLNG, 4, task_main,         4, 4096, NULL} );
7:
8:  CRE_SEM( SEMID_SENSOR,   {TA_TFIFO, 0, 1} );
9:  CRE_SEM( SEMID_ACT_TASK, {TA_TFIFO, 0, 1} );
10:
11: CRE_CYC( CYCID_SERVO, {TA_HLNG, 0, cycle_servo, 3, 0} );
タスク概略
1:  void    task_sensor( VP_INT exinf )
2:  {
3:      /* ここに本タスクの初期化を記載 */
4:      while( 1 ) {
5:          wai_sem( SEMID_SENSOR );    // task_servo() により解除
6:          /* ここにセンサ読み取りなどの処理を記載 */
7:      }
8:  }
9:  void    task_servo( VP_INT exinf )
10: {
11:     /* ここに本タスクの初期化を記載 */
12:     while( 1 ) {
13:         slp_tsk();                  // 周期タイマによりスリープ解除
14:         /* ここに ICS2 データ取得処理を記載 */
15:         /* ここに角度・スピード・ストレッチの判定と分岐を記載 */
16:         sig_sem( SEMID_SENSOR );    // センサ用セマフォ解除
17:         /* ここに ICS2 データ送信処理を記載 */
18:         sig_sem( SEMID_ACT_TASK );  // 止められているタスクがあれば動作させる
19:     }
20: }
21: void    task_dynamic_walk( VP_INT exinf )
22: {
23:     /* ここに本タスクの初期化を記載 */
24:     do {
25:         wai_sem( SEMID_ACT_TASK );  // task_servo() により解除
26:         /* ここに時刻に応じた動作を計算する処理を記載 */
27:     } while( /*終了判定*/ );
28:     ext_tsk();
29: }
30: void    task_main( VP_INT exinf )
31: {
32:     while( 1 ) {
33:         /* ここに本タスクの処理を記載, act_tsk(TSKID_DYNAMIC_WALK) など */
34:     }
35: }
36: void    init_task( VP_INT exinf )
37: {
38:     act_tsk( TSKID_SENSOR );
39:     act_tsk( TSKID_SERVO );
40:     act_tsk( TSKID_MAIN );
41:     sta_cyc( CYCID_SERVO );
42: }
43: void    cycle_servo( VP_INT exinf )
44: {
45:     iwup_tsk( TSKID_SERVO );
46: }

 HOSにより起動後、init_task(), cycle_servo() が呼び出され、各タスクが実行されます。 task_main() は待ち状態になることはなく処理されるようにして、この task_main() から動歩行計算処理や、登録モーション再生のための補間計算処理などを act_tsk() により移行します。 さらに、動歩行計算(task_dynamic_walk())や補間計算では、「その時刻」に合わせた計算をさせたいので、セマフォ SEMID_ACT_TASK が解除される毎に計算処理が実行されるようにしています。
 task_sensor() を独立タスクに登録していますが、task_servo に入れても良いかもしれませんね。

 これにより、先日悩んでいたコントローラやPC(デバッグ)によるコマンド毎の処理の記述ができたように思えます。 自分のなかではすっきりした感じです。

(2008年8月16日)


 引き続き HOS でのプログラミングを。 先日のセマフォによる管理を書きましたが、イベントフラグの方がすっきりしそうなので、変更。 また、task_main() でのロボット動作の分岐を別タスクで実現する方法も、いま一つだったので、task_main() の中で実施することに。 さらにすっきりしました。

system.cfg (一部抜粋)
1:  ATT_ISR( {TA_HLNG, 0, HOS_VN_IP7, hdr_os_timer} );
2:
3:  ATT_INI( {TA_HLNG, 0, init_os_timer} );
4:  ATT_INI( {TA_HLNG, 0, init_task} );
5:
6:  CRE_TSK( TSKID_SERVO, {TA_HLNG, 1, task_servo, 1, 4096, NULL} );
7:  CRE_TSK( TSKID_MAIN,  {TA_HLNG, 2, task_main,  2, 4096, NULL} );
8:
9:  CRE_FLG( FLGID_ACT_TASK, {TA_TFIFO | TA_WSGL | TA_CLR, 0} );
10:
11: CRE_CYC( CYCID_SERVO, {TA_HLNG, 0, cycle_servo, 3, 0} );
タスク概略
1:  void    task_servo( VP_INT exinf )
02: {
03:     /* ここに本タスクの初期化を記載 */
04:     while( 1 ) {
05:         slp_tsk();  // 周期タイマによりスリープ解除
06:         /* ここに ICS2 データ取得処理を記載 */
07:         /* ここに角度・スピード・ストレッチの判定と分岐を記載 */
08:         /* ここにセンサ値読み取り */
09:         /* ここに ICS2 データ送信処理を記載 */
10:         set_flg( FLGID_ACT_TASK, 0x0001 );
11:     }
12: }
13: FLGPTN  p_flg;
14: void    dynamic_walk( VP_INT exinf )
15: {
16:     /* ここに本タスクの初期化を記載 */
17:     do {
18:         wai_flg( FLGID_ACT_TASK, 0x0001, TWF_ANDW, &p_flg );
19:         /* ここに時刻に応じた動作を計算する処理を記載 */
20:     } while( /*終了判定*/ );
21: }
22: void    task_main( VP_INT exinf )
23: {
24:     while( 1 ) {
25:         /* ここに本タスクの処理を記載, コントローラにより dynamic_walk()呼び出しなど */
26:     }
27: }
28: void    init_task( VP_INT exinf )
29: {
30:     act_tsk( TSKID_SERVO );
31:     act_tsk( TSKID_MAIN );
32:     sta_cyc( CYCID_SERVO );
33: }
34: void    cycle_servo( VP_INT exinf )
35: {
36:     iwup_tsk( TSKID_SERVO );
37: }

(2008年8月17日)


HOSv4 の続き<メモ>です。
MIPS 命令で FPU レジスタを double 型で使うものがありますが、この命令は、8byteで align されていないと例外命令扱いになってしまいます。 HOSv4 で、kernel_int_sp が不幸にして8byte-align されていない場合があるらしく、たまに止まってしまう不具合に悩まされていました。 現在、HOSv4 の kernel に手を加えないですむ方法を模索中です。

@ LDSCRIPT の semb1200a-rom.ld の要所要所に . = ALIGN(8); を書き入れる。

いちおう、これだけは最低限やっておきたいところ。 おおむね、@だけでも動いていそうですが、すべての状況下を試験するわけでもないので、mipsel-semb-elf-gcc の処理として align されるように処置しておきたいところです。

(2008年8月20日)


(その1)

さらにHOSv4の続きです。
ようやくわかりました。

現状のおさらいから。
kernel_cfg.c を作り出す hos4cfg 仕様では、@ idle stack, A int stack がコンパイラのアドレス・アラインに任されていて、どこに配置されるかわかりません。 現状、SEMB1200A の開発環境は .align 2 となってしまうため、.align 8 を期待して動作する、64ビットのロード・ストア命令でアドレス例外が発生してしまいます。 64ビットのロード・ストア命令は、スタックの復帰・退避以外は無いようです。 言い換えれば、先の@、Aだけケアすれば他はコンパイラが上手に扱ってくれているようです(double型のFPUを使った演算などは、double型の変数のメモリ配置はコンパイラにて.align 8 となっています)。

そこで、include/mips/hospac.h でちょっとした演算を施して、いかなるメモリ配置を hos4cfg で行っても、レジスタの復帰・退避に対しては、8の倍数のアドレスをアクセスするようにしてみました。

#define hospac_cre_ctx(pk_ctxinf, exinf, task, stksz, stk) 旧) hospac_cre_ctx_asm(pk_ctxinf, (VP)((UB *)(stk) + ((stksz) & 0xfffffffc)), task, exinf)
  新) hospac_cre_ctx_asm(pk_ctxinf, (VP)((UB *)(((unsigned long)stk + stksz) & 0xfffffff8)), task, exinf)

ちょっと強引かもしれませんが、共通カーネル変更なく、安定して行うには、これがベストのようです。 注意点は、上記演算で最悪期待しているスタック領域が7バイトほど小さくみえる可能性がありますので、hos4cfg で変換する system.cfg での HOS_IDL_STK, HOS_INT_STK では少し大き目の値にしておくことが必要になります。 もっとも、semb1200a の場合、他のマイコン群よりも圧倒的に大きな高速内蔵RAMをもっていますので、7バイトくらいなら大きめに指定してもなんら問題にはならないと思います。

これで一連の不具合は治ったと思います。 最新のソースコードとして仕上げた後、 sourceforge にあげておきます。 アップ完了通知はこのページに書くようにします。

(その2)

SEMB1200A を使う上での私の環境ですが、最近のパソコンは RS232C がなかなかついていないので、USB で接続したいところ。 そこで、Strawberry-Linuxさん秋月電子通商さんで入手可能なUSB-RS232C変換小型基板を使っています。 これらには、RXD, TXD, GND が2.54mmピッチのスルーホールが基板に配置されていますので、それらと SEMB1200A とクロスで接続すれば完了。 SEMB1200A 側のコネクタは、ココで紹介してようにRSコンポーネンツさんで圧着端子付きケーブルを購入し使用しています。

(2008年8月23日)


ロボット搭載用のカメラについて考えてみました。 2つに分類できるのかな? @無線にて画像のみを飛ばして遠隔操作用に用いる、Aロボット本体のマイコンにて画像処理を行い自律動作用に使う。 これまでAを中心に考えて来たのですが、@も面白そうだな、と(今更ながら)感じ始めました。 ガンダムとかのロボットアニメのように、基本は人間が見て動作させるけど、補助として内蔵マイコンが画像解析する、っていうのが目指すべき第1段階なのかもしれません。

そこで、探してみると意外と小型で無線を使って画像を得る装置って多いことに気が付きました。 CP-18PWやTC-9などとても小型カメラで良い感じです。 もともと、防犯用、鉄道模型用に販売されているものです。 ただし、受信機側がとっても大きいので、将来ロボットに入れるとなった場合は苦労するかも。

あと、HOSv4 を更新しておきました。 更新版は、sourceforge.jp より CVS を使って入手してください。
再度、アップデートしました(19:50)。
内容は、以下の通りです。
 hospac_cre_ctx_asm() 関数の引数を変更。 引数順番の変更(hospac_cre_ctx() に合わせる)と、0xFFFFFFF8 との and を取るのは、アセンブラで記述した hospac_cre_ctx_asm() 内部で行いました。

#define hospac_cre_ctx(pk_ctxinf, exinf, task, stksz, stk) 旧) hospac_cre_ctx_asm(pk_ctxinf, (VP)((UB *)(stk) + ((stksz) & 0xfffffffc)), task, exinf)
  前) hospac_cre_ctx_asm(pk_ctxinf, (VP)((UB *)(((unsigned long)stk + stksz) & 0xfffffff8)), task, exinf)
  新) hospac_cre_ctx_asm(pk_ctxinf, exinf, task, stk+stksz)

(2008年8月24日)


gcc-4.3.2 がリリースされたので、mipsel-semb-elf 環境を作ろうとしたら gmp, mpfr でつまづいた。 Web検索すると似たようなのが幾つか出てきました。 一応、ここにも書いておきます。

gmp ftp://ftp.dti.ad.jp/pub/GNU/gmp/ などから gmp-4.2.3.tar.bz など入手し、/usr/local/spool などにコピー。
% cd /usr/local/src
% tar xvfj /usr/local/spool/gmp-4.2.3.tar.bz
% mkdir cygwin
% cd cygwin
% mkdir gmp
% cd gmp
% ../../gmp-4.2.3/configure --prefix=/usr/local
% make
% make install
mpfr http://www.mpfr.org/ から mpfr-2.3.1.tar.bz などを入手し、/usr/local/spool などにコピー。
% cd /usr/local/src
% tar xvfj /usr/local/spool/mpfr-2.3.1.tar.bz
% mkdir cygwin
% cd cygwin/mpfr
% ../../mpfr-2.3.1/configure --prefix=/usr/local
% make
% make install
gcc ftp://ftp.dti.ad.jp/pub/GNU/gcc/ などから、gcc-core-4.3.2.tar.bz などを入手し、/usr/local/spool などにコピー。
% cd /usr/local/src
% tar xvfj ../spool/gcc-core-4.3.2.tar.bz
% mkdir mipsel-semb
% cd mipsel-semb
% mkdir gcc-4.3.2
% cd gcc-4.3.2
% ../../gcc-4.3.2/configure --target=mipsel-semb-elf --prefix=/usr/local --with-newlib --enable-languages=c \
--disable-threads --disable-shared --disable-libssp --with-gmp=/usr/local --with-mpfr=/usr/local
% make
% make install

ポイントは、gmp, mpfr の version と、gcc の configure での --with-gmp, --with-mpfr で、インストールしたディレクトリを指定することです。

(2008年8月30日)


足裏センサの調整です。 これでいいのかな? 1つの足裏に4つの圧力センサの強さが同じ力で同じ値になるように調整したいと考えています。 これは、足裏センサにより ZMP を正しく求めたいからなのですが、値調整が難しい。 もともとセンサそのものが持っている誤差、OPAMPで増幅する際の誤差、その他電気的な誤差の他、4つに同じ圧力を加える、ということが難しいのです。 何か良いアイデアはないものでしょうか。。。

とりあえず、4つの中心点付近1点で押しつけた場合に圧力変換値が同じくらいになるように電気的に調整しました(4つ目の凸部)。 これで正しくZMPが得られるはず。 あとは、ZMP 座標が足裏の座標範囲から外れないように補正し、重心座標計算すれば良いはず。

前後軸 : (足裏のカカト座標) ≦ (足裏センサでのZMP前後座標) ≦ (足裏のつま先座標)
左右軸 : (足裏の内側座標) ≦ (足裏センサでのZMP左右座標) ≦ (足裏の外側座標)
(ただし、前後軸では、前が+、左右軸では外側が+とする)

あと、昨日の gcc-4.3.2 ネタですが、cross-compile 環境は正しく動いているみたいです。 新しいもの好きなので、ついつい変えてしまうのですが、バグなく(あっても影響なく)リリースしていただけるのは非常に助かりますね。

(2008年8月31日)


HOSv4 関連です。 V850ES/JG2 でも動作が可能となりました。 シマフジ電機さんのところで uITRON4の uT-Kernel への移植が行われていますが、それに続く uITRON4 互換の RTOS移植です。 (もちろん、TOPPERSも動いていますね)
手元に、Minicube2 の懸賞であたった V850E/IG3 ボードもありますので、V850ES だけではなく V850E 全般での動作ができるように展開してみたいと思います。
ドキュメントやサンプルなど整備が終わり次第、本家 HOS のサーバへアップロードしますので、しばらくお待ちください。

(2008年10月4日)


HOSv4 の V850ES/JG2 移植についてです。 一通り整備が終わりましたので、sourceforgeのココ にアップロードしました。 SEMB1200A と同様、サンプルコードにいろいろな割込みベクタの整備も行っておきましたので、ハードウェアユーザーズマニュアルを片手に整備はできるかと思います。 入手方法は、cvs による checkout(co) を行ってダウンロードしてください。 

今回は、以下が特徴です。

@ 基本的なライブラリの作成は、cygwin, msys 上で行う(ただし、NECエレクトロニクス製の無償提供コンパイラ一式は必要)。
A ライブラリ作成ができたら、その後は、無償提供統合環境の PM+ 上で行える。
B HOS 用のコンフィギュレータも PM+ で実行できる(サンプルとしてのPM+環境ファイルの添付(sample/v850es/sample.prw)と、ドキュメントに設定方法を書いておきました)。

HOSv4 を移植してですが、非常に移植自由度の高い RTOS だということを改めて感じました。 コツがわかったので、次のターゲットデバイスが決まったら、ささっと移植できそうな気がします。
あと、上記@がどうしても作れないとか、hos4cfg.exe が作れない、という方、いらっしゃいましたらデバッグということで協力いただくことを前提に配布いたしますので、連絡いただければと思います。

ところで、この10月のROBO-ONEは早くから日程上都合がつかないということで見切っているのですが、目標をきめてロボットに触らないと、回り道ばかりしてしまいますね。 denno-ono さんの情報収集には大変助かります。 これさえ読んでいれば、最近の動向を見落とすことなく(レベル的にどんどん差がついていくことだけは実感しながら)、趣味に没頭できます。 NHK からオファーのかかっているサイトがいくつか見かけます。 いずれも素晴らしい方々。 TV放映が見れるのか自信がありませんが、是非みてみたいものです。

(2008年10月5日)


ONO-ONE ありがとうございます! > denno_ono さん
V850ES 用 HOSv4 のつづきです。
少し改版しました。 今回の改版内容は、-reg22, -reg26 モード(外部変数レジスタ機能)のライブラリ作成時の編集項目を減らす工夫をしてみました。 引き続き、ちょこまかと改善をしてみたいと思います。(基本仕様は変わらないです)

(2008年10月6日)


今日はROBO-JAPAN と ROBO-ONE 予選の日ですが、都合と天候により自宅でのんびり、ということになりました。 この天気なら、明日は朝からお出かけでしょう。
ということで、HOSv4 の V850ES 環境を整備しなおしました。 改めて CVS にて sourceforge からゲット頂けると幸いです。

変更点は、libh4v850es.a を -reg22, -reg26, -reg32 という外部変数レジスタに対応させるというものです。 以前は、10/6の記載通りでしたが、makefile 等の工夫でフルオート作成が可能になりました。 お試しあれ。

参考までに、外部変数レジスタというのは、V850E(S) の場合、32本もの32ビットレジスタを持っていますので、これの一部を通常RAM上に配置される変数に割り振って、高速、最適化しようというものです。 変数そのものは、PM+ で定義できます。 RTOSの場合、タスク切り替え(ディスパッチ)のタイミングで全レジスタを push ,pop します。 外部変数レジスタはその対象外となりますので、ディスパッチの高速化にも役立ちそう、ということで積極的に盛り込みました。 実際、CA850 などCコンパイラはそれほどレジスタを多様しないこともありますので、外部変数レジスタで -reg22 を指定し、10個のレジスタ変数を指定すると、ご利益が大きいといえます。 設定方法の詳しい説明は、CQ出版 Interface 2008年 5月号の私の記事をご覧ください(笑)。

一応、これにて V850ES 対応は終わりにしたいと思ってますが、バグがあったら(もちろん)修正したいと思います。 気がついたところがあれば、ご連絡いただけるとたすかります。 > 皆様

(2008年10月11日)

第2部。 とっても使っていてイライラしてしまったので、ココにメモを残しておきます。 V850用コンパイラCA850 のヘルプメニューですが、Windowsコンソール環境では > help.txt などしてもテキストで落とせませんでした。(単にやり方が間違っているだけ?) そこで、とある手法で何とか全文を保存できたので、ココに上げておきます。 無償ソフトだし、特に copyright などの文字もないので良いでしょう。 何かクレームが来たらなにがしかの方法で対応します(笑)。

For V850/V850E on Microsoft(R) Windows(R)
== OPTIONS(other options are passed to ld) ==
-C               : make preprocessor preserve C style comments
-D<name>[=<def>] : define preprocessor symbol 'name'
-E               : run source through preprocessor, output to stdout
-Fic[=<file>]    : output intermediate language file
-Fo[=<file>]     : output object file
-Fs[=<file>]     : output assembler source file
-Fv[=<file>]     : output assemble list file
-G<num>          : specify maximum data size to locate sdata/sbss section
-I<dir>          : add directory 'dir' to preprocessor include path
-L<dir>          : add directory 'dir' to ld library path
-O[<c>...]       : specify optimization item
-P               : run source through preprocessor, output to '.i' file
-S               : produce '.s' file. do not run as
-U<name>         : delete initial definition of preprocessor symbol 'name'
-V               : print version and copyright
-W<c>,<arg>[,<arg>...] : pass option 'arg' on to phase 'c'
-X256M           : X256M option(see your manual)
-Xbyte           : Xbyte option(see your manual)
-Xbitfield       : Xbitfield option(see your manual)
-Xbpc=<num>      : Xbpc option(see your manual)
-Xchar           : Xchar option(see your manual)
-Xcre_sec_data_only[=<file>] : Xcre_sec_data_only option(see your manual)
-Xcre_sec_data[=<file>] : Xcre_sec_data option(see your manual)
-Xcxxcom         : Xcxxcom option(see your manual)
-Xcase           : Xcase option(see your manual)
-Xc              : Xc option(see your manual)
-Xdefvar         : Xdefvar option(see your manual)
-Xd              : Xd option(see your manual)
-Xe              : Xe option(see your manual)
-Xenum_type=<type> : type is changed into enum type
-Xfar_jump=<file> : Xfar_jump option(see your manual)
-Xfar_jump <file> : Xfar_jump option(see your manual)
-Xi              : Xi option(see your manual)
-Xj              : Xj option(see your manual)
-Xkt             : Xkt option(see your manual)
-Xk              : Xk option(see your manual)
-Xmask_reg       : Xmask_reg option(see your manual)
-Xm<num>         : Xm option(see your manual)
-Xno_word_bitop  : Xno_word_bitop option(see your manual)
-Xpack=<num>     : Xpack option(see your manual)
-Xpro_epi_runtime[=(on|off)] : Xpro_epi_runtime option(see your manual)
-Xr              : Xr option(see your manual)
-Xsconst[=num]   : Xsconst option(see your manual)
-Xsec_file=<file> : Xsec_file option(see your manual)
-Xv850patch      : Xv850patch option(see your manual)
-Xword_switch    : Xword_switch option(see your manual)
-ansi            : pedantic compilation option
-a               : make assemble list, output to '.v' file
-cc78k           : extended specification (78k migration)
-cpu <cpuname>   : CPU name of device file
-cnv850e         : create V850E core common object file
-cnv850e2        : create V850E2 core common object file
-cn              : create common object file
-c               : produce '.o' file. do not run ld
-devpath=<path>  : device file directory
-err_file=<file> : output error and warning to file
+err_file=<file> : append error and warning to file
-err_limit=<num> : set limit error number
-g               : generate extra information for symbolic debugger
-help            : print help message
-l<lib>          : read object library 'lib'
-m               : run source through frontend, output to '.ic' file
-o <file>        : set name of output file
-reg<num>        : register mode(22, 26 or 32)
-r<num>=<sym>    : reserve user register for external variable
-temp=<dir>      : create temporary files in 'dir'
-t               : enable trigraph
-v               : verbose mode
-w[<num>|<item>] : control warning messages, default 'num' is 1
-R <startup>     : replace startup module file
@<file>          : read command-file 'file'
== OPTIMIZATION ITEM CHARACTER ==
 b  : do basic optimization
 d  : do optimization in consideration of debugging
 g  : do global optimization
 m  : merge intermediate files
 s  : do code size optimization
 t  : do exec speed optimization
== PHASE CHARACTER ==
 p  : preoptimizer
 o  : global optimizer
 i  : improver
 a  : assembler
 l  : link editor
== STANDARD FILE SUFFIX ==
.a  : object library
.c  : C source file
.ic : intermediate language file
.o  : object file
.s  : assembler source file
.c2s: assembler source file
== =================== ==

(2008年10月11日)


足裏センサのバグだしが終わったので、本格的にプリント基板で作ることにしました。 部品点数が少ない割に、足裏面積分を作るので、結構実装としては余裕ができました。 信号線は表面の配線(除く圧力センサへの接続)で達成。 電源、GNDだけ裏面を使うというシンプル仕様にできました。(下図は表面配線と表裏実装部品、穴位置)

圧力センサは、廃番になった? HDK 製のもので、6ピンパッケージのMEMS。 テスト段階で気になったのが、このセンサの抵抗ばらつき。 ホイートストーンブリッジによる抵抗差をOPAMPの差動増幅でマイコンのA/Dコンバータに信号を入れて抵抗のバランスが崩れたことを電圧で検出する方法を採用しているのですが、センサによって感度が異なって見えたので、もしかしたら、このセンサ内部の4抵抗のセンターがずれているのではないか、と思いました。 そこで、今回の基板ではセンサの抵抗に直列に任意の抵抗を入れられるようにしました。 可変抵抗でもよかったのですが、@高い、A面積を食う、B足の振動で抵抗が変わってしまわないか(回転してしまわないか)が不安、ということで、定抵抗のものを入れることにしました。

あと、センサ以外はすべて表面側に表面実装できる部品を選びました。 というのも、ロボットの足裏にペタっと貼り付ける関係上、裏面側に出っ張りがあると足裏のフレームにも穴をあけないといけないからです(すでにフレームには重量低減のための穴があいているので、別の位置に穴をあけると剛性が落ちる)。

一応、これまでの経験から、@部品の発注、Aネジの発注、そしてプリント基板&実装の手続き、という順番にて進めることとします。

(2008年10月19日)


足裏センサーボードの部品類が一通り届きました。 LSI は RSコンポーネンツ。 コネクタはメーカ直販。 表面実装チップ型抵抗と容量素子は実装時にタダでもらえるものを利用。 これで出来そうです。

サブマイコンとしての V850ES ボードをさらにシュリンク。 36.8mm x 34.3mm。 ただし、外部バスのピンは外しました。 ロボットに搭載することを考えると、@SRAM増設をするなら、同じボード上で行いたい、A外部RAMは搭載しない、のいずれかと判断しての割り切り。 足裏センサーボードと面付けして発注することを検討中。 まだ空き土地があるので子ボード(変換ボード)など作っておこうかな。 (もしかして、ボード作成の相乗りを募ったら集まるのでしょうか。)

(2008年11月1日)


 このあたりで良いかな? いざ、発注! 基板サイズは約 100mm x 80mm で Eagle フリー版での最大サイズ。 発注枚数は、実際必要なのは2枚なのですが、1枚当たりの単価がサチっていそうな6枚(6枚でも、2枚でも総額はほとんど同じ)。 実装は2枚だけかな? 出張前に発注して大丈夫かちょっと心配。。。

左上:サブCPUボード、中央上:カメラ用アダプタ、左下:サブCPU補助ボード、右:足裏センサ用ボード。
サブCPU補助ボードは、音源用アンプと、電圧監視用減圧OPAMPと、個々のコネクタ用端子。

(2008年11月4日)


基板発注に際して、レイアウトを見直しました。 また、Vカットは基板の1辺から対辺まで通さないといけない、という仕様を見落としていました。 面付イメージは変えられないので、ミシン目指定に変更してみました(先の11/4イメージを更新しました)。

(2008年11月8日)


HOSv4 の V850ES版を更新しました。 今回はHOSのライブラリを生成する部分も含めて、すべてPM+(メーカー無償提供の統合環境)上で生成できるようにしました。

(2008年11月9日)


P板どっとコムのメモ
・ Eagle でレイアウトし発注する場合、微妙な誤差が生じる
・ 0.127mm 以下となると、びっくりする追加料金が発生するため、設計段階では、上記誤差を考慮しレイアウト必要。
・ べたパターンとビア間、べたパターンと信号線でエラーがほとんど。 そのため、べたパターンの clearance を 0.13mm とすると回避できる可能性が高い。 

(2008年11月12日)


北米の出張から戻ってきました。 出張中も P板ドットコムさんからメールを頂き、不具合を修正。

HOSv4 for V850ES版ですが、2つ大きく修正、追加しました。 1つは、多重割込みにおける不具合修正、もう1つは、OSタイマを16ビットタイマのTMMを使わず、時計タイマによるインターバルタイマ割込みを実現し行うものです。

(2008年11月23日)


発注していた基板が届きました。 年末年始に遊ぶおもちゃが揃った、というところです。 ちょっとダイオードの半田付けが曲がってしまってますが、大丈夫かな? 斜めカット部分はミリングだと追加料金だけど、ミシン目指定にしたので、すっきりカットしてもらえました。 助かりました。

ミシン目のつなぎ目は残し幅が小さいので基板を山なりに曲げるだけで分離できました。 そのあと、爪切りと軽くやすりをかけるということですっきりできあがり。

35mm x 37mm の基板に V850ES を搭載してみました。 ロボット専用(趣味)ということで、不要なピンを削除して設計したので、前回のものよりも更に小さくなってます。 電源+音声アンプ+電源電圧監視部を搭載したベースボードと、足裏センサボードの3つを1つで作ったので総額はそれなりですが、1つあたりは非常に安く仕上がりました。 足裏センサはちゃんと動作するか?よりも、既存の足裏フレームにぴったり合うか?が不安。。。

あと、最近、ロボットビルダーのホームページ更新がハード的な話題が少なくなりましたね。 メーカーさんの努力の結果だと思いますが、ちょっと寂しい感じです。 実際に操縦すること、イベントに参加することの前に、つくる楽しさのところがもっと輪が広がれば、と思う今日この頃です。 その中でも、ONOさんの電脳壁新聞や、ROBO-ONE 優勝者のDr.GIYさんのように製作記事を大公開頂いているところや、浅草ギ研さんのように製造販売も行いつつ自分の物作りを公開頂いているようなサイトがもっともっと増えると楽しいのですね。(自分は全然更新していないのですが。。。) 歴代のロボットビルダーの皆さん、がんばりましょう! (きっと不況だからこそ、自由になる時間は増えてくるはず。)

(2008年12月3日)


 ロボット製作のページへ

 トップページへ