*完成絵 [#h7a19268]
#ref(./s_DSC_1435.JPG);

外の丸が輪郭、三つの山が前髪、長い直線と二つのコの字が眼鏡、逆Tの字の一部を削ったような部分が鼻と口である。
パーツ単位では上手く逝ってるので一種の福笑い状態である。

*ロボット [#t1f8bcdd]
全体像

#ref(./s_DSC_1423.JPG);

接続は
端子A→右タイヤ
端子B→ペン上下
端子C→左タイヤ

ペン上下機構については下画像のように作った。

#ref(http://resizer4.myct.jp/img/36472033541/s_s_DSC_1425.JPG);
#ref(./s_DSC_1425.JPG);

十字棒に付ける黒く歯が付いたパーツを使い、モータが90度回転することでペンが上下する。
ペンの取り付けはパーツを使った固定(画像中央のモータの左下部分)と輪ゴムによる固定を用いた。固定と書いたがペン位置の微調整をする余裕はある。
機構の取り付けはペン先が左右のタイヤの中央に来るように工夫した。これは車体が旋回するときに一々ペンを上げ下げさせないためである。これによりプログラムの量を若干減らせる他、ペンの上下の跡(斜めに取り付けたためどうしても発生する)を極力無くせる。

しかし、このペン機構の取り付けはMindstormsに載ってる作り方(本体の取り付け方)では不可能である。
よって今回は下画像のように本体の取り付けを行った。

#ref(http://resizer6.myct.jp/img/56966453408/s_s_DSC_1422.JPG);
#ref(./s_DSC_1422.JPG);

また、後輪は誤差の原因になると判断し取り外した。
走行面が荒くなければパーツの平らな部分を接地させることで後輪の役目を果たせると判断したのも理由の一つだ。

*プログラム [#q198ca66]
まず、プログラミング時のイメージは下画像のような感じである。

#ref(./s_DSC_1434.JPG);

(赤線は進行順序)
顔の輪郭を円形にすることでどこからでも顔パーツを描き始められるようにした。

プログラミングは以下のもの。
 #define RAIGHT_ANGLE 600      //直角方向転換の時間
 #define pen_down RotateMotor(OUT_B,50,90);
 #define pen_up RotateMotor(OUT_B,50,-90);
 #define turn_right(t) OnRev(OUT_A,70); OnFwd(OUT_C,60); Wait(t); Off(OUT_AC);
 #define turn_left(t) OnFwd(OUT_A,70); OnRev(OUT_C,60); Wait(t); Off(OUT_AC);
 #define go_straight(t) OnFwd(OUT_AC,75); Wait(t); Off(OUT_AC);
 #define go_back(t) OnRev(OUT_A,60); OnRev(OUT_C,70); Wait(t); Off(OUT_AC);
 #define draw_line(t) pen_down; go_straight(t); pen_up;
 #define turn_RA_L_go(t) turn_left(RAIGHT_ANGLE); go_straight(t);
 #define turn_RA_R_go(t) turn_right(RAIGHT_ANGLE); go_straight(t);

 task main()
 {
     pen_down;
     RotateMotor(OUT_A,75,1600);    //顔の輪郭
     turn_right(300);
     repeat(3){                     //前髪
     go_back(200);
     turn_left(400);
     go_straight(200);
     turn_right(400); 
     }
     turn_right(240);
     pen_up;
     draw_line(550);               //眼鏡のフレーム
     go_back(75);
     repeat(2){                    //眼鏡のレンズ部分
     pen_down;
       repeat(3){
       turn_RA_L_go(200);
       }
      pen_up;
      turn_left(RAIGHT_ANGLE);
      go_back(100);
      }
     turn_RA_L_go(400);
     turn_RA_R_go(200);
     draw_line(300);               //口
     go_back(150);
     turn_RA_R_go(100);
     draw_line(100);               //鼻
 }

*定義について [#e159aae4]
RAIGHT_ANGLE         直角の直訳。因みに私は訳せない。

pen_down(_up)     モータBを90度回転し、ペンを下げる(上げる)

turn_right(left)(t)  左右のモータを逆回転させ、その場で右旋回(旋回)。tは旋回時間。

go_straight(back)(t) t時間だけ直進(後ろ進)。出力が異なるのは左右のモータの出力差を鑑みて
のもの。

draw_line(t)         tが全身する時間である。プログラム完成時に直線を引く命令が多いことから作成した。今回は出来なかったが単位長さ辺りの時間も調べてみたい。

turn_RA_L(_R)_go(t)  左折のL(もしくは右折のR)からt時間直進である。

*反省点 [#j10dcfe2]
最初にも書いたが、パーツごとでは上手く行っていた。崩れたのはパーツ間の移動の時である。
この事から、左旋回が原因と推測できる。
前髪にも左旋回は含まれるが、殆ど崩れていないのは旋回角が小さい事、旋回がズレてもさほど影響がないパーツである事が上げられる。
肝心の左旋回がズレた理由はモータの出力差である。
実は左右でモータの出力が異なることは分っていた。よって直進や右旋回は左右の出力(パーセンテージの部分)を調整することで対応したあった。しかし、左旋回は右旋回とモータの回転の正負が逆になる事を失念していたため、このような失敗が起きた。

しかしながら、練習段階では上手く行ったり、逆に右旋回がおかしくなったりといった事があった。よって根本的な原因は左右どちらかのモータの出力が不安定になっていると推測する。
これは場合によっては買い替え以外の完全な対策は不可能である。しかし、三つのモータのどれがどの程度の出力かを調べ、不調があったものをペンの機構に回すといった程度の事は可能なので、それをしなっかったのは自己責任である。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS