2015a/Member/T.M./Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*初めに [#v593fd56]
今回の課題は空き缶を探したあとにそれに向かってシュートするというもの。
*マシンの説明 [#r9d274e1]
新たに付け足した部分は、アームの上の超音波センサー。
&ref(sensor1.jpg.jpg);
&ref(sensor2.jpg);
少し不格好ではあるが、正面を向いているのでプログラムを組みやすかった。今回も課題2に記したようにコンピュータは固定せず、車体にのせているだけではあるが、特に問題はなかった。
*プログラムの説明 [#x6cc6856]
サンプルプログラムを参考にして、機体の角度を使って空き缶の位置を割り出した。
#define SPEED 50
#define SPEED_SLOW 30
タイヤや円周率のデータを入力する。
const float diameter = 5.45;
const float track = 10.35;
const float pi = 3.1415;
void fwdDist(float d)
{
角度を計算し、angle度まで回転させる。
long angle;
angle = d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, true);
}
ang度時計回りに旋回
void turnAng(long ang)
{
long angle;
angle = track/diameter * ang;
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true, true);
}
ang度の範囲探す。
int searchDirection(long ang)
{
旋回角度からタイヤの回転を計算し、そこまで反時計回りで戻る。
long angle,tacho_min=0, tacho_corr ;
int d_min;
d_min=300;
angle = (track/diameter)*ang;
turnAng(ang/2);
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC,SPEED_SLOW,-100);
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S1)<d_min){
d_min=SensorUS(S1);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
缶の所まで旋回。
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d_min);
Wait(14);
Off(OUT_BC);Wait(500);
return d_min;
}
缶へシュートする。
task main()
{
SetSensorLowspeed(S1);
int d = searchDirection(120);
if (d > 10) {
fwdDist(d-25.0);
OnRev(OUT_A,30);
Wait(400);
Off(OUT_A);
OnFwd(OUT_BC,50);
Wait(400);
}
}
*反省・感想 [#lfead3db]
角度を扱う方式でプログラムを作った。なかなか複雑で難しかったがいい経験になった。
これをうまく使えば一気にプログラムの自由度が増すなと思った。
終了行:
#contents
*初めに [#v593fd56]
今回の課題は空き缶を探したあとにそれに向かってシュートするというもの。
*マシンの説明 [#r9d274e1]
新たに付け足した部分は、アームの上の超音波センサー。
&ref(sensor1.jpg.jpg);
&ref(sensor2.jpg);
少し不格好ではあるが、正面を向いているのでプログラムを組みやすかった。今回も課題2に記したようにコンピュータは固定せず、車体にのせているだけではあるが、特に問題はなかった。
*プログラムの説明 [#x6cc6856]
サンプルプログラムを参考にして、機体の角度を使って空き缶の位置を割り出した。
#define SPEED 50
#define SPEED_SLOW 30
タイヤや円周率のデータを入力する。
const float diameter = 5.45;
const float track = 10.35;
const float pi = 3.1415;
void fwdDist(float d)
{
角度を計算し、angle度まで回転させる。
long angle;
angle = d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, true);
}
ang度時計回りに旋回
void turnAng(long ang)
{
long angle;
angle = track/diameter * ang;
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true, true);
}
ang度の範囲探す。
int searchDirection(long ang)
{
旋回角度からタイヤの回転を計算し、そこまで反時計回りで戻る。
long angle,tacho_min=0, tacho_corr ;
int d_min;
d_min=300;
angle = (track/diameter)*ang;
turnAng(ang/2);
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC,SPEED_SLOW,-100);
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S1)<d_min){
d_min=SensorUS(S1);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
缶の所まで旋回。
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d_min);
Wait(14);
Off(OUT_BC);Wait(500);
return d_min;
}
缶へシュートする。
task main()
{
SetSensorLowspeed(S1);
int d = searchDirection(120);
if (d > 10) {
fwdDist(d-25.0);
OnRev(OUT_A,30);
Wait(400);
Off(OUT_A);
OnFwd(OUT_BC,50);
Wait(400);
}
}
*反省・感想 [#lfead3db]
角度を扱う方式でプログラムを作った。なかなか複雑で難しかったがいい経験になった。
これをうまく使えば一気にプログラムの自由度が増すなと思った。
ページ名: