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


Scratchなどから教えていこうと思ったのですが、障害物を避けるロボットを作るという最終目的のためにはC言語をベースにしたArduino言語で教えた方がスムーズなようです。
今回の参加者は小学校5年生とそのお父さん。6年生とそのお父さん。

必要な物は
Arduino UNO
USBケーブル
100Ω抵抗3本
ジャンパーケーブル(オスーオス)7本
LED 3つ

LEDの点灯 digitalWrite

まずはLEDの点灯です。接続はこんな感じでお願いします。

1LED
void setup() {
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(8, HIGH);   //  LED 点灯
}

LEDの点滅

パラメータをいじってもらってください。1秒点灯、2秒消灯など。

void setup() {
pinMode(8, OUTPUT);
}

void loop() {
digitalWrite(8, HIGH);   //  LED 点灯
delay(1000);             // 1秒 1000ミリ秒
digitalWrite(8, LOW);   // LED 消灯
delay(1000);           // 1秒 1000ミリ秒
}

3つのLEDでコンビネーション点灯

次は3つのLEDで遊びます。いろんなパターンで点滅させてみましょう。2個づつ点灯しながら右にずらしていくなどいろいろなパターンを作ってもらいます。
_1020420

void setup() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}

void loop() {
digitalWrite(8, HIGH);   // 8番LED点灯
digitalWrite(9, LOW);
digitalWrite(10, LOW);
delay(1000);              // 1秒間そのまま
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10,LOW);
delay(1000);  
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10,LOW);
delay(1000);
digitalWrite(8, HIGH); //全点灯
digitalWrite(9, HIGH);
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(8, LOW); //全消灯
digitalWrite(9, LOW);
digitalWrite(10,LOW);
delay(1000);

}
3LED

変数について

次は変数の扱いを学んでもらいます。点滅間隔がだんだん長くなるプログラムです。数字をいろいろ変えて遊んでもらいます。
だんだん早くしていくプログラムを作ってもらってもいいでしょう。

void setup() {
  pinMode(8, OUTPUT);
}

void loop() {
  int i;
  for(i = 0; i <= 500; i=i+3) {
    digitalWrite(8,HIGH);
    delay(i);
    digitalWrite(8,LOW);
    delay(i);
    
  }
  digitalWrite(8,LOW);
    delay(3000);
}

乱数 random

今度は三連LEDを使ってまず乱数を発生させます。以下のプログラムを走らせてシリアルモニタを見てください。8,9,10の数字がランダムに表示されます。
そのナンバーのLEDを点滅させます。

long randNumber;
void setup() {
Serial.begin(9800);
randomSeed(analogRead(0));
}
void loop() {
randNumber = random(8, 11); // 8から10の乱数を生成
Serial.print(randNumber);
Serial.println("");
digitalWrite(randNumber,HIGH);
delay(1000);
digitalWrite(randNumber,LOW);
delay(1000);
digitalWrite(randNumber,HIGH);
delay(1000);
}

ルーレットを作る

いままでおぼえたことを使って、ルーレットを作ってもらいましょう。

int i;
long randNumber;

void setup() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9800);
randomSeed(analogRead(0));
}

void loop() {
  digitalWrite(8, LOW);   // set the LED on
digitalWrite(9, LOW);
digitalWrite(10, LOW);
delay(1000);
digitalWrite(8, HIGH);   // set the LED on
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
delay(2000);
digitalWrite(8, LOW);   // set the LED on
digitalWrite(9, LOW);
digitalWrite(10, LOW);
delay(1000);
for(i = 0; i <= 500; i=i+4) {
digitalWrite(8, LOW);   // set the LED on
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(8+i%3,HIGH);
delay(i);              // wait for a second

}
randNumber = random(8, 11); // 8から10の乱数を生成
digitalWrite(8, LOW);   // set the LED on
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(randNumber,HIGH);
delay(1000);
digitalWrite(randNumber,LOW);
delay(1000);
digitalWrite(randNumber,HIGH);
delay(1000);
Serial.print(randNumber);
Serial.println("");

}
_1020418

当たり判定 if

さてルーレットですから、当たりを設定しましょう。ここでは10番を当たりにします。以下の行を挿入してください。あたったら0.5秒間隔で点滅します。

delay(1000);
Serial.print(randNumber);
Serial.println("");

if (randNumber== 10) {
  digitalWrite(randNumber,LOW);
delay(500);
digitalWrite(randNumber,HIGH);
delay(500);
    digitalWrite(randNumber,LOW);
delay(500);
digitalWrite(randNumber,HIGH);
delay(500);
  digitalWrite(randNumber,LOW);
delay(500);
digitalWrite(randNumber,HIGH);
delay(500);
  digitalWrite(randNumber,LOW);
delay(500);
digitalWrite(randNumber,HIGH);

}
}

ここまで休憩をはさみながら4時間位でしょうか?流れでやってしまえばそれこそ一時間もかかりません。しかしパラメータをいじったりしながら自分でArduinoを制御しているっていう感覚をつかんでくれれば、楽しく集中して勉強ができるはずです。

さていよいよ次回はロボット制御に向けて、モーターシールド、センサーの使い方を学習していきたいと思います。
part2はこちらから

ご自由にどうぞ