RSS Feed

Twitter

  • かえる 1 hr ago
  • おいおい そんな精度いい抵抗が必要な仕事とかしてるのかよ(笑) 2 hrs ago
  • 曲げた抵抗を部品棚に戻したやつは誰だ 許さん 2 hrs ago
  • More updates...

リンク

最近の投稿

最近のコメント

カテゴリー

タグ

アドエス ゲーム サーバー テスト ニコニコ ネタ・おもしろ ネットワークデバイス ノートPC プログラミング プロコン ロボコン 修理 分解 物欲 謹賀新年 雑記 高専 Arduino Beta Blog Bluetooth Chrome CORESERVER Firefox FreeNAS G9 Gmail Google MX-R Opera PIC Sleipnir Tumblr Twitter USBメモリ Vista VisualStyle willcom Windows7 WindowsLiveWriter WordPress x64 XBee XP XREA

アーカイブ

[うp]wiiハンドルもどきでロボットを動かしてみた[ソフト編]

6月 15th, 2009 by admin in 作ってみた

もうすぐ1500再生・・・

たぶん動画を見てもらえると分かるんですが回路面はそんなに凝った作りじゃないです

前回に続き今回はソフト編。だらだら書いてたら1ヶ月半経ってしまった。。。

基本的な流れ

リモコン側のpicは内蔵クロック(4MHz)で動作しているうえpic自体があまり速くないので(実効1MHz)重い計算処理はすべてArduino側に投げる形で、PIC側は単にAD変換結果をRS232Cで飛ばすだけになってます。
無線部分はXBeeなので有線でシリアル通信するのとなんらプログラムに差はありません。
そしてArduinoは受信したデータからハンドルの回転角を割り出し、そこから左右のモーターをどれだけ駆動するか算出しモータードライバに出力するという流れになっています。

送信側

[ソース]

test.c

ミソ

set_adc_channel(0);		//pin0にセット
delay_us(50);			//AD変換待ち
value=read_adc()-X_CAL;	//キャリブレート
printf("X%04lu",value);	//0で埋めた4桁の数値で送信
getc();					//Arduino側が何か応答を返すまで待つ

送信側は説明のしようがないくらいに単純です
AD変換の後の待ち時間をクロックが低いのでちょっと長めに取ってみたくらい。

受信側

[ソース]

090330a.pde

ミソ:

for(ct=0;ct<4;ct++)
{
	while(!Serial.available());	//何か文字が飛んでくるまで待つ
	val[ct]=Serial.read();		//配列に代入
}

/*文字列valを書式指定(%d)に従って変数prmに代入*/
sscanf(val,"%d",&prm);

受信側は説明しきれないくらい長い。。。
Arduinoはprintfとかscanfが動かない(エラーは出ないがUARTと関連づけられてない感じ)。
でもsscanfなら動くからこれでいいやって事で。
文字列->数値変換は自分で書いた方がプログラムサイズが減ったり速くなったりするだろうがこういう「動けばいい」系にそう言う凝った細工はしなくても良いと思う。プログラミングのお勉強じゃないんだし、本質的に重要なのはそこじゃない。下手に自分で書くよりかはどっかのえろい人が書いたライブラリの方がずっと速いかもしれないし

動画でもあったように初めのうちはPC(HSP)でデバッグしていたんですがHSPのCOMポート操作命令、特に受信系が扱いづらくて、Cみたいにとりあえず何十文字かがさっと取ってきてscanfでふるいに掛けるというようなことができないので、送信後は律儀に1軸ずつ受信完了を待つような形にしています。こうすると受信側では上のように最初の1文字でswitch?caseして残りの4文字を数値として読めばいいので結構楽です。またscanfが使えなくてもこの方法ならいけるという理由もあります。

数値を出した後は後々扱いやすいようにラジアンにしておきます。

/*ハンドルの回転角(rad)を求める                         */
/*atan()でなくatan2()にすると0?360度の範囲で求められる */
at=atan2((1.0*int_y)-AD_NOR,(1.0*int_x)-AD_NOR);

/*ハンドルを傾けるほど左右のモーターの回転数に差が出るように*/
/*                          ≒傾けるほどよく曲がるように    */
mS=100.0*cos(at+PI_2);

三角関数の辺は数学のお勉強的にはややこしいけど実用できるとすごく便利。こういう時に。
センサーの取り付け方的にそのままの数値を使うと90度ずれた状態で出てくるのでπ/2を足して補正したりとか。
でも授業でアークタンジェントのこんな使い方はしなかったような気がせんでもない。ググって知った。

左右の傾き具合で曲がり具合を変える部分は、横に倒すほどcosが増えるのでその数値を左右のモーターにそれぞれ符号を変えて足してやると横に倒すほど左右のモーターで回転数に開きが出てくる、といった感じです。

まとめと反省と雑記

  • 今見るとなんだか不可解な部分がかなりある。やっぱり書いてから2ヶ月半も経つと忘れるなぁ・・・とブログ記事の方もハード編から1ヶ月半も経っていることに深く反省。なんじゃこりゃ。
  • 忙しいかというとそうでもないのに更新するかと言えばそうでもない。だらしねぇ・・・何という怠惰生活。高専じゃない3年生だったらこれはやばいし許されない。いや、高専の3年もいろいろとやばい年だけど。
  • でもテストは専門科目が増えて平均点が久しぶりに70代行ったりとか景気は良いがふたを開けると最高点と最低点の差が91点とか言うグランドキャニオンなので安心はできないという。
  • Googleで捜し物をしていると自分のブログが引っかかる事があるけど、何もないのは分かってる(書いた覚えがない)ってのがイライラする。引っかかるならなんか情報出せやってね。だから手に入れた情報は全部ネットに置いといて還元しないといけないなぁーと思う。こういうのとかロボコン関連の技術情報とか。wikiでも建てるかな?。。。
  • そう言う意味でエントリー化する基準をもっと下げても良いのかなー。大昔厨二病の症状で始めた時(2006年?)のエントリーはほんとにどうでもいい日記だけだったからそれからどれだけ閾値を上げるか様子見してたらtwitterとかtumblrとかで細々した話題は済むようになっちゃって本当にブログに書くのはでかい話題しか無くなった。
  • でも、でかい話題の中に埋もれてる事(今回でいえばXBee周りとか)とかがばっさり切り落とされてるからそれではまずい。情報源として役に立たない。
  • そんなわけで、どうすればKnowledgeBase的なものが作れるか思案中。やっぱWikiかなぁ・・

[うp]wiiハンドルもどきでロボットを動かしてみた[回路編]

5月 1st, 2009 by admin in 作ってみた

食らえ!ニコニコの限界画質!!!
・・・画質が良いのは良いけど、重いなんてもんじゃねぇよこれ。。ちなみに測ったら1042Kbpsだった。
ブログに解説を書くと動画の方に書いちゃったので以下解説

・動機

研究室に鎮座している人型ロボットを動かそうと思って、手に使うちっちゃいサーボとか無線モジュールとか加速度センサとかいろいろ買ってたので、まず無線からやってみるかと思って着手したものの、2つある片方がぶっ壊れて一時中断。次に加速度センサーでもやるかと思って、ブレッドボードの真ん中にセンサーを置いたら良い感じにハンドルっぽくなって気がついたらいつの間にかレースゲーが出来てたという流れ。
でもやっぱ画面の上のお友達ではロボコンチーム的に許されないと思ったのでちゃんと画面の外でロボットが動くようにしたのがこれ

・何故うpした

部活勧誘会でお披露目したら新入生たちから世間の冷たい視線を浴びせられたのでついカッとなってやった。反省はしていない。正確に言うと新入生以外からも冷たい目線で見られたような気がしたが気にしない。
007 新歓モード。この下にあれが入っている。
ちなみに羽は電飾されてて埋め込まれてるLEDが光ります(白鳥っていうと学校ばれそうな気がするがどうなんだろ)

・具体的な仕組み

・加速度センサ周り

使用しているのは秋月で買える3軸加速度センサ。やっぱり5v入力対応してるってのは良いですね。プロトタイピングのときは5vってのは都合が良い電圧なので。(電源装置が使用中でも空いてるUSBポートから5vが取り出せるから)
このそれぞれの軸の出力をPIC12F675でADコンバート、データをUARTでXBeeに送っています。
IMGP1453 真ん中が加速度センサ。右にPIC。左にレギュレータ。上はXBee。
ブレッドボードとはいえ見せ物だから部品をシンメトリーに配置した上でなるべく綺麗に配線してみた。

・駆動系周り

005 自作XBeeシールド+Arduino 2009+TA8429(x2個,右側)
こっちはかなり無茶苦茶な回路。なんというスパゲッティ。白・黒のペアになったケーブルがPWM用で、確かTA8429の出力をON/OFFする12番ピンにつながっています。
本当はArduinoのTXピンをXBeeのDINにつなぐときレベル変換(5v->3.3v)にしなくちゃいけないんですが、抵抗で分圧して適当にごまかしています。前はその辺に気付いていなかったんで5vを適当につないでしまったり、更にモータードライバのノイズも原因になって見事にXBeeが死亡しました。
だから本当はモータードライバと共存させたくないしきちんとしたレベル変換の出来るシールドが欲しいんですけどね。。

いっぺんここで記事切ります。ソフトウェア編はまた後日。


買い物をした(1か月前に)

2月 28th, 2009 by admin in 買い物

024 その1
025その2

お値段合計約¥15000なり。

上の方はXBeeという2.4GHz帯無線通信モジュールとその変換基盤、緑の袋はArduinoというお手軽マイコン。
これだけでほぼ1万かかった
下の方は加速度センサー、3.3vレギュレータ、PIC16F88、ちっちゃいサーボモーターx2

とりあえず今は主に上の方をいじくって遊んでる日々です
無線いいよ無線