黒い線の上を歩くロボットを創ろう!!。(製作:Ku☆ra 様、keisuke)
-名前:+テラニシシリアゲアリ+-
-参考資料:http://ant.edb.miyakyo-u.ac.jp/J/Taxo/F42103.html-
初めは二足歩行にしようと意気込んでいたが断念orz。
しかし、タイヤによる移動はどうにも気に入らない。 ということで「足」を使ったマシンを作ることに。
でも、今度は4足歩行ではつまらない。 結果6足の昆虫(虫じゃない)型にした。
縦に長めのボディ。昆虫の「腹」に見立てた電池ソケット?を
マシン後方に完全に固定せずに設置。固定していないために微妙に傾いている。
でもこれは仕様でありバランスを取っているためである。
光センサーは昆虫でいう「胸」の部分に装着。
動力であるモーターに近いため回転動作をするときの振りが小さい。
そのためにカーブなどの動作で誤作動をしにくくなった。
また位置的にもあまり目立たなくなった。
ちなみに頭部は腹部とのバランスを取るために作った
蟻を模したおもりである。これで電池ソケットとの重量バランスをとっている。
6本の脚をすべて動かすということでかなり設計に悩んだ。
何度か試行錯誤して固定部分や可動部分を変更した。
結果写真のものに落ち着いた。
出来たのだが6本すべてが機能するというのは難しい。後ろの足は動くが
そこまで意味がない。実質、機能するのは4本になった。
主力は前方の4本。タイヤと違ってゴムでないため滑り止めとして、
最前の1対にはパーツを斜めにしてトゲを中央の1対にはギアを装着。
これにより紙の上でもきちんと動くようになった。
交差点や近道は道の図を参照
#define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define So 784 #define Ra 880 #define Si 988 #define Doo 1047 #define Ree 1175 #define THRESHOLD 40 #define GO(t) OnFwd(OUT_A+OUT_C);Wait(t); task main()
task play_music() // 国家 { while (true){ PlayTone(Re,80); Wait(30); PlayTone(Do,80); Wait(30); PlayTone(Re,80); Wait(30); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Mi,80); Wait(30); PlayTone(Re,160); Wait(60); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,40); Wait(15); PlayTone(Ra,40); Wait(15); PlayTone(Ree,80); Wait(30); PlayTone(Si,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,160); Wait(60); PlayTone(Ree,80); Wait(30); PlayTone(Doo,80); Wait(30); PlayTone(Ree,160); Wait(60); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Mi,120); Wait(45); PlayTone(So,40); Wait(15); PlayTone(Re,160); Wait(60); PlayTone(Ra,80); Wait(30); PlayTone(Doo,80); Wait(30); PlayTone(Ree,160); Wait(60); PlayTone(Doo,80); Wait(30); PlayTone(Ree,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,40); Wait(15); PlayTone(Mi,40); Wait(15); PlayTone(Re,160); Wait(60); Wait(20); } { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); while (true) { if (SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_A+OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if (SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) {GO(100); // ここまでで一回目の交差点を通過
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_C);OnFwd(OUT_A);Wait(300); //ロータリーに入り、ロータリーの4分の一まで
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_A);OnFwd(OUT_C);Wait(400); //ロータリー半分通過
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_C);OnFwd(OUT_A);Wait(400); //ロータリーを通過していったん普通の道へ出る
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);OnRev(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);OnRev(OUT_C);} else if (SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_A+OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {GO(100); //ロータリーを出てから二度目の交差点通過
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if (SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_A+OUT_C);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {GO(180); //交差点再度通過
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if (SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_A+OUT_C);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_A);OnFwd(OUT_C);Wait(400); // 二回目のロータリー侵入
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_C);OnFwd(OUT_A);Wait(400); //ロータリー中間地点まで
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_A);OnFwd(OUT_C);Wait(400); //二回目のロータリー終了
ClearTimer(0); //近道開始 while ( Timer(0) <= 50 ) {GO(500);} //近道終了
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_A);OnFwd(OUT_C);Wait(300); //一般道に回帰
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { GO(100); //交差点ラスト完了
if(SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) {OnFwd(OUT_C);Off(OUT_A);} else if(SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) {OnFwd(OUT_A);Off(OUT_C);} else if(SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) {Off(OUT_A+OUT_C); start play_music; //ミッション 終了の国歌斉唱 }}}}}}}}}}}}}
逆走ver
#define THRESHOLD 40 // 閾値
#define RUN_TIME 485 // トレースする時間(単位 1/10 秒)
#define Do 523
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880
#define Si 988
#define Doo 1047
#define Ree 1175
task play_music() // 音楽を演奏するタスク { while (true){ PlayTone(Re,80); Wait(30); PlayTone(Do,80); Wait(30); PlayTone(Re,80); Wait(30); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Mi,80); Wait(30); PlayTone(Re,160); Wait(60); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,40); Wait(15); PlayTone(Ra,40); Wait(15); PlayTone(Ree,80); Wait(30); PlayTone(Si,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,160); Wait(60); PlayTone(Ree,80); Wait(30); PlayTone(Doo,80); Wait(30); PlayTone(Ree,160); Wait(60); PlayTone(Mi,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Mi,120); Wait(45); PlayTone(So,40); Wait(15); PlayTone(Re,160); Wait(60); PlayTone(Ra,80); Wait(30); PlayTone(Doo,80); Wait(30); PlayTone(Ree,160); Wait(60); PlayTone(Doo,80); Wait(30); PlayTone(Ree,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,80); Wait(30); PlayTone(Ra,80); Wait(30); PlayTone(So,40); Wait(15); PlayTone(Mi,40); Wait(15); PlayTone(Re,160); Wait(60); Wait(20); } }
task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); ClearTimer(0); while ( Timer(0) <= RUN_TIME ) {start play_music;}// 国歌斉唱 while (true) { if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) //GOAL地点 { Off(OUT_C); OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C); Off(OUT_A);}//黒白で左に旋回 else if (SENSOR_1 > THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_A+OUT_C);}//白白で直進 else if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { OnFwd(OUT_A+OUT_C);Wait(400); //交差点1(黒黒で直進)
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_A);OnFwd(OUT_C);Wait(400); } //ロータリー1(黒黒で左に旋回) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);Wait(400); } //ロータリー2(黒黒で右に旋回) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_A);OnFwd(OUT_C);Wait(400); } //ロータリー3(黒黒で左に旋回) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { OnFwd(OUT_A+OUT_C);Wait(400); }//交差点2(黒黒で直進) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { OnFwd(OUT_A+OUT_C);Wait(400); }//交差点3(黒黒で直進) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_A);OnFwd(OUT_C);Wait(400); } //ロータリー4(黒黒で左に旋回) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);Wait(400); } //ロータリー5(黒黒で右に旋回) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_A);OnFwd(OUT_C);Wait(400); } //ロータリー6(黒黒で左に旋回) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);} else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { OnFwd(OUT_A+OUT_C);Wait(400); }//交差点4(黒黒で直進) else if (SENSOR_1 > THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_C);OnFwd(OUT_A);}//白黒で右に旋回 else if (SENSOR_1 < THRESHOLD && SENSOR_3 > THRESHOLD) { OnFwd(OUT_C);Off(OUT_A); //黒白で左に旋回
if (SENSOR_1 < THRESHOLD && SENSOR_3 < THRESHOLD) { Off(OUT_A+OUT_C);} //START地点(黒黒で停止) }}}}}}}}}}}}
マシンの設計にはとても苦労した。なぜかタイヤを拒んでしまったから・・・。
しかしうまく動かせたので満足。
プログラミングはマシンの設計よりは楽だったかもしれない。
自分はタイマーがどうも気に入らなかった(一回使ったが)ので
ifの中にifをというのを繰り返して交差点の数を数えさせた。
少々プログラムが分かりにくくなるがタイマーと違い電池に左右されないというのは
利点だと思う。難しかったのはロータリーで反対側に行くまでの間にある横の道を
どうやって無視させるか。そこでわずかに両方が黒くなるときがあるので
それを利用して問題を解決させた。我ながらよく頑張ったと思う。
曲作りは相棒に任せました。めっちゃ頑張ってたので
何かすげー申し訳なかった。いいできだったょ。
とてつもなく長いプログラムになってしまった...
プログラムを作るのも大変だったが電池の消耗によって
少しずつ移動距離が変わったりして大変だった 。 ロータリーと交差点を通過させるプログラムを工夫して作りました。
(Ku☆ra 様アドバイスを少しもらって)
曲作りも大変でした。
(国歌が意外と長くドから1オクターブ高いレまで定義し流す時間をゆっくりな曲にあうよう設定し...)
時間が結構かかりました。
今回前回の反省をあまり活かすことができなかったことが残念でした。
コメントよろ〜。