プログラミング入門第6回 ~レゴロボットのプログラミング6~ 2007/5/29 プログラミング入門第6回 ~レゴロボットのプログラミング6~ 高畠俊徳,小林 学 二宮 洋,鈴木 誠 toshi@info.shonan-it.ac.jp kobayasi@info.shonan-it.ac.jp ninomiya@center.shonan-it.ac.jp msuzuki@info.shonan-it.ac.jp
1 前回の復習 非常に重要 1.1 プログラムの制御構造1:順次(復習) プログラムの基本ルール1: 命令は,一度に一つだけ実行される 1.1 プログラムの制御構造1:順次(復習) #include<sit.h> main(){ Init(); Zenshin(2.0); Hidari_Turn(0.5); Migi_Turn(0.5); Koutai(2.0); } 非常に重要 プログラムの基本ルール1: 命令は,一度に一つだけ実行される プログラムの基本ルール2: 命令は,一つずつ(下に)順々に実行される 命令1 命令2 命令3 命令4
非常に重要 1.2 プログラムの制御構造2:反復(復習) プログラムの基本ルール2(反復): 反復の終わりまで来たら反復の始まりまで戻る. 1.2 プログラムの制御構造2:反復(復習) 非常に重要 #include<sit.h> main(){ Init(); while(MUGEN){ Zenshin(2.0); Hidari_Turn(0.5); } プログラムの基本ルール2(反復): 反復の終わりまで来たら反復の始まりまで戻る. ある終了条件を満たすまで反復は繰り返される. 注:命令が一つずつ実行される のは変わらない 反復の始 反復の終 終了条件が書いてある(ここでは無限回繰り返す) ここでは「前進」→「左ターン」→「前進」→「左ターン」・・・を繰り返す
非常に重要 1.3 プログラムの制御構造3:条件分岐(復習) 条件が記述されている (センサー1とつながったタッチ 1.3 プログラムの制御構造3:条件分岐(復習) 非常に重要 #include<sit.h> main(){ Init(); while( MUGEN ){ if( Oshita1 ){ Hidari_Turn(0.5); } else{ Zenshin(2.0); } プログラムの基本ルール3(条件分岐): ある条件を満たした場合には,「はい」の方が実行され,満たしていない場合には「いいえ」の方が実行される. 注:一度に実行されるのはどちらか 一方だけ. 条件が記述されている (センサー1とつながったタッチ センサーがおされているか?) 「はい」のとき実行 「いいえ」のとき実行
2 変数を使う 2.1 変数 非常に重要 2.5を入れる 2.5 kazu2 kazu2 変数:数や文字を入れる入れ物 自分で好きな名前を付けられる(半角英数字だけ) 注:、変数を使うときは、始めに宣言が必要 2.1 変数 #include<sit.h> main(){ int kazu1; double kazu2; char mozi; kazu2 = 2.5; Atai_Hyoji(kazu2); } 変数 kazu1 を宣言(整数はint型) 変数 kazu2 を宣言(浮動小数点はdouble型) 変数 mozi を宣言(文字はchar型) kazu2 に2.5を入れる(初期化). 2.5を入れる 2.5 kazu2 kazu2
2.1 変数を使った簡単なストップウォッチ(C言語) ①タッチセンサー1を押し続ける ②時間が計り始められる ③タッチセンサー1を離すと時間が0に戻る
2.1 変数を使った簡単なストップウォッチ(C言語) #include<sit.h> main () { double count1 = 0.0; Init(); while (MUGEN) { Atai_Hyoji( count1 ); if (Oshita1) { Wait(1.0); count1 = count1 + 1.0; } else { count1 = 0.0; } 変数 変数 count1 を宣言(浮動少数点はdouble型)
3. 課題 次の課題の車をC言語でプログラミング及び実行しなさい [課題1]タッチセンサー1が押された回数をディスプレイ表示 [課題2]タッチセンサー1が押された回数をディスプレイに表示し、タッチセンサー3が押されるとその回数が減る [課題3]タッチセンサー1を押すとスタートし、離すとストップするストップウォッチ。タッチセンサー3を押すとゼロに戻る。 [課題4]前進と後退を行うライントレースカー。ただし、タッチセンサー1を押すと前進と後退が入れかわる。次ページを参照。 [課題5]タッチセンサー1を押すとスタートし、もう一度押すとストップするストップウォッチ。 [課題6]自分で考えたストップウォッチ [課題7]自分で考えたライントレースカー [課題8]自分で考えたローヴァーボット
[課題4]前進と後退を行うライントレースカー。ただし、タッチセンサー1を押すと前進と後退が入れかわる。 Back_Hidari_Turn(0.1); Back_Migi_Turn(0.1); 復習(条件式) if ( a == 0) { ・・・ } else { ・・・ }
[課題4]前進と後退を行うライントレースカー。ただし、タッチセンサー1を押すと前進と後退が入れかわる。 ライトセンサー2 タッチセンサー1 ライトセンサー3
0. 前回課題の解答例 [課題1]1秒前進,0.5秒左ターンを繰り返す [課題2]左ターンを繰り返し,ボタンを押している間だけ前進する [解答2] [解答1] #include<sit.h> main () { Init(); while (MUGEN) { if (Oshita1) { Zenshin(0.1); } else { Hidari_Turn(0.1); #include<sit.h> main () { Init(); while (MUGEN) { Zenshin(1.0); Hidari_Turn(0.5); }
0. 課題の解答例 [課題3]前進し,衝突したら1秒バックし,右へ障害物をよける [解答3] #include<sit.h> main () { Init(); while (MUGEN) { if (Oshita1) { Koutai(1.0); Migi_Turn(1.0); } else { Zenshin(0.1);
0. 課題の解答例 [課題4]シートの黒枠より内側を走り続ける(ライントレースではない) [解答4] #include<sit.h> main () { Init(); while (MUGEN) { if (Akarui2) { Zenshin(0.1); } else { Hidari_Turn(1.0);
0. 課題の解答例 [課題5]ライントレースカー(障害物に衝突したら1秒バックし, 右へ障害物をよけ,再びもとのラインに戻る) [解答5] #include<sit.h> main () { Init(); while (MUGEN) { if(Oshita1) { Koutai(1.0); Migi_Turn(1.0); Zenshin(1.0); Hidari_Turn(2.0); } else { if (Akarui2) { Hidari_Turn(0.1); } else { Migi_Turn(0.1); }
0. 課題の解答例 [課題6]タッチセンサー1,3,ライトセンサー2をつける.センサー1だけ押すと左ターン,センサー3だけ押すと右ターン.センサー1,3両方押すと前進.両方押していないときはライントレースする #include<sit.h> main () { Init(); while (MUGEN) { if (Oshita1) { if (Oshita3) { Zenshin(0.1); } else { Hidari_Turn(0.1); } } else { if (Oshita3) { Migi_Turn(0.1); if (Akarui2) { [解答6]
[課題7]2つのライトセンサーを使った次の動きをするライントレースカー [解答7] 左折 直進 右折 #include<sit.h> main () { Init(); while (MUGEN) { if (Akarui1) { Hidari_Turn(0.1); } else { if (Akarui3) { Zenshin(0.1); } else { Migi_Turn(0.1); }
0. 課題の解答例 [課題8]ライントレースカー(前方が暗かったら1秒バックし,右へ障害物をよけ,再びもとのラインに戻る) [解答8] #include<sit.h> main () { Init(); while (MUGEN) { if (Akarui1) { Koutai(1.0); Migi_Turn(1.0); Zenshin(1.0); Hidari_Turn(2.0); } else { if (Akarui2) { Hidari_Turn(0.1); } else { Migi_Turn(0.1); } [解答8]
2.2 スピードを変えるラインとレースカー(C言語) #include<sit.h> void Speed_Setup(int ); main () { int count1 = 0; Init(); while (MUGEN) { Atai_Hyoji( count1 ); Speed_Setup( count1 ); if ( (count1 < 0) || (count1 > 255) ) { count1 = 0; } if (Oshita1) { count1 = count1 + 1; } if (Oshita3) { count1 = count1 - 1; Zenshin(0.1); void Speed_Setup(int value) { if ((value >= 0) && (value <= 255) ) { motor_a_speed( value ); motor_b_speed( value ); motor_c_speed( value ); } else { motor_a_speed( 0 ); motor_b_speed( 0 ); motor_c_speed( 0 ); }