課題1にて作成したNXTを用いたお絵かきロボットです。
相方の似顔絵を書くというものでした。
これが今回私達が作ったロボットです。
二本のアームがひし形みたいになっており、左右をいい感じに回すことで
ペン先を縦横無尽に動かすことができます()
ペン先を持ち上げる場所は、当初はこのマシンの下につけるつもりでしたが、
考えなしにアームを作る機構をはしゃいで作っていたらそんな余地はありませんでした。
上に乗っかているなんかかっこいいやつがほぼ180°回転し、持ち上げるシンプルなものとなっています。
少しこの昇降機でこだわった点が、重心を後ろに乗せることでモーターへの負担を減らすようにしたことです。
NXTの本体はこの中のどのパーツよりもクッソ重くて、真ん中に乗っけるとモーターくんがとんでもない音を出してくれます。なんとかしようと思い後ろに乗っける形に落ち着きました。
見た目がごちゃついているところが一押しです。
アームの先端のペンを括り付けてあるところです。
ここで拘ったところはアームが合体するところを1点にすることと、ペンの取り外しやすさです。
最初は適当に固定していましたが、グニャグニャになってしまったのでなんとなく交点を1点にすることで解決しました。
ペンをつけるところは、レゴの板でひっついているためすごい簡単に取り外しができます。
地味にかなり便利でした。
#define S 10 //speed #define A 193 //昇降機の回転幅 task main () { RotateMotor(OUT_A,20,A); RotateMotor(OUT_B,S,100); RotateMotor(OUT_A,20,-A);
右の頬から描くために筆を一度持ち上げています。
今回作ったロボットは複雑なプログラムよりも根性が必要でした。
OnFwd(OUT_B,13); OnFwd(OUT_C,11); Wait(1200); OnFwd(OUT_B,5); OnFwd(OUT_C,16); Wait(900);
右側の頬と顎を描くための場所。現在地から下に線を引くためには両方のモーターを動かす必要がありましたが、
2つのRotateMotorを同時に動かす方法がわからなかったので時間指定で回しています。
Off(OUT_BC); //毎回Offしないと上手く行かなかった OnFwd(OUT_B,-18); /*左上に押し上げるためBモーターだけを Wait(900); */ Off(OUT_BC); OnFwd(OUT_BC,-10); /* //左の頬を描くために両方を回して上へ押し上げます。 Wait(1400); */ Off(OUT_BC);
OnFwd(OUT_B,15); /* OnFwd(OUT_C,9); 右下へ Wait(550); */ Off(OUT_BC); OnFwd(OUT_C,-18); /* OnFwd(OUT_B,-14); 右上へ Wait(400); */ Off(OUT_BC); OnFwd(OUT_B,15); /* OnFwd(OUT_C,8); 右下へ Wait(530); */ Off(OUT_BC); RotateMotor(OUT_C,13,-80); //微調整 Off(OUT_BC); OnFwd(OUT_B,S); /* OnFwd(OUT_C,-8); 右上へ長く Wait(200); */ Off(OUT_BC);
前髪をなんとか表現しようと頑張ったところです。本当は頭の輪郭を描きたかったのですが、
うまく円を書くことができず苦肉の表現になっています。
RotateMotor(OUT_A,20,A); RotateMotor(OUT_BC,S,45); RotateMotor(OUT_C,20,10); RotateMotor(OUT_A,20,-A);
右目から描くために一旦筆を浮かせて描き始めまで移動
RotateMotor(OUT_B,S,-16); RotateMotor(OUT_C,S,15); RotateMotor(OUT_A,20,A);
描いたら浮かせて今度は左目へ
RotateMotor(OUT_B,S,-20); RotateMotor(OUT_C,S,20); RotateMotor(OUT_A,20,-A);
左目の地点に移動
RotateMotor(OUT_B,S,-16); RotateMotor(OUT_C,S,15); RotateMotor(OUT_A,20,A);
右から左へ線を描き鼻を描くために浮かせる
RotateMotor(OUT_B,S,16); RotateMotor(OUT_C,S,-15); RotateMotor(OUT_B,S,10); RotateMotor(OUT_C,S,-10); RotateMotor(OUT_BC,S,10); RotateMotor(OUT_A,20,-A);
非常に手間取って顔の真ん中、鼻へ
RotateMotor(OUT_BC,S,15); RotateMotor(OUT_A,20,A);
鼻を描いたら今度は口へ
RotateMotor(OUT_C,15,30); RotateMotor(OUT_A,20,-A); RotateMotor(OUT_B,10,14); RotateMotor(OUT_C,10,-20); RotateMotor(OUT_C,10,-30); RotateMotor(OUT_A,20,A); }
口はかなりブレが大きくこのときははみ出してしまっています。
何という洗練されていないプログラムでしょう。
最初は両方の角度を同時に動かして書いていくつもりだったのですが、
果たしの力量では全く叶わずついに両方動いてくれることはありませんでした。
仕方なく今の私で唯一同時に動く時間と速さのOnFwdに過労死してもらいました。
プログラミングでこだわったことは、try and error です。
残念だったのは自分の妥協へ向かう心の強さです。
viewでモーターの回転角を表示できることを知らなかったので、プログラムを書いては、
微調整を繰り返して、と非効率なことをしていました。~まず何ができるのかを把握して取り組むことが大切だと思わされました。
なんか画像がどうしても縦向きになってくれないので首を左に90°傾けてください。
この様になりました、上手いこと弧を描くことができなかったのでカクカクです。
このときの口はかなり下にずれてしまっていますね。
髪型や細かい特徴を出すことは今の技術ではできませんでした。
比較対象がないので大きさをごまかせていますが、実際はかなり小さいです。
これはアームを近くまで引き寄せて絵を書いてしまうと昇降機くんがアームに衝突してしまうためです。完全に作る前にわかる欠陥でしたね。自分の愚かさを呪ってしまいます。
一応は顔にかろうじて見えるものができて私は満足です。
次の課題ではロボット作成の段階から自分のプログラミング技術の程度の低さを考慮して
よりシンプルなロボットにしようと思いました。
サブルーチンを用いてmainをスッキリさせるようにしていきたいです。
今回で唯一良かったところは持ち運びの簡単さです。
アームもコンパクトに収納でき、本体も平べったいので鞄に楽に入れることができました。
良かった点も次に引き継いでより良い結果になるよう頑張りたいと思います。