プログラミング入門第5回 ~レゴロボットのプログラミング5~ 情報工学科1年生 2007/5/22 プログラミング入門第5回 ~レゴロボットのプログラミング5~ 湘南工科大学 工学部 情報工学科 高畠俊徳,小林 学 二宮 洋,鈴木 誠 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. legOSとは RCXモジュール用のフリーのOS 余計な動作を省いて、必要最小限の機能を持っている。 フィードバックが速い。 ⇔より細かく記述する必要がある。
1. C言語とは C言語の例 #include<dsensor.h> #include<unistd.h> #include<dmotor.h> #include<conio.h> main() { int akarui=80; ds_active(&SENSOR_2); cputs("GO!!"); while(1){ if(LIGHT_2>=akarui){ motor_a_dir(brake); motor_c_speed(MAX_SPEED); motor_c_dir(fwd); } else{ motor_c_dir(brake); motor_a_speed(MAX_SPEED); motor_a_dir(fwd); C言語の例
1. プログラミングとは?(復習) プログラムを作る≠パソコンに向かって作業する その前にやることがいっぱい 1.テーマを決める LEGOブロックでライン・トレースカーを作ろう!! 2.シナリオを考える どんなライン・トレースカーにするか? 3.シナリオを書く ライン・トレースカーってどうやって動くのか? 4.プログラミング言語に翻訳する 純正ファームウェア,C言語など 5.動かしてみる ライン・トレースカーを走らせる 6.確認する 線を辿って前進している事を確認 7.バージョンアップする もっと早く・複雑に動かすためには? シナリオ?
C言語プログラミングに挑戦! ・準備:C言語を使ったプログラミング ・プログラムの制御構造1 順次 ・プログラムの制御構造2 反復 ・プログラムの制御構造3 条件分岐 図のライントレースカー(基本形) を準備する
「メモ帳」(Notepad)を使って、C言語を入力する 「スタート」→「プログラム」→「アクセサリ」→「メモ帳」を開く ③ ④ ② ①
2. C言語を使ったプログラミング #include<sit.h> main(){ Init(); Zenshin(1.0); Hidari_Turn(1.0); Migi_Turn(1.0); Koutai(1.0); }
2. C言語を使ったプログラミング 「メモ帳」に「半角」で入力 #include<sit.h> main(){ Init(); Zenshin(1.0); Hidari_Turn(1.0); Migi_Turn(1.0); Koutai(1.0); } 「メモ帳」に「半角」で入力 入力が終了したら「名前を付けて保存」する。 「ファイル」→「名前を付けて保存」を選択する。
2. C言語を使ったプログラミング (ファイルの保存) 「保存する場所」は「ローカルディスク(C:)」→「legOS」→「Demo」とする。 ① ② ③ ④
2. C言語を使ったプログラミング (ファイルの保存) 「ファイルの種類」を「すべてのファイル」とする。 「ファイル名」は「sit1.c」とする。 ファイル名を入力したら「保存」ボタンを押す。 ② ③ ①
3. 動かしてみる 純正ファームウェアと異なる点 ↓ C言語はコンパイルという操作が必要 コンパイルしたファイル(コンピュータの理解できるファイル)をロボットへ転送する。 コンパイルする環境を起動 「スタート」→「プログラム」→「Cygnus Solutions」→「Cygwin B20」をクリックしCygwin B20を起動する。 プログラム コンパイル(ビルド) 実行可能ファイル
3. 動かしてみる Cygwin B20
3. 動かしてみる コンパイル ⇒右の画面に次のように入力する。 cd /legOS 2回目以降は次のように 入力する。 ./sit.sh (エラーがでたら、もう一度始めから確かめてやり直す.) ロボットの「Run」ボタンを押す。 前進,左ターン,右ターン,後退することを確認する。
4 プログラミングの基礎 4.1 プログラムの制御構造1:順次 数値の入力に注意! #include<sit.h> 4.1 プログラムの制御構造1:順次 #include<sit.h> main(){ Init(); Zenshin(2.0); Hidari_Turn(0.5); Migi_Turn(0.5); Koutai(2.0); } 数値の入力に注意!
非常に重要 4.1 プログラムの制御構造1:順次(復習) プログラムの基本ルール1: 命令は,一度に一つだけ実行される 命令1 4.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
4.2 プログラムの制御構造2:反復(ループ,リピート) 4.2 プログラムの制御構造2:反復(ループ,リピート) #include<sit.h> main(){ Init(); while(MUGEN){ Zenshin(2.0); Hidari_Turn(0.5); } }
非常に重要 4.2 プログラムの制御構造2:反復(復習) プログラムの基本ルール2(反復): 反復の終わりまで来たら反復の始まりまで戻る. 4.2 プログラムの制御構造2:反復(復習) 非常に重要 #include<sit.h> main(){ Init(); while(MUGEN){ Zenshin(2.0); Hidari_Turn(0.5); } プログラムの基本ルール2(反復): 反復の終わりまで来たら反復の始まりまで戻る. ある終了条件を満たすまで反復は繰り返される. 注:命令が一つずつ実行される のは変わらない 反復の始 反復の終 終了条件が書いてある(ここでは無限回繰り返す) ここでは「前進」→「左ターン」→「前進」→「左ターン」・・・を繰り返す
4.3 プログラムの制御構造3:条件分岐 #include<sit.h> main(){ Init(); 4.3 プログラムの制御構造3:条件分岐 #include<sit.h> main(){ Init(); while(MUGEN){ if(Oshita1){ Hidari_Turn(0.5); } else{ Zenshin(2.0); 図のようにタッチセンサー を1番に取り付ける
非常に重要 4.3 プログラムの制御構造3:条件分岐(復習) 条件が記述されている (センサー1とつながったタッチ 4.3 プログラムの制御構造3:条件分岐(復習) 非常に重要 #include<sit.h> main(){ Init(); while( MUGEN ){ if( Oshita1 ){ Hidari_Turn(0.5); } else{ Zenshin(2.0); } プログラムの基本ルール3(条件分岐): ある条件を満たした場合には,「はい」の方が実行され,満たしていない場合には「いいえ」の方が実行される. 注:一度に実行されるのはどちらか 一方だけ. 条件が記述されている (センサー1とつながったタッチ センサーがおされているか?) 「はい」のとき実行 「いいえ」のとき実行
5. いくつかの例題 次のいくつかの例を実行してみよう(C言語) (注:プログラムを理解しながら作成すること) [例1]数値を変えてロボットの反応を確かめる #include<sit.h> main () { Init(); while (MUGEN) { if (Oshita1) { Hidari_Turn(0.1); } else { Zenshin(0.1); } 時間を0.1秒に
[例2]ライントレースカー(基本形) #include<sit.h> main () { Init(); while (MUGEN) { if (Akarui2) { Hidari_Turn(0.1); } else { Migi_Turn(0.1); }
[例3]ライントレースカー(衝突するとストップ) #include<sit.h> main () { Init(); while (MUGEN) { if (Oshita1) { } else { if ( Akarui2 ) { Hidari_Turn(0.1); } else { Migi_Turn(0.1);
[例4]前方が暗いとバック 2番のライトセンサーが暗いか? #include<sit.h> main() { Init(); 図のようにライトセンサーをつなぐ #include<sit.h> main() { Init(); while (MUGEN) { if (Kurai2) { Koutai(1.0); } else { Zenshin(1.0); } 2番のライトセンサーが暗いか?
[例5]リモコンカー 図のようにタッチセンサーを2つつなぐ #include<sit.h> main() { Init(); while (MUGEN) { if (Oshita1) { if (Oshita3) { Zenshin(0.1); } else { Migi_Turn(0.1); } } else { Hidari_Turn(0.1);
5. 課題 次の課題の車をC言語でプログラミング及び実行しなさい [課題1]1秒前進,0.5秒左ターンを繰り返す [課題2]左ターンを繰り返し、ボタンを押している間だけ前進する [課題3]前進し,衝突したら1秒バックし,右へ障害物をよける [課題4]シートの黒枠より内側を走り続ける(ライントレースではない) [課題5]ライントレースカー(障害物に衝突したら1秒バックし,右へ障害物をよけ,再びもとのラインに戻る) [課題6]タッチセンサー1,3,ライトセンサー2をつける.センサー1だけ押すと左ターン,センサー3だけ押すと右ターン.センサー1,3両方押すと前進.両方押していないときはライントレースする. [課題7]次のページを参照 [課題8]ライントレースカー(前方が暗かったら1秒バックし,右へ障害物をよけ,再びラインに戻る.
[課題7]2つのライトセンサーを使った次の動きをするライントレースカー センサー1 センサー3 センサー接続方法
[課題7]2つのライトセンサーを使った次の動きをするライントレースカー 2つのセンサーが両方とも白の時 2つのセンサーが両方とも黒線上の時 右折 左折 直進 2つのセンサーが境界線をまたいでいる時