実践ロボットプログラミング
LEGO Mindstorms EV3 で目指せロボコン！

WEB：http://www.robot-programming.jp/
著者：藤吉弘亘, 藤井隆司, 鈴木裕利, 石井成郎
E-mail：support@robot-programming.jp

1

06: 障害物回避(タッチセンサ) (p.71〜)2タッチセンサの原理

スイッチボタン

タッチセンサの測定原理
スイッチボタンの状態を、押されていないときは”0”、押されたら”1”，離したときに”2”を出力する
3

タッチセンサの接続• EV3の入力ポート１にタッセンサを接続

入力ポート14

タッチセンサによる障害物回避
1. 常にロボットを前進→無限ループの利用

2. タッチセンサによる障害物の衝突を判定
3.

}

→条件分岐

衝突あり：一定時間後退し右旋回．その後1. に戻る
衝突なし：1.に戻る

後退
障害物旋回

5

タッチセンサによる障害物回避のPAD (p.73)• タッチセンサによる条件分岐
タッチセンサによる障害物回避

無限ループ

1

前進

2
True10cm後退

445度右旋回5

タッチセンサが3
押された
False

条件分岐：if 文

PADの構成部品：
処理：

選択：

反復：

6

タッチセンサによる障害物回避 (p.75 touch.c)→#include "./jissenPBL.h"#define TURN45 250#define POW 50
void backward_mm(double mm){double angle;
angle=mm*20.5;
RotateMotor(OUT_BC, -POW, angle);}void turn_right(int time) {OnFwdEx(OUT_B, POW,0);
OnRevEx(OUT_C, POW,0);
Wait(time);}→

int main(){
OutputInit();
initSensor();
ButtonLedInit();
setSensorPort(CH_1,TOUCH,0);
startSensor();
while(true) {OnFwdEx(OUT_BC, 50, 0);if(getSensor(CH_1)==1) {backward_mm(10.0);
turn_right(TURN45);}
if(ButtonPressed(BTN1)) break;}
Off(OUT_BC);
closeSensor();}7

07: 障害物回避(超音波センサ) (p.77〜)8

超音波センサによる障害物回避

30cm前に障害物発見！
ぶつからないように回避しよう

9

超音波センサ

受信素子

発信素子

超音波センサの測定原理
超音波を発信し、対象物で反射した超音波を受信し、この音波の発信から受信までの時間を計測することで対象物までの距離を計測
10

超音波センサの接続• EV3の入力ポート4に超音波センサを接続

入力ポート411

超音波センサによる障害物回避
1. 常にロボットを前進→無限ループの利用

2. 障害物までの距離を計測
3.

}30cm以下(障害物あり)：右旋回．その後1. に戻る
30cm以上(障害物なし)：1.に戻る

障害物

旋回

→後退する動作を必要としない
12

超音波センサによる障害物回避のPAD (p.78)• 超音波センサの値により条件分岐して障害物回避

超音波センサによる障害物回避

無限ループ

1前進

2
True

45度右旋回4

障害物との距離が30cmより小さい

3False13

超音波センサによる障害物回避 (p.80 usonic.c)→
int main(){
OutputInit();
initSensor();
ButtonLedInit();
setSensorPort(CH_4,USONIC,0);
startSensor();#include "./jissenPBL.h"#define TURN90 500#define TURN45 250
void backward_cm(double cm){
double angle;
angle=cm*20.5;
RotateMotor(OUT_BC, -50, angle);}

while(true) {OnFwdEx(OUT_BC, 50, 0); 2
if(getSensor(CH_4)< 300) { 3turn_right(TURN45); 4}
if(ButtonPressed(BTN1)) break;}
Off(OUT_BC);
closeSensor();void turn_right(int time) {OnFwdEx(OUT_B, 50,0);OnRevEx(OUT_C, 50,0);
Wait(time);
}

→}
14

08: ジャイロセンサを用いたモータ制御(p.81〜)15ジャイロセンサの原理

ジャイロチップ(InvenSense社)

ジャイロセンサの測定原理
ジャイロセンサは角速度センサとも呼ばれ、単位時間あたりの回転角である角速度[degree/s]を計測

16

ジャイロセンサ• EV3のジャイロセンサは一軸の回転角/角速度を計測

回転角 [degree]
角速度 [degree/sec]17

ジャイロセンサによる旋回角度制御(PAD) (p.81)• ジャイロセンサの角度が90度以上になるまで右旋回ジャイロセンサによる制御

ジャイロセンサのリセット

角度＜902モータの停止1
右旋回3角度の取得4518

ジャイロセンサによる旋回角度制御 (p.82 gyro.c)#include “./jissenPBL.h”
int main(){
int start, current;
OutputInit();//use Motor
initSensor();//use Sensor
ButtonLedInit(); //use button
setSensorPort(CH_2,GYRO,0); //ch,type,mode
startSensor();start=getSensor(CH_2);

1

do {OnFwd(OUT_B);
OnRev(OUT_C); 3
current=getSensor(CH_2);4}while(current <= start+90);}

Off(OUT_BC);
closeSensor();2519

09: カラーセンサ(p.84〜)20

カラーセンサLED

フォトダイオード

カラーセンサの測定原理
LEDにより赤、緑、青の光を照射して、それぞれの反射量(R, G, B成分)をフォトダイオードで計測して，カラーに変換21

カラーセンサ• 二種類のしくみで色や光の強さを計測
反射光の計測

LEDRG

色
反射光の強さB
フォトダイオード

周辺光の計測RGB値

RG

周辺の光の強さ

B
フォトダイオード

RGB値22光の三原色とカラー（加法混色）• 赤(R)，緑(G)，青(B)の3色を組み合わせて色彩を表現

RGB

加法混色

色番号

RGB

1: 黒000

2: 青00

大3: 緑0

大04: 黄大大05: 赤

大006: 白大大大23

カラーセンサの原理• LEDを切り替えて発光し、そのタイミングでの反射光を計測して、カラーを計測
LED：赤

R:
G:
B:

24

カラーセンサの原理• LEDを切り替えて発光し、そのタイミングでの反射光を計測して、カラーを計測
LED：緑

R:
G:
B:

25

カラーセンサの原理• LEDを切り替えて発光し、そのタイミングでの反射光を計測して、カラーを計測
LED：青

R:
G:

黄色

B:

1[ms]

オシロスコープで計測してみたところ：
1秒間に1,000回、R,G,Bと切り替えて発光し、同期してフォトダイオードで反射光量を計測

26

カラーセンサの接続• EV3の入力ポート3にカラーセンサを接続

入力ポート327

カラーの利用(PAD) (p.86)• カラーに合わせて複数に分岐
カラーに合わせて複数分岐

無限ループ

1
カラー？

2

赤

その他

色の識別値
黒

➡

1

青➡

2緑

➡

3黄➡

4赤➡

5白➡

6

ステータスライトを緑

3

ステータスライトを赤

4

ステータスライトをオフ

5緑1秒間待機カラー：緑

6
カラー：赤

カラー：その他

ステータスライト28

カラーの利用 (p.88 color̲RGB.c)#include “./jissenPBL.h”
int main(){initSensor();//use Sensor
ButtonLedInit(); //use button
setSensorPort(CH_3,COLOR,2); //ch,type,mode
startSensor();}

while(true){switch (getSensor(CH_3)) {case 3:
SetLedPattern(LED_GREEN);
break;
case 5:
SetLedPattern(LED_RED);
break;
default:SetLedPattern(LED_BLACK);
break;}
if(ButtonPressed(BTN1)) break; //Stop Program}
closeSensor();

3 緑
4 赤
5 その他

29

カラーセンサによるライントレース (p.89)• カラーセンサの”反射光の強さ”を利用して白と黒に判別• 白(明るい)ところでは右旋回，黒(暗い)ところでは左旋回

黒いところ→左旋回

白いところ→右旋回

30

ライントレースのPAD (p.89)• 白(明るい)ところでは右旋回，黒(暗い)ところでは左旋回
True
ライントーレス

無限ループ

1

反射光 > 50

右旋回

3

左旋回

42
False

右旋回しながら少し前に進むには：
旋回中心

OnFwd(OUT_B);
Off(OUT_C);
モータB
順方向に回転モータC停止(パワー0)

31

ライントレース (p.91 line̲trace.c)→
setSensorPort(CH_3,COLOR,0);
startSensor();#include "./jissenPBL.h"void turn_right(){
OnFwdEx(OUT_B,50,0);
Off(OUT_C);}

while(true){ 1if(getSensor(CH_3) > 50){ 2turn_right(); 3 白いところ(右旋回)}else{
turn_left(); 4 黒いところ(左旋回)}
if(ButtonPressed(BTN1))break;}
Off(OUT_BC);
closeSensor();void turn_left(){OnFwdEx(OUT_C,50,0);
Off(OUT_B);}
int main(){
int i=0;
OutputInit();
initSensor();
ButtonLedInit();}→32

ライントレースの改良
ジグザグ走行なので遅い！

①黒のライン上→前進②白→左右に旋回して黒のライン探索

33