2017b/Member 目次
黒い線のコースに沿って動き、紙コップを移動させるロボットを製作せよ。 (相棒と違うコースを選ぶこと。ただし第3コースは3名チーム用とする。) 私は第2コースで課題に挑戦した。
Dをスタート →Cを直進 →Bを左折 →Pを左折(一時停止) →Qを直進 →Rを左折 →Fを左折 →Sを直進(一時停止) →Y地点の紙コップを取得してコースに戻る →Sを直進(一時停止) →Qを左折(一時停止) →Rを直進 →X地点に紙コップを置いてコースに戻る →Pを左折 →B を左折(一時停止) →A地点へ(ゴール)
はじめは4輪のロボットだったが細かい旋回がうまくいかないときがみられたので3輪のロボットにした。
光センサーは旋回時に大きく揺れるのを防ぐために前輪に近づけた。地面とセンサーの距離は1.7cm。
旋回秒数によって交差点を判別させるようにしたため今回の課題では「何秒旋回するか」が1つの重要のポイントであり、旋回秒数にズレが生じないことが求められた。よって旋回するときに紙との抵抗を小さくするためにプラスティックの車輪を使用した。
試行錯誤を繰り返した結果画像のようになった。
コップをキャッチできる範囲を増やすため大きめのモデルにした。その結果画像のように立てた状態からでないとおろすことができない。
先端の車輪はおろしたときに紙との抵抗を小さくするために取り付けた。
脇についている黄色い棒はコップが横からすり抜けてしまったり、倒れてしまったりするのを防ぐために取り付けた。
アームを大きいモデルにしたためアームを起こした時に衝撃で土台の部分が壊れてしまうという問題が生じたがは補強パーツを取り付け解決した。
まず以下のように定義した。
#define shikiichi 45 //閾値45 #define HIPOWER 7 //ハイパワーを7と定義 #define LOWPOWER 1 //ローパワーを1と定義 #define set_power_H SetPower(OUT_ABC,HIPOWER); #define set_power_L SetPower(OUT_ABC,LOWPOWER); #define mae set_power_H;OnRev(OUT_AC); //前進する #define hidari set_power_L;OnRev(OUT_C);Off(OUT_A); //左折する #define migi set_power_L;OnRev(OUT_A); Off(OUT_C); //右折する #define hidarisennkai set_power_L;OnFwd(OUT_A); OnRev(OUT_C); //左旋回する #define migisennkai set_power_L;OnRev(OUT_A); OnFwd(OUT_C); //右旋回する #define go(s) OnRev(OUT_AC);Wait(s);Off(OUT_AC); //s秒前進する #define tomaru Off(OUT_AC);Wait(100); //交差点で1秒止まる #define back(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒後退する #define turnleft(u) OnFwd(OUT_A);OnRev(OUT_C);Wait(u);Off(OUT_AC); //u秒左旋回する #define turnright(v) OnFwd(OUT_C);OnRev(OUT_A);Wait(v);Off(OUT_AC); //v秒右旋回する #define right(w) OnRev(OUT_A);Wait(w);Off(OUT_A); //w秒右折する #define ageru set_power_H;OnRev(OUT_B);Wait(035);Off(OUT_B); //アームを上げる #define sageru set_power_H;OnFwd(OUT_B);Wait(010);Off(OUT_B); //アームを下げる
ライントレースをスムーズに行うため前進するときはハイパワー、左右に行くときはローパワーにした。
ラインの左側を走行するようにした。
白ー右旋回
白っぽいー右折
中間ー直進
黒っぽいー左折
黒ー左旋回
の五段階にすることでスムーズなライントレースを実現。
1つのプログラムでは対応しきれない部分があったのでサブルーチンを3つ作成した。
sub line() { SetSensor(SENSOR_1, SENSOR_LIGHT); ClearTimer(0); while (FastTimer(0)<=028) { //タイマーが0.28になったら止まる if (SENSOR_1 < shikiichi -3) //閾値が42以下の時 { hidarisennkai; //左旋回する } else if (SENSOR_1 < shikiichi -1 ) //閾値が44以下の時 { hidari; //左折する ClearTimer(0); //タイマーを0にする } else if (SENSOR_1 < shikiichi+2 ) //閾値が47以下の時 { mae; //前進する ClearTimer(0); //タイマーを0にする } else if (SENSOR_1 < shikiichi+4 ) //閾値が49以下の時 { migi; //右折する ClearTimer(0); } else //上記の条件以外の時 { migisennkai; //右旋回する ClearTimer(0); } } PlaySound(SOUND_CLICK); //ピッと音を鳴らす Off(OUT_AC); //止まる }
私の場合ラインの左側を走行するためP-Q区間のようにい左折するポイントに浅い角度で進入すると0.28秒以内に左折し終わってしまう。そこで新たにサブルーチンを作成した。
P-Q缶などの半円で黒に侵入しすぎてしまうとFastTimerを短くしているため止まってしまうので右旋回をなくし、白よりを走行するようにした。
sub line_q() { SetSensor(SENSOR_1, SENSOR_LIGHT); ClearTimer(0); while (FastTimer(0)<=024) { //タイマーが0.24になったら止まる if (SENSOR_1 < shikiichi -3) //閾値が41以下の時 { hidarisennkai; //左旋回する } else if (SENSOR_1 < shikiichi -1 ) //閾値が44以下の時 { hidari; //左折する ClearTimer(0); //タイマーを0にする } else if (SENSOR_1 < shikiichi +2 ) //閾値が47以下の時 { mae; //前進する ClearTimer(0); //タイマーを0にする } else if (SENSOR_1 < shikiichi+4 ) //閾値が44以下の時 { migi; //右折する ClearTimer(0); //タイマーを0にする } else //閾値が上記の条件以外の時 { migi; //右折する ClearTimer(0); //タイマーを0にする } } PlaySound(SOUND_CLICK); //ピッと音を鳴らす Off(OUT_AC); //止まる }
ヘアピンカーブでは交差点と判断してしまうので別にプログラミングを作成し、時間による制限で次のプログラムに移るようにした。
sub line_pin() { SetSensor(SENSOR_1, SENSOR_LIGHT); ClearTimer(0); while (FastTimer(0)<=1000) { //10秒たつと次のプログラムに移る if (SENSOR_1 < shikiichi -7) //閾値が38以下の時 { hidarisennkai; //左旋回する } else if (SENSOR_1 < shikiichi -5 ) //閾値が40以下の時 { hidari; //左折する } else if (SENSOR_1< shikiichi-2 ) //閾値が43以下の時 { mae; //前進する } else if (SENSOR_1 < shikiichi +1 )//閾値が46以下の時 { migi; //右折する } else //閾値が上記の条件以外の時 { migisennkai; //右旋回する } } PlaySound(SOUND_CLICK); //ピッと音を鳴らす Off(OUT_AC); //止まる }
あらかじめコップの位置が決まっているのでコップの位置に車体が来るように調節し、アームを下げたり上げたりするだけのプログラムを作成。
コップを確実にキャッチさせるために動作の間は一時停止させ慎重な動きにした。
車体をコップの位置までもっていき、コップをキャッチさせるプログラムは以下のようである。
sub toru() { tomaru; //一時停止 turnleft(080); //左に旋回 sageru; //アームを下げる back(023); //少し下がる tomaru; //一時停止 turnright(080); //右に旋回 tomaru; //一時停止 }
車体を指定された位置までもっていき、コップをリリースするプログラムは以下のようである。
sub hanasu() { turnleft(060); //左に旋回 ageru; //アームを下げる back(035); //少し下がる tomaru; //一時停止 turnright(050); //右に旋回 tomaru; //一時停止 }
task main() { go(200); //C地点を通過 line(); //C-B間 turnleft(020); line(); //B-P間 tomaru; //一時停止 turnleft(035); line_q(); //P-Q間 right(050); line_q(); //Q-R間 turnleft(020); line(); //R-E間 turnleft(025); Off(OUT_AC); line_pin(); //E-F間(ヘアピンカーブ) line(); turnleft(030); line(); //F-S間 tomaru; //一時停止 go(080); toru(); //コップをキャッチ line(); //S-S間 tomaru; //一時停止 right(100); line(); //S-Q間 turnleft(020); line_q(); //Q-R間 go(060); hanasu(); //コップをリリース line(); //R-P間 turnleft(020); line(); //P-B間 turnleft(075); go(230); Off(OUT_AC); Off(OUT_AC); //止まる }
交差点で一時停止後、正しい位置からライントレースを始めるためサブルーチン以外に調節のためのプログラムを追加した。
今回の発表会では画像のようにいギア比を1:1にしてしまい、アームの動きがかなり早くなってしまった。
小回りが利くと考え前輪の幅を短くしたが、長くした方が旋回が低速になりFastTmerの調節がしやすく、やりやすかったと思った。