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

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

1

04: 関数化 (p.63〜)2ロボットを一周させる時• 同じ処理が何度も繰り返される → 関数化

2回目
3秒前進→90度旋回

1回目

3回目

3秒前進→90度旋回

3秒前進→90度旋回

4回目
3秒前進→90度旋回

3

関数化1(p.64 func.c）#include "./jissenPBL.h"#include "./jissenPBL.h"
int main(){
int i ;
関数化
OutputInit();OnFwdEx(OUT_BC, 50,0);
Wait(3000);
OnFwdEx(OUT_B, 50,0);OnRevEx(OUT_C, 50,0);Wait(500);
Off(OUT_BC);}

void forward(){
OnFwdEx(OUT_BC, 50,0);
Wait(3000);}
void turn_right(){
OnFwdEx(OUT_B, 50,0);OnRevEx(OUT_C, 50,0);
Wait(500);}
int main(){
OutputInit();forward();turn_right();
呼び出しOff(OUT_BC);}!4

関数化2(p.64 func.c）#include "./jissenPBL.h"#include "./jissenPBL.h"void forward(){
OnFwdEx(OUT_BC, 50,0);
Wait(3000);}
void turn_right(){
OnFwdEx(OUT_B, 50,0);OnRevEx(OUT_C, 50,0);
Wait(500);}
int main(){
OutputInit();forward();turn_right();
Off(OUT_BC);}

void forward(int time){
OnFwdEx(OUT_BC, 50,0);
Wait(time);}void turn_right(int time){
OnFwdEx(OUT_B, 50,0);OnRevEx(OUT_C, 50,0);
Wait(time);}
int main(){
OutputInit();forward(3000);
turn_right(500);
Off(OUT_BC);}!5引数を持つ関数• 関数の書式：void 関数名(引数){ }• 引数は関数内のみ有効!6

#deﬁneによる定義 (p.65)→#include "./jissenPBL.h"

int main(){
int i;
OutputInit();for(i=0; i<4; i++){forward(3000);
turn_right(TURN90);}
Off(OUT_BC);}#define TURN90 500
void forward(int time){
OnFwdEx(OUT_BC, 50,0);
Wait(time);}void turn_right(int time){
OnFwdEx(OUT_B, 50,0);OnRevEx(OUT_C, 50,0);
Wait(time);}→
旋回角度（時間制御）を調整するには、TURN90の値を変るだけで全てに反映!7■■

チャレンジ！

■■• 星形やスパイラルの軌跡を描くロボットを実現してみよう！

これは簡単かも！

…

8

05: 演算と変数 (p.66〜)

950cm前進するには？
• モータの回転角を変化させたときの直進距離を測定し、法則をみつける
RotateMotor(OUT_BC, 50, 180);
角度：
180〜1440度

角度[ ]距離[cm]

1cmあたりの回転角度

180

9.0

20.0

360

17.5

20.6

720

34.5

20.8

1080

52.5

20.5

1440

69.5

20.4

中央値

※1cmあたりの回転角度 ＝回転角度[ ] / 距離[cm]回転角度 = 直進したい距離

1cmあたりの回転角度
20.5度
10

50cm前進するには？ (forward50cm.c）• 実数型(double)を使用#include "./jissenPBL.h"
int main(){double angle;
OutputInit();}angle=50*20.5;
RotateMotor(OUT_BC, 50, angle);
Off(OUT_BC);11

50cm前進するには？ (forward50cm.c）• 関数化#include "./jissenPBL.h"void forward_cm(double cm){
double angle;
angle=cm*20.5;
RotateMotor(OUT_BC, 50, angle);}
int main(){
OutputInit();}forward_cm(50.0);
Off(OUT_BC);12

スパイラル軌跡に挑戦しよう• 星形やスパイラルの軌跡を描くロボットの動きを実現してみよう！

これは簡単！

…

13実現したい動きの規則性• 繰り返し回数ごとのロボットの動きを表にしてみよう

cm

10回数

前進

右回転

110cm

90度

220cm

90度

330cm

90度

440cm

90度

550cm

90度

660cm

90度

770cm

90度

880cm

90度

990cm

90度
14

実現したい動きの規則性• 規則性を数式で表現
回数
1

前進

１10cm

右旋回

1090度

220cm

90度

330cm

90度

回数←1

440cm

90度

前進する距離 = 10cm 回数

550cm

90度

回数←回数+1

660cm

90度

770cm

90度

880cm

90度

990cm

90度

15

スパイラル状の軌跡のPAD• 繰り返し回数cntと演算によりスパイラル軌跡を実現
スパイラルcnt←11

無限ループ

2cntx10cm前進
角度の計算

3

求めた角度前進

4

90度右旋回

5cnt←cnt+1

616

スパイラル状の軌跡 (p.69 spiral.c）→int main(){int cnt=1 ; 1#define TURN90 500
double angle;
��ButtonLedInit();void forward_cm(double cm){
OutputInit();double angle;
2
while(true){angle=cm*20.5;
3
forward_cm(cnt*10.0); 3 4
RotateMotor(OUT_BC, 50, angle); 4
turn_right(TURN90);}5����cnt=cnt+1;
6
����//force-quit
void turn_right(int time){
if(ButtonPressed(BTN1))�break;OnFwdEx(OUT_B, 50,0);}OnRevEx(OUT_C, 50,0);��Off(OUT_BC);
Wait(time);→ }}#include "./jissenPBL.h"!17while文を用いたループ• while(true){処理} とすると無限ループ

while (true){
繰り返す処理//force-quit
if(ButtonPressed(BTN1)) break;}
Off(OUT_BC);

無限ループのプログラムを作成する時は：プログラムの緊急停止（無限ループ脱出）のための処理を必ず入れておくこと
無限ループ脱出後の処理として、モータを停止する命令を追加すること
18