[うp]wiiハンドルもどきでロボットを動かしてみた[ソフト編]
もうすぐ1500再生・・・
たぶん動画を見てもらえると分かるんですが回路面はそんなに凝った作りじゃないです
前回に続き今回はソフト編。だらだら書いてたら1ヶ月半経ってしまった。。。
基本的な流れ
リモコン側のpicは内蔵クロック(4MHz)で動作しているうえpic自体があまり速くないので(実効1MHz)重い計算処理はすべてArduino側に投げる形で、PIC側は単にAD変換結果をRS232Cで飛ばすだけになってます。
無線部分はXBeeなので有線でシリアル通信するのとなんらプログラムに差はありません。
そしてArduinoは受信したデータからハンドルの回転角を割り出し、そこから左右のモーターをどれだけ駆動するか算出しモータードライバに出力するという流れになっています。
送信側
[ソース]
ミソ
set_adc_channel(0); //pin0にセット
delay_us(50); //AD変換待ち
value=read_adc()-X_CAL; //キャリブレート
printf("X%04lu",value); //0で埋めた4桁の数値で送信
getc(); //Arduino側が何か応答を返すまで待つ
送信側は説明のしようがないくらいに単純です
AD変換の後の待ち時間をクロックが低いのでちょっと長めに取ってみたくらい。
受信側
[ソース]
ミソ:
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かなぁ・・