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日)


新しいもの好きな私はnewlibが年末に更新されるのを待っていたのですが、なかなか downloadページ(newlibの左にあるリンクのこと)にアナウンスがされないので、探していました。 すると、News のところに v1.17.0 が 2008/12/22 に released! とあるではないですか! 早速、News -> Newlib Version 1.17 -> newlib project とリンクをたどって、大元の ftp サイトを見つけました。 なるほど、今後はここを見ればよいわけね。。。 ということで、ダウンロード成功。

SEMB1200A, V850E(S), SH2 などの環境用に構築開始です。

(2008年12月26日)


あけましておめでとうございます。 今年もよろしくおねがいします。

年始めからパソコンの調子が悪いのです。 電源を入れた後、ピコっと音が鳴ってBIOSが立ち上がる画面がでるはずなのですが、ピコという音すらでない。 電源が弱いのかなぁ。。。と思い、DVDドライブを1台外してみたら、起動した。。。 他にも何かありそうな。。。こまったものです。

昨年も行った1年を振り返ること、新年の抱負を書いておきたいと思います。

(昨年を振り返ってみると(昨年の目標に対して))
・ Web更新が少ない。(2年連続)
・ 結局、わんだほー、ROBO-ONE参加できなかった。
・ RTOS の HOSv4 については、SEMB1200Aへの実装を達成。 V850E(S) もできた。 これは合格点をあげたい。
(目標以外)
・ 更にお金を使っているような。。。

(今年の予定)
・ 関東ロボット練習会に参加する(初心にかえってみよう)
  - JiGoRoHP を成長させる(笑)
・ 練習会や大会以外は、やることを絞って広げない。
  - RTOS HOSv4 関連

雑誌掲載し多くの方に好評をいただいたこと感謝の2008年。 2009年は更なる飛躍の1年にしたいですね。

(2009年1月2日)


Hide-i さんの疑問にお応えできるか。。。まずは簡単に作ってみました。 疑問点を連絡いただければ、更新しますね。

Eagle での面付けの方法を紹介します。 活用ください。 注意点は、抵抗素子などの連番が継承されないことです。 たとえば、基板A, 基板B で同じ R1 という抵抗識別文字を使った場合、基板A情報に基板B情報を面付した場合、基板A の R1 はそのまま使えますが、基板B の R1 は基板A で使っていない R?? として登録されます。 さらにたとえば、基板A で R1 〜 R12 まで使っていて、基板B では R1〜R10 を使っている場合は、基板B を面付した場合、R13〜R22 に番号が再度つけなおしされてしまうということです。 一件、良さそうですが、同じ基板Aを2面作ろうと面付した場合、基板A に基板Aを張りつけますが、2つめの基板A の抵抗番号は R13〜R24 になる、ということです。 同一基板データの面付けで文字を同じにしたい場合は、識別文字をテキスト文字で書きなおす方法くらいしか思い浮かびません。。。 基板A, 基板B で重ねたくない場合は、あらかじめ抵抗文字を基板A, B で、それぞれ RAnn, RBnn としておけば番号は重なりません。

@□点線のアイコン(Group) で
 基板全体のデータを選択。
 そのとき、うっかりやってしまうのが、
 表示情報として必要なものを
 消してしまっていると、領域選択から
 漏れてしまいますので、Display で
 必要な情報は出してください。

 また、GNDなどのベタパターンを作る
 外枠も領域選択の際に入れてくださいね。
Aはさみアイコン(CUT) で
  選択した領域の CUT してください。
  選択した領域の上で右クリックです。

  Microsoft 的な表現ではクリップボードに
  COPY される機能が、
  Eagle では CUT です。
B新規のボードデータ上で
  刷毛?アイコン(Paste)を行います。

  回路図がリンクされていないボードデータの
  場合は、同一ボードデータ上でも可能です。
B’同じボードデータを2つ
  貼り付けた場合です。

  コンデンサや抵抗の識別文字が連番に
  なっている様子がわかりますね。
  これに違和感を感じます。。。

(2009年1月9日)


昨日はONO-ONE でした。 ありがとうございます。 > denno_ono さん

Eagle で面付できたところで、次にやりたくなるのが、V cut などのボードデータ間の切断情報をガーバデータに落としたいということ。
P板どっとコムで入手できる Eagle のガーバデータ変換 CAM 情報に V CUT 情報を加えてみたのが、コレです。 P版どっとコムに発注するときにも必要な情報ですので、拡張子と意味、層合成を対応させた表を記しておきます。 また、ガーバデータのチェックには、GraphiCode の GC-Prevue(無料トライアル版) がお勧めです。 P板どっとコムで入手できるガーバビューアでは相性がわるいのかうまく表示できないことがあるのですが、GC-Prevueだとばっちりでした。

拡張子 説明 層合成 備考
.cmp 部品面パターン 1+17+18  
.plc 部品面シルクデータ 21+25 vector フォントで
.stc 部品面レジストデータ 29  
.sol 半田面パターン 16+17+18  
.pls 半田面シルクデータ 22+26 vector フォントで
.sts 半田面レジストパターン 30  
.out 基板外形 20 0.2mm幅
.vct Vカット 46 0.5mm幅
.drd ドリルデータ 44+45 excellon.cam で出力
.dri ドリルリスト - excellon.cam で出力

今年の決意(抱負)を少し(だいぶ?)見直し。
まだ1週間しか今年は仕事をしていませんが、とても疲れました。 また、波乱含みなスタートで、今年1年はロボットを触れる時間が非常に少なく貴重になりそうです。 できるときは集中してしっかりとやりたい、そう感じました。

(2009年1月10日)


サブボード立ち上げに苦戦していました。
しかし、なんとか解決できそうです(来週から出張なのにこんなことしていていいのだろうか。 リフレッシュと自分を納得させているのですが。。。)。

苦戦してしまったのは、@サブCPUボードは、低消費電力なものばかりつなげているという思い込み、AGP2D12の動作時の消費電流を甘く見ていた、AGP2D12は3.3Vでも特に問題はないんだという思い込み、の3つです。 特に、GP2D12 の使い方については、すごく勘違いしていました。 電源電圧は+4.5〜5.5Vだったのですね。 3.3Vでも動いていたのと、どこかでもっと広いレンジの規格を読んだと思い込んでいたことが原因特定を遅らせてしまいました。 3.3Vでも動作しているのですが、その場合、消費電流が多いようです(実測していませんが、他のデバイスが安定動作しないので、光を出すタイミングでのラッシュカレントは結構大きいのでしょうね)。

対策は、GP2D12 の出力は3.3Vよりも十分小さいみたいなので、電源だけ5Vに変更し、ラッシュカレント対策として、GP2D12 側に 100uF程度のコンデンサを入れること、とします。

(2009年1月24日)


パパ何しているの? ロボットの修理?
まぁ、そのうち動くから。。。
これではいけない。 そろそろ本格的に動かしてみるか。

(2009年2月25日)


ちょっと V850ES マイコンの勉強資料として作ってみました(ここクリック)。 RC PROPO の 4ch PWM 信号を合成して、4つのPWM信号を生成するという単純なもの。 すべて割込みだけで行っているので、メインプログラムは自由につくれるはずです。 何せ、勉強資料なので、デバッグすらしていません。。。あしからず。 バグ情報頂ければ修正はしますが、ソフトの使い方、ハード設計、使用した際のハードの故障、トラブルなど一切責任を負いませんので、ユーザの皆さんで勉強用として使っていただければと思います。

(2009年3月7日・その1)


足裏センサ部分の回路が、ほぼ決まったので、概要を公開します(きまったつもりがバグっていたのをようやく駆除できました)。 振り返ってみれば、昨年の8月からこれやってるんだ。。。

北陸電気工業製の微小フォースセンサを代理店経由で購入しようとしたのですが、リメイク中とのことで断られてしまったので、とある知人からわけていただきました。 ありがとうございました。 (また作り直したいので、10個ほど分けてほしいなぁ。。。)
その微小フォースセンサは、ホイートストーンブリッジ回路のような構成になっているため、インスツルメンテーションアンプという方式で、差動増幅させて信号を得ることにしました。 入力インピーダンスが気になる場合は、もう少し OPAMP を追加する回路もありますが、その効果はあまりなかったので、今回はシンプルに1個のセンサに3つのOPAMPの回路までとしました。 その電圧信号を、AREF=+3.3Vとした78K0/9222 にてA/D変換し、4回積分を行うこととしました。 マイコンの78K0はICS2.0信号を処理することと、高速に安定動作させるために+5V電源で動作させることとしたため、アナログ部の信号電圧とわけることにしました。

結果、手で押さえた時の信号波形なので、あまり意味はありませんが、各センサの0点となる最小値も安定していて、応答性も非常によいことがわかりました。 あとは、ロボットに搭載するだけなのですが、その場合、足くびトルクが強すぎると、足裏センサの意味がなくなってしまいそうなので、「竹馬」の要領で足くびトルクがなくても歩ける歩行を実現し、足裏センサを的確に読み取れるようにしたいと思います。 ZMPを抽出することができるはずなので、不整地や、多少の衝撃が加わっても歩けるようなロボットになるんじゃないか、と期待しています。 ただ、ずっとトルクを下げていたのでは、何かとおかしな動作になりそうなので、着地から重心が乗るまでの間だけトルクを下げてZMP抽出を行い、重心がある、とわかったら、そこと理論値との差分から足くび角度を決定しオフセットを加えるようなことができればいいのかな?とイメージしています。 イメージだけですけどね。

(2009年3月7日・その2)


そろそろホームページの中身を整理しないといけないなぁ、と感じてきました(サーバの上限を超えてしまった)。
テキスト文であれば、なんとか追記できそうなので、書けそうなネタだけ残しておきます。

今日はNECエレクトロニクス製の16bitマイコン78K0Rのコンパイラオプションについてです。 この類のネタを書くと、あることをしているのですが、できてから公開ということで。 ちなみに、ターゲットとしている開発ボードは市販品のQB-78K0RKG3-TBとしました。

RA78K0R
78K0R Assembler W1.31  [19 Aug 2008]
   Copyright(C) NEC Electronics Corporation 2006,2008

usage : ra78k0r [option[...]] input-file [option[...]]
The option is as follows ([] means omissible).
-cx          :Select target chip. ( x = f1166a0 etc. ) *Must be specified.
-o[file]/-no :Create the object module file [with the specified name] / Not.
-e[file]/-ne :Create the error list file [with the specified name] / Not.
-p[file]/-np :Create the print file [with the specified name] / Not.
-ka/-nka     :Output the assemble list to print file / Not.
-ks/-nks     :Output the symbol table list to print file / Not.
-kx/-nkx     :Output the cross reference list to print file / Not.
-lw[width]   :Specify print file columns per line.
-ll[length]  :Specify print file lines per page.
-lf/-nlf     :Add Form Feed at end of print file / Not.
-lt[n]       :Expand TAB character for print file(n=1 to 8)/ Not expand(n=0).
-lhstring    :Print list header with the specified string.
-g/-ng       :Output debug information to object file / Not.
-j/-nj       :Create object file if fatal error occurred / Not.
-idirectory  :Set include search path.
-tdirectory  :Set temporary directory.
-ydirectory  :Set device file search path.
-ffile       :Input option or source module file name from specified file.
-ga/-nga     :Output assembler source debug information to object file / Not.
-dname[=data][,name[=data][...]]  :Define name [with data].
-common	     :Create the common object module file for 78K0R.
-self        :Use Self-programming.
-zs/-ze/-zn  :Change source regulation.
               -zs:SJIS code usable in comment.
               -ze:EUC code usable in comment.
               -zn:no multibyte code in comment.
-compati/-ncompati:Use macro for DIVUW,ROR4,ROL4,ADJBA,ADJBS,CALLF,DBNZ / Not.
--           :Show this message.
DEFAULT ASSIGNMENT:
	  -o -ne -p -ka -nks -nkx -lw132 -ll0 -nlf -lt8 -g -nj -ga
CC78K0R
78K0R C Compiler W2.10  [ 8 Jul 2008]
   Copyright(C) NEC Electronics Corporation 2006,2008

Usage : CC78K0R [option[...]] input-file [option[...]]
The option is as follows ([] means omissible, ... means repeat).
<Preprocessor>
  -dname[=data][,name[=data]]...
                : Define name with data.
  -uname[,name]...
                : Undefine name.
  -idirectory[,directory]...
                : Set include search path.

<Memory Arrangement>
  -cx           : Select target chip. ( x = chip name ) *Must be specified.
  -mx           : Memory model (default : x = m)
                        x = s : Small memory model
                        x = m : Medium memory model
                        x = l : Large memory model
  -mi[n]        : Select allocation of MIRRORP segment. (n = 0, 1)
                  (default : n = 0)
  -mafile[ -mafile]
  -mafile[,file]
                : Specify variable and function information file.
  -rx/nr        : Control data arrengement / Not.
                   x = d : assign external variable to SADDR area (all)
                   x = dn: assign external variable to SADDR area till n byte
                            (n = 1, 2, 4)
                   x = dm: assign external variable to SADDR area
                           structure, union and array
                   x = s : assign local static variable to SADDR area (all)
                   x = sn: assign local static variable to SADDR area
                           till n byte (n = 1, 2, 4)
                   x = sm: assign local static variable to SADDR area
                           structure, union and array
                   x = b : assign bit field from MSB
                   x = c : packing structure members
                   x = a : suppress indirect word access
                   x = f : assign ROM data to far area
                   x = n : assign ROM data to near area

<Optimization>
  -q[z]/nq      : Optimize output code / Not. (default : z = cjlvw)
                   z = x[n] : max. optimization (default n = 2)
                             n = 1 : optimize object speed           (z = cjvw)
                             n = 2 : default                        (z = cjlvw)
                             n = 3 : optimize object size          (z = cjl3vw)
                   z = c : assign char variable without sign expand
                   z = u : change plain char to unsigned char
                   z = r[n]: use SADDR area for norec & register variable
                                                             (default : n = 2)
                             n = 1 :  norec parameter & auto variable
                             n = 2 :  n = 1 & register variable
                   z = v : automatic allocation of the register variable
                   z = j : jump optimization
                   z = l[n]: optimize object size (default : n = 1)
                             n = 1 - 3 : size is smaller as n is to 3,
                                                          but speed is slowly
                   z = w : aggressive optimization
                   z = g : optimization debugging
                   z = t : generate relative branch table for switch

<Debugging>
  -g[n]/ng      : Output debugging information / Not. (default : n = 2)
                   n = 1 : to .rel only
                   n = 2 : to both .asm and .rel

<Output Files>
  -o[file]/no   : Create the object file / Not.
                              (default : file = input file primary name)
  -a[file]/na   : Create the assembler source file / Not.
                              (default : file = input file primary name)
  -sa[file]/nsa : Create the assembler source file with the C source / Not.
                              (default : file = input file primary name)
  -li/nli       : Output included source to the assembler source comment / Not.
  -e[file]/ne   : Create the error list file / Not.
                              (default : file = input file primary name)
  -se[file]/nse : Create the error list file with the C source / Not.
                              (default : file = input file primary name)
  -x[file]/nx   : Create the cross reference list file / Not.
                              (default : file = input file primary name)
  -lw[width]    : Specify list file columns per line. (width = 72 to 132)
                                                 (default : width = 132)
  -ll[length]   : Specify list file lines per page. (length = 0, 20 to 65535)
                  0 means no paging.              (default : length = 0)
  -lt[n]        : Expand TAB character for list file. (n = 1 to 8)
                  Not expand. (n = 0)                  (default : n = 8)
  -lf/nlf       : Add Form Feed at end of list file / Not.
  -p[file]/np   : Create the preprocess list file / Not.
                              (default : file = input file primary name)
  -k[y]/nk      : Specified preprocess list mode / None. (default : y = fln)
                   y = c : delete comment
                   y = d : execute #define
                   y = f : execute #if, #ifdef, #ifndef
                   y = i : execute #include
                   y = l : execute #line
                   y = n : add line number and paging

<Miscellaneous>
  -zy/-nz       : Change source regulation / Not. 
                   y = a : disable extensions (ANSI standard only)
                   y = f : output the object for flash memory
                   y = p : enable C++ comment, ignore from // till end of line
                   y = c : comment can nest
                   y = s : SJIS code usable in comment
                   y = e : EUC code usable in comment
                   y = n : no multibyte code in comment
                   y = b : not expand argument and return value
  -ztaddress    : Specify start address of flash area branch table.
  -zzaddress    : Specify start address of flash area.
  -v/nv         : Verbose compile messages / Not.
  -w[n]         : Change warning level. (n = 0 to 2) (default : n = 1)
  -tdirectory   : Set temporary directory
  -ffile        : Input option or source file name from specified file.
  -ydirectory   : Set device file search path.
  --            : show this message.
  -?            : show this message.
  -h            : show this message.

  DEFAULT ASSIGNMENT
                : -o -g -qcjlvw -lw132 -ll0 -lt8 -w1

(2009年4月9日)


近藤科学から、値段、トルクともに高いサーボKRS-6000台が発売されるみたいですね。 18個大人買い用も用意されているところなんか、すごいですね。 きっと、木箱か何かに入ってるのでしょう(冗談です)。 LiPOも5500mAh とかいうのも出てますので、またまた大電流時代に入ってきた感じですね。 家電製品業界で大型のものを作るのは、それよりちょっと小さいものを売るための餌だと聞いたことがあります。 このサーボはどういうところをターゲットにしているのだろう。。。(と、KRS-4014 が出た時も感じましたが、結局主流になってるので、KRS-6xxx も自然と移行していくんでしょうか。)

78K0R/KG3 で通信部分のプログラムを作成。 割込み処理なしで通信をさせたかったのですが、Applilet2 や UsersManual だと割込み前提で記載されているため、初期設定などからフルスクラッチしてみました。 SAU(Serial Array Unit) による UART 実現という方式なので、SAU のチャンネル毎に、設定をするということが少々面倒だな、と感じました。 きっと、何かの仕様変更などに追従しやすいようにパラメータがたくさんあるんだろう、と思いました。 もしかすると、近藤科学サーボのICS2などは結構簡単に対応できそうな気がしました。(できたら、SAUのチャンネル分、つまり8ポート分持っていることになるので、SEMB1200Aと同じように使えそうです。 グーグル等で調べてもなかなか 78K0R 関連の記事がないので、ソースコードを下記に示しておきます。 書き間違い等ありましたら、ご指摘いただけると助かります。 今回の場合、UART2(SAU10=TxD2,SAU11=RxD2) を使っています。

/*      --------------------------------------------------------------------------      */
/*      -       UART2 に1文字送信                                               -      */
/*      --------------------------------------------------------------------------      */
void    uart2_putc(
        uint8   x
)
{
#if 1                                   /* 改行文字を2文字化。 不要なら、1 -> 0 に    */
        if( x == '\n' ) {
                while( (SSR10 & 0x0020) != 0 ) ;
                TXD2 = '\r';
        }
#endif
        while( (SSR10 & 0x0020) != 0 ) ;
        TXD2 = x;
}
/*      --------------------------------------------------------------------------      */
/*      -       UART2 より1文字受信                                             -      */
/*      --------------------------------------------------------------------------      */
uint8   uart2_getc( void )
{
        uint8   rxd;

        while( (SSR11 & 0x0020) == 0 ) ;
        rxd = RXD2;
        return rxd;
}
/*      --------------------------------------------------------------------------      */
/*      -       UART2 初期化                                                     -      */
/*      -               Baudrate        = 38400bps                               -      */
/*      -               Character       = 8 bit                                  -      */
/*      -               Parity          = NONE                                   -      */
/*      -               Stop Bit        = 1 bit                                  -      */
/*      -               ※ 送受信における割込み処理は実施しない                 -      */
/*      --------------------------------------------------------------------------      */
void    init_UART2( void )
{
        SAU1EN  = 1;                    /* SAU1 clock supply                            */
        NOP();
        NOP();
        NOP();
        NOP();
        SPS1    = 0x0022;               /* CK11=CK10=fclk/(2^2)=5MHz                    */

        /* UART2 initial setting */
        ST1     |= 0b00000011;          /* disable UART2 RxD and UART2 TxD              */
        SRMK2   = 1;                    /* disable interrupt of INTSR2                  */
        SREMK2  = 1;                    /* disable interrupt of INTSRE2                 */
        STMK2   = 1;                    /* disable interrupt of INTST2                  */
        SRIF2   = 0;                    /* clear interrupt-flag of INTSR2               */
        SREIF2  = 0;                    /* clear interrupt-flag of INTSRE2              */
        STIF2   = 0;                    /* clear interrupt-flag of INTST2               */
        SIR11   = 0b00000111;           /* clear Flaming-E/F, Parity-E/F, Overrun-E/F   */
        NFEN0   |= 0b00010000;          /* noise filter on for UART2 RxD                */
        // RxD
        SMR11   = 0x8122;               /* CKS=1, CCS=0, STS=1, SIS=0, MD=UART          */
        SCR11   = 0x4097;               /* RxD(TXE=0, RXE=1), 8N1, LSB-1st              */
        SDR11   = 0x8000;               /* SDR[15:9]=64 -> 64 << 9 = 0x8000             */
        // TxD
        SMR10   = 0x0022;               /* CKS=0, CCS=0, STS=0, SIS=0, MD=UART          */
        SCR10   = 0x8097;               /* TxD(TXE=1, RXE=0), 8N1, LSB-1st              */
        SDR10   = 0x8000;               /* SDR[15:9]=64 -> 64 << 9 = 0x8000             */
        SO1     |= 0x0001;              /* output level                                 */
        SOE1    |= 0x0001;              /* enable UART2 output                          */

        /* RXD2 pin setting */
        PM14    |= 0x08;
        /* TxD2 pin setting */
        P14     |= 0x10;
        PM14    &= ~0x10;

        SS1     |= 0b00000011;          /* enable UART2 RxD and UART2 TxD               */
}
/*      --------------------------------------------------------------------------      */
/*      -       CPU初期化                                                        -      */
/*      --------------------------------------------------------------------------      */
void    init_CPU( void )
{
        OSTS    = 0b00000111;           /* 13.11msec. waiting (2^18/fx)                 */
        CMC     = 0b01000001;           /* 20MHz, X1 mode, non-SubCLK                   */
        MSTOP   = 0;                    /* start external CLK with X1                   */
        while((OSTC & 0xFF) != 0xFF) ;
        OSMC    = 1;                    /* >10MHz                                       */
        CKC     = 0b00111000;           /* CSS=0, MCM0=1, fCLK=fMX                      */
        HIOSTOP = 1;                    /* stop internal HighSpeed CLK                  */
        XTSTOP  = 1;                    /* stop SubCLK                                  */
}

(2009年4月12日)


78K0R/KG3 を触って3日目。 HOSv4 の(大雑把にですが)動作確認までできました。 各種割込みのテストは行っていませんが、タスク切り替えは問題なくできているようです。 78K0, 78K0R は4バンクのレジスタ構成になっているのですが、これをRTOSではどのように扱えば良いのか、悩みどころです。 ここはおいおいやっていくとして、まずは、sourceforgeに登録できるように、ドキュメント整備を進めたいと思います(ドキュメントはなくても良いので欲しい方、メール下さいね)。

(2009年4月12日・その2)


78K0R用 HOSv4 を sourceforge.jp に CVSで登録しました。

# 自宅PCの調子が悪いので、週末は大がかりな修理かな? RAID-5 がダメなのかなぁ。。。

(2009年4月13日)


今日は雨上がりでしたが、家族と約束していたBBQしてきました。 近くの河原で昼ごはん。

ここ数日PCと闘っていたのですが、自宅PCの不調原因がつかめた感じです。 パソコンショップで電源容量が足りないとか、HDDの消費電力が大きいから分散させるべきだとか、情報を得ましたので、とりあえず素直に従ってみることに。 まずは、電源交換だけでどうかな?と思ったのですが、やっぱり突然パワーダウン。 次に、電源の交換とHDDを一旦80Gバイト単体で動作させようとしたのですが、WindowsXPインストール時に、ブルーバックになったり(メッセージがすごい;ウィルスに侵されている可能性がありますとか。。。)、DVDドライブの読み取りに失敗したり(たぶん、これをウィルスと勘違いしてるのがブルーバックメッセージ)、惨憺たる状態。 ふと、思ったのが、DVDドライブが悪いんじゃないか?です。 昔使っていたドライブに交換したら、すんなり、WindowsXPのインストール完了。 気を良くして、HDDをもとのRAID-5状態に戻して、全ドライブを動作。 何の問題もない。 DVDドライブが悪いだけで、システムが全部落ちるほどのトラブルって。。。(思わず故障解析をしたくなりました)

今は、快適に動いています。 ということで、3D-CAD で絵を描いたり、プログラム作ったりの生活が復活しました。

ところで、SISOさんのBLOGでコメントしていたのですが、秋月通商さんで以前扱っていたロープロファイル・ピンソケット、販売再開していますね。

(2009年4月18日)


78K0R のオプション・バイトについてメモです。
ハードウェア・ユーザーズマニュアルや、RA78K0R のヘルプにあるのですが、見つけるのに苦労しましたので、メモを残しておきます。
RA78K0R(CC78K0R)では、オプションバイト指定は、2通りできるようになってます。 @オプションバイトコードを記載したソースをアセンブラ形式で記載し同時にビルドする。 Aリンカオプションにて指定する。 @、Aの場合、Aの方が優先度が高いことになりますので、注意が必要です。 特に、Applilet2 などでコードを自動生成させた場合、リンカオプションも同時に指定されている場合があります。

これは、オプションバイトを RA78K0R(CC78K0R) のリンカオプションの設定、出力2の画面のハードコピーです(上半分だけ)。 赤丸部分がオプションバイト指定するための入力箇所です。 ここでは、オプションバイトの最初の3バイトが指定できます(上記指定は、WatchDogTimerを使用しない場合の例になります)。

A HOSv4 の hos4cfg 用に探し物、見つかりました。 CC78K0R は cpp (c preprocessoer) だけの処理を行うことができないようなので、フリーで単独配布されている cpp です。 すると、mcpp というツールを見つけました。 これによって、hos4cfg の前段処理が mcpp system.cfg > system.i だけでできてしまうすぐれものです(PM+上での設定例は下記の画面コピーを参照ください)。 bcc55cygwin, MinGW(msys)などインストールしていれば、gccのcppがあるのですが、HOSv4 での 78K0R版は V850E(S)版と同じく、NEC Electronics製の無償版 PM+環境上単独で作ることも可能なようにしたかったので、必要になったというわけです。

(2009年4月19日)


今週末、いよいよ発売になります、Interface誌別冊の TECH-I 42号で、再び V850ES/JG2 のロボット製作記事が再び載ります。 いろいろな製作記事が入ってますので、TECH-I はお買い得?

(2009年4月22日)


私と同じくPC不調だった、思い立ったが吉日の石川さん。 原因も同じ。 DVDドライブ交換でパソコン復活。 流行りでしょうか? 電源系のトラブル、怖いですね。

(2009年4月25日)


JiGoRo3 設計中。

(2009年4月28日)


NEC Electronics 製の無償提供品の統合環境 CubeSuite をインストールしてみました。 PM+に比べて、立ち上がりに時間がかかるということを除いては、PM+環境で不満に感じていたところをうまく仕上げてくれている感じがします。 MPUの品種が多いので、順次対応のようですが、MPUのピンコネ表なども出てくるのは、ユーザーズマニュアルを探す手間を省いてくれる良い機能に思えます。 このあたり、ユーザーに解放してくれれば、整備をしていくんですが、メーカー品だからなかなか自由に仕様を公開してくれないのでしょうね、きっと。。。

CubeSuite のすごいところは、従来の統合環境のプロジェクトファイルをそのまま流用できることですね。 環境以降のための手続きはすべてソフトがやってくれる、当たり前のことをしてくれるのがうれしいです。 V850E(S), 78K0R に移植した RTOS の HOSv4(HyperOS uITRON4.0) のライブラリ構築、開発環境もそのまま使えましたので、特に、CubeSuite用のプロジェクトファイルを添付しなくてもよさそうです。

(2009年5月1日)


JiGoRo3用に平行リンクの脚部を考えてます。 足くび部分の自由度を増すということを考えると、飛騨神ロボットのNeutrino-NEROがとても良くできているな、と感心してしまいました。 製作過程の写真など参考になります。 ロボプロチャレンジカップで準優勝という実力からしても、完成度の高さがわかりますね。 すばらしいです。 トコトコ網野さんのアドバイスを忘れずに仕上げたいなと思います。

(2009年5月2日)


JiGoRo3 のボディ部分と、従来の軸構成をベースに軽量化したタイプは作画完成しました。 先日のとおり、平行リンクのものも同時に作ろうと考えてるのですが、なかなかまとまりません。 もっと大々的に変更しないと駄目かなぁ。

アルミの板金加工だけで仕上げようとするから難しいのかな? とりあえず、足くび?部分のパーツだけはこれでよいだろう、というものが完成。

テクノロジア(株)が8日に、秋葉原でロボット専門ショップとして開店するそうな。 旧・ロボット王国の店長がロボット専門ショップの店長に就任されたとか(噂情報)。 心機一転頑張ってほしいですね。 ロボット王国のWebショップは、いつまで存在しつづけるのでしょうか(品物は売り切れ状態のままですが)。

(2009年5月5日)


ちょこっとネタ。 近藤科学製のベアリング付きサーボホーンをアルミ板につける際に回転を阻害しないようにするアイテムです。

上の2つの写真で左側をご覧ください。 いわゆる平ワッシャー。 左がM3用、右がM2.6用です(すみません、撮る角度が悪く、同じ寸法に見えますね)。 外形寸法は、M3はφ7.6mm, 0.5mm厚、M2.6はφ7.2mm, 0.5mm厚でした(実測値)。 このほんの少し外形直径の差がポイントです。 M3ネジでも、M2.6用の平ワッシャーが使えるのも内径がほとんど変わらないためです。 上の右側の写真は、スルーホール基板(1.6mm厚)にサーボホーンをつけてみたところです。 サーボホーンと基板の間に平ワッシャーがあるのですが、左側がM3の平ワッシャー、右側がM2.6です。 拡大してみるとわかるのですが、M3用平ワッシャーだとベアリングの外側(フリーホーンに固定された方)が完全にあたってしまうのですが、M2.6用だと微妙に内側に潜り込む感じでフィットします。 裏側から見た写真を下に示します。

これらの写真も左側がM3用平ワッシャー, 右側がM2.6用平ワッシャーです。 フリーホーンに取り付けられたベアリングが見えない左に対して右側が平ワッシャーの外側に見えるのがわかります。 手で回してみると、差は歴然です。
この発見?で、アルミ板に0.5mmの溝加工を施さなくてもよいことがわかったので、加工の手間(費用増)が防げました。 ただ、ベアリングの厚さ分だけ寸法補正をしないといけませんが、0.5mmだけずらせばよいので、大丈夫。

注)ここの平ワッシャーですが、一般規格かどうか調べていません。 近くのホームセンターで購入したものですので、製造バラツキなど含めて必ずできるかどうかは当方は責任を負いかねます。

(2009年5月16日)


先日に続いて、工作ネタ。 直行軸を作るときにフリーホーンを固定するネジが気になりました。 ネジ頭部のサイズが通常M3だとφ4mmくらいですが、これは、φ9mmです。 (有)浅井製作所さんのところから入手しました。 これを使うとネジ頭部の面積が大きいので、アルミフレームにピタっと張り付く感じで、軸がぶれが改善できます。

現時点の足構造。 描けば描くほど、イメージからずれてくる。。。

(2009年5月18日)


ROBOSPOT にて POM 加工が開始というのを見つけて、早速見積をお願いしました。 思ったよりも高めかな?とも思えましたが、加工に要する時間を短くできるように設計を工夫したらいいのね、と気がつく。 寸法調整含めてもうすこし見直して発注させていただくことにしよう。 Inventor のデータそのままで受け付けてくれるのがうれしいですね。

話は変わって、4月から勤務体制が変わったので、家での過ごし方もかわってきました。 朝4時におきて、ロボットのことをあれこれ考えてから朝食、出勤、というのが定着してきました。 この時間帯にメールすると相手からビックリのコメントが多いですが、そういうことです。

ロボット王国、復活なんですね。 おめでとうございます、かな。 秋葉原にたくさんのロボット関係のお店ができるのはうれしいことですが、もうちょっと値段を下げてほしいなぁ。。。

(2009年5月22日)


コントローラについて。 Wii リモコンの解析したサイトが充実していますね。 新しい形のリモコンなので、2足歩行ロボットで使うとしたらマスター&スレーブの際に両手にもって動かすくらいでしょうか(2つもコントローラを使うなんて贅沢ですけどね)。

日本のゲーム機が海外で解析されてるっていうのがすごいですね。

ここまで解析が終わってれば、搭載は簡単そうなんですけど、どうも満足感がなさそうなので、自作かな? また、完成まで時間がかかりそうですけど、趣味ですから、いいんです。

(2009年5月24日)


ボチボチと色々なことを平行してやっています。 有言実行というと、趣味でなくなるので、できたところで随時お知らせ(公開)していきたいと思います。 その中でも、3D-CAD でロボットのイメージをつくっていくのは楽しいですね。 お金はかからないので(電気代はかかりますね)、あれこれ書いてしまいます。 ですが、現実的に板金加工へ移ろうとすると、数が多くてギブアップ。。。 うーん、宝くじでも買うか。。。(どうせ当たらないから買わない主義だったが)

(2009年5月27日 AM5:30)

シマケンさんから、SEMB1200A にて malloc() を使いたいんだけど、という連絡をうけました。 こちらで調べた感じですが、割込み含めて non-OS 状態でも特に問題なく動いています。 malloc(), realloc(), memalign(), free() といったものをテストしています。 sbrk() にてメモリ領域を確保しておいてその中で使うという形です。 シマケンさんはきっと、すごい行列を扱っていらっしゃると思うので、きっとテストプログラムくらいなものでは引っかからない現状を引き起こしてしまってるんだろうな、と思います。 1つ気になってるのは、割込み処理をした場合だけ引っかかる、ということ。 もしかして、割込み処理の方が malloc() でメモリを確保するよりも前に実行して、NULLポインタを参照しに行っていませんか?

(2009年5月27日 PM 7:10)


SEMB1200A ネタが出たところで、1つ予告です。
ひさびさにライブラリを更新します。 これまでドキュメントのtypoを除いて具体的にココがおかしいという情報が来ていないので、大きく仕様は変更しない予定です。 次のことが改版の目的です。
 @ Ether 1port のサンプルを添付。 どのようなレベルまで書いてリリースするのが良いのか未熟な私にはわからないため、サンプルコードとして添付する。 提案あればメールください。
 A inline 定義を削除し、無駄なコードが .bin に入らないようにする。
 B HOSv4 との連携をとる。
こんなところでしょうか。

(そろそろ、ページを新しくした方が良いのかな? それとも、テーマ毎に整理した方が良いのかな???)

(2009年5月30日)


JiGoRo3の一部パーツが仕上がってきました。 1か所設計ミスしてしまってることの気が付きましたが、回避はできそうです。 よかった、よかった。 全体の仮組(結線)を週末からスタートですね。

(2009年6月5日)


宣伝しても加工代OFFキャンペーン中ではないので期待はできませんが、ROBOSPOT に POM加工依頼をしました。 POM材の色も指定ができて良かったです(納品まで待ち時間が出てしまいますが)。 これで、JiGoRo3 の加工依頼はほぼ完了。 あとは、サーボのシリアル番号をつけなおしてプログラミングしなおすだけ、のハズ。 足の長さなど入力しなおすだけで動歩行計算プログラム部分は変更しなくても動くはずなのだが。。。 とらぶった方が楽しいのだが、やはり一発で動いてほしいものです。

(2009年6月9日)


帰宅したら城南通信機さんから連絡。 とっても親切なフォローをいただいて、いつも助かります。 時間をお金で買うというところでロボット作りを行ってますが、特に板金加工のところは城南通信機さんのような個人相手に行っていただけるところが非常に助かります。 皆さんもDXFファイルが描ける環境があるのであれば、一度トライしてみては?と思います。

(2009年6月11日)


構想だけは進んでいます。 今回チャレンジですが、プリント基板を EzPCB に発注してみようと思います。 価格が安いことが魅力ですね。 ちょっとググルといろいろと出てきますが、失敗談がないから大丈夫なのでしょう。 ここのルートが確立できれば、お財布に優しくなるので、うれしい限りです。

あと、Eagle のフリーライセンスの強い味方を発見しました。 GerbMagic です。 これで何をさせたいのかですが、ガーバデータ出力後のデータで面付けを行いたいのです。 Eagle そのもので面付けの方法については以前紹介した通りですが、これの欠点は、部品番号が同じ番号にならないように自動的にずらす仕様があるために、同じものを2枚面付したいという場合には、ちょっと手間です。 また、Eagleのフリーライセンスは80mmx100mmなので面付けの面積もそれに律則しています。 EzPCBなどに発注する場合は初期セットアップ費用がかかるので、1面で張り付けたデータが生成できれば、安くできますからね。 次の発注にはGerbMagicを活用してみたいと思います。

(2009年6月12日)


P板.COM で \12,000キャンペーン実施中。 100x100mm□が5枚でこの価格は魅力的。 ですが、シルクが片面なので、見送りさせていただきます。。。

(2009年6月18日)


昨日は子どもと一緒に秋葉原の ROBO-SPOT に POM加工品とパーツを買いに行きました。 子供にロボットを体験してもらおうと(自分のものは動作訓練中なので触らせていないのでした。。。)KHR-2HV をお借りして歩かせたり、サッカーさせたりしていました。 ほんと良くできていますね。 簡単に遊べたのでお店を出た後、大興奮でした。 ああいう感じで遊べるロボットにしないといけないんだな、と勉強になりました。

POM 加工の出来栄えは、非常にきれいでした。 ただ 2mmφの穴が開いていなかった(場所の目印だけ付いていた)ので、ひさびさに卓上ドリルが活躍しそうです。

あと、Eagle によるPCB基板製作にめどが立ちましたので、疑問点がいくつかあったのですが1点だけに絞って EzPCB にメールしてみました。 仕事以外で英語のメールするのが初めてなので、ちょっと緊張でしたが、まぁ、通じるでしょう。。。

今日は父の日。 子供から手作りのメッセージカードをもらいました。 うれしいものです。

(2009年6月21日)


EzPCB に基板発注を行いました。 簡単な英語のメールのやり取りで無事に発注できました。 わからないところは、I have some questions. 1st, ... とかいう感じで書けば回答がきます。 問題は、とても簡略化された文章で回答がくることがあって、その意味がわからない(何通りにも解釈できてしまう)ので、質問を繰り返してしまいました。 おもなメールのやり取りは、以下の通りです。 このキーワードがきたら、何をする、というのを覚えておけば大丈夫でしょう。 先方もかなりの broken-english なので、気軽にメールしましょう。

EzPCB) Thanks for placing order at www.ezpcb.com. Your order will be checked and quotated very soon, please be patient.
このメッセージは、Web にて gerber ファイルを登録した際に自動的に送付されてくるものです。
この後のメールのやり取りを避けるため、gerber ファイルの登録の前に、何度かメールで会話しておくとよいでしょう。
特に、見積もりはタダなので、そのついでにわからないところを聞くことがポイントです。
あと、うっかりミスを防ぐために、gerber ファイルと一緒に readme.txt ファイルに PCB 情報を書いておくとよいでしょう。
prototype の PCB には抵抗やコンデンサをタダでつけてくれるサービスもあるのですが、在庫がないとかいうことで、
もらえないものもありますが、readme.txt に書いておくと見積もりメールの時に教えてくれます。

EzPCB) hi, for your file xxxxx.zip. it is 2layers, 1.6mm thick ,HASL,4PCS it is $xxx shipping by EMS is $20 paypal: $xxx total price is $xxx
最終見積もりを教えてくれます。 これでOK。とメールすると、次のメールがきます(ちょっと時間がかかります)。

EzPCB) hi, attached is the order form ,please check it first and then i will begin it after i received the payment.
添付してくれたワードファイルは、特に値段とかが書かれています。 一通り目を通してチェックしましょう。 問題は、最後の payment。 the payment は paypal での送付をすると先方に自動で送られるメールのこと。 特に document を用意してくれ、ということではありません。 注意点は、paypal account は、EzPCB専用のものがあります。 (私がそうだったのですが)この時点でわからなければ、迷わず、Please tell me your paypal account. と言いましょう。 私はここで、3回ほどメールのやり取りしました(先方と言葉がかみ合わず困りました)。

paypal で送金をすると、しばらくの後、EzPCB からメールがきます。 入金を確認しました。 その後何をする?とか書かれていないのと、new customer gift の話とか全然出てこないので、迷わず、Could you give a new-customer-gift for me ? メールしました。 すると、納期とgiftも送るよ、のメールがきました。 これでひとまず安心。 1週間ほど待ちましょう。。。

(2009年6月25日)


今日は3つの注文先から品物が届いた。 ちゃくちゃくと JiGoRo3 の部品が揃っていくのですが、なかなか思うように組み立てが進まない。 もっと集中しないと。。。 コンセプトは正しいはず。 それをちゃんと実行しないでほっておくから、時代遅れになってしまう。 これ以上繰り返さないようにしないと。

(2009年6月26日)


EzPCB に発注していた基板が届きました。 シルク文字が若干ずれてしまってるかな?という印象をうけますが、十分実用に耐えるので良いと思います。

梱包は、プチプチを使った真空包装で、ミシン目で割れないように1枚だけ向きを逆にして入れてくれてます。 2つ残念だったことがあります。 1つ目、プロトタイプ用に無料でつけてくれるはずのコンデンサチップがWebにあるものがほとんど在庫なく、添付していただけなかったということです。 2つ目、最後の最後までEzPCBからの英語メールが淡白で、情報が漏れていることです。 EMS使って送ったよ、という最後のメールも、EMSの track-number を伝えてくれなくて問い合わせメールしたのですが土曜日だったので返信は月曜日。 結局、到着日に track-number の通知メールが届きました。 意味ないですよねぇ。。。。 どんなミスをしてもミスだと思ってないのか、謝りのコメントが入らない。。。それが普通なんだ、と思って対応すればいいんでしょうね。

(2009年7月7日)


EzPCB製造の基板に半田付け中。 1箇所回路ミスをしてしまったのですが、なんとか空中配線で回避できました。

JSTのEHコネクタを愛用しているのですが、JST-SHOP(JSTの通販)を使うよりも安価に入手できる店を見つけました。 実は、秋葉原に買い出しに行った際には必ず立ち寄っていたのですが、そのお店でも通販しているのを知りました(ココ)。 お財布に優しいお店、頑張ってほしいものです。

(2009年7月12日)


SEMB1200A で newlib の malloc() を使う場合、メモリが確保できないケースがあるようです。 sbrk() で領域確保しようとしてもエラー値 -1 が返される場合、ld の際に -lnosys を入れてみてください。 デフォルトで入れても問題はないと思いますので、specs に書き入れても良いと思います。 嶋田さんソース提供にご協力ありがとうございます。

(2009年7月19日)


SEMB1200A のライブラリを更新しました。 合わせて、SEMB1200A のページを見直しました(誤植を治しました)。 ライブラリについては、Rel.1, 2 があります。 include/semb1200a/mipsregs.h に不具合があったので、Rel.1, Rel.2 ともに修正してあります。 gcc-4.x.x で確認がとれている現象なのですが、#define した文字定数を変数として定義してもエラーにもワーニングにもならず、アセンブラコードで通ってしまえば気付かずにいるケースが散発してしまいます。 もしかすると、gcc-3.x.x でもそうなのかもしれません。 対象としている文字は、v0, v1, a0〜a3, t0〜t9, s0〜s7, k0, k1, gp, sp, fp, ra です。 つまり MIPS のレジスタ名です。

(2009年7月25日)


材料が揃ってもロボットが完成しない。
いつものことではあるのですが、新しいものに着手してしまうからでしょうね。
今回は、アナログジョイスティック4つ、ボタン8個の Zigbee コントローラを作ってます。 コントローラは非常にシンプルな設計で終了、と思いきや、ミス発生。 PCB基板レイアウト修正するお金がもったいないので、抵抗を使って空中配線。。。ちょっとみっともない。。。(けど、どうせケースに入れるので見えないし、ロボット側ではないのであらっぽ扱いはしないから、抵抗は外れないでしょう)
なぜつくっているか、ですが、プレステのアナログジョイスティックって8bitの情報しか得られないので、KRS-401x などのように270度も動かせるサーボの場合、1度以上の位置制御しかできないため、動作がカクカクしてみえてしまうためです。 もっと、ピタッと目的の指先、足先を指定したい、という思いから踏みきりました。

今回は、10bitADCを8chもっている8bitマイコンを探しました。 結局、オン・チップ・デバッガが使えるNECエレの78K0/KC2にしました。 小さいパッケージでコンパクトに仕上がりました。
プログラムも簡単に仕上げたところで、再度、ロボット組立て開始です。

(2009年7月26日)


SEMB1200A がテクノロジアさんで販売開始されましたね。 入手が・・・という声が聞こえてきていて、私も1ユーザーとして不安でした(笑)。 これにて一安心。

あと、嶋田さんのところで例外エラーに悩まされていた話を(未解決案件もありますが)まとめておきます。 皆様も悩まされたら1度回避できそうか試みてください。
・ sugi3さんのところのバイナリパッケージは、cygwin含めて同じ環境であることが推奨されています。
・ 例外エラーはいくつかのパターンがあって、@newlib内でエラーを発生させているようなエラーでも実際にはユーザープログラム内での処理に誘発されている A関数の引数が1つで float型の場合に例外エラーがでる(doubleだとでない) B srbk(), malloc() ができない、C sprintf() を使うと、その他何も変更していなくても atoi(), atof() など strtol() 関数でエラーがでる、といったものです。
・ 上記の対策として、@ gcc コンパイルオプションに -O (最適化)を入れる、A -mdouble-float をコンパイルオプションに入れる、B -lnosys をリンク時に指定してライブラリを読み込む(デフォルトで入れても問題なさそうなので specs に書き入れてしまっても良いです) C原因不明
・ 同じソースコードであっても、gcc-4.1.2, gcc-4.2.4 で挙動が違う(上記対策@、Aでも同じ結果が得られない。B、Cは同じ結果でした)

 いずれにしましても、何か問題がでてそうな場合は、情報を頂けると助かります。 私も1ユーザーですので、どこまでフォローできるかわかりませんが、安定化のために頑張ってみます。

(2009年7月30日)


関東ロボット練習会に参加させていただくことにしました。 ここまでに何とか動くロボットに仕上げたい、という目標設定でもありますが、きっと脇道にそれるんだろうなぁ。。。
そんな兆候がでているのか、ひさびさに cvs を使おうとしたら使えない。 そういえば、Cygwinを新しくしてから1度も使っていなかったなぁ。。。 Cygwin をフルインストールしないと駄目かな? ググってみても、Develpment 環境だけで良さそうなんだけど。。。

(2009年8月4日)


台風とか地震とかおかしなことがいろいろと起きますね。

さて、動作しなかった CVS ですが、いろいろとやってみました。 Cygwin の再インストールを残しやるだけのことはやった感じがしています。 が、動作しない。。。 anonymous での commit もできないのです。 そこで、WinCVS + ssh + Python を使うことにしました。 Python はマクロ動作?させるためのツールみたいです(特にインストール不要かも)。 WinCVS-2.0.2-4 + ssh-1.2.14-win32 + Python-2.3.4 の組み合わせとしました。

各webサイトでインストールの仕方が載っているので、私が困ったところだけ記しておきます。
・ WinCVS は、最新版にしました(日本語パッチなどなし)
・ ssh を使う際の環境変数を Windows に登録。 システムアイコンより。
   HOME, CVS_RSH, CVSROOT の3つ。
   HOME は .ssh/ を作るディレクトリ
   CVS_RSH=ssh
   CVSROOT=:ext:username@cvs.sourceforge.jp:/cvsroot/modulename ・・・username は sourceforge.jp のユーザー名、modulename は hos の場合、hos とする。
・ ssh を使ったsourceforge.jo にアクセスをしたいので、ssh-keygen など使い、SSH公開キーを作成する。
   ssh-keygen -C username@localhost (= 自分自身のPCのアカウント@PCの名前 で良い。 メールアドレスを指定するというサイトもあり。)
   -C を指定しないと、gethostname というコマンドで localhost 名を入手するみたいなのですが、そのコマンドがない、と言って処理を終了する。
・ ssh-genkey でできた $HOME/.ssh/identity.pub を sourceforge.jp の SSH公開キーにて登録する。 約5分後に登録完了する。
・ WinCVS を起動し、login 環境を適当に作る(上記CVSROOTと同じ要領)。

これまでの悩みはなんだったんだ、というくらいすんなりと動作しました。
だけど、何を CVS でやりたかったんだっけ???

話はロボット作りに戻します(というか、ロボットの話は久し振り?)。

2か月くらいに前に作った平行リンクの足を片足だけ組み上げてみました。 結果、なんと2mmもずれた設計ミスをしていることがわかりました。 今回、アルミ板金に加えて、POM加工も行っていて、POMに M2 ネジ用の穴をあけるのが面倒、いや、お盆休みまで楽しみを取っていたのでした。 それが失敗でした。 借り組だけでもやっておくべきでした。 2mmずれていましたが、止められるところだけネジ止めして平行リンクを動かしてみました。 なるほど、です。 軽くスムーズに動くものですね。 ヒザにサーボがないのに屈伸ができるのは面白いですね。 今のJiGoRo3 ロボットを残してもう1体つくりたくなりました。 あと、KRS-4013 * 18個(13個+5個予備)あればなぁ。。。

(2009年8月11日)

EzPCB ネタです。 1度目の発注の際、ミシン目加工をお願いしました。 今回、V-CUT をお願いしました。 ともに、$30 でした。 simple 'cut out' is free という文言があったので、CUT OUT でお願いします、と言ったのですが、それも $30 だとのこと。 何が free なのか、ちゃんと聞かないとだめですね。 いずれにしても、多面付しての発注の場合は、$30 というのが加えられる、と覚えておけば間違いはなさそうです。 今回の場合、結局 $30 払うということになったのですが、国内キャンペーン中のところよりも、送料含めても安くできたので満足です(しかも両面シルク)。

(2009年8月11日)


夏休みも終わって、はや2週間。 Web更新が止まってることを思い出しました(笑)。

注文していた EzPCB から基板が届き、前回発注時の不具合を解消した基板が入手できた。 他にも、仕事で使うための基板を合わせて作りこんだが、却下。。。 まぁ、あまった土地を使ったので良いのだが、もうちょっと考えて作りこめばと、反省。 ちょっと頑張りが空回りした感じ。
ROBOSPOT で POM 5mm加工を依頼し入手。 1/4サイズに入る大きさだったので、非常に安価にできたので満足。 ただ、2mm穴が開けられない(場所だけはドリル先の跡が残る)のは改善を期待したい。 ロボットユーザーは M2 ネジを使う人が多いと思うので(特にKRS-4000シリーズはM2が多い)。

次はちょっと悲しいネタ。 連休中の話しですが、初めて飼い育てていたハムスターが死んでしまった。 子供の教育を兼ねていたのですが、結構自分が癒されていたのを実感。 毎日何気に世話をしているのが気分転換になっていたようです。 育て方が悪くてごめんね、ハムスター。。。

最後に明るいネタ。 今日は給料日。 ボーナスは期待できないが、給料はちゃんともらえる(はず)なので、楽しく仕事をしよう!

(2009年8月26日)


またまた更新を止めていることに気がついた。

 毎朝、4時に起きて何がしかゴソゴソやってるのですが、ロボ作りは止まったまま。 JiGoRo3 も2バージョン組み立ては終わっているのですが、火入れをしていない状態です(非常にもったいない)。 ROBO-ONE を目指してスタートしたロボット作りも自分なりのコンセプトを見失いがちになったとき、いつもネットサーフィンしています。 私の場合、最新記事だけではなく、数年前までさかのぼって読むのが好きで、結構時間をかけて読んでいたりします(なので、ロボ作りが進まない?)。 いろいろな方のロボ記事を読ませていただいて、あれもしたいな、これもしたいな、と妄想だけが膨らんでいきます。 数年前、ROBO-ONE も自作ロボが多数出ていたころの記事を懐かしく読んでいると、ロボ制作に気合いをいれているときは、ネットサーフィンをしないとか養命酒を飲むとか、すごい集中力でしあげていたんですよね。

 ネットサーフィンばかりしていないで、生のロボットの見学にロボ連に行きたいのですが、どうも関東地区のロボ連とは日程の相性が悪いみたいで、いつも予定がぶつかってしまっています。 なので、自分でロボ連を立ち上げてみてもいいのかな?とも思うのですが、ありきたりなものだと、なかなか人は集まらないだろうな、とか、ロボ連としての魅力をださないといけないだろうな、とか、ROBO-ONE無名の自分がやって集まるんだろうかとか、いろいろと考えてしまいます。 今のところやるんだったら、ロボットを使った練習会ではなくって、ロボットを作る楽しさをワイワイできるロボ連?を目指したいな、と感じています。 1から作ってもよいし、キットを組み立ててもよいのですが、最終的にバトルすることが目標ではなくって、ロボットが何かをしてくれる、という目標を決めて作り上げていくということをしてみたいんですよね。 単純に不整地を歩いてものを運んでくれる、でもいいし、家の中をぐるぐる歩いて、地図を作るでもいいし、レレレのおじさんのようにホウキ持って掃除して歩くでもいいし、そのための技術は何だろうって一緒に考えたり、作るための知恵を出し合ったり、そんな場がいいですね。 まずは、組み込みマイコンのプログラミングからかな。 自分も独学でやってるのですが、アーキテクチャというより、開発環境(コンパイラの仕様)ではまるケースが多い気がしています。 すくなくとも、パソコンプログラミングの乗りだとミスを「組み込んで」しまうので、避けたいところのキモは分かったと思ってます。 ここが理解できて、自分でできるとモーション登録のロボット操作から、いろいろとやりたいことが増えてくるはず。 うーん、どうしよう。。。 いいぞ!という方、応援メッセージ、一緒にやろうぜ、という人いたらメール連絡ください。 相談しましょう。

 ともかく、今日はリフォーム第1弾の日。 長らく使ってきた、エアコン2台と、冷蔵庫の入れ替え。 エコポイントというより、いい加減な掃除をしてきたので、エアコンのカビが気になっていて、体調不良になる前に交換(贅沢ですが)。 冷蔵庫も10年使うと壊れる(はず)なので、製造から10年の今年に交換(使用は9年目かな?)。 さぁ、夜明けだ。 忙しくなるぞ。

(2009年9月13日)


 256(JiGoRo)-Series日記(4)へ

 ロボット製作のページへ

 トップページへ