Arduinoの電子工作で遊ぼう! その21 ~光で操作するテルミンを作ってみよう2~
(前回からの続きです)
プログラムを見てみましょう
このプログラムは、照度センサーの値を読み取り、その値に基づいて音の周波数を調整するものです。
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
while(millis() < 5000){
sensorValue = analogRead(A0);
if(sensorValue > sensorHigh){
sensorHigh = sensorValue;
}
if(sensorValue < sensorLow){
sensorLow = sensorValue;
}
}
digitalWrite(ledPin, LOW);
}
void loop() {
sensorValue = analogRead(A0);
int pitch = map(sensorValue,sensorLow,sensorHigh,50,4000);
tone(8,pitch,20);
delay(100);
}
1.変数の初期化
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
const int ledPin = 13;
sensorValue:照度センサーから読み取る値を格納
sensorLow と sensorHigh:照度センサーの最低値と最高値を格納
ledPin:LEDを接続するピン(13番ピン) ※Arduinoの基板上にあるデジタル端子13番です。
2.setup()関数
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
while(millis() < 5000){
sensorValue = analogRead(A0);
if(sensorValue > sensorHigh){
sensorHigh = sensorValue;
}
if(sensorValue < sensorLow){
sensorLow = sensorValue;
}
}
digitalWrite(ledPin, LOW);
}
ledPinを出力モードに設定し、LEDを点灯させる
5秒間のループで、アナログ入力(A0)からセンサー値を読み取る
読み取った値が最高値より大きければ、sensorHighを更新
読み取った値が最低値より小さければ、sensorLowを更新
5秒経過後、LEDを消灯
プログラムを動かすと5秒間で自動的に最大値と最小値を格納する変数が更新されます。
最大値を格納:sensorHigh (初期値0)
最小値を格納:sensorLow (初期値1023)
この5秒の間、Arduinoの基板上にあるデジタル端子13番のLEDが点灯します。
5秒間のループは、whileでおこなってます。
while(millis() < 5000){
millis()関数は、Arduinoの電源を入れてから、またはリセットしてからの時間をミリ秒単位で返します。
3.loop()関数
void loop() {
sensorValue = analogRead(A0);
int pitch = map(sensorValue,sensorLow,sensorHigh,50,4000);
tone(8,pitch,20);
delay(100);
}
再びセンサー値を読み取り、map()関数を使用してセンサー値を50から4000の範囲に変換。この範囲はArduinoが出す音の範囲です。
tone()関数で音を鳴らします。引数を3つ指定します。
1)スピーカーを接続するデジタル入出力端子の番号
今回は8番
2)鳴らす音の周波数
map()関数で求めて変数pitchに格納した値
3)鳴らす音の長さ
今回は20ミリ秒
delay()関数で100ミリ秒待つようにしています。