2016a/Member/Mick/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016a/Member]]
#contents
*困惑の吐露のような愚痴の発散のような [#mfc00170]
Ris一体、それに準じて光センサーも一つで課題をこなさなく...
時間かけた結果も散々だった。~
久しぶりに吐いた。~
その上で先生のまとめのお言葉を聞いた時「うわぁ先生その...
08/23 20:40追記
&color(#e8383d){ルール読み間違えてたらしい。Ris一個でもセ...
*ハード [#g814f17e]
#ref(./DSC_0587.JPG,100)
まず前述の通り~
・Ris一つ~
・=モーター3っつまで~
・=光センサー一つのみ~
で考える必要があった。なんでだよ。しらん。地面に巻いた水...
その結果大前提として~
「ライントレースに光センサーを費やす以上、コップ回収には...
またコードの調子が悪く、「タッチセンサーも使用が厳しい...
という前置きはここまでにして。~
行動原理および作戦としては、~
「コップを横向きにひっくり返して重ねていく」「『運ぶ』の...
という発想である。コップ回収にセンサー利用が0である以上...
だってコップ見つけるセンサー持てないんだもんね。~
**構造 [#g6a7fcf9]
***アーム [#j1093ab7]
#ref(./DSC_0591 - コピー.JPG,100)
1.モーターから、一番小さいギア→一番大きいギアの順に伝...
2.このタイヤと平行なモーターの回転運動をを棒の回転運動...
+α.この当たりは「補強(A)」や「先端の動作で必要(B)」...
…そういえば光センサーの記述してない。~
前回の課題にてこの位置にしたから、というわけだけでは実...
1つめに、前方であること。アームに比較的近いところであ...
2つめに、コップを引きずる上で邪魔にならないこと。~
3つめに、正確なライントレースを求めるために、「あまり...
この点から、~
#ref(./DSC_0602 - コピー.JPG,100)
設置点Aはバンパー(後述(&color(#00afcc){☆2};))の「わ...
設置点Bはバンパーと紙コップの位置的な相性から「ここは空...
そして設置点C。繰り返しの試行の結果「いうほどアームの影...
つまり、~
作戦上のバンパーの有り方の形状>>>>>>>>>>...
#ref(./DSC_0593 - コピー (2).JPG,100)
#ref(./DSC_0594 - コピー.JPG,100)
回転方向は図の通り。
ここが先述(&color(#ea5550){※1};)によって親指上向きに...
逆にアームを初期状態に戻すとき、「コップが進むだけで入...
なお、アームの軸回転が戻っている途中にアームが開きそう...
歯車2についている(&color(#0000cd){この部分};)は「アー...
***バンパー [#t013f3ce]
#ref(./DSC_0589.JPG,100)
(&color(#00afcc){☆2};)。~
運ぶ(笑)ためのバンパー(仮称)である。バンパーの役割...
仕組みはGIFアニメにて。~
#ref(./1470985947CJd5B0L5T25RnU_1470985932.gif,50%)
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
なお、光センサーが真ん中の位置であると、以下のようにな...
#ref(./1470986829M1fPAhUxPPWah951470986824.gif,50%)
本体は特にゴツさを極力削ったつもりである。~
**経緯 [#t6dd33d4]
光センサーは先述したので省略。~
***アームの決定 [#kf43e754]
まず、先生に教授いただいた方法を試してみた。女子二人で...
教えていただいた機構は以下の通り。~
#ref(./名称未設定 1 - コピー.png,50)
これについての考察として、~
・歯車の数が多い~
・ブロックで連結しなければならない→重たくなりそう~
・Ris一台分で動作させる必要がある →つまりアームの方が重く...
→補強用ブロックも足りな...
・歯車とブロックの融合したごついモーターをRisの近くに設置...
というのは共通認識レベルで考えた。おそらくちゃんとそれら...
重いアームが何故問題なのかを考えた時、それは「重いもの...
・重くても、動かなければ重心は安定している~
・軽ければ、動いても重心は安定しやすい~
のどちらかにしようと意見をまとめた。~
最初に考えたのは「エレベーター方式」である。おそらく「...
・構造が複雑化=センサーなしでできると思えない+一台分では...
・紙コップは寸胴ではないので、両側からの押し上げ式の持ち...
・箱型(よくあるエレベーター)であれば「持ち上げる」動作...
であるために断念。
本当に一台分でやらされたの糞だなあいつらどうさせようとし...
となれば、と「軽量化」に着手。~
そこで浮かんだのが、「ブロックと歯車で回転運動を伝達す...
早速見本(歯車連結)と見比べながら試作。実際にモーター...
その結果が
#ref(./DSC_0611 - コピー - コピー.JPG,100)
こうである。~
つまり想定していた動きと、得た動きはこのように差異があ...
#ref(./DSC_0612 - コピー.JPG,100)
求めていた「タイヤと平行な向きの、上昇する回転運動」では...
棒の回転運動を止めるとアームの先端のつかむ動きもできな...
だが、なんというか、素晴らしい言い方をすれば「ひらめき...
これ、ある程度の高さがあったらこう…かぽって…お椀伏せる...
#ref(./1470989773S6pCY4nj9uBCupQ1470989766.gif,50%)
という「理想の動きをしてくれなかったことによる%%やけくそ%...
***アーム先端 [#ge7ca0fb]
使ったことのない部品を組み合わせながら「いかにして固定...
#ref(./DSC_0611 - コピー.JPG,100)~
棒をできるだけ使い軽量化を狙う。~
左側に伸びているのは(&color(#00947a){☆1};)のため。~
アームの右側が直線的なのは「高さを下げないため」である...
<高さが足りないとどうなるか>~
#ref(./1470991212jEai3uFay5v6_oK1470991205.gif,50%)
<直線的でなかったらどうなるか>~
#ref(./14709912689blrdYdfnPwOt2_1470991264.gif,50%)
また、直線的の方が紙コップが直進した時に入ってきやすい...
ただ、同時にそれだと「つかむ」要素が薄れつかみ損ねかね...
#ref(./DSC_0603 - コピー.JPG,100)
***本体 [#tbcca449]
アーム接地部分をブロックを敷き詰めることにより底上げ。...
#ref(./DSC_0605 - コピー.JPG,100)~
下への設置だけでなく、横向きへ伸ばした棒+ブロックで接地...
#ref(./DSC_0607 - コピー - コピー.JPG)
***バンパー [#lb06882e]
バンパーに求められたのは、~
・ライントレース程度の左折に耐える~
・コップをひっくり返すとき狙いのところにコップを都合のよ...
・最後コップが離脱する~
事である。~
#ref(./DSC_0606 - コピー.JPG,100)
#ref(./DSC_0608 - コピー.JPG,100)
左折に耐えるためにAの部分は短すぎず、また、コップが離脱...
Cの折れの位置はアームの長さに合わせ、アームが回転した時...
*大会時の狙っていた流れ [#y3ab3d56]
#ref(./1470998334O99JCPHqXwJ2zbl1470998333.gif,50%)
#ref(./1470998759K2PikBo2GqgReII1470998752.gif,50%)
#ref(./1470998901QBtGLZEWXKlCTqj1470998889.gif,50%)
「すでに獲得しているコップをバンパーの中で左上に寄せて」...
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
の上方に寄せることである。
*大会時のプログラム [#ldd385a5]
今見たら自分でも見にくくて震えてる…~
「書き換えてみたプログラム」は運転してません(解体して...
そうやって理論上に泣いてきたけどな!HAHAHA!!!!~
控えめに言って汚すぎて説明できないです(おい)ミスした...
インライン関数を本質的に理解してないんですが、サブルー...
ということで、サブルーチンとインライン関数が同じように...
しかしながら!!やはり!!!走らせてないプログラムだけ...
**定義 [#i6399169]
前回同様のものが多い。
#define straight 5
#define carb 2
#define KAITEN 2 //大きいギアを一枚しか噛ませられなかっ...
#define set_straight SetPower(OUT_AC,straight);
#define set_carb SetPower(OUT_AC,carb);
#define set_kaiten SetPower(OUT_AC,KAITEN);
#define arm_tsukamu(t) set_kaiten; OnFwd(OUT_B); Wait(t)...
#define arm_hanasu(t) set_kaiten; OnRev(OUT_B); Wait(t);...
#define go_forward set_straight; OnFwd(OUT_AC);
#define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
#define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
#define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
#define black 38
#define glayA 42
#define glayB 45
#define glayC 48
#define white 50
#define KURO 11
#define TURN_TIME 90
#define TUKAMU_TIME 3
#define HANASU_TIME 3
#define MA_NO_ZIKAN 3
#define ma_wo_toru Off(OUT_B); Wait(MA_NO_ZIKAN);
**サブルーチン [#t41a11a4]
8個までなの本当に罠だよぉ!~
sub go_go_left()//交差点で左折
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
turn_leftL;
Wait(TURN_TIME);
Off(OUT_AC);
go_forward;
Wait(50);
}
sub go_go_right()//交差点で右折
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
turn_rightL;
Wait(TURN_TIME);
Off(OUT_AC);
}
sub go_go_forward()//交差点で直進
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
Off(OUT_AC);
}
交差点で左行って右行って直進する
sub go_follow()//サブルーチン8個までということで無理や...
{
ClearTimer(1);
while (FastTimer(1) <= 300) { //タイマー1を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところにいる...
turn_leftS; //少し左に曲がりな...
} else if (SENSOR_2 < glayB) { //白寄りのところにいる...
go_forward; //直進し、
} else { //それ以外のとき、つま...
turn_rightL; //大きく右へいきな...
}
Wait(1); //この判定を0.01秒ごと...
}
ClearTimer(0);
while (FastTimer(0) <= KURO) { //タイマー0を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところにいる...
turn_leftS; //少し左に曲がりな...
ClearTimer(0); //タイマーをリセッ...
} else if (SENSOR_2 < glayB) { //白寄りのところにいる...
go_forward; //直進し、
ClearTimer(0); //タイマーをリセッ...
} else { //それ以外のとき、つま...
turn_rightL; //大きく右へいきな...
ClearTimer(0); //タイマーをリセッ...
}
Wait(1); //この判定を0.01秒ごと...
}
}
sub tukamu()//コップをひっくり返す
{
repeat(6) { //動く/とまるを瞬時に繰り返すことで、結果...
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
OnRev(OUT_AC);//少し下がる(回転したりした時に他のコ...
Wait(80);
Off(OUT_ABC);
turn_rightL;//アームの中でコップを狙いの位置へ誘導☆
Wait(30);
Off(OUT_AC);
repeat(6) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
Off(OUT_B);//勢いが付きすぎると二個目以降はまだいい...
Wait(5);//ここで一回勢いを殺すことで、一回目もちゃん...
repeat(3) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
}
尚、全体的に速度/勢いを殺す動きをさせているが、勢いを殺...
※のRepeatの数の比は重要。前の※が大きいとハメる予定のコ...
☆について
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
これの「上方に寄せる」ということ。これでコップが落ち着...
sub hanasu()//離すというものの、実際はアームを元に戻す...
{
repeat(22) { //アームを開ききるために、アームを閉じる...
arm_hanasu(HANASU_TIME);
ma_wo_toru;
}
}
sub turn_180()//C/D地点でのターン用
{
turn_rightL;
Wait(170);
Off(OUT_AC);
go_forward;
Wait(50);
Off(OUT_AC);
}
**Task main [#x8a49667]
task main ()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
go_follow();//
&color(#e8383d){大失態。大恥};。交差点感知しなくて恥かい...
go_go_forward();
go_follow();
go_go_forward();
go_follow();
go_go_right();
go_follow();//C到着
int move_time; // 整数型の変数を宣言
move_time = 0;
go_forward;//C地点でコップがアームの中に入るようにす...
Wait(move_time);
Off(OUT_AC);//
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完(C一つ目)
turn_180();
go_follow();
go_go_forward();
go_follow();//D着
turn_rightL;//
Wait(50);//
/*これ、書き直した方で言及してる(&color(#c70067){関連1...
最初自分でもなんだこれって思った。~
Dでピタッと止まってくれないからこの段階を踏んで向きをラ...
コップにスッって入船する流れを作れなかったんだ…*/
go_forward;
Wait(move_time);
Off(OUT_AC);//Dコップ圏内へ
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
turn_180();
go_follow();
go_go_forward();
go_follow();//C着
move_time += 60;//コップをアームに入れるときにより進む...
go_forward;
Wait(move_time);
Off(OUT_AC);//Cにてコップをアームにいれる
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_forward();
go_follow();//D着
turn_rightL;
Wait(50);
go_forward;
Wait(move_time);
Off(OUT_AC);//Dコップ圏内4
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_forward();
go_follow();//C着
move_time += 50;//各スペース3つめ=3列目になるのでさら...
go_forward;
Wait(move_time);
Off(OUT_AC);//Cコップ圏内5
turn_rightS;
Wait(30);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_forward();
go_follow();//D着
turn_rightL;
Wait(50);
go_forward;
Wait(move_time);
Off(OUT_AC);//Dコップ圏内6
turn_rightS;
Wait(30);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返しすべて完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_right();//S脱出
go_follow();
go_go_left();
go_follow();//Q到着
turn_rightL;
Wait(360);
Off(OUT_AC);
turn_rightS;
Wait(90);
Off(OUT_AC);
go_go_left();
Off(OUT_ABC);
}
控えめに言って汚すぎて説明できない(おい)~
インライン関数を本質的に理解してないんですが、サブルー...
ということで、サブルーチンとインライン関数が同じように...
*書き直してみた [#g57e30cb]
int move_time; // 整数型の変数を宣言
move_time = 0;
この辺がどうなるのか根本的に理解してない気がする。不安...
**定義 [#ue0f0c45]
変更なし
#define straight 5
#define carb 2
#define KAITEN 2 //大きいギアを一枚しか噛ませられなかっ...
//なお、1にすると今度は勢いがなさ過ぎ...
#define set_straight SetPower(OUT_AC,straight);
#define set_carb SetPower(OUT_AC,carb);
#define set_kaiten SetPower(OUT_AC,KAITEN);
#define arm_tsukamu(t) set_kaiten; OnFwd(OUT_B); Wait(t)...
#define arm_hanasu(t) set_kaiten; OnRev(OUT_B); Wait(t);...
#define go_forward set_straight; OnFwd(OUT_AC);
#define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
#define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
#define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
#define black 38
#define glayA 42
#define glayB 45
#define glayC 48
#define white 50
#define KURO 11
#define TURN_TIME 90
#define TUKAMU_TIME 3
#define HANASU_TIME 3
#define MA_NO_ZIKAN 3
#define ma_wo_toru Off(OUT_B); Wait(MA_NO_ZIKAN);
**サブルーチンとかインライン関数とか [#dbdec9ad]
sub go_go_left()
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
turn_leftL;
Wait(TURN_TIME);
Off(OUT_AC);
go_forward;
Wait(50);
}
sub go_go_right()
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
turn_rightL;
Wait(TURN_TIME);
Off(OUT_AC);
}
sub go_go_forward()
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
Off(OUT_AC);
}
交差点で左行って右行って直進する(さっきと同じ)
sub go_follow()//三秒間交差点ない前提でライントレースを...
{
ClearTimer(1);
while (FastTimer(1) <= 300) { //タイマー1を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところに...
turn_leftS; //少し左に曲が...
} else if (SENSOR_2 < glayB) { //白寄りのところに...
go_forward; //直進し、
} else { //それ以外のとき、...
turn_rightL; //大きく右へい...
}
Wait(1); //この判定を0.01秒ご...
}
}
sub go_follow2()//ふつうのライントレース
{ ClearTimer(0);
while (FastTimer(0) <= KURO) { //タイマー0を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところにいる...
turn_leftS; //少し左に曲がりな...
ClearTimer(0); //タイマーをリセッ...
} else if (SENSOR_2 < glayB) { //白寄りのところにいる...
go_forward; //直進し、
ClearTimer(0); //タイマーをリセッ...
} else { //それ以外のとき、つま...
turn_rightL; //大きく右へいきな...
ClearTimer(0); //タイマーをリセッ...
}
Wait(1); //この判定を0.01秒ごと...
}
}
同じ。ライントレース。
void go_follow3()//go_followの1秒バージョン
{
ClearTimer(1);
while (FastTimer(1) <= 100) { //タイマー1を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところに...
turn_leftS; //少し左に曲が...
} else if (SENSOR_2 < glayB) { //白寄りのところに...
go_forward; //直進し、
} else { //それ以外のとき、...
turn_rightL; //大きく右へい...
}
Wait(1); //この判定を0.01秒ご...
}
}
追加。C→Dで交差点後が少し3秒が長くD地点でぴたっと止まっ...
void go_follow4()//どうせ交差点後はこの組み合わせになる...
{
go_follow();
go_follow2();
}
void go_follow5()//どうせ交差点後はこの組み合わせになる...
{
go_follow3();
go_follow2();
}
追加。すっきりさせたかったので。
void tukamu()
{
repeat(6) { //動く/とまるを瞬時に繰り返すことで、結...
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
OnRev(OUT_AC);//少し下がる(回転したりした時に他のコ...
Wait(80);
Off(OUT_ABC);
turn_rightL;//アームの中でコップを狙いの位置へ誘導☆
Wait(30);
Off(OUT_AC);
repeat(6) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
Off(OUT_B);//勢いが付きすぎると二個目以降はまだいいが...
Wait(5);//ここで一回勢いを殺すことで、一回目もちゃん...
repeat(3) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
}
サブルーチンから変更。やっていることは同じ。
一応繰り返しになりますが↓
尚、全体的に速度/勢いを殺す動きをさせているが、勢いを殺...
※のRepeatの数の比は重要。前の※が大きいとハメる予定のコ...
☆について
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
これの「上方に寄せる」ということ。これでコップが落ち着...
void hanasu()
{
repeat(22) { //アームを開ききるために、アームを閉じる...
arm_hanasu(HANASU_TIME);
ma_wo_toru;
}
}
void turn_180() //C/D地点でのターン用
{
turn_rightL;
Wait(170);
Off(OUT_AC);
go_forward;
Wait(50);
Off(OUT_AC);
}
サブルーチンから変更。中身は同じ。
void tsukande_hakobu() //つかんではこぶ。うん。
{
go_forward;//少し前進しコップがアームに入るようにする...
Wait(move_time);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
turn_180();//現在地点を出発
go_follow4();
go_go_forward();//交差点まっすぐすすむよ!
go_follow5();//次の地点に到着
}
void tsukande_hakobu_last() //つかんではこぶ最後六個目...
{
go_forward;//少し前進しコップがアームに入るようにする
Wait(move_time);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
}
大会時はサブルーチン8個むりだよふえぇってなってたのであ...
( つかんで動く動きを部品化すればいいのでしょうが、intっ...
**たすくめいん [#vec1c783]
task main ()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
go_follow2();//本番でミスったのここ。交差点感知しなく...
go_go_forward();
go_follow4();
go_go_forward();
go_follow4();
go_go_right();
go_follow4();//Cに初めて到着
int move_time; // 整数型の変数を宣言
move_time = 0; //初回は地点についた時点でコップが収ま...
tsukande_hakobu();
tsukande_hakobu();
move_time += 50;//並べたコップをとるために少し奥へ。短...
tsukande_hakobu();
tsukande_hakobu();
move_time += 50;//並べたコップをとるためにさらに少し奥へ
tsukande_hakobu();
tsukande_hakobu_last();//Dで6つめを乗せおわる
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow4();//Sへ向かう
go_go_right();//S脱出.ゴールへ向かい始める
go_follow4();
go_go_left();
go_follow4();//Q到着
turn_rightL;//コップが逃げないように基本右回りで行動...
Wait(360);
Off(OUT_AC);
turn_rightS;//コップが逃げないように基本右回りで行動。
Wait(90);
Off(OUT_AC);
go_go_left();//コップを置き去りにし離脱
Off(OUT_ABC);
}
*感想 [#fdc942f1]
恥かいて本当にしんどかった。プログラミングに関してほぼ...
最後先生のまとめの時に、「コンピューター制御がアテにな...
借り物
歯車素材→http://www.pixiv.net/member_illust.php?illust_...
終了行:
[[2016a/Member]]
#contents
*困惑の吐露のような愚痴の発散のような [#mfc00170]
Ris一体、それに準じて光センサーも一つで課題をこなさなく...
時間かけた結果も散々だった。~
久しぶりに吐いた。~
その上で先生のまとめのお言葉を聞いた時「うわぁ先生その...
08/23 20:40追記
&color(#e8383d){ルール読み間違えてたらしい。Ris一個でもセ...
*ハード [#g814f17e]
#ref(./DSC_0587.JPG,100)
まず前述の通り~
・Ris一つ~
・=モーター3っつまで~
・=光センサー一つのみ~
で考える必要があった。なんでだよ。しらん。地面に巻いた水...
その結果大前提として~
「ライントレースに光センサーを費やす以上、コップ回収には...
またコードの調子が悪く、「タッチセンサーも使用が厳しい...
という前置きはここまでにして。~
行動原理および作戦としては、~
「コップを横向きにひっくり返して重ねていく」「『運ぶ』の...
という発想である。コップ回収にセンサー利用が0である以上...
だってコップ見つけるセンサー持てないんだもんね。~
**構造 [#g6a7fcf9]
***アーム [#j1093ab7]
#ref(./DSC_0591 - コピー.JPG,100)
1.モーターから、一番小さいギア→一番大きいギアの順に伝...
2.このタイヤと平行なモーターの回転運動をを棒の回転運動...
+α.この当たりは「補強(A)」や「先端の動作で必要(B)」...
…そういえば光センサーの記述してない。~
前回の課題にてこの位置にしたから、というわけだけでは実...
1つめに、前方であること。アームに比較的近いところであ...
2つめに、コップを引きずる上で邪魔にならないこと。~
3つめに、正確なライントレースを求めるために、「あまり...
この点から、~
#ref(./DSC_0602 - コピー.JPG,100)
設置点Aはバンパー(後述(&color(#00afcc){☆2};))の「わ...
設置点Bはバンパーと紙コップの位置的な相性から「ここは空...
そして設置点C。繰り返しの試行の結果「いうほどアームの影...
つまり、~
作戦上のバンパーの有り方の形状>>>>>>>>>>...
#ref(./DSC_0593 - コピー (2).JPG,100)
#ref(./DSC_0594 - コピー.JPG,100)
回転方向は図の通り。
ここが先述(&color(#ea5550){※1};)によって親指上向きに...
逆にアームを初期状態に戻すとき、「コップが進むだけで入...
なお、アームの軸回転が戻っている途中にアームが開きそう...
歯車2についている(&color(#0000cd){この部分};)は「アー...
***バンパー [#t013f3ce]
#ref(./DSC_0589.JPG,100)
(&color(#00afcc){☆2};)。~
運ぶ(笑)ためのバンパー(仮称)である。バンパーの役割...
仕組みはGIFアニメにて。~
#ref(./1470985947CJd5B0L5T25RnU_1470985932.gif,50%)
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
なお、光センサーが真ん中の位置であると、以下のようにな...
#ref(./1470986829M1fPAhUxPPWah951470986824.gif,50%)
本体は特にゴツさを極力削ったつもりである。~
**経緯 [#t6dd33d4]
光センサーは先述したので省略。~
***アームの決定 [#kf43e754]
まず、先生に教授いただいた方法を試してみた。女子二人で...
教えていただいた機構は以下の通り。~
#ref(./名称未設定 1 - コピー.png,50)
これについての考察として、~
・歯車の数が多い~
・ブロックで連結しなければならない→重たくなりそう~
・Ris一台分で動作させる必要がある →つまりアームの方が重く...
→補強用ブロックも足りな...
・歯車とブロックの融合したごついモーターをRisの近くに設置...
というのは共通認識レベルで考えた。おそらくちゃんとそれら...
重いアームが何故問題なのかを考えた時、それは「重いもの...
・重くても、動かなければ重心は安定している~
・軽ければ、動いても重心は安定しやすい~
のどちらかにしようと意見をまとめた。~
最初に考えたのは「エレベーター方式」である。おそらく「...
・構造が複雑化=センサーなしでできると思えない+一台分では...
・紙コップは寸胴ではないので、両側からの押し上げ式の持ち...
・箱型(よくあるエレベーター)であれば「持ち上げる」動作...
であるために断念。
本当に一台分でやらされたの糞だなあいつらどうさせようとし...
となれば、と「軽量化」に着手。~
そこで浮かんだのが、「ブロックと歯車で回転運動を伝達す...
早速見本(歯車連結)と見比べながら試作。実際にモーター...
その結果が
#ref(./DSC_0611 - コピー - コピー.JPG,100)
こうである。~
つまり想定していた動きと、得た動きはこのように差異があ...
#ref(./DSC_0612 - コピー.JPG,100)
求めていた「タイヤと平行な向きの、上昇する回転運動」では...
棒の回転運動を止めるとアームの先端のつかむ動きもできな...
だが、なんというか、素晴らしい言い方をすれば「ひらめき...
これ、ある程度の高さがあったらこう…かぽって…お椀伏せる...
#ref(./1470989773S6pCY4nj9uBCupQ1470989766.gif,50%)
という「理想の動きをしてくれなかったことによる%%やけくそ%...
***アーム先端 [#ge7ca0fb]
使ったことのない部品を組み合わせながら「いかにして固定...
#ref(./DSC_0611 - コピー.JPG,100)~
棒をできるだけ使い軽量化を狙う。~
左側に伸びているのは(&color(#00947a){☆1};)のため。~
アームの右側が直線的なのは「高さを下げないため」である...
<高さが足りないとどうなるか>~
#ref(./1470991212jEai3uFay5v6_oK1470991205.gif,50%)
<直線的でなかったらどうなるか>~
#ref(./14709912689blrdYdfnPwOt2_1470991264.gif,50%)
また、直線的の方が紙コップが直進した時に入ってきやすい...
ただ、同時にそれだと「つかむ」要素が薄れつかみ損ねかね...
#ref(./DSC_0603 - コピー.JPG,100)
***本体 [#tbcca449]
アーム接地部分をブロックを敷き詰めることにより底上げ。...
#ref(./DSC_0605 - コピー.JPG,100)~
下への設置だけでなく、横向きへ伸ばした棒+ブロックで接地...
#ref(./DSC_0607 - コピー - コピー.JPG)
***バンパー [#lb06882e]
バンパーに求められたのは、~
・ライントレース程度の左折に耐える~
・コップをひっくり返すとき狙いのところにコップを都合のよ...
・最後コップが離脱する~
事である。~
#ref(./DSC_0606 - コピー.JPG,100)
#ref(./DSC_0608 - コピー.JPG,100)
左折に耐えるためにAの部分は短すぎず、また、コップが離脱...
Cの折れの位置はアームの長さに合わせ、アームが回転した時...
*大会時の狙っていた流れ [#y3ab3d56]
#ref(./1470998334O99JCPHqXwJ2zbl1470998333.gif,50%)
#ref(./1470998759K2PikBo2GqgReII1470998752.gif,50%)
#ref(./1470998901QBtGLZEWXKlCTqj1470998889.gif,50%)
「すでに獲得しているコップをバンパーの中で左上に寄せて」...
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
の上方に寄せることである。
*大会時のプログラム [#ldd385a5]
今見たら自分でも見にくくて震えてる…~
「書き換えてみたプログラム」は運転してません(解体して...
そうやって理論上に泣いてきたけどな!HAHAHA!!!!~
控えめに言って汚すぎて説明できないです(おい)ミスした...
インライン関数を本質的に理解してないんですが、サブルー...
ということで、サブルーチンとインライン関数が同じように...
しかしながら!!やはり!!!走らせてないプログラムだけ...
**定義 [#i6399169]
前回同様のものが多い。
#define straight 5
#define carb 2
#define KAITEN 2 //大きいギアを一枚しか噛ませられなかっ...
#define set_straight SetPower(OUT_AC,straight);
#define set_carb SetPower(OUT_AC,carb);
#define set_kaiten SetPower(OUT_AC,KAITEN);
#define arm_tsukamu(t) set_kaiten; OnFwd(OUT_B); Wait(t)...
#define arm_hanasu(t) set_kaiten; OnRev(OUT_B); Wait(t);...
#define go_forward set_straight; OnFwd(OUT_AC);
#define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
#define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
#define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
#define black 38
#define glayA 42
#define glayB 45
#define glayC 48
#define white 50
#define KURO 11
#define TURN_TIME 90
#define TUKAMU_TIME 3
#define HANASU_TIME 3
#define MA_NO_ZIKAN 3
#define ma_wo_toru Off(OUT_B); Wait(MA_NO_ZIKAN);
**サブルーチン [#t41a11a4]
8個までなの本当に罠だよぉ!~
sub go_go_left()//交差点で左折
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
turn_leftL;
Wait(TURN_TIME);
Off(OUT_AC);
go_forward;
Wait(50);
}
sub go_go_right()//交差点で右折
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
turn_rightL;
Wait(TURN_TIME);
Off(OUT_AC);
}
sub go_go_forward()//交差点で直進
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
Off(OUT_AC);
}
交差点で左行って右行って直進する
sub go_follow()//サブルーチン8個までということで無理や...
{
ClearTimer(1);
while (FastTimer(1) <= 300) { //タイマー1を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところにいる...
turn_leftS; //少し左に曲がりな...
} else if (SENSOR_2 < glayB) { //白寄りのところにいる...
go_forward; //直進し、
} else { //それ以外のとき、つま...
turn_rightL; //大きく右へいきな...
}
Wait(1); //この判定を0.01秒ごと...
}
ClearTimer(0);
while (FastTimer(0) <= KURO) { //タイマー0を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところにいる...
turn_leftS; //少し左に曲がりな...
ClearTimer(0); //タイマーをリセッ...
} else if (SENSOR_2 < glayB) { //白寄りのところにいる...
go_forward; //直進し、
ClearTimer(0); //タイマーをリセッ...
} else { //それ以外のとき、つま...
turn_rightL; //大きく右へいきな...
ClearTimer(0); //タイマーをリセッ...
}
Wait(1); //この判定を0.01秒ごと...
}
}
sub tukamu()//コップをひっくり返す
{
repeat(6) { //動く/とまるを瞬時に繰り返すことで、結果...
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
OnRev(OUT_AC);//少し下がる(回転したりした時に他のコ...
Wait(80);
Off(OUT_ABC);
turn_rightL;//アームの中でコップを狙いの位置へ誘導☆
Wait(30);
Off(OUT_AC);
repeat(6) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
Off(OUT_B);//勢いが付きすぎると二個目以降はまだいい...
Wait(5);//ここで一回勢いを殺すことで、一回目もちゃん...
repeat(3) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
}
尚、全体的に速度/勢いを殺す動きをさせているが、勢いを殺...
※のRepeatの数の比は重要。前の※が大きいとハメる予定のコ...
☆について
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
これの「上方に寄せる」ということ。これでコップが落ち着...
sub hanasu()//離すというものの、実際はアームを元に戻す...
{
repeat(22) { //アームを開ききるために、アームを閉じる...
arm_hanasu(HANASU_TIME);
ma_wo_toru;
}
}
sub turn_180()//C/D地点でのターン用
{
turn_rightL;
Wait(170);
Off(OUT_AC);
go_forward;
Wait(50);
Off(OUT_AC);
}
**Task main [#x8a49667]
task main ()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
go_follow();//
&color(#e8383d){大失態。大恥};。交差点感知しなくて恥かい...
go_go_forward();
go_follow();
go_go_forward();
go_follow();
go_go_right();
go_follow();//C到着
int move_time; // 整数型の変数を宣言
move_time = 0;
go_forward;//C地点でコップがアームの中に入るようにす...
Wait(move_time);
Off(OUT_AC);//
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完(C一つ目)
turn_180();
go_follow();
go_go_forward();
go_follow();//D着
turn_rightL;//
Wait(50);//
/*これ、書き直した方で言及してる(&color(#c70067){関連1...
最初自分でもなんだこれって思った。~
Dでピタッと止まってくれないからこの段階を踏んで向きをラ...
コップにスッって入船する流れを作れなかったんだ…*/
go_forward;
Wait(move_time);
Off(OUT_AC);//Dコップ圏内へ
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
turn_180();
go_follow();
go_go_forward();
go_follow();//C着
move_time += 60;//コップをアームに入れるときにより進む...
go_forward;
Wait(move_time);
Off(OUT_AC);//Cにてコップをアームにいれる
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_forward();
go_follow();//D着
turn_rightL;
Wait(50);
go_forward;
Wait(move_time);
Off(OUT_AC);//Dコップ圏内4
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_forward();
go_follow();//C着
move_time += 50;//各スペース3つめ=3列目になるのでさら...
go_forward;
Wait(move_time);
Off(OUT_AC);//Cコップ圏内5
turn_rightS;
Wait(30);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_forward();
go_follow();//D着
turn_rightL;
Wait(50);
go_forward;
Wait(move_time);
Off(OUT_AC);//Dコップ圏内6
turn_rightS;
Wait(30);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返しすべて完
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow();
go_go_right();//S脱出
go_follow();
go_go_left();
go_follow();//Q到着
turn_rightL;
Wait(360);
Off(OUT_AC);
turn_rightS;
Wait(90);
Off(OUT_AC);
go_go_left();
Off(OUT_ABC);
}
控えめに言って汚すぎて説明できない(おい)~
インライン関数を本質的に理解してないんですが、サブルー...
ということで、サブルーチンとインライン関数が同じように...
*書き直してみた [#g57e30cb]
int move_time; // 整数型の変数を宣言
move_time = 0;
この辺がどうなるのか根本的に理解してない気がする。不安...
**定義 [#ue0f0c45]
変更なし
#define straight 5
#define carb 2
#define KAITEN 2 //大きいギアを一枚しか噛ませられなかっ...
//なお、1にすると今度は勢いがなさ過ぎ...
#define set_straight SetPower(OUT_AC,straight);
#define set_carb SetPower(OUT_AC,carb);
#define set_kaiten SetPower(OUT_AC,KAITEN);
#define arm_tsukamu(t) set_kaiten; OnFwd(OUT_B); Wait(t)...
#define arm_hanasu(t) set_kaiten; OnRev(OUT_B); Wait(t);...
#define go_forward set_straight; OnFwd(OUT_AC);
#define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
#define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
#define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
#define black 38
#define glayA 42
#define glayB 45
#define glayC 48
#define white 50
#define KURO 11
#define TURN_TIME 90
#define TUKAMU_TIME 3
#define HANASU_TIME 3
#define MA_NO_ZIKAN 3
#define ma_wo_toru Off(OUT_B); Wait(MA_NO_ZIKAN);
**サブルーチンとかインライン関数とか [#dbdec9ad]
sub go_go_left()
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
turn_leftL;
Wait(TURN_TIME);
Off(OUT_AC);
go_forward;
Wait(50);
}
sub go_go_right()
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
turn_rightL;
Wait(TURN_TIME);
Off(OUT_AC);
}
sub go_go_forward()
{
Off(OUT_AC);
Wait(100);
PlaySound(SOUND_FAST_UP);
go_forward;
Wait(50);
Off(OUT_AC);
}
交差点で左行って右行って直進する(さっきと同じ)
sub go_follow()//三秒間交差点ない前提でライントレースを...
{
ClearTimer(1);
while (FastTimer(1) <= 300) { //タイマー1を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところに...
turn_leftS; //少し左に曲が...
} else if (SENSOR_2 < glayB) { //白寄りのところに...
go_forward; //直進し、
} else { //それ以外のとき、...
turn_rightL; //大きく右へい...
}
Wait(1); //この判定を0.01秒ご...
}
}
sub go_follow2()//ふつうのライントレース
{ ClearTimer(0);
while (FastTimer(0) <= KURO) { //タイマー0を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところにいる...
turn_leftS; //少し左に曲がりな...
ClearTimer(0); //タイマーをリセッ...
} else if (SENSOR_2 < glayB) { //白寄りのところにいる...
go_forward; //直進し、
ClearTimer(0); //タイマーをリセッ...
} else { //それ以外のとき、つま...
turn_rightL; //大きく右へいきな...
ClearTimer(0); //タイマーをリセッ...
}
Wait(1); //この判定を0.01秒ごと...
}
}
同じ。ライントレース。
void go_follow3()//go_followの1秒バージョン
{
ClearTimer(1);
while (FastTimer(1) <= 100) { //タイマー1を使用
if (SENSOR_2 < black) { //黒の範囲にいるとき、
turn_leftL;
} else if (SENSOR_2 < glayA) { //黒寄りのところに...
turn_leftS; //少し左に曲が...
} else if (SENSOR_2 < glayB) { //白寄りのところに...
go_forward; //直進し、
} else { //それ以外のとき、...
turn_rightL; //大きく右へい...
}
Wait(1); //この判定を0.01秒ご...
}
}
追加。C→Dで交差点後が少し3秒が長くD地点でぴたっと止まっ...
void go_follow4()//どうせ交差点後はこの組み合わせになる...
{
go_follow();
go_follow2();
}
void go_follow5()//どうせ交差点後はこの組み合わせになる...
{
go_follow3();
go_follow2();
}
追加。すっきりさせたかったので。
void tukamu()
{
repeat(6) { //動く/とまるを瞬時に繰り返すことで、結...
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
OnRev(OUT_AC);//少し下がる(回転したりした時に他のコ...
Wait(80);
Off(OUT_ABC);
turn_rightL;//アームの中でコップを狙いの位置へ誘導☆
Wait(30);
Off(OUT_AC);
repeat(6) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
Off(OUT_B);//勢いが付きすぎると二個目以降はまだいいが...
Wait(5);//ここで一回勢いを殺すことで、一回目もちゃん...
repeat(3) { //※
arm_tsukamu(TUKAMU_TIME);
ma_wo_toru;
}
}
サブルーチンから変更。やっていることは同じ。
一応繰り返しになりますが↓
尚、全体的に速度/勢いを殺す動きをさせているが、勢いを殺...
※のRepeatの数の比は重要。前の※が大きいとハメる予定のコ...
☆について
#ref(./1470986068Dp1oyA0_F5g2zKR1470986060.gif,50%)
これの「上方に寄せる」ということ。これでコップが落ち着...
void hanasu()
{
repeat(22) { //アームを開ききるために、アームを閉じる...
arm_hanasu(HANASU_TIME);
ma_wo_toru;
}
}
void turn_180() //C/D地点でのターン用
{
turn_rightL;
Wait(170);
Off(OUT_AC);
go_forward;
Wait(50);
Off(OUT_AC);
}
サブルーチンから変更。中身は同じ。
void tsukande_hakobu() //つかんではこぶ。うん。
{
go_forward;//少し前進しコップがアームに入るようにする...
Wait(move_time);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
turn_180();//現在地点を出発
go_follow4();
go_go_forward();//交差点まっすぐすすむよ!
go_follow5();//次の地点に到着
}
void tsukande_hakobu_last() //つかんではこぶ最後六個目...
{
go_forward;//少し前進しコップがアームに入るようにする
Wait(move_time);
Off(OUT_AC);
tukamu();
Off(OUT_B);
Wait(100);
hanasu();
Off(OUT_B);
Wait(100);//コップひっくり返し完
}
大会時はサブルーチン8個むりだよふえぇってなってたのであ...
( つかんで動く動きを部品化すればいいのでしょうが、intっ...
**たすくめいん [#vec1c783]
task main ()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
go_follow2();//本番でミスったのここ。交差点感知しなく...
go_go_forward();
go_follow4();
go_go_forward();
go_follow4();
go_go_right();
go_follow4();//Cに初めて到着
int move_time; // 整数型の変数を宣言
move_time = 0; //初回は地点についた時点でコップが収ま...
tsukande_hakobu();
tsukande_hakobu();
move_time += 50;//並べたコップをとるために少し奥へ。短...
tsukande_hakobu();
tsukande_hakobu();
move_time += 50;//並べたコップをとるためにさらに少し奥へ
tsukande_hakobu();
tsukande_hakobu_last();//Dで6つめを乗せおわる
OnRev(OUT_AC);
Wait(move_time);
turn_180();
go_follow4();//Sへ向かう
go_go_right();//S脱出.ゴールへ向かい始める
go_follow4();
go_go_left();
go_follow4();//Q到着
turn_rightL;//コップが逃げないように基本右回りで行動...
Wait(360);
Off(OUT_AC);
turn_rightS;//コップが逃げないように基本右回りで行動。
Wait(90);
Off(OUT_AC);
go_go_left();//コップを置き去りにし離脱
Off(OUT_ABC);
}
*感想 [#fdc942f1]
恥かいて本当にしんどかった。プログラミングに関してほぼ...
最後先生のまとめの時に、「コンピューター制御がアテにな...
借り物
歯車素材→http://www.pixiv.net/member_illust.php?illust_...
ページ名: