- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015a/Member]]
#contents
*ロボット本体の説明 [#mad047d8]
**ロボットの紹介 [#e6b27aac]
-全体像…アームを左右二本ずつにすることでよりボールを離しにくくした。
また、1つのモーターで左右のアームを動かすことが出来る。
#ref(./gbgfbd.jpg)
-裏側から見た写真…センサーをできるだけ本体の中心に近づけることで、より小回りがよくなるようにした。
#ref(./grgwerfw.jpg)
**アーム部分とセンサー部分 [#s2ec782d]
#ref(./htergref.jpg)
*本体の制作において [#nb07a091]
**工夫した点 [#cda40afd]
-できる限りセンサーをロボットの中心に近づけることで小回りをよくした点
-1つのモーターで左右のアームを同時に操作できる構造のアームを作った点
**反省点 [#nbea7ffe]
-アーム部分がボールに前にあるボールに当たり、ボールをうまく掴むことができなかったため、ボールを線の外に配置せざるを得なかった点
*プログラムの説明 [#p47e8be0]
**ルートとボールの配置 [#y9bba3d6]
#ref(./unnamed.jpg)
**プログラム紹介 [#n5c6116b]
#define gostr OnFwd(OUT_A+OUT_C);
#define goback OnRev(OUT_A+OUT_C);
#define gori OnFwd(OUT_A); OnRev(OUT_C);
#define gole OnFwd(OUT_C); OnRev(OUT_A);
#define THRESHOLD 40
#define runtimeone 95
#define armtimer 200
#define STEP 300
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
gostr;
ClearTimer(0);
ClearTimer(1);
while(Timer(0) < runtimeone)
{
if(SENSOR_1 < THRESHOLD)
{
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}
else
{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* 一回目の交差点で停止 */
Off(OUT_A+OUT_C);
Wait(STEP);
gostr;
Wait(30);
Off(OUT_A+OUT_C);
while(Timer(1) < armtimer)
{
if(SENSOR_1 < THRESHOLD)
{
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}
else
{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
Off(OUT_A+OUT_C);
/* ボールを掴む動作 */
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
gostr;
Wait(30);
Off(OUT_A+OUT_C);
OnFwd(OUT_B);
Wait(10);
Off(OUT_B);
goback(OUT_A+OUT_C);
Wait(40);
Off(OUT_A+OUT_C);
Wait(30);
ClearTimer(0);
while(Timer(0) < 100)
{
if(SENSOR_1 < THRESHOLD)
{
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}
else
{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* 二回目の交差点で停止 */
Off(OUT_A+OUT_C);
Wait(STEP);
gostr;
Wait(30);
Off(OUT_A+OUT_C);
ClearTimer(0);
while(Timer(0) < 190)
{
if(SENSOR_1 < THRESHOLD)
{
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}
else
{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* シュート*/
Off(OUT_A+OUT_C);
Wait(30);
gostr;
Wait(100);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
goback;
Wait(100);
Off(OUT_A+OUT_C);;
}
/* 数字及びしきい値、動作時間を設定する */
#define gostr OnFwd(OUT_A+OUT_C);
#define goback OnRev(OUT_A+OUT_C);
#define gori OnFwd(OUT_A); OnRev(OUT_C);
#define gole OnFwd(OUT_C); OnRev(OUT_A);
#define THRESHOLD 40
#define runtimeone 95
#define armtimer 200
#define STEP 300
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
gostr;
ClearTimer(0);
ClearTimer(1);
/* 黒の部分と白い部分の境界をトレースする */
while(Timer(0) < runtimeone){
if(SENSOR_1 < THRESHOLD){
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}else{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* 一回目の交差点で停止 */
Off(OUT_A+OUT_C);
Wait(STEP);
gostr;
Wait(30);
Off(OUT_A+OUT_C);
/* 黒の部分と白い部分の境界をトレースする */
while(Timer(1) < armtimer){
if(SENSOR_1 < THRESHOLD){
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}else{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* ボールを掴む動作 */
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
gostr;
Wait(30);
Off(OUT_A+OUT_C);
OnFwd(OUT_B);
Wait(10);
Off(OUT_B);
goback(OUT_A+OUT_C);
Wait(40);
Off(OUT_A+OUT_C);
Wait(30);
ClearTimer(0);
/* 黒の部分と白い部分の境界をトレースする */
while(Timer(0) < 100){
if(SENSOR_1 < THRESHOLD){
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}else{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* 二回目の交差点で停止 */
Off(OUT_A+OUT_C);
Wait(STEP);
gostr;
Wait(30);
Off(OUT_A+OUT_C);
ClearTimer(0);
/* 黒の部分と白い部分の境界をトレースする */
while(Timer(0) < 190){
if(SENSOR_1 < THRESHOLD){
gori;
until(SENSOR_1 > THRESHOLD);
gostr;
}else{
gole;
until(SENSOR_1 < THRESHOLD);
gostr;
}
}
/* ボールをシュートする */
Off(OUT_A+OUT_C);
Wait(30);
gostr;
Wait(100);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
goback;
Wait(100);
Off(OUT_A+OUT_C);;
}
*プログラムの制作において [#f02621ba]
**工夫した点 [#jae10a02]
**反省点 [#je989337]
-交差点をうまく認識させることができず、すべて時間に選る制御に頼ってしまった点
-プログラムを綺麗にまとめることができず、長大化してしまった点
*実際の動作と感想 [#q9162f10]