2019b/Member/ameame/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
#contents
*課題3 ボール運び [#d6beec22]
コースやルールは[[こちらのページ>2019b/Mission3]]にある.~
4人で1つの課題に挑んだ.グループは3N4Nである.
*成果 [#z4b650fd]
基礎点0点,技術点の平均14点で合計点14点であり,順位は3位...
*ロボットについて [#r7c8b892]
2つのロボットを作った.
**ロボット? [#k0543428]
#ref(3-ロボ1.jpeg)
ボールを缶ごとコースの真ん中まで運んでくるロボット.モー...
**ロボット? [#h9d0d78d]
#ref(3-ロボ2.jpeg)
缶の上に乗ったボールを集め,缶の上に置くロボット.モータ...
#ref(manzi.jpeg)
写真の卍の形をしたパーツの左下の部分にアルミ缶がはまり,...
#ref(ギヤ.jpeg)
モーターから卍の形をしたパーツへは写真のようにギヤを組み...
#ref(touchLight.jpeg)
光センサで缶の接近を感知する仕組みは写真のようになってい...
*プログラムについて [#s4279a79]
私の班では4人それぞれプログラムを作り,動かして,1番うま...
**ロボット?のプログラム [#cc7f68a8]
#define TIME1 130 //この時間を超えて黒の部分に...
#define SPEED 50 //ロボットのベースとなる速さ
#define centor 40 //白と黒の境目の光センサの値
const float diameter=5.5; //タイヤの直径
const float distance=12.5; //タイヤ間の距離
const float pi=3.14; //円周率
#define limit 40 //ライントレース時の速さの制限
#define CONN 1 //通信するNXTの番号
#define SIGNALON 11 //通信先のNXTを動かすための...
float CmToDeg(int cm)
{
int Tiredeg=360*cm/(diameter*pi);
return Tiredeg;
}
float DegToDeg(int deg)
{
int TireDeg=deg*distance/diameter;
return TireDeg;
}
void change_line(int curve){
while(SENSOR_4>centor-10){
OnRev(OUT_B,50*(-curve/abs(curve)));
OnFwd(OUT_C,50*(-curve/abs(curve)));
}
}
void crossroad(int d,int t)
{
if(d>0){RotateMotorEx(OUT_BC,20,DegToDeg(d),100,true...
if(d<0){RotateMotorEx(OUT_BC,20,DegToDeg(-d),-100,tr...
OnFwd(OUT_BC,40);
Wait(t);
Off(OUT_BC);
}
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_4-centor);
int vb=(SPEED-a)/(slowdown/10);
int vc=(SPEED+a)/(slowdown/10);
if(vb>limit){vb=limit;}
if(vc>limit){vc=limit;}
if(vb<-limit){vb=-limit;}
if(vc<-limit){vc=-limit;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_4>centor-5 || CurrentTick()-t0<tmin){t...
}
Off(OUT_BC);
}
task main()
{
SetSensorLight(S4);
follow_linePlus(100,20,2000,10000);
crossroad(10,0);
RotateMotor(OUT_C,30,2*DegToDeg(85));
RotateMotor(OUT_A,30,50);
follow_linePlus(100,20,100,10000);
crossroad(10,100);
follow_linePlus(100,20,10,10000);
crossroad(-20,0);
follow_linePlus(100,20,2000,2000);
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true);
RotateMotor(OUT_A,-40,49);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON);
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true);
}
**ロボット?のプログラム [#yd621489]
#define TIME1 130 //この時間を超えて黒の部分に...
#define SPEED 50 //ロボットのベースとなる速さ
#define centor 40 //白と黒の境目の光センサの値
const float diameter=5.5; //タイヤの直径
const float distance=12.5; //タイヤ間の距離
const float pi=3.14; //円周率
#define limit 40 //ライントレース時の速さの制限
#define SIGNALON 11 //通信先のNXTを動かすための...
float CmToDeg(int cm)
{
int TireDeg=(360*cm)/(diameter*pi);
return TireDeg;
}
float DegToDeg(int deg)
{
int Tiredeg=deg*distance/diameter;
return Tiredeg;
}
void change_line(int curve)
{
while(SENSOR_2>centor-10){
OnRev(OUT_B,50*(-curve/abs(curve)));
OnFwd(OUT_C,50*(-curve/abs(curve)));
}
}
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_2-centor);
int vb=(SPEED-a)/(slowdown/10);
int vc=(SPEED+a)/(slowdown/10);
if(vb>limit){vb=limit;}
if(vc>limit){vc=limit;}
if(vb<-limit){vb=-limit;}
if(vc<-limit){vc=-limit;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_2>centor-5 || CurrentTick()-t0<tmin){t...
}
}
void fetch_ball(int CURVE,int SLOWDOWN)
{
int c=0;
while(c<3){
while(SensorUS(S3)>6){
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,30,CmToDeg(6),0,true,true);
RotateMotor(OUT_A,30,85);
RotateMotor(OUT_B,-30,180);
RotateMotor(OUT_B,30,180);
c=c++;
}
RotateMotorEx(OUT_BC,-40,DegToDeg(180),100,true,true);
}
void find_can(int deg)
{
long tacho_min=0;
int d_min=300;
RotateMotorEx(OUT_BC,20,DegToDeg(deg)/2,100,true,tru...
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC,20,-100);
while(MotorTachoCount(OUT_B)<=DegToDeg(deg)){
if(SensorUS(S3)<d_min&&SensorUS(S3)>10){
d_min=SensorUS(S3);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSync(OUT_BC,20,100);
until(MotorTachoCount(OUT_B)<=tacho_min);
Wait(14);
Off(OUT_BC);
}
void put_ball(int tmax)
{
long T0=CurrentTick();
OnFwdSync(OUT_BC,20,0);
until(SENSOR_2<35||CurrentTick()-T0>tmax);
Off(OUT_BC);
long T=CurrentTick()-T0;
RotateMotor(OUT_A,20,87);
OnRevSync(OUT_BC,20,0);
Wait(T);
Off(OUT_BC);
}
task main()
{
SetSensorLight(S2);
SetSensorLowspeed(S3);
follow_linePlus(-100,20,6000,6000);
change_line(50);
int msg;
while(msg!=SIGNALON){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
fetch_ball(100,20);
change_line(-50);
follow_linePlus(-100,20,0,10000);
find_can(60);
put_ball(5000);
RotateMotorEx(OUT_BC,40,DegToDeg(90),-100,true,true);
find_can(60);
put_ball(5000);
}
**関数の説明 [#jb848e96]
??に共通の関数について説明する.
***CmToDeg [#gfe0d885]
float CmToDeg(int cm)
{
int TireDeg=(360*cm)/(diameter*pi);
return TireDeg;
}
進みたい距離(cm)からタイヤの回転角度を計算する関数.
***DegToDeg [#c1982aee]
float DegToDeg(int deg)
{
int TireDeg=deg*distance/diameter;
return TireDeg;
}
ロボットの回転したい角度からタイヤの回転角度を計算する関...
***change_line [#lc9bbbec]
void change_line(int curve){
while(SENSOR_4>centor-10){
OnRev(OUT_B,50*(-curve/abs(curve)));
OnFwd(OUT_C,50*(-curve/abs(curve)));
}
}
ライントレースの沿う側を変更する関数.センサーがラインの...
引数は1つあり,左から右に移る時は負の値,右から左の時は正...
***follow_line [#z31a8548]
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_1-centor); //光センサの値と...
int vb=(SPEED-a)/(slowdown/10); //モータBの速さ
int vc=(SPEED+a)/(slowdown/10); //モータCの速さ
if(vb>limit){vb=limit;} //モータの速さを...
if(vc>limit){vc=limit;}
if(vb<-limit){vb=-limit;}
if(vc<-limit){vc=-limit;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
SPEED:ロボットのベースとなる速さ~
光センサの値によって左右のモータの速さをそれぞれ-limit〜l...
引数は2種類あり,~
curve:ロボットの曲がりやすさを決める.''値の正負で沿うラ...
slowdown:ロボットを全体的に減速させる.~
***follow_linePlus [#e1c0e49f]
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_2>centor-5 || CurrentTick()-t0<tmin){t...
}
}
ライントレースをする.経過時間がtmin以降で十字路につく,...
引数は4つあり,前2つはfollow_line内の値を決め,後2つは前...
**ロボット?の関数 [#z9f31889]
ロボット?のプログラムにだけ使った関数を説明する.
***crossroad [#s411b092]
void crossroad(int d,int t)
{
if(d>0){RotateMotorEx(OUT_BC,20,DegToDeg(d),100,true...
if(d<0){RotateMotorEx(OUT_BC,20,DegToDeg(-d),-100,tr...
OnFwd(OUT_BC,40);
Wait(t);
Off(OUT_BC);
}
交差点などで停止した後ロボットの位置を調整するのに使う関...
**ロボット?の関数 [#x496d63f]
ロボット?のプログラムにだけ使った関数を説明する.
***fech_ball [#r97ab3b7]
void fetch_ball(int CURVE,int SLOWDOWN)
{
int c=0;
while(c<3){ //以下の動作を3...
while(SensorUS(S3)>6){ //超音波センサの...
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,30,CmToDeg(6),0,true,true); //6cm...
RotateMotor(OUT_A,30,85); //ア...
RotateMotor(OUT_B,-30,180); //ロ...
RotateMotor(OUT_B,30,180); /...
c=c++;
}
RotateMotorEx(OUT_BC,-40,DegToDeg(180),100,true,true...
}
線上に縦一列に並んでいるボールを載せた缶からボールを集め...
***find_can [#o1a2aeb0]
void find_can(int deg)
{
long tacho_min=0; //タイヤの回転角度を記憶...
int d_min=300; //仮の最小値
RotateMotorEx(OUT_BC,20,DegToDeg(deg)/2,100,true,tru...
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC,20,-100); ...
while(MotorTachoCount(OUT_B)<=DegToDeg(deg)){ ...
if(SensorUS(S3)<d_min&&SensorUS(S3)>10){ ...
d_min=SensorUS(S3); ...
tacho_min=MotorTachoCount(OUT_B); ...
}
}
OnFwdSync(OUT_BC,20,100); ...
until(MotorTachoCount(OUT_B)<=tacho_min); ...
Wait(14);
Off(OUT_BC);
}
最も近い缶を探す関数.仕組みは講義内で紹介されたものとほ...
***put_ball [#nff4fbc4]
void put_ball(int tmax)
{
long T0=CurrentTick(); //経過...
OnFwdSync(OUT_BC,20,0); //缶が...
until(SENSOR_2<35||CurrentTick()-T0>tmax); //
Off(OUT_BC);
long T=CurrentTick()-T0; //前進...
RotateMotor(OUT_A,20,87); //ボー...
OnRevSync(OUT_BC,20,0); //前進...
Wait(T); //
Off(OUT_BC); //
}
find_canで缶を見つけた後,正面にある缶にボールをのせに行...
**mainプログラムの説明 [#l7036e47]
全体の流れは~
ロボット??起動~
↓~
ロボット?缶を集める,ロボット?I´に移動する.~
↓~
ロボット?缶を集め終わり,缶から離れる~
↓~
ロボット?缶からボールを回収する~
↓~
ロボット?H´に移動する~
↓~
ロボット?缶を探してボールを置く~
となり,具体的な説明はプログラムに直接記載する.
#ref(roats.jpeg)
task main() //ロボット1
{
SetSensorLight(S4);
follow_linePlus(100,20,2000,10000); /...
crossroad(10,0); /...
RotateMotor(OUT_C,30,2*DegToDeg(85)); /...
RotateMotor(OUT_A,30,50); /...
follow_linePlus(100,20,100,10000); /...
crossroad(10,100); /...
follow_linePlus(100,20,10,10000); /...
crossroad(-20,0); /...
follow_linePlus(100,20,2000,2000); /...
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true); /...
RotateMotor(OUT_A,-40,49); /...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON); /...
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true); /...
}
アームは350mlアルミ缶3本分の約200mmあるため,Dで回転する...
task main() //ロボット2
{
SetSensorLight(S2);
SetSensorLowspeed(S3);
follow_linePlus(-100,20,6000,6000); //右...
change_line(50); //左...
int msg;
while(msg!=SIGNALON){ //ロ...
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
fetch_ball(100,20); ...
change_line(-50); ...
follow_linePlus(-100,20,0,10000); ...
find_can(60); ...
put_ball(5000); ...
RotateMotorEx(OUT_BC,40,DegToDeg(90),-100,true,true)...
find_can(60); ...
put_ball(5000); ...
}
ロボット?はコースの中心でボールを回収した後H´に向かいその...
*まとめ [#cf1a0a02]
ロボットに関してはかなり満足のいくものを作ることができた...
自分のプログラムは未完成であった.ロボット?に関してはすべ...
終了行:
[[2019b/Member]]
#contents
*課題3 ボール運び [#d6beec22]
コースやルールは[[こちらのページ>2019b/Mission3]]にある.~
4人で1つの課題に挑んだ.グループは3N4Nである.
*成果 [#z4b650fd]
基礎点0点,技術点の平均14点で合計点14点であり,順位は3位...
*ロボットについて [#r7c8b892]
2つのロボットを作った.
**ロボット? [#k0543428]
#ref(3-ロボ1.jpeg)
ボールを缶ごとコースの真ん中まで運んでくるロボット.モー...
**ロボット? [#h9d0d78d]
#ref(3-ロボ2.jpeg)
缶の上に乗ったボールを集め,缶の上に置くロボット.モータ...
#ref(manzi.jpeg)
写真の卍の形をしたパーツの左下の部分にアルミ缶がはまり,...
#ref(ギヤ.jpeg)
モーターから卍の形をしたパーツへは写真のようにギヤを組み...
#ref(touchLight.jpeg)
光センサで缶の接近を感知する仕組みは写真のようになってい...
*プログラムについて [#s4279a79]
私の班では4人それぞれプログラムを作り,動かして,1番うま...
**ロボット?のプログラム [#cc7f68a8]
#define TIME1 130 //この時間を超えて黒の部分に...
#define SPEED 50 //ロボットのベースとなる速さ
#define centor 40 //白と黒の境目の光センサの値
const float diameter=5.5; //タイヤの直径
const float distance=12.5; //タイヤ間の距離
const float pi=3.14; //円周率
#define limit 40 //ライントレース時の速さの制限
#define CONN 1 //通信するNXTの番号
#define SIGNALON 11 //通信先のNXTを動かすための...
float CmToDeg(int cm)
{
int Tiredeg=360*cm/(diameter*pi);
return Tiredeg;
}
float DegToDeg(int deg)
{
int TireDeg=deg*distance/diameter;
return TireDeg;
}
void change_line(int curve){
while(SENSOR_4>centor-10){
OnRev(OUT_B,50*(-curve/abs(curve)));
OnFwd(OUT_C,50*(-curve/abs(curve)));
}
}
void crossroad(int d,int t)
{
if(d>0){RotateMotorEx(OUT_BC,20,DegToDeg(d),100,true...
if(d<0){RotateMotorEx(OUT_BC,20,DegToDeg(-d),-100,tr...
OnFwd(OUT_BC,40);
Wait(t);
Off(OUT_BC);
}
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_4-centor);
int vb=(SPEED-a)/(slowdown/10);
int vc=(SPEED+a)/(slowdown/10);
if(vb>limit){vb=limit;}
if(vc>limit){vc=limit;}
if(vb<-limit){vb=-limit;}
if(vc<-limit){vc=-limit;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_4>centor-5 || CurrentTick()-t0<tmin){t...
}
Off(OUT_BC);
}
task main()
{
SetSensorLight(S4);
follow_linePlus(100,20,2000,10000);
crossroad(10,0);
RotateMotor(OUT_C,30,2*DegToDeg(85));
RotateMotor(OUT_A,30,50);
follow_linePlus(100,20,100,10000);
crossroad(10,100);
follow_linePlus(100,20,10,10000);
crossroad(-20,0);
follow_linePlus(100,20,2000,2000);
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true);
RotateMotor(OUT_A,-40,49);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON);
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true);
}
**ロボット?のプログラム [#yd621489]
#define TIME1 130 //この時間を超えて黒の部分に...
#define SPEED 50 //ロボットのベースとなる速さ
#define centor 40 //白と黒の境目の光センサの値
const float diameter=5.5; //タイヤの直径
const float distance=12.5; //タイヤ間の距離
const float pi=3.14; //円周率
#define limit 40 //ライントレース時の速さの制限
#define SIGNALON 11 //通信先のNXTを動かすための...
float CmToDeg(int cm)
{
int TireDeg=(360*cm)/(diameter*pi);
return TireDeg;
}
float DegToDeg(int deg)
{
int Tiredeg=deg*distance/diameter;
return Tiredeg;
}
void change_line(int curve)
{
while(SENSOR_2>centor-10){
OnRev(OUT_B,50*(-curve/abs(curve)));
OnFwd(OUT_C,50*(-curve/abs(curve)));
}
}
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_2-centor);
int vb=(SPEED-a)/(slowdown/10);
int vc=(SPEED+a)/(slowdown/10);
if(vb>limit){vb=limit;}
if(vc>limit){vc=limit;}
if(vb<-limit){vb=-limit;}
if(vc<-limit){vc=-limit;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_2>centor-5 || CurrentTick()-t0<tmin){t...
}
}
void fetch_ball(int CURVE,int SLOWDOWN)
{
int c=0;
while(c<3){
while(SensorUS(S3)>6){
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,30,CmToDeg(6),0,true,true);
RotateMotor(OUT_A,30,85);
RotateMotor(OUT_B,-30,180);
RotateMotor(OUT_B,30,180);
c=c++;
}
RotateMotorEx(OUT_BC,-40,DegToDeg(180),100,true,true);
}
void find_can(int deg)
{
long tacho_min=0;
int d_min=300;
RotateMotorEx(OUT_BC,20,DegToDeg(deg)/2,100,true,tru...
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC,20,-100);
while(MotorTachoCount(OUT_B)<=DegToDeg(deg)){
if(SensorUS(S3)<d_min&&SensorUS(S3)>10){
d_min=SensorUS(S3);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSync(OUT_BC,20,100);
until(MotorTachoCount(OUT_B)<=tacho_min);
Wait(14);
Off(OUT_BC);
}
void put_ball(int tmax)
{
long T0=CurrentTick();
OnFwdSync(OUT_BC,20,0);
until(SENSOR_2<35||CurrentTick()-T0>tmax);
Off(OUT_BC);
long T=CurrentTick()-T0;
RotateMotor(OUT_A,20,87);
OnRevSync(OUT_BC,20,0);
Wait(T);
Off(OUT_BC);
}
task main()
{
SetSensorLight(S2);
SetSensorLowspeed(S3);
follow_linePlus(-100,20,6000,6000);
change_line(50);
int msg;
while(msg!=SIGNALON){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
fetch_ball(100,20);
change_line(-50);
follow_linePlus(-100,20,0,10000);
find_can(60);
put_ball(5000);
RotateMotorEx(OUT_BC,40,DegToDeg(90),-100,true,true);
find_can(60);
put_ball(5000);
}
**関数の説明 [#jb848e96]
??に共通の関数について説明する.
***CmToDeg [#gfe0d885]
float CmToDeg(int cm)
{
int TireDeg=(360*cm)/(diameter*pi);
return TireDeg;
}
進みたい距離(cm)からタイヤの回転角度を計算する関数.
***DegToDeg [#c1982aee]
float DegToDeg(int deg)
{
int TireDeg=deg*distance/diameter;
return TireDeg;
}
ロボットの回転したい角度からタイヤの回転角度を計算する関...
***change_line [#lc9bbbec]
void change_line(int curve){
while(SENSOR_4>centor-10){
OnRev(OUT_B,50*(-curve/abs(curve)));
OnFwd(OUT_C,50*(-curve/abs(curve)));
}
}
ライントレースの沿う側を変更する関数.センサーがラインの...
引数は1つあり,左から右に移る時は負の値,右から左の時は正...
***follow_line [#z31a8548]
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_1-centor); //光センサの値と...
int vb=(SPEED-a)/(slowdown/10); //モータBの速さ
int vc=(SPEED+a)/(slowdown/10); //モータCの速さ
if(vb>limit){vb=limit;} //モータの速さを...
if(vc>limit){vc=limit;}
if(vb<-limit){vb=-limit;}
if(vc<-limit){vc=-limit;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
SPEED:ロボットのベースとなる速さ~
光センサの値によって左右のモータの速さをそれぞれ-limit〜l...
引数は2種類あり,~
curve:ロボットの曲がりやすさを決める.''値の正負で沿うラ...
slowdown:ロボットを全体的に減速させる.~
***follow_linePlus [#e1c0e49f]
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_2>centor-5 || CurrentTick()-t0<tmin){t...
}
}
ライントレースをする.経過時間がtmin以降で十字路につく,...
引数は4つあり,前2つはfollow_line内の値を決め,後2つは前...
**ロボット?の関数 [#z9f31889]
ロボット?のプログラムにだけ使った関数を説明する.
***crossroad [#s411b092]
void crossroad(int d,int t)
{
if(d>0){RotateMotorEx(OUT_BC,20,DegToDeg(d),100,true...
if(d<0){RotateMotorEx(OUT_BC,20,DegToDeg(-d),-100,tr...
OnFwd(OUT_BC,40);
Wait(t);
Off(OUT_BC);
}
交差点などで停止した後ロボットの位置を調整するのに使う関...
**ロボット?の関数 [#x496d63f]
ロボット?のプログラムにだけ使った関数を説明する.
***fech_ball [#r97ab3b7]
void fetch_ball(int CURVE,int SLOWDOWN)
{
int c=0;
while(c<3){ //以下の動作を3...
while(SensorUS(S3)>6){ //超音波センサの...
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,30,CmToDeg(6),0,true,true); //6cm...
RotateMotor(OUT_A,30,85); //ア...
RotateMotor(OUT_B,-30,180); //ロ...
RotateMotor(OUT_B,30,180); /...
c=c++;
}
RotateMotorEx(OUT_BC,-40,DegToDeg(180),100,true,true...
}
線上に縦一列に並んでいるボールを載せた缶からボールを集め...
***find_can [#o1a2aeb0]
void find_can(int deg)
{
long tacho_min=0; //タイヤの回転角度を記憶...
int d_min=300; //仮の最小値
RotateMotorEx(OUT_BC,20,DegToDeg(deg)/2,100,true,tru...
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC,20,-100); ...
while(MotorTachoCount(OUT_B)<=DegToDeg(deg)){ ...
if(SensorUS(S3)<d_min&&SensorUS(S3)>10){ ...
d_min=SensorUS(S3); ...
tacho_min=MotorTachoCount(OUT_B); ...
}
}
OnFwdSync(OUT_BC,20,100); ...
until(MotorTachoCount(OUT_B)<=tacho_min); ...
Wait(14);
Off(OUT_BC);
}
最も近い缶を探す関数.仕組みは講義内で紹介されたものとほ...
***put_ball [#nff4fbc4]
void put_ball(int tmax)
{
long T0=CurrentTick(); //経過...
OnFwdSync(OUT_BC,20,0); //缶が...
until(SENSOR_2<35||CurrentTick()-T0>tmax); //
Off(OUT_BC);
long T=CurrentTick()-T0; //前進...
RotateMotor(OUT_A,20,87); //ボー...
OnRevSync(OUT_BC,20,0); //前進...
Wait(T); //
Off(OUT_BC); //
}
find_canで缶を見つけた後,正面にある缶にボールをのせに行...
**mainプログラムの説明 [#l7036e47]
全体の流れは~
ロボット??起動~
↓~
ロボット?缶を集める,ロボット?I´に移動する.~
↓~
ロボット?缶を集め終わり,缶から離れる~
↓~
ロボット?缶からボールを回収する~
↓~
ロボット?H´に移動する~
↓~
ロボット?缶を探してボールを置く~
となり,具体的な説明はプログラムに直接記載する.
#ref(roats.jpeg)
task main() //ロボット1
{
SetSensorLight(S4);
follow_linePlus(100,20,2000,10000); /...
crossroad(10,0); /...
RotateMotor(OUT_C,30,2*DegToDeg(85)); /...
RotateMotor(OUT_A,30,50); /...
follow_linePlus(100,20,100,10000); /...
crossroad(10,100); /...
follow_linePlus(100,20,10,10000); /...
crossroad(-20,0); /...
follow_linePlus(100,20,2000,2000); /...
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true); /...
RotateMotor(OUT_A,-40,49); /...
SendRemoteNumber(CONN,MAILBOX1,SIGNALON); /...
RotateMotorEx(OUT_BC,-40,CmToDeg(20),0,true,true); /...
}
アームは350mlアルミ缶3本分の約200mmあるため,Dで回転する...
task main() //ロボット2
{
SetSensorLight(S2);
SetSensorLowspeed(S3);
follow_linePlus(-100,20,6000,6000); //右...
change_line(50); //左...
int msg;
while(msg!=SIGNALON){ //ロ...
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
fetch_ball(100,20); ...
change_line(-50); ...
follow_linePlus(-100,20,0,10000); ...
find_can(60); ...
put_ball(5000); ...
RotateMotorEx(OUT_BC,40,DegToDeg(90),-100,true,true)...
find_can(60); ...
put_ball(5000); ...
}
ロボット?はコースの中心でボールを回収した後H´に向かいその...
*まとめ [#cf1a0a02]
ロボットに関してはかなり満足のいくものを作ることができた...
自分のプログラムは未完成であった.ロボット?に関してはすべ...
ページ名: