2019b/Member/Nishi/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
目次
#contents
*課題 [#se26b6b2]
**ルート [#u475520c]
#ref(./2019b-mission2.png,65%);
+ A地点から出発
+ B
+ C (直進)
+ D (一時停止の後、直進)
+ E, F 通過
+ G (一時停止の後、左折)
+ H (一時停止の後、左折)
+ I (ボール or キューボイドをつかんでUターン)
+ H (直進)
+ J (一時停止)
+ A地点に入る(ゴール)
**コース作り [#c443b33e]
- 黒い線をテープで作ると光が反射し、光センサーの感知に影...
- 交差点や曲がり角を示すアルファベットを黒色で太く書いた...
*ロボット [#rdb86612]
**ロボットの説明 [#a82bdc20]
#ref(./IMG_3690.jpg,12%);
今回のロボットにはモーター3つ、超音波センサー、光セン...
#ref(./IMG_3692.jpg,10%);
製作の初期段階では2つのアームに挟む形でボールを掴もう...
#ref(./IMG_3696.jpg,10%);
光センサーは前輪の前に設置されており、ラインを識別する...
**ロボットの特徴 [#nf54064f]
***ロボットが転倒しにくいようした [#qeddd225]
ボールを捉えるための囲いを下ろすと、前側に使用するパー...
***光センサーをなるべく下に近づけた [#q8d721ad]
光センサーが紙面から離れていると、白と黒での明るさの値...
*プログラム [#za36c1d9]
**プログラム全体 [#b511c31e]
#define WHITE 54 // 白色
#define GWHITE 48 // 白灰色
#define GBLACK 44 // 黒灰色
#define BLACK 34 // 黒色
#define SPEED_H 45 // ハイスピード
#define SPEED 35 // ノーマルスピード
#define SPEED_L 25 // ロースピード
#define STEP 1
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go OnFwdSync(OUT_BC,SPEED_H,0); //...
#define gofwd OnFwdSync(OUT_BC,SPEED_L,0); //...
#define left_rotation_s OnRL(SPEED,-SPEED); //...
#define left_rotation OnRL(SPEED_L,-SPEED_L); //...
#define turn_left Off(OUT_C);OnFwd(OUT_B,SPEED); //...
#define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED); //...
#define right_rotation OnRL(-SPEED_L,SPEED_L); //...
float GetAngle(float d)
{
const float diameter = 5.45;
const float pi=3.1415;
const float distance=12.5;
float ang = (distance*d)/diameter;
return ang;
}
void u_turn()
{
int angle = GetAngle(90.0);
RotateMotorEx(OUT_BC,SPEED,angle,100,true,true);
}
void back(long b)
{
RotateMotorEx(OUT_BC,-SPEED,b,0,true,true);
}
void follow_line()
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 200){
if(SENSOR_3 <= BLACK){
left_rotation
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
t0 = CurrentTick();
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
t0 = CurrentTick();
}else if(WHITE <= SENSOR_3){
right_rotation
t0 = CurrentTick();
}
Wait(STEP);
}
Off(OUT_BC);
}
void follow_line_for_intersection(long t)
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < t){
if(SENSOR_3 <= BLACK){
left_rotation_s
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
}else if(WHITE <= SENSOR_3){
right_rotation
}
Wait(STEP);
}
Off(OUT_BC);
}
void fetch_ball()
{
SetSensorLowspeed(S1);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 100){
if(SensorUS(S1) <= 10){
RotateMotor(OUT_A,-SPEED,70);
}else{
gofwd
t0=CurrentTick();
}
}
Off(OUT_BC);
}
task main()
{
RotateMotorEx(OUT_BC,SPEED_H,180,0,true,true);
follow_line();
Wait(1000);
RotateMotor(OUT_C,SPEED,60);
follow_line();
Wait(1000);
follow_line_for_intersection(2000);
follow_line();
Wait(1000);
follow_line_for_intersection(1000);
back(120);
fetch_ball();
u_turn();
follow_line_for_intersection(15000);
follow_line();
Wait(1000);
turn_right
Wait(200);
Off(OUT_BC);
go
Wait(1000);
Off(OUT_BC);
}
**プログラムの説明(定義,関数など) [#l67fe0b2]
***定義 [#rb11c2e0]
#define WHITE 54 // 白色
#define GWHITE 48 // 白灰色
#define GBLACK 44 // 黒灰色
#define BLACK 34 // 黒色
#define SPEED_H 45 // ハイスピード
#define SPEED 35 // ノーマルスピード
#define SPEED_L 25 // ロースピード
#define STEP 1
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go OnFwdSync(OUT_BC,SPEED_H,0); //...
#define gofwd OnFwdSync(OUT_BC,SPEED_L,0); //...
#define left_rotation_s OnRL(SPEED,-SPEED); //...
#define left_rotation OnRL(SPEED_L,-SPEED_L); //...
#define turn_left Off(OUT_C);OnFwd(OUT_B,SPEED); //...
#define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED); //...
#define right_rotation OnRL(-SPEED_L,SPEED_L); //...
今回は曲がり方に種類があり、値の範囲指定をするプログラ...
直進のプログラムを定義するとき、OnFwd, RotateMotor(Ex)...
***Uターン [#y0c1f6da]
float GetAngle(float d)
{
const float diameter = 5.45;
const float pi=3.1415;
const float distance=12.5;
float ang = (distance*d)/diameter;
return ang;
}
void u_turn()
{
int angle = GetAngle(90.0);
RotateMotorEx(OUT_BC,SPEED,angle,100,true,true);
}
方向転換したい角度からタイヤの回転角度を計算し、Uターン...
***後退 [#me0d75b4]
void back(long b)
{
RotateMotorEx(OUT_BC,-SPEED,b,0,true,true);
}
タイヤの回転角度を入力し、その分真っ直ぐ後退する。
***ライントレース(交差点感知)[#xfba2e64]
void follow_line()
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 200){
if(SENSOR_3 <= BLACK){
left_rotation
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
t0 = CurrentTick();
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
t0 = CurrentTick();
}else if(WHITE <= SENSOR_3){
right_rotation
t0 = CurrentTick();
}
Wait(STEP);
}
Off(OUT_BC);
}
ラインの左縁を進み、交差点を感知したときに停止する。交...
今回、黒と判定する値の幅が狭いと交差点と認識せず左折し...
***ライントレース(交差点無視) [#l899b8be]
void follow_line_for_intersection(long t)
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < t){
if(SENSOR_3 <= BLACK){
left_rotation_s
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
}else if(WHITE <= SENSOR_3){
right_rotation
}
Wait(STEP);
}
Off(OUT_BC);
}
時間を入力し、その間は光センサーが黒色を長時間感知して...
***アーム [#p87fb86b]
void fetch_ball()
{
SetSensorLowspeed(S1);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 100){
if(SensorUS(S1) <= 10){
RotateMotor(OUT_A,-SPEED,70);
}else{
gofwd
t0=CurrentTick();
}
}
Off(OUT_BC);
}
前進し、超音波センサーでボールがあることによる距離の変...
**プログラムの説明(task main) [#b0475cf3]
***区間A-B-C-D [#x98df0b4]
RotateMotorEx(OUT_BC,SPEED_H,180,0,true,true);
follow_line();
Wait(1000);
最初に直進してAの枠から出た後、ライントレースを開始する...
***区間D-E-F-G [#g950ca41]
RotateMotor(OUT_C,SPEED,60);
follow_line();
Wait(1000);
Dの交差点で一時停止するとき、プログラム上若干左を向くた...
***区間G-H [#r1a883f2]
follow_line_for_intersection(2000);
follow_line();
Wait(1000);
Gの交差点で一時停止した後、交差点を感知するライントレー...
***区間H-I [#l27a81cf]
follow_line_for_intersection(1000);
back(120);
fetch_ball();
u_turn();
Hの交差点から少しライントレースをし、まずは直線HIとロボ...
***区間I-H-J [#b4c1829c]
follow_line_for_intersection(15000);
follow_line();
Wait(1000);
ボールを捉えた状態のまま、ライントレースを再開する。H-J...
***区間J-A [#q16fa85f]
turn_right
Wait(200);
Off(OUT_BC);
go
Wait(1000);
Off(OUT_BC);
Dの交差点のときと同様にJ地点では少々左を向いているため...
*反省・改善点 [#q8bbd59a]
**ロボット面 [#g9ab0578]
- すぐに分解しにくい構造で持ち運びがしづらかった。
**プログラム面 [#o7c28231]
- 最初にアームの位置を正すプログラムを設定するべきだった...
- モーターのスピードを光センサーの値と比例させれば、スム...
*まとめ [#e6fc06cb]
今回は前回の反省を活かし、改行やスラッシュを使ってプロ...
終了行:
[[2019b/Member]]
目次
#contents
*課題 [#se26b6b2]
**ルート [#u475520c]
#ref(./2019b-mission2.png,65%);
+ A地点から出発
+ B
+ C (直進)
+ D (一時停止の後、直進)
+ E, F 通過
+ G (一時停止の後、左折)
+ H (一時停止の後、左折)
+ I (ボール or キューボイドをつかんでUターン)
+ H (直進)
+ J (一時停止)
+ A地点に入る(ゴール)
**コース作り [#c443b33e]
- 黒い線をテープで作ると光が反射し、光センサーの感知に影...
- 交差点や曲がり角を示すアルファベットを黒色で太く書いた...
*ロボット [#rdb86612]
**ロボットの説明 [#a82bdc20]
#ref(./IMG_3690.jpg,12%);
今回のロボットにはモーター3つ、超音波センサー、光セン...
#ref(./IMG_3692.jpg,10%);
製作の初期段階では2つのアームに挟む形でボールを掴もう...
#ref(./IMG_3696.jpg,10%);
光センサーは前輪の前に設置されており、ラインを識別する...
**ロボットの特徴 [#nf54064f]
***ロボットが転倒しにくいようした [#qeddd225]
ボールを捉えるための囲いを下ろすと、前側に使用するパー...
***光センサーをなるべく下に近づけた [#q8d721ad]
光センサーが紙面から離れていると、白と黒での明るさの値...
*プログラム [#za36c1d9]
**プログラム全体 [#b511c31e]
#define WHITE 54 // 白色
#define GWHITE 48 // 白灰色
#define GBLACK 44 // 黒灰色
#define BLACK 34 // 黒色
#define SPEED_H 45 // ハイスピード
#define SPEED 35 // ノーマルスピード
#define SPEED_L 25 // ロースピード
#define STEP 1
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go OnFwdSync(OUT_BC,SPEED_H,0); //...
#define gofwd OnFwdSync(OUT_BC,SPEED_L,0); //...
#define left_rotation_s OnRL(SPEED,-SPEED); //...
#define left_rotation OnRL(SPEED_L,-SPEED_L); //...
#define turn_left Off(OUT_C);OnFwd(OUT_B,SPEED); //...
#define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED); //...
#define right_rotation OnRL(-SPEED_L,SPEED_L); //...
float GetAngle(float d)
{
const float diameter = 5.45;
const float pi=3.1415;
const float distance=12.5;
float ang = (distance*d)/diameter;
return ang;
}
void u_turn()
{
int angle = GetAngle(90.0);
RotateMotorEx(OUT_BC,SPEED,angle,100,true,true);
}
void back(long b)
{
RotateMotorEx(OUT_BC,-SPEED,b,0,true,true);
}
void follow_line()
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 200){
if(SENSOR_3 <= BLACK){
left_rotation
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
t0 = CurrentTick();
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
t0 = CurrentTick();
}else if(WHITE <= SENSOR_3){
right_rotation
t0 = CurrentTick();
}
Wait(STEP);
}
Off(OUT_BC);
}
void follow_line_for_intersection(long t)
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < t){
if(SENSOR_3 <= BLACK){
left_rotation_s
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
}else if(WHITE <= SENSOR_3){
right_rotation
}
Wait(STEP);
}
Off(OUT_BC);
}
void fetch_ball()
{
SetSensorLowspeed(S1);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 100){
if(SensorUS(S1) <= 10){
RotateMotor(OUT_A,-SPEED,70);
}else{
gofwd
t0=CurrentTick();
}
}
Off(OUT_BC);
}
task main()
{
RotateMotorEx(OUT_BC,SPEED_H,180,0,true,true);
follow_line();
Wait(1000);
RotateMotor(OUT_C,SPEED,60);
follow_line();
Wait(1000);
follow_line_for_intersection(2000);
follow_line();
Wait(1000);
follow_line_for_intersection(1000);
back(120);
fetch_ball();
u_turn();
follow_line_for_intersection(15000);
follow_line();
Wait(1000);
turn_right
Wait(200);
Off(OUT_BC);
go
Wait(1000);
Off(OUT_BC);
}
**プログラムの説明(定義,関数など) [#l67fe0b2]
***定義 [#rb11c2e0]
#define WHITE 54 // 白色
#define GWHITE 48 // 白灰色
#define GBLACK 44 // 黒灰色
#define BLACK 34 // 黒色
#define SPEED_H 45 // ハイスピード
#define SPEED 35 // ノーマルスピード
#define SPEED_L 25 // ロースピード
#define STEP 1
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go OnFwdSync(OUT_BC,SPEED_H,0); //...
#define gofwd OnFwdSync(OUT_BC,SPEED_L,0); //...
#define left_rotation_s OnRL(SPEED,-SPEED); //...
#define left_rotation OnRL(SPEED_L,-SPEED_L); //...
#define turn_left Off(OUT_C);OnFwd(OUT_B,SPEED); //...
#define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED); //...
#define right_rotation OnRL(-SPEED_L,SPEED_L); //...
今回は曲がり方に種類があり、値の範囲指定をするプログラ...
直進のプログラムを定義するとき、OnFwd, RotateMotor(Ex)...
***Uターン [#y0c1f6da]
float GetAngle(float d)
{
const float diameter = 5.45;
const float pi=3.1415;
const float distance=12.5;
float ang = (distance*d)/diameter;
return ang;
}
void u_turn()
{
int angle = GetAngle(90.0);
RotateMotorEx(OUT_BC,SPEED,angle,100,true,true);
}
方向転換したい角度からタイヤの回転角度を計算し、Uターン...
***後退 [#me0d75b4]
void back(long b)
{
RotateMotorEx(OUT_BC,-SPEED,b,0,true,true);
}
タイヤの回転角度を入力し、その分真っ直ぐ後退する。
***ライントレース(交差点感知)[#xfba2e64]
void follow_line()
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 200){
if(SENSOR_3 <= BLACK){
left_rotation
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
t0 = CurrentTick();
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
t0 = CurrentTick();
}else if(WHITE <= SENSOR_3){
right_rotation
t0 = CurrentTick();
}
Wait(STEP);
}
Off(OUT_BC);
}
ラインの左縁を進み、交差点を感知したときに停止する。交...
今回、黒と判定する値の幅が狭いと交差点と認識せず左折し...
***ライントレース(交差点無視) [#l899b8be]
void follow_line_for_intersection(long t)
{
SetSensorLight(S3);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < t){
if(SENSOR_3 <= BLACK){
left_rotation_s
}else if((BLACK < SENSOR_3) && (SENSOR_3 < GBLAC...
turn_left
}else if((GBLACK <= SENSOR_3) && (SENSOR_3 <= GW...
go
}else if((GWHITE < SENSOR_3) && (SENSOR_3 < WHIT...
turn_right
}else if(WHITE <= SENSOR_3){
right_rotation
}
Wait(STEP);
}
Off(OUT_BC);
}
時間を入力し、その間は光センサーが黒色を長時間感知して...
***アーム [#p87fb86b]
void fetch_ball()
{
SetSensorLowspeed(S1);
long t0;
t0 = CurrentTick();
while(CurrentTick()-t0 < 100){
if(SensorUS(S1) <= 10){
RotateMotor(OUT_A,-SPEED,70);
}else{
gofwd
t0=CurrentTick();
}
}
Off(OUT_BC);
}
前進し、超音波センサーでボールがあることによる距離の変...
**プログラムの説明(task main) [#b0475cf3]
***区間A-B-C-D [#x98df0b4]
RotateMotorEx(OUT_BC,SPEED_H,180,0,true,true);
follow_line();
Wait(1000);
最初に直進してAの枠から出た後、ライントレースを開始する...
***区間D-E-F-G [#g950ca41]
RotateMotor(OUT_C,SPEED,60);
follow_line();
Wait(1000);
Dの交差点で一時停止するとき、プログラム上若干左を向くた...
***区間G-H [#r1a883f2]
follow_line_for_intersection(2000);
follow_line();
Wait(1000);
Gの交差点で一時停止した後、交差点を感知するライントレー...
***区間H-I [#l27a81cf]
follow_line_for_intersection(1000);
back(120);
fetch_ball();
u_turn();
Hの交差点から少しライントレースをし、まずは直線HIとロボ...
***区間I-H-J [#b4c1829c]
follow_line_for_intersection(15000);
follow_line();
Wait(1000);
ボールを捉えた状態のまま、ライントレースを再開する。H-J...
***区間J-A [#q16fa85f]
turn_right
Wait(200);
Off(OUT_BC);
go
Wait(1000);
Off(OUT_BC);
Dの交差点のときと同様にJ地点では少々左を向いているため...
*反省・改善点 [#q8bbd59a]
**ロボット面 [#g9ab0578]
- すぐに分解しにくい構造で持ち運びがしづらかった。
**プログラム面 [#o7c28231]
- 最初にアームの位置を正すプログラムを設定するべきだった...
- モーターのスピードを光センサーの値と比例させれば、スム...
*まとめ [#e6fc06cb]
今回は前回の反省を活かし、改行やスラッシュを使ってプロ...
ページ名: