2004/09/30 |
MICRO-MG 自分が使い始めたのは先代のG-Tuneからなんですが、あれは、姫路ソフトワークスさんのペンギンくんが発表された時に、「ん?このサーボなんだろう?」と思い、浅草ギ研さんで販売されているのを見つけて使い始めた、というのがきっかけです。 きっと、これからもMICRO-MGを使う人が多いだろうな〜ということで、たいしたものではありませんが、使うとわかるMICRO-MGの情報など。
こんなところですが、参考になりますでしょうか?
| ||||||||||||||||||||||||||||||||||||
2004/09/28 |
足首ピッチ発振 腕等の、比較的振動周期の短いものは倒れるほどの事態にはならないのですが、足首から見ると重心は大きくて遠いので、ひどい時は、前後に逆ブランコの如くブンブン振って、転ぶまで頑張ります。MICRO-MGのギアの遊びが、他と比べてちょっとイマイチかな?ということで、ちょっとハデ目にでているような気がしますが、他の方でも、スペーサを噛ましたり、立っているときに脚の位置を少しずらしたりされているようです。 そうそう、思い出しました。G-Tuneにもこんなものをサーボ軸にはさんでいます。これは、MICRO-MGかS03Tについていたゴムブッシュを、ニッパでプチプチ切ったものです。もう、ぼろぼろになってしまっています。そうか〜、これがヘタってきたんで、最近足首ピッチ発振がひどいんだ。 新しいのにしようか悩んだんですが、せっかく次までは期間がありますので、実験ということで、手持ちであったポリスライダーワッシャ(材質で選んだのではなく、単に手持ちで、厚みがいろいろあって、硬いものということで)を噛ませてみました。MICRO-MGのホーン付け根とサーボケースの隙間は約0.6mmなのですが、手持ちの都合上、約0.8mm(薄いものの組み合わせ)を入れてみました。 おお、効果抜群!今まで「増幅してってるよ〜」な状態から、1〜2回で振れが納まります。でも、心配はネジのゆるみです。もともとここは、ネジロック剤を塗っていても緩みやすいのですが、なんとなく、さらに緩みやすくなるような気がします。ま、様子見ということで。緩みがひどいようならば、標準品より長めのビス+ネジロック剤にしてみようと思います。これでロック力が少し上がるのは、腰のヨー軸で確認しています。 発振を防ぐ効果はかなりあるので、今度はテフロン(ポリスライダーより軟らかいのでなんとなく良さそう…直感です。理屈はありません)で試してみようと思います。 MICRO-MGの新基板と旧基板の制御の違い ということで、制御信号をOFFにすると、新基板のMICRO-MGでは支えきれなくなって倒れてしまいます(制御方法は新、OFF時の動作は旧というのが欲しい〜)。足首を旧基板のMICRO-MGに入れ替える、という手もあったのですが、入手はもう無理だと思いますので、あきらめて現在に至ります。
| ||||||||||||||||||||||||||||||||||||
2004/09/23 |
送信処理、結局こうなりました。
んで、考えたんですが…実は、「送信バッファレジスタから送信バッファに送る速度は、実は超高速ではない」のではないか?と推測しています。良く考えてみれば、送信レジスタが空になったからといって、送信バッファレジスタにデータ突っ込むのは紳士じゃないですね〜。 ということは、「送信レジスタ空フラグ(UiC0/TXEPT)」と、送受信制御レジスタ1の「送信バッファ空フラグ(UiC1/TI)」の両方をチェックしてやるのがベスト!ということになるのですが、ま、そこまではいいかな?ということで、送信バッファレジスタをチェックするだけにしておきます。
今は、puts()とかgets()とかを作っていますので、もう少しテストができてきたら、まとめてアップします。
| ||||||||||||||||||||||||||||||||||||
2004/09/21 |
動画はとりあえず、これで打ち止めです。最後はやっぱり変形!今回は、変形後のポーズというのも考えてみました。やっぱり、キメが欲しいかな〜なんて。あはは。ほら、アニメなんかでも、なんとなくポーズとか、キメのカメラワークとかあるじゃないですか〜。 変形そのものは、メカデザインによって決まっているわけなんで、後は、手を先に動かすとか、脚を先に動かすとかっていうのが「見せ方」になるわけなんですが、なるべく大きく、開いていくように見えるよう、気をつけて動かしています。 ONOさん、いつもいつも紹介してくださっている上に、お褒めのコメントありがとうございます。カンファレンスではお会いできるかな?
| ||||||||||||||||||||||||||||||||||||
2004/09/20 |
全部、編集できました。慣れてくると、編集も楽しいです。でも、きっと次に動画取り込みやるころには忘れてしまいます…。デジカメの方がやっぱり簡単…かといって、うちのデジカメだと、やっぱDVの方が画質がいいんで、DVで頑張ってしまうのです、はい。 とうわけで、「始めのご挨拶」。少ない関節で、なるべくそれっぽく見えるようにがんばってみました。 次に「愛想」。これのポイントは、足首のヨー軸を使って、身体全体を左右に捻っているところです。こういう動きは、「SIPHA TERM」の動作設定機能が良くなってきたおかげで、ようやく簡単に設定できるようになってきたという感じです。G-Tune 2004F(前回)の時は、ほとんどソフトが間に合ってなくて、NCの数値入力みたいなやり方でやってましたんで…。ソフトが違えば、動きも違うってことですね! そして「歩行」です。これは、前回の動作パターンを見直して2〜3割ほど高速化しています。単に歩幅を少し広げたのと、運びを速くして、時間配分を若干調整しているだけです。本当は、「膝曲げなし」歩行をやりたかったのですが、断念し、これを正式採用としました。まだまだ、いろいろ改善の余地ありですね〜。せっかくのグリップ足裏が役に立っていない感じです。 最後に「横歩き」です。横歩きは、「しっかりと脚が上がっているのがわかるように移動させる」のが意外に難しく、結局、「グリップ系足裏」を利用して、このような、制動力で最後に脚を引っ張り上げるような動きとなりました。このあたり、「グリップ」が役に立っているような気がします。グリップ系は、すごくよかったので、次回も採用予定です。 変形動画もできているんですが、容量が結構あるんで、いちおう、サーバの負荷を考慮して、今日はこれぐらいにしておきます。
| ||||||||||||||||||||||||||||||||||||
2004/09/19 |
今日はDV出してきて、G-Tune 2004FIのビデオ収録。 とりあえず、予選で出せなかった技を… ついでに、出せたけど、一回しか出せなかった技も… 他の、地味なやつも現在編集中で、随時アップしていこうと思います。お楽しみに。
| ||||||||||||||||||||||||||||||||||||
2004/09/17 |
_farですよ、_far 「標準関数はどのように定義されているんだろう?」 NC30は、標準関数ライブラリが用意されているので、このヘッダを覗いてみることに。探してみると「MTOOLS\INC30」にヘッダが入っていました。
う、ここにそう書いてあるではないか…。先に、こういうところからチェックすればよかった…。みなさん、すいません。わたなべさんのいわれるように、"far"は、"_far"なんですね。うむうむ。というわけで、宣言を修正(ついでにヘッダファイルに書いてあるように、変数名を書かないタイプに修正)して、実体の方も修正して…と。
りびるど〜! あ、ビルドできました。 よし、デバッガで確認だ!strCopy()を呼び出しているところでブレークポイントを仕掛けて 「りせっとよぉぉしぃ、ごぉぉぉっ!すてっぷ、すてっぷ、すてぇ〜っぷぅぅぅ!」 お、いいですね。ちゃんとデータが設定されるようになりました。よし、これでまた一歩、この環境へ馴染みました。というわけで、明日は、シリアル通信プログラムに戻ることにします。 みなさん、どうもご指南ありがとうございます〜! というわけでデバッグのやり方・変数内容チェック
はい、ここで、表示するソースファイルを指定します。 で、ソースファイルが表示されたところで、変数を選択状態にして、右クリックメニューを表示し、「Add C Watch...」を選択すると、「C Watch Window」が開き、変数が追加されます。もちろん、「C Watch Window」をあらかじめ開いておいて、「Add」操作で開いても構いません。
「文字列データじゃわからない〜」ってことはありません。この「C Watch Window」で変数を選択してダブルクリックすると、中身を見ることができます。よくできてる、うんうん。 というわけで、先ほど修正したソースコードで、ステップ実行させた時の変数表示です。思ったとおりの値が入っていることがわかります。 また、このように、グローバルなデータだけではなく、ローカルなデータも表示することができます。 ふぅぅ、長かった〜。でも、偉大なる第一歩!
| ||||||||||||||||||||||||||||||||||||
2004/09/16 |
いろいろ考えていたんですが、なんか、根本的に理解しないといけない部分がある(ようは知らないコトがある)ような気がしてきました。というわけで、オークス電子さんがアップされている、自習用テキストを読み始めました。今はOAKS16プログラミングテキストの方を読んでいます。ふむふむ。NC30が管理するセクションがウンたらかんたら。何はともあれ、環境(クセとか決り文句)を覚えて慣れないとね! ところで、デバッガでデバッグするのって、フラッシュROMの書き込み回数にカウントされるのかな?素朴な疑問です。
| ||||||||||||||||||||||||||||||||||||
2004/09/15 |
2004/09/06のTOPICの最後にボソボソっと書いた、「関数に文字列を渡すのに警告が出て、あげくの果てに渡されていない模様」みたいな話ですが、未だに解決してなかったりします。たぶん、コンパイラのクセだと思うんで、解決すれば早いんでしょうけど…。 というわけで、ちょっとシンプルなコードを作ってみました。デバッガ前提なので、シリアル出力処理はつけていません。 #include "sfr26.h" void main( void ); void strCopy( char* szDest, char* szSrc ); char szWorkG[32]; void strCopy( char* szDest, char* szSrc ) { int nCnt; for( nCnt = 0; szSrc[nCnt] != '\0'; nCnt++ ){ szDest[nCnt] = szSrc[nCnt]; } szDest[nCnt] = '\0'; } void main( void ) { char szWorkL[32]; strCopy( szWorkG, "ABC" ); strCopy( szWorkL, "ABC" ); strCopy( szWorkG, szWorkL ); while( 1 ); } これをコンパイルすると、無情にも、
といわれます。さらに、デバッガで動作を追いかけてみると、思ったような値がstrCopy()のszSrcに入ってないようです。警告を読むと、なんかnear pointerのところに、far pointerを無理やり入れてしまったようです。このnearとfar、直訳で「近い」と「遠い」という意味でなんのことやら?ですが、実はポインタ(データや関数のアドレスを指す変数)には2種類あるようで、nearは2バイト - FFFFのアドレス空間を指せる、farは4バイトだけど実は3バイトで 0 - FFFFFFのアドレス空間を指せるポインタになります(わたなべさん、説明ありがとうございました)。で、ハードウェアマニュアルを読むと、RAMは前の方、ROMは後ろの方にあって、ROMがfar pointerなようです。対して、RAMは前の方なのでnear pointerになると。 これをコードで意識するとなると、結構、大変な気がするのですが、みなさんどうされているんでしょうか?例えば、strcpy()のコピー元って、"ABC"と渡したい時もあれば、文字列を編集して渡す(RAM上の変数)こともあるわけです。どうしたらいいんでしょう?悩んだあげく、コンパイルオプションを試してみることにしました。 -ffar_RAM 「RAMデータのデフォルト属性をfarにします。」というオプションです。意味が良くわかりませんが、それっぽいので、試してみることにしました。どうやってTM上でコンパイルオプションを変えるのか、わからなかったので、makeファイル(〜.tmk)のCFLAGSの行を直接編集しました。 リビルド〜! 何か、深そうなもの変更した時は、何はともあれリビルドしましょう。
う、また難しそうなものが…。0FFFFFHを越えているぅ???う〜む、なんか違うっぽい…。
| ||||||||||||||||||||||||||||||||||||
2004/09/14 |
今まで気づかなかったのですが、うちのBBS、URL入力する時に、40文字まででカットされていました。ひょっとしたら、以前にも切れていたことがあったかも、いや、あったような…。切られてしまった方、すいませんでした。気づかせてくれたイカガワさん、ありがとう〜。OLMECA、りりしいぞ〜!(どうやって、いきなりあんなすごいロボットを作ったのか教えて欲しい…万年試行錯誤のSISO JUNK STUDIO)。 というわけで、初めてPHPなるものを編集してみました。これで80文字になりました。よろしくです。
| ||||||||||||||||||||||||||||||||||||
2004/09/12 |
昨日のことですが、なぜか近所に 大好きな!!! 「渋さ知らズ」が来ていました。来ることは知っていたのですが、まさか、ダンサーまで来ているとは…。燃えすぎたので、ロボットはお休みです。ハイ。
| ||||||||||||||||||||||||||||||||||||
2004/09/09 |
送信処理続編 ハードウェアマニュアル(rjj09B0033_m16chm.pdf)の「図13.2 UARTi 送受信部ブロック図」をよく見ると、「UiTB(送信バッファレジスタ)」から「送信レジスタ」データが転送され、そこからデータが送信されている図画描いてあります。つまり、送信処理は、プログラムから「送信バッファレジスタ」にデータを書き込み、それが「送信レジスタ」に転送され、そこからシリアル化されて送信されるわけですね! そんなわけで、送受信制御レジスタ0の「送信レジスタ空フラグ(UiC0/TXEPT)」は、実際にデータを完全に送りきった場合にフラグがセットされ、送受信制御レジスタ1の「送信バッファ空フラグ(UiC1/TI)」は、「送信バッファレジスタから送信レジスタにデータが転送された時」にセットされるということみたいです。図で書くと、次のような感じでしょうか。
そんなわけで、「UiC1/TI」をチェックして送信バッファレジスタにデータを設定すると、「データは送っているとは限らないけど、プログラムからみたら、新データを設定していいタイミング」で設定することになり、「UiC0/TXEPT」をチェックして送信バッファレジスタにデータを設定すると、「完全にデータを送りきった後のタイミング」で設定することになりますね。 実際、送信レジスタが空であれば、Step 2からStep 3は一瞬だと思いますし、プログラムでのフラグチェックも、シリアル通信速度から見ればぐっと速いので、一番確実そうな「UiC0/TXEPT」でのチェックで送信するようにしようと思います。なんとなくもったいないのですが、ベーシックなものとしては良さそうです。文字列送信とかでスピードが気になることがあったら、連続データ送信用に別途用意すればいいかと思います。というわけで、割り込み無しの送信処理は、 void RSCsend( _BYTE bData ) { while( txept_u1c0 == 0 ); // txept_u1c0が1になるまで(送信レジスタが空)待つ u1tb = (_WORD)bData; // 送信バッファレジスタにセット } としておくことにします。 と、書いていたら、TWO LEGSのわたなべさんからもフォローの記事が…みなさん、ありがとうございます〜。
| ||||||||||||||||||||||||||||||||||||
2004/09/06 |
うぅ、夏ばて? OAKS16-MINI、引き続き、シリアル通信です。新しいものをやるのは、実に楽しいです。でも、オークス電子さん、こういう誰でも作りそうなものは、サンプルライブラリみたいな形で用意しておいた方が、よく売れると思います(ひょっとして、もうある???)それか販売してる方とか…最近、OAKS16-MINIも取り扱っている、チャーリーさんとことかでやってくれないかなぁ〜。 シリアル通信の初期化方法 それでは、先日の式で、転送速度レジスタにセットする値を計算してみます(四捨五入してます)。
うむ。4800bpsと2400bpsは255をオーバーしてしまいました。転送速度レジスタ(UiBRG)は、8ビットですから、セットできません。う〜ん。どうしましょう。てぃろりろりん♪送受信制御レジスタ(UiC0)で、f1sioを使用しているのを、f8sioにすれば、さらに1/8になりますから、それでOKです。 というわけで、4800、2400bpsの場合は、こんな式になります。
でも、これはプログラムで切り替えることにします。というわけで、まずは、転送速度を定義します。ついでに、GDLに慣れてしまっているので、_BYTEと_WORDも定義してしまいました。 typedef unsigned short _WORD; typedef unsigned char _BYTE; typedef enum { BPS2400 = 521, BPS4800 = 260, BPS9600 = 130, BPS19200 = 65, BPS38400 = 33, BPS57600 = 22 } RSCbps; はたと、「H8/3664の時みたいに、charが実はunsignedとかでハマることは無いだろうか?」と心配になりました。どうやら予感的中です。M16もunsignedみたいです。ま、でも、わかっていればそれまでなので、気を取り直して、今回作った初期化ルーチンです。ポイントは、渡された値をチェックして、f1sioかf8sioを再設定するようにしてみました。 void RSCinit( RSCbps tBps ) { u1mr = 0x05; // 送受信モ−ドレジスタ 内部クロック、非同期、 // 8ビット、パリティなし、スリープなし if( tBps > 0xFF ){ u1c0 = 0x11; // 送受信制御レジスタ クロックはf8SIO u1brg = (_BYTE)( tBps/8 - 1 ); // CLKが1/8になるので、BRGも1/8にする。 } else{ u1c0 = 0x10; // 送受信制御レジスタ クロックはf1SIO u1brg = (_BYTE)( tBps - 1 ); // 転送速度レジスタ } u1c1 = 0x05; // 送受信制御レジスタ1 送受信許可 } 送信処理 2つ、同じ意味と思われるフラグが存在します。 送受信制御レジスタ0の「送信レジスタ空フラグ(UiC0/TXEPT)」と、送受信制御レジスタ1の「送信バッファ空フラグ(UiC1/TI)」は、説明文は違うのですが、どうやら動作は同じようです。ただ、割り込み要因として指定できるのはTXEPTの方みたいなので、こっちの方が由緒正しいのかもしれません。試しに、両方やってみたのですが、どちらも結果は同じでした。 void RSCsend( _BYTE bData ) { while( ti_u1c1 == 0 ); // ti_u1c1が1になるまで(バッファが空)待つ u1tb = (_WORD)bData; // 送信バッファレジスタにセット } 受信処理 _BYTE RSCrecv( void ) { _WORD wData; while( ri_u1c1 == 0 ); // 受信完了が1になるまで待つ wData = u1rb; // 受信バッファから取り出す。 return((_BYTE)( wData & 0xFF )); } ふむ。これでOKって感じです。今回、バッファチェックは、それぞれの処理中に書いていますが、これを、チェックルーチンとして独立させると「受信待ちせずに、データがある時だけ受信する」という処理ができます。SIPHA COREでも、送受信両方とも、このような使い方をしています。 こんなんでいいのかな???間違ってたら教えてくださいね〜。 で、この後、まだ未解決のよくわからない問題にブチあたるのであった。う〜ん。また後日。 いや、文字列送信関数RSCputs( char* )なんてのを作ってね、RSCputs("abc....")って書いてみたらコンパイルで警告(far pointer (implicitly) casted by near pointer)がでるんですよ。んで、よくわかんないんで、RSCputs( const char* )にしてたら出なくなったんですが、端末に表示されるはずのデータが表示されないわけです。う〜む。現在、調査中です。
| ||||||||||||||||||||||||||||||||||||
2004/09/05 |
ROBO-ONE
DVD、予選まで観ました 次は本戦だ〜!「次期G-Tuneはやらなくていいの〜?」とか言われそうですが、いいんです。今は「だらだら」しながら、現行のアーキテクチャにとらわれず楽しむフェイズと、SISO-LABのスケジュールシートに書いてありますから。ビール飲んで、DVDを楽しむ、いや、研究する。うむうむ。
| ||||||||||||||||||||||||||||||||||||
2004/09/02 |
OAKS16-MINIのサンプルmini5.c シリアル通信速度の設定 20,000,000/19,200/16 - 1 とあります。20,000,000は20MでCPUクロック、19,200は転送速度、じゃあ、この「/16」はいったいなんなんだ〜?ハードウェアマニュアルを読んでも、周辺クロックを使用するようなことは書いてありますが、「1/16」なんてのはでてきません。 そういうものと覚えておけばいいのかな〜?と悩んでいたら、TWO LEGSのわたなべさんがヘルプしてくれまして、手元のマニュアルでも確認してみました。転送速度レジスタのところには書いてないのですが(そもそも、これが原因)、「rjj09B0033_m16chm.pdf」のP118のブロック図をよく見ると、「UiBRG」の前に、「1/16」と書いてある箱があるのを発見しました。そして、遂に!P133に「fj/16(n+1)」の計算式を見つけたのです。ふうふうふう。大変でした。きっと、わたなべさんからの書き込みが無ければ、一生、「そういうもんだ」とあきらめていたに違いないです。 よし、これで、「u0mr」とかを「u1mr」に変更すればOK!(UART0とUART1は、たぶん同じ機能) そう簡単にはいきませんでした。 割り込みベクタテーブル??? ロボットやり始めの頃、ちょっと秋月電子で扱っているコンパイラを触った時に、そんなようなことがあったような気がしました。というわけで、「sect30.inc」に書いてある .lword dummy_int ; uart2 receive(for user)(vector 16) .lword dummy_int ; uart0 transmit(for user)(vector 17) .glb _receive ; .lword _receive ; uart0 receive(for user)(vector 18) .lword dummy_int ; uart1 transmit(for user)(vector 19) .lword dummy_int ; uart1 receive(for user)(vector 20)こんなふうに修正します。 .lword dummy_int ; uart2 receive(for user)(vector 16) .lword dummy_int ; uart0 transmit(for user)(vector 17) .lword dummy_int ; uart0 receive(for user)(vector 18) .lword dummy_int ; uart1 transmit(for user)(vector 19) .glb _receive ; .lword _receive ; uart1 receive(for user)(vector 20) これによって、M16マイコンは、receive()という関数が、UART1の受信割り込みになっていることを知るわけです。「sect30.inc」を眺めていたら、一通りの割り込みが書いてありますので、必要に応じて書き換える必要がありますね。 よく考えてみると、これって、マイコンプログラミングをしていたらあたりまえのことなんですよね?う〜む。いやいや、何事も勉強勉強!
| ||||||||||||||||||||||||||||||||||||
2004/09/01 |
う〜ん、みなさん、すばらしい! 予選上位陣、歩行、かなり速いのですが、3位ながら「リトル・トライダーG1」、歩行、すごい。な、なぜだ…。G-Tuneと同じサーボモーターなのに。すごく安定感があります。じっくり研究させてもらっちゃおうと思います。G-Tuneとは前後バランスがだいぶ違う感じです。 さて、次はROBO-ONE予選だ〜。 っと。ちょい書き足しです。 まだJ-Classだけなんですが、何度か見直して思ったのが、意外に自分が攻撃を仕掛けて、思わぬ反作用を受けて転んでしまう、というケースが結構あります。簡単なケースだと、出したパンチが相手に引っかかってすくわれるとか、ちょっとわかりにくいケースですと、下からパンチを出して相手が倒れず、そのまま自分が反作用でずるずると倒れてしまうとか。 今回用意した攻撃パターンが、出した後、0.5秒ぐらい伸ばして押し込んでおくのが多いので、これを速く引っ込めるようにするだけでも、だいぶ自爆パターンが減るかもしれません。でも…同時に、倒せる率も減るんですよね〜(SISO-LABの極秘研究レポートによる)。難しいところです。
|
2004 | Jan. | Feb. | Mar. | Apr. | May. | Jun. | Jul. | Aug. | Sep. | Oct. | Nov. | Dec. |
2003 | Jan. | Feb. | Mar. | Apr. | May. | Jun. | Jul. | Aug. | Sep. | Oct. | Nov. | Dec. |