- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009a]]
*目次 [#f4e29bb1]
#contents
**課題・ロボコン [#lc482827]
紙パックを収集して色ごとに所定の場所に運ぶ。
途中に超えなければいけない壁があり、またラインの判定、色の識別、障害物の認識など今までに学んだことを応用する必要がある。
**メンバー [#qca2151a]
今回は、ロボットを2機作りそれぞれで違う働きをするものだったので2チームに分けて作業をしました。
おくりびと制作委員会~
・スガ~
・はやぶさ~
プロジェクトI~
・かおりん~
・ハる~
・松~
special thanks~
・ぴーちゃん
**ロボットの特徴、工夫 [#u3e83e8a]
課題の特性上2つのロボットで役割を分担するのが最良と考えたので以下の2機を制作しました。~
まず中央の壁の向こう側までもう1機のロボットを運ぶ役割をする「おくりびと」byハる。~
次に壁の向こうで紙パックを所定の位置まで運ぶ「愛ちゃん」byハる。
***おくりびと [#ca1c8503]
・愛ちゃんを壁の向こう側まで送りとどけるため、壁の前まで運び、足場を作って壁を越えさせます。
・ロボットを上に載せるので必然的に大きくなってしました。そのため、曲がるときに周りに引っかかってしまいうまく曲がれませんでした。
・上のロボットを支えないといけないので強度を強くし、なるべく高さを低くしました。
#ref(2009a/A9/ロボコン/zentai.jpg)
・車体を低くしたところ、本体を入れるスペースがなくなったので、足場とのバランスを取るのも兼ねて後ろに取り付けました。
#ref(2009a/A9/ロボコン/hontai.jpg)
・はじめ前後輪をつなげて四輪駆動で馬力を出そうと思ったが、タイヤとホイールが空回りしてしまったりしてうまくいかなかった。
三輪にしても曲がる時にバランスを崩し、前輪が変な方向を向き安定しなかった。
前輪はモーターとはつながずに、横にすべりやすいものにしたところうまくいきました。その際、スピードが出過ぎだったのでギアの組み合わせで遅くしました。
#ref(2009a/A9/ロボコン/zenrin.jpg)
・移動中に勝手に足場がおりてしまうことがあったので、ストッパーを付けてモーターで外せるようにした。
#ref(2009a/A9/ロボコン/stoper.jpg)
光センサーは端につけました
#ref(2009a/A9/ロボコン/200908051807000.jpg)
***愛ちゃん [#df22dd37]
作業の途中で、致命的な不具合を発見しましたので、ここにアップしておきます。
1.四輪駆動の取扱説明書のロボットが動かない
4輪型のロボットで、正面にアームを取り付けました。タイヤ用ゴムを使用したため、牛乳パックが滑り落ちる確率も少ないです。光センサーは下に二つ使用して、両方の光センサーが黒線上を走ったら曲がるというように設定しました。
#ref(2009a/A9/ロボコン/200908051416000.jpg)
二輪駆動にし、前輪を一輪にすることで対処しました。
原因は、モータの出力が不足している、重量過多であるなど、さまざまな原因が考えられましたが、結局、前段階の課題では正しく動作していた、取扱説明書の正規のデザインのロボットであることから、部品などの摩耗が原因だと思われます。
タイヤは後輪のみモーターをつけました。ロボットの下の方にある「鼻」のような出っ張りは、牛乳パックをつかむ時ロボットを、板に接触させた場合それが、アームと牛乳パックのちょうどよい距離感をつくるために取り付けました。
2.スロットCの回線が断線している
これは、端子を拭き取ることで対処しようと試みましたが、復旧できませんでした。
原因は、ワセリンを使用していないことであると推測されます。
**各プログラム [#e3e3741b]
***おくりびと [#ra79abe2]
スタート地点から黒線で曲がる位置を判断し、方向転換して壁の真ん中まで進みます。
//定数・マクロ群
#define L_B 40 //白と黒の境界線の値(line_boder)
#define T_T 105 //90°回転の所要時間(turn_time)
#define GO_SIGN 22 //愛ちゃん起動の暗号(go_sign)
#define ALL_OFF Off(OUT_A+OUT_B+OUT_C);Wait(100); //全停止(all_stop)
#define T_L OnFwd(OUT_A);OnRev(OUT_C); //左回転(turn_left)
#define G_F OnRev(OUT_A+OUT_C); //前進(go_front)
//メインプログラム
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサーをセット
SetPower(OUT_A+OUT_B+OUT_C,7); //全力全開
Wait(200); //スタート後の余裕
G_F //前進
until ( SENSOR_1 < L_B ); //1本目のラインを横切る
Wait(50); //1本目のラインをパス
until ( SENSOR_1 < L_B ); //2本目のラインを横切る
Wait(80); //十分に通り過ぎる
ALL_OFF //呼吸を整える
T_L //左回転
Wait(T_T); //90°
ALL_OFF //全停止
G_F //前進
until ( SENSOR_1 < L_B ); 3本目のラインを横切る
Wait(30); //少し通り過ぎる
ALL_OFF //全停止
T_L //左回転
Wait(T_T); //90°
ALL_OFF //全停止
G_F //前進
until ( SENSOR_1 < L_B ); //中央右ラインを横切る
Wait(100); //中央へ
ALL_OFF //全停止
OnFwd(OUT_C);OnRev(OUT_A); //右回転
Wait(T_T); //90°
ALL_OFF //全停止
G_F //前進
Wait(30); //壁に密着
ALL_OFF //全停止
Wait(100); //余裕
OnFwd(OUT_B); //足場のストッパーをはずす
Wait(50); //足場展開
Off(OUT_B); //停止
Wait(50); //余裕
SendMessage(GO_SIGN); //暗号送信(愛ちゃん発進)
PlaySound(SOUND_CLICK); //確認音
Wait(150); //愛ちゃんが下りるまで待機
OnFwd(OUT_A+OUT_C); //後退
Wait(200); //後退完了
ALL_OFF //終了
}
***愛ちゃん [#k78cf1c6]
#define THRESHOLD 50
#define GO_SIGN 22 通信機能を定義する
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); 光センサーは左右に設置
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_B,7); 牛乳パックを落とさないように出力を7に
ClearMessage(); 通信機能を使う
until (Message() == GO_SIGN); 通信されるまでおくりびとの上で待機
OnFwd(OUT_A+OUT_C); 通信されたら直進してはしごを渡る
Wait(150);
Off(OUT_A+OUT_C); 降りたら一度停止
Wait(100);
1.サブルーチン化して文の重複をなくした
2.全体的にスペースを多用し、それぞれの関係を明確にした。
#define THRESHOLD 50
#define GO_SIGN 22 通信機能を定義する
sub turn_right()
{
OnRev(OUT_A); 90度旋回する
OnFwd(OUT_C);
Wait(60);
Off(OUT_A+OUT_C);
Wait(100);
}
sub turn_left()
{
OnRev(OUT_C); 90度旋回する
OnFwd(OUT_A);
Wait(60);
Off(OUT_A+OUT_C);
Wait(100);
}
sub go_back()
{
OnFwd(OUT_A); 180度回転する
OnRev(OUT_C);
Wait(130);
}
sub parge_pack()
{
OnFwd(OUT_A+OUT_C); 指定の場所に運ぶため前進する
Wait(150);
OnRev(OUT_B); 牛乳パックを放す
OnRev(OUT_A+OUT_C); そのままの向きで下がる
Wait(110);
Off(OUT_A+OUT_C);
Wait(70);
}
sub hold_pack();
{
OnFwd(OUT_B); アームを使って牛乳パックをはさむ
Wait(80);
OnRev(OUT_A+OUT_C); そのままか移転すると前輪が壁に当たるので、少し下がる
Wait(65);
Off(OUT_A+OUT_C);
}
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT); 光センサーは左右に設置
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_B,7); 牛乳パックを落とさないように出力を7に
ClearMessage(); 通信機能を使う
until (Message() == GO_SIGN); 通信されるまでおくりびとの上で待機
OnFwd(OUT_A+OUT_C); 通信されたら直進してはしごを渡る
Wait(150);
Off(OUT_A+OUT_C); 降りたら一度停止
Wait(100);
turn_right();
OnFwd(OUT_A+OUT_C); 直進する
while(true)
{
while(true)
{
if(SENSOR_1<THRESHOLD)
{ 左の光センサーが黒線上で
{ 左の光センサーが黒線上で
if(SENSOR_3<THRESHOLD)
{ 右の光センサーも黒線上の時
{ 右の光センサーも黒線上の時
OnFwd(OUT_A+OUT_C); 光センサーが前に付いていて、回転軸が前ぎみになっているので、少し前進する
Wait(40);
Off(OUT_A+OUT_C);
Wait(100);
OnRev(OUT_A); 90度回転し、牛乳パックの正面に立つ
OnFwd(OUT_C);
Wait(55);
Off(OUT_A+OUT_C);
Wait(200);
turn_right();
OnFwd(OUT_A+OUT_C); 前進して牛乳パックに近づく
Wait(60);
Off(OUT_A+OUT_C);
Wait(100);
OnFwd(OUT_B); アームを使って牛乳パックをはさむ
Wait(80);
OnRev(OUT_A+OUT_C); そのままか移転すると前輪が壁に当たるので、少し下がる
Wait(65);
hold_pack();
Wait(100);
OnFwd(OUT_A); 180度回転する
OnRev(OUT_C);
Wait(130);
OnFwd(OUT_A+OUT_C); 指定の場所に運ぶため前進する
Wait(150);
OnRev(OUT_B); 牛乳パックを放す
OnRev(OUT_A+OUT_C); そのままの向きで下がる
Wait(110);
Off(OUT_A+OUT_C);
Wait(70);
turn_right();
OnFwd(OUT_A+OUT_C);
Wait(90);
Off(OUT_A+OUT_C);
Wait(100);
turn_right();
OnFwd(OUT_A+OUT_C); 前進して牛乳パックに近づく
Wait(60);
Off(OUT_A+OUT_C);
Wait(100);
OnFwd(OUT_A); 180度回転する
OnRev(OUT_C);
Wait(130);
OnFwd(OUT_A+OUT_C); 指定の場所に運ぶため前進する
Wait(150);
OnRev(OUT_B); 牛乳パックを放す
OnRev(OUT_A+OUT_C); そのままの向きで下がる
Wait(110);
Off(OUT_A+OUT_C);
Wait(70);
OnRev(OUT_A); 90度回転する
OnFwd(OUT_C);
Wait(60);
Off(OUT_A+OUT_C);
Wait(100);
OnRev(OUT_A+OUT_C); 後ろに下がり、また左右の光センサーが同時に黒線上になったら、先ほどと同じような動きをして、もう一つの牛乳パックを運ぶ
Wait(150);
hold_pack();
parge_pack();
turn_right();
OnRev(OUT_A+OUT_C); 後ろに下がり、また左右の光センサーが同時に黒線上になったら、先ほどと同じような動きをして、さらに二つの牛乳パックを運ぶ
Wait(150);
}
}
}
}
}
}
}
**感想 [#nd2b43c3]
難しかったです。
壁を越えるプログラムがうまくいかなかったです。真ん中の低いところを狙わないで行けばよかったと思いました。
ロボットのプログラムを考え、思い通りに動かすのは大変でした。最後になっていい感じにできたので、成功させたかったです。
また、作業中に様々なアクシデントに見舞われ、結局、何とかなりましたが、ロボコン課題を始めた時点で、様々な事象を予想しておいたほうが良かったのかな、と今改めて思います。おくりびとの上に愛ちゃんを乗せてテストをしなかったことが、牛乳パックを運ぶに至らなかった主な原因だと思います。愛ちゃんを乗せた時と、乗せていない時のおくりびとの動きにかなり差があったので、そこを考えていなかったことが悔やまれます。
このロボティクス入門ゼミで、かなりいろいろなことがありましたが、最終的に全員ロボコンに出席できてよかったし、やはりプログラミングをする以上、初めに順序立てて動いたりすることもとても重要だと思いました。
**コメント欄 [#r45d621d]
コメントお願いします。
#comment