実践ロボットプログラミング LEGO Mindstorms EV3 で目指せロボコン! WEB:http://www.robot-programming.jp/ 著者:藤吉弘亘, 藤井隆司, 鈴木裕利, 石井成郎 E-mail:support@robot-programming.jp
10: ディスプレイ表示 (p.95〜) 2
ディスプレイの座標 x 177 MINDSTORMS y 127 テキスト表示 x 127 y (50,20) 40 177 図形表示 3
超音波センサの値を表示 超音波センサの値を液晶ディスプレイに表示 デバッグに重要 4
超音波センサの値を表示(PAD) (p.96) 超音波センサの値を読み取り、テキストをディスプレイに表示 MINDSTORMS 1 2 3 距離の読み取り 2 超音波センサ ディスプレイ表示 1 無限ループ テキストを表示 3 177 127 x y テキスト座標 MINDSTORMS 5
超音波センサの値を表示 (p.97 display_text.c) #include "./jissenPBL.h" int main() { int dist=0; char sensval[64]; LcdInit(); LcdSelectFont(2); LcdRefresh(); initSensor(); ButtonLedInit(); //use button setSensorPort(CH_4,USONIC,0); startSensor(); while(true){ dist=getSensor(CH_4); sprintf(sensval,"%4d",dist); LcdText(1,50,50,sensval); LcdText(1,120,50,"mm"); Wait(100); if(ButtonPressed(BTN1))break; //Stop Program } closeSensor(); sprint()とは? 書式指定変換した出力を文字列に格納 整数型変数distの値を4桁の整数として 文字変数sensvalに格納する 1 2 3 6
図形の繰り返し表示(PAD) (p.98) 図形1と図形2を繰り返しにディスプレイに表示 1 2 3 4 5 6 7 x y 図形の表示 無限ループ 1 画像を1秒表示 2 3 ディスプレイのクリア 4 図形を1秒表示 5 6 ディスプレイのクリア 7 177 127 x y (50,20) 40 CircleOut(50,20,40); 7
図形の表示 (p.99 display_fig.c) #include "./jissenPBL.h" int main() { LcdInit(); LcdRefresh(); ButtonLedInit(); //use button while(true){ LcdBmpFile(1,0,0,”/home/root/lms2012/prjs/Angry.rgf”); Wait(1000); LcdClearDisplay(); CircleOut(50,20,40); //(x,y,r) if(ButtonPressed(BTN1))break; //Stop Program } 1 2 3 4 5 6 7 8
■課題 障害物までの距離が小さくなるほど大きくなる円を表示 127 (89,64) r y x 177 9
■並列タスク (p.107〜) 10
→ライントレースと障害物回避を同時に行うには並列タスクを利用 シングルタスク シングルタスクと並列タスク →ライントレースと障害物回避を同時に行うには並列タスクを利用 11
PADによる並列タスクの図示 (p.110) 1 2 5 1 3 4 6 7 10 9 2 右旋回 無限ループ 反射光 > 40 ライントレースプログラムを起動 障害物回避プログラムを起動 2 True 右旋回 5 1 ライントレース 無限ループ 3 反射光 > 40 4 左旋回 6 False 障害物との距離が 30cm以下 超音波センサによる障害物回避 7 10 無限ループ 45度右旋回 9 True False 2 12
並列タスクにおける問題 (p.110) 命令の衝突(コンフリクト) タスクAがタスクBの実行を妨害 同時にモータを制御 タスクB:後退 モータBCを順方向に回転 タスクB:後退 モータBCを逆方向に回転 どっちを実行すればいいの? 13
セマフォ(信号灯) 14
セマフォ(信号灯) 15
セマフォ(信号灯) 16
セマフォ(信号灯) 17
セマフォによるコンフリクトの回避 18