自動運転は、Arduinoで実行出来る内容としては最も実用的ではないだろうか。回路は簡単で、前回のものからボリューム部分を取り除けばオーケーだ。スケッチも以下の通り、今のところ基本的に出力のみで、値を読み取るルーチンはない。前進は10番ピンに値100を出力し、後退は逆に11番ピンに出す。delayが前後進と停止の時間指定で、実験なのでこれを無限に繰り返すだけの簡単な処理である。
[ スケッチ:Pwm1]
void setup() {
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
analogWrite(10, 100);
digitalWrite(11, LOW);
delay(2550); // 前進
analogWrite(10, LOW);
digitalWrite(11, LOW);
delay(5000); // 5秒停止
analogWrite(11, 100);
digitalWrite(10, LOW);
delay(2650); // 後退
analogWrite(11, LOW);
digitalWrite(10, LOW);
delay(5000); // 5秒停止
}
次はいよいよパワーパック、PWM制御というヤツで(教科書158ページ)、今回よりモータードライバを活用した実験が続く。回路は写真の様な感じで、モータードライバ(TB6643KQ)含む出力側は実験キット基板上に実装されている(写真ピンクのマーキング部分)ものを使った。例によって不良パーツが含まれてないか心配だったが、今回は問題なし。他にスイッチングACアダプター(12V)、ボリューム、整流ダイオードは別途購入した。
[ スケッチ:Pwm1]
void setup() {
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
int vol = analogRead(A0)/4;
analogWrite(10, vol);
digitalWrite(11, LOW);
delay(50);
}
ここまでのまとめとして、光センサー、LED、サーボモーター、圧電ブザーを組み合わせ、踏切として組み上げてみる(教科書124ページ)。その前に、CdSセルが手元に少し余っていたので、キット基板上のものと入れ替え、動作するようにしておいた。スケッチは前回の光センサー+圧電ブザーのものに、LEDを加え、最後にサーボモーターのコントロールを加える。
[ スケッチ:Fumikiri1]
#include
Servo myservo; // create servo object to control a servo
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
int analogValue = analogRead(A0);
if (analogValue< 100) {
int i;
for (i=0; i<10; i++) {
// play a note on pin 6 for 200 ms:
tone(6, 675, 500);
digitalWrite(13, HIGH);
delay(450);
// turn off tone function for pin 8:
noTone(6);
digitalWrite(13, LOW);
tone(6, 675, 500);
digitalWrite(12, HIGH);
delay(450);
// turn off tone function for pin 8:
digitalWrite(12, LOW);
noTone(6);
myservo.write(90);
}
delay(1000);
myservo.write(0);
}
}
次は圧電ブザーで音を出す。これで踏切の要素が全て揃う事になるが、ブザーの模擬音なので音質はチープ。まあ、ちゃんとやろうとしたらサウンドシステムか何かを使う事になるんだろうが。スケッチはサンプルの toneMultipleからの改造で、LEDを交互に点滅させる処理を付け加える。
[ スケッチ:toneMultiple1]
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
tone(6, 675, 500);
digitalWrite(13, HIGH);
delay(450);
noTone(6);
digitalWrite(13, LOW);
tone(6, 675, 500);
digitalWrite(12, HIGH);
delay(450);
noTone(6);
digitalWrite(12, LOW);
}
サーボモーターは色々な使い方が出来そうだが、とりあえずすぐ頭に浮かぶのは踏切遮断機だろう。というわけで、次の練習課題では光センサーと組み合わせ、列車の通過を検知して遮断機を操作する。
[ スケッチ:Sweep1]
#include <Servo.h>
const int analogPin = A0; // pin that the sensor is attached to
const int threshold = 150; // an arbitrary threshold level
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
int analogValue = analogRead(analogPin);
if (analogValue < threshold) {
for (pos = 0; pos <= 90; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position 'pos'
delay(15); // waits 15ms for the servo to reach pos
}
delay(3000);
for (pos = 90; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in 'pos'
delay(15); // waits 15ms for the servo to reach pos
}
}
}