Arduino UNOプログラミングワークショップfor kid’s part2


次はいよいよロボットの制御になります。

完成するとこんな感じです。
必要なもの
Arduino UNO
L298p使用 2Aモーターシールド
シャープ測距モジュール GP2Y0A02YK
LED 2つ
カーボン抵抗1/4w100Ω抵抗 2つ
絶縁型ラジアルリード型積層セラミックコンデンサー0.01μF50V±10%5mm
ジャンパーケーブル8本
携帯充電器
タミヤ(TAMIYA) ダブルギヤボックス(左右独立4速タイプ)
タミヤ(TAMIYA) ユニバーサルプレート(2枚セット) *一枚しか使いませんが。
タミヤ(TAMIYA) オフロードタイヤセット
ブレッドボード tiny
自在金具付きキャスター
両面テープ
はんだこて、はんだ

測距モジュール

今回使用するのはシャープ製測距モジュールGP2Y0A02YKというモデル。20cmから150cmまで測距してくれます。
今思えば10cmの距離まで測れるGP2YA21YKを買ったほうが良かったのではないかと思います。今からそろえようという人は試してみてください。

sensor
void setup() {
     Serial.begin(9600) ;     // 9600bpsでシリアル通信のポートを開きます
 }
 void loop() {
     int ans ;

     ans = analogRead(0)  ;   // センサーから読込む
     Serial.println(ans) ;    // シリアルモニターに表示させる
     delay(500) ;             // 500ms時間待ち
 }

このプログラムを書き込んだら、シリアルモニタで確認してみてください。測距モジュールの前に出した手を動かすと数値が刻々とかわります。
次は13番ピンを使って障害物に近づいたら、LEDを点灯させるプログラムです。

void setup() {
     Serial.begin(9600) ;     // 9600bpsでシリアル通信のポートを開きます
     pinMode(13, OUTPUT);
 }
 void loop() {
     int ans ;
     ans = analogRead(0)  ;   // センサーから読込む
     Serial.println(ans) ;    // シリアルモニターに表示させる
     delay(500) ;             // 500ms時間待ち
     if (ans > 560) {digitalWrite(13, HIGH);   // 20cm以内に何かがあったらLEDを点灯
}

else { digitalWrite(13, LOW); //何もなければ消灯
 }
}

モーターシールドを使う

いよいよモーターを動かします。ギアボックスを組み立てていきます。ギアは一番遅い344.2:1のギア比で組み上げてください。あまり早いとぶつかって壊れてしまうこともありますので。ユニバーサルプレート、ホイールセット、自在金具付きキャスターを使って組み立ててみてください。各説明書を参考に組み立てます。
_1020424

int rp = 5; //right motor power
int rd = 4; //right motor direction
int lp = 6; //left motor power
int ld = 7; //left motor direction
void setup() {   
    pinMode(rd, OUTPUT); //right motor direction
    pinMode(ld, OUTPUT); //left motor direction

}

void loop() {

    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 250);   //right motor power
    analogWrite(lp, 250);   //left motor power
    delay(1000);
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 0);   //right motor power
    analogWrite(lp, 0);   //left motor power
    delay(1000);
    
  }

1秒毎に前進と停止を繰り返すプログラムです。
一行目が右のモーターのパワー 5番ピンで0-255まで設定できます。変数rpを使います。
二行目は右のモーターの方向 4番ピンHIGHで前進、LOWで後退です。変数rdを使います。
三行目は左のモーターのパワー 6番ピンで0-255まで設定できます。変数lpを使います。
四行目は左のモーターの方向 7番ピンHIGHで前進、LOWで後退です。変数ldを使います。

これからどんどんいろんな動きを追加していくので、変数を使って収納していきます。

int rp = 5; //right motor power
int rd = 4; //right motor direction
int lp = 6; //left motor power
int ld = 7; //left motor direction
void front() //前進はこの制御
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 250);   //right motor power
    analogWrite(lp, 250);   //left motor power
    }
void stop() //ストップはこの制御
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 0);   //right motor power
    analogWrite(lp, 0);   //left motor power
    }

void setup() {   
  pinMode(rd, OUTPUT); //right motor direction
    pinMode(ld, OUTPUT); //left motor direction

}

void loop() {

    front();
    delay(2000);
    stop();
    delay(1000);
    
  }

_1020426
Arduinoとモーターシールドは重ねるだけ。スペースを有効活用できますね。

さてあとはどんな動きが必要でしょう?後退、右折、左折、右固定左のみ後退、左固定右のみ後退いろいろ作ってみましょう。

void ***(動きの名前) {
digitalWrite(rd,HIGH or LOW);
    digitalWrite(ld, HIGH or LOW);
    analogWrite(rp, 0-255);  
    analogWrite(lp, 0-255);  
}

サンプルはこちら

int rp = 5; //right motor power
int rd = 4; //right motor direction
int lp = 6; //left motor power
int ld = 7; //left motor direction
void front() //前進
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 250);   
    analogWrite(lp, 250);   
    }
void stop() //停止
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 0);   
    analogWrite(lp, 0); 
    }
void back()
{
digitalWrite(rd,LOW);
    digitalWrite(ld, LOW);
    analogWrite(rp, 250);   
    analogWrite(lp, 250); 
  }
void right()
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, LOW);
    analogWrite(rp, 230);
    analogWrite(lp, 230);
  }
void left()
{
digitalWrite(rd,LOW);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 230);   //right motor power
    analogWrite(lp, 230);   //left motor power
  }
void bleft()
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, LOW);
    analogWrite(rp, 0);   //right motor power
    analogWrite(lp, 230);   //left motor power 
}
void bright()
{
    digitalWrite(rd,LOW);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 250);
    analogWrite(lp, 0);
}

void setup() {   
  pinMode(rd, OUTPUT); //right motor direction
    pinMode(ld, OUTPUT); //left motor direction

}

void loop() {

    front();
    delay(1000);
    bleft();
    delay(300);
    bright();
    delay(300);
    back();
    delay(500);
    left();
    delay(2000);
    stop();
    delay(5000);
    
  }

void loop(){}の中でいろいろとダンスさせたり、あらかじめコースを設定してその通りに動かしたりすると面白いです。そろそろUSBケーブルが邪魔になってきますね。携帯充電器を使って独立電源で動かしましょう。

あとは冒頭で使ったシャープ測距センサーのプログラムと組み合わせて、ロボットを制御してください。センサーを下向きに取り付けて、テーブルから落ちないロボットにしたりするのも面白いかも。
_1020427
LEDを2つ搭載しました。障害物がないときは青色を発光させて、障害物を見つけた時は赤を光らせます。13番ピンに青LED、12番ピンに赤LEDを取り付けてあります。

int rp = 5; //right motor power
int rd = 4; //right motor direction
int lp = 6; //left motor power
int ld = 7; //left motor direction
int ans ;
void front() 
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 250);   
    analogWrite(lp, 250);
    }
void stop()
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 0); 
    analogWrite(lp, 0); 
    }
void back()
{
digitalWrite(rd,LOW);
    digitalWrite(ld, LOW);
    analogWrite(rp, 250);
    analogWrite(lp, 250);
  }
void right()
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, LOW);
    analogWrite(rp, 230);
    analogWrite(lp, 230);
  }
void left()
{
digitalWrite(rd,LOW);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 230);
    analogWrite(lp, 230);
  }
void bleft()
{
    digitalWrite(rd,HIGH);
    digitalWrite(ld, LOW);
    analogWrite(rp, 0);   //right motor power
    analogWrite(lp, 230);   //left motor power 
}
void bright()
{
    digitalWrite(rd,LOW);
    digitalWrite(ld, HIGH);
    analogWrite(rp, 250);   //right motor power
    analogWrite(lp, 0);   //left motor power 
}

void setup() {   
  pinMode(rd, OUTPUT); //right motor direction
    pinMode(ld, OUTPUT); //left motor direction
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
    Serial.begin(9600) ;

}

void loop() {
  ans = analogRead(0)  ;   // センサーから読込む
     Serial.println(ans) ;    // シリアルモニターに表示させる
  if (ans > 560) {  //20cm以内に何かあったら
    digitalWrite(12, HIGH); //赤LED点灯
    digitalWrite(13, LOW);
    //ここから
    bleft();
    delay(300);
    bright();
    delay(300);
    back();
    delay(500);
    left();
    delay(5000);
    stop();
    }
    //ここまで障害物を見つけた時の動き front(),back(),left(),right(),bleft(),bright()から選ぶ
else { 
  digitalWrite(13, HIGH); //青LED点灯
  digitalWrite(12, LOW);
  front(); //直進
 }
}

ご自由にどうぞ