ライントレーサ講習第 7 回制御 2 回 2016 年

ライントレーサ講習第 7 回制御 2 回 2016 年
2 年機械工学科 中村 魁人
1.今回行う作業
ライントレーサを走らせるプログラムを作成し,走行させるのが今回の目的である. そのた
めにシリアル通信,LED とセンサの連動,プログラムの作成を順にやっていく.
2. シリアル通信と,LED とセンサの連動
ⅰ)シリアル通信とは
表 2-1 シリアルモニタ
何台かのコンピュータで通信をするこ
とです.今回はマイコンである Arduino
とパソコンとを通信させます.通信ができ
ると Arduino につないだセンサからの
値をパソコンに読み込んだり,パソコンか
ら Arduino に指令を与えたり,プログラ
ム中の変数の値をパソコンに送ることで
プログラムのミスを発見しやすくするな
ど多くのメリットがあります.
今回は特に Arduino につないだセンサ
からの値をパソコンで読み込むプログラ
ムを作ります.
実際にプログラムを Arduino に書き込
み,ツールからシリアルモニタを開くことで Arduino からパソコンに送られてくるデータをみる
ことができます.
ⅱ) LED とセンサの連動
右のセンサがラインを踏むと LED1が,左のセンサがラインを踏むと LED2がそれぞれ光る
ようにします.そうすることによってシリアル通信をせずともセンサが正常に動作しているかが
一目でわかるようになります.
ⅲ)使用する関数について
・Serial.begin 関数
書式 Serial.begin(rate);
1/7
パソコンとシリアル通信を行うときの通信速度を設定します.今回は転送速度 9600bps で行
うので rate には 9600 を設定します.
注意 setup 関数内で設定する必要があります.
また bps とは bit per second のことで数新回線などのデータ伝送速度の単位で,1 秒
間に何ビットのデータを送れるかを表します.1bps は 1 秒間に 1 ビットのデータを伝
送できることを表します.ちなみに 8bit = 1Byte です.
・Serial.print 関数
書式 Serial.print(data);
シリアル通信でデータを「改行コードなし」で送る関数です.また文字も送信することが
できますが,その場合,(“a”)のように送信したい文字をダブルコーテーションで囲む必要
があります.
注意 Serial.begin 関数で通信の設定をしておく必要があります.
・Serial.println 関数
書式 Serial.println(data);
Serial.print 関数とほぼ同じですが違いは「改行コードあり」で送信します.
注意 Serial.begin 関数で通信の設定をしておく必要があります.
・analogRead 関数
書式 analogRead(pin);
pin で指定したアナログピンにかかる 0V から 5V までの電圧を 0 から 1023 の値と
して返します.
ⅳ)if 文と else if 文
まず,if 文とはプログラムにおける分岐点という認識を持っておいてください.
使用例. if (条件文){} //カッコ内の条件を満たしたときにやること
試しに使ってみましょう.
Ex1)
if (Your blood type == A)
printf (“あなたは几帳面ですね”);
条件を満たしていない場合には何もしないわけです.
次に, else if 文です.これは if 文とセットで使います.
例えば, if 文であなたの血液型がA型であれば,その人は几帳面だ.と表示されるプログラ
ムを作ります.
このとき不快に思うのがA型でない場合には他の血液型の人の情報が一切ないといった
ことです. else if 文は,条件判断を1回で終わらせず,他の条件を打ち込む.言わば敗者復活
戦に持ち込むことが出来るわけです.
2/7
使用例 if(条件文)
else if(上以外の条件文)
なので,こんなプログラムが書けるわけです.
Ex2)
if(Your blood type == A)
printf (“あなたは几帳面ですね”);
else if(Your blood type == B)
printf (“あなたは明るい性格ですね”);
else if(Your blood type == O)
printf (“あなたは活動的ですね”);
else if(Your blood type == AB) printf (“あなたはクールな人ですね”);
else printf (“あなたは人類ではないのですね”);
このように,A 型でないならB型,違うならO型,さらに違うならAB型.といった具合に次
の条件,次の条件へと進んでいくわけです .else 文はA,B,O,AB型を選ばないようなお茶
目な人のために,コンピュータにさせる仕事です.
3/7
ⅴ)参考プログラム
プログラムを作成,書き込み,機体を実際にコースの上にのせ,センサがラインの上にあるかな
いかでセンサの値が変化することと,LED が光ったり消えたりすることを確かめよう.
リスト2-2 参考プログラム
const int r1=11,r2=10,l1=6,l2=5,rx=0,lx=1,LED_R=2,LED_L=3; //Arduino のピンの番号
const int r,l,x=650;//x はセンサが反応しているかいないかを分ける境目の数値である
void setup(){
//以下のようにピン設定する
pinMode(LED_R,______);//右の LED を出力状態にする
pinMode(LED_L,______);//左の LED を出力状態にする
Serial.begin(9600);//転送速度を 9600bps に設定する
delay(__);//3 秒待つ
}
void loop(){
//{}を何度も実行
l= analogRead(lx);//l に lx ピンで読み込んだ値を代入
Serial.print(l);//lの値をパソコンに表示
r=______(__);//r に rx ピンで読み込んだ値を代入
Serial.println(__);//r の値をパソコンに表示
delay();//3 秒待つ
if(r<x){//もし右のセンサが反応したら
digitalWrite(LED_R,____);//右の LED を光らせる
}
else{//もし右のセンサが反応していなければ
digitalWrite(LED_R,____);//右の LED を消す
}
if(l<x){//もし左のセンサが反応したら
digitalWrite(LED_L,____);//左の LED を光らせる
}
else{//もし左のセンサが反応していなければ
digitalWrite(LED_L,____);//左の LED を消す
}
}
4/7
3.ライントレーサの走行プログラム
ⅰ)プログラムの構想
今回のライントレースは前提として2つのセンサがラインにまたがっている状態でスタート
します.そして前進しながらセンサによりラインに対する機体の位置をマイコンが把握し,軌道
修正をしながら機体がラインを外れないように進んでいくプログラムを書きます.
具体的には右のセンサが反応したら右に旋回し,左のセンサが反応したら左に旋回する.これ
により機体の軌道を修正,そうして両方のセンサが反応しなくなったら直進する,というプログ
ラムを作ります.
ⅱ)モータの制御(復習だよ!)
第6回講習でやったようにモータドライバにマイコンから2つの信号を送りモータを制御す
る.表 3-1 は右モータを 3 秒ごとに正転,ブレーキしているプログラムである.書き写す必要はな
くどうモータを制御するかを見て納得すればよい.
1
2 HIGH
LOW
HIGH
ブレーキ
正転
LOW
逆転
空転
リスト 3-1 モータの制御プログラム
int r1=11,r2=10; //Arduino に書いてある数値
void setup(){
//以下のようにピン設定する
pinMode(r1,OUTPUT);//r1 ピンを出力状態にする
pinMode(r2,OUTPUT);//r2 ピンを出力状態にする
delay(3000);//3 秒待つ
}
void loop(){
digitalWrite(r1,HIGH);
digitalWrite(r2,LOW);//右モータを正転
delay(3000);
digitalWrite(r1,LOW);
digitalWrite(r2,LOW);//右モータを空転
delay(3000);
}
5/7
ⅲ)ライントレースのプログラム
作ったら実際にコースを走らせてみよう.赤文字のところを追加して書いてね.
リスト 3-2 参考プログラム
int r1=11,r2=10,l1=6,l2=5,rx=0,lx=1,LED_R=2,LED_L=3; //Arduino のピンの番号
int r,l,x=650;//x はセンサが反応しているかいないかを分ける境目の数値である
void setup(){
//以下のようにピン設定する
pinMode(LED_R,______);//右の LED を出力状態にする
pinMode(LED_L,______);//左の LED を出力状態にする
pinMode(r1,OUTPUT);//出力状態にする
pinMode(r2,OUTPUT);//出力状態にする
pinMode(l1,OUTPUT);//出力状態にする
pinMode(l2,OUTPUT);//出力状態にする
Serial.begin(9600);//転送速度を 9600bps に設定する
delay(__);//3 秒待つ
}
void loop(){
//{}を何度も実行
l= analogRead(lx);//l に lx ピンで読み込んだ値を代入
Serial.print(l);//lの値をパソコンに表示
r=______(__);//r に rx ピンで読み込んだ値を代入
Serial.println(__);//r の値をパソコンに表示 delay();//3 秒待つ
if(r<x){//もし右のセンサが反応したら
digitalWrite(LED_R,____);//右の LED を光らせる
}
else{//もし右のセンサが反応していなければ
digitalWrite(LED_R,____);//右の LED を消す
}
if(r<x){//もし左のセンサが反応したら
digitalWrite(LED_L,____);//左の LED を光らせる
}
else{//もし左のセンサが反応していなければ
digitalWrite(LED_L,____);//左の LED を消す
}
if(r<x){//もし右のセンサが反応したら
digitalWrite(r1,__);
digitalWrite(r2,__);
6/7
digitalWrite(l1,__);
digitalWrite(l2,__);
}
if(__){//もし左のセンサが反応したら
digitalWrite(r1,__);
digitalWrite(r2,__); 7 / 7 7 / 7
digitalWrite(l1,__);
digitalWrite(l2,__);
}
else{//それ以外だったら
digitalWrite(r1,__);
digitalWrite(r2,__);
digitalWrite(l1,__);
digitalWrite(l2,__);
}
}
4.参考文献
岡島裕史.スラスラわかるC言語株式会社翔泳社 2012p104,105,107
牧野浩二.たのしくできる Arduino 工作.東京電機大学出版局 2012 p34,37,38,108
7/7