前回記事の最後では
「押している時」「押していない時」をLEDの「点灯」「消灯」と対応付けるコードを書きました
「デジタル入力によって、デジタル出力をコントロール」してみたのですが
今回は、ゼロとイチでは割り切れない別のセンサを使ってみましょう
##ボリュームセンサでLEDの明るさコントロール
A0にボリュームセンサを接続します(D2のボタンは抜く)
ArduinoIDEで「ファイル」→「新規ファイル」を開き
下記のコードをコピー、ペーストしてSeeduinoに書き込みます
const int volumePin = A0; //ボリュームセンサが刺さっているピンを指定
const int ledPin = 3; //LEDが刺さっているピンを指定
void setup() {
Serial.begin(9600); //コンピュータとのシリアル通信の開始
pinMode(volumePin, INPUT); //ボリュームセンサが接続されているピンを入力モードに
pinMode(ledPin, OUTPUT); //LEDが接続されているピンを出力モードに
}
void loop() {
int volumeVal = analogRead(volumePin); //volumeValという変数を指定し、ボリュームセンサの値を読む
Serial.println(volumeVal); //0 - 1023の間でアナログ値を出力(10bit)
int ledBrightness = map(volumeVal, 0, 1023, 0, 255); //0 - 1023の値を、LEDの明るさ0 - 255に変換する
analogWrite(ledPin, ledBrightness); //指定された明るさでLEDを点灯
}
ボリュームを回転させるとLEDの明るさが変わります
####プログラム解説
プログラム中にmap()
という関数が出てきます。
analogRead()
関数で取得するボリュームの値は10bit(0-1023)なのに対して、
LEDの明るさを制御しているanalogWrirte()
が対応しているのが
8bit(0-255)なのでmap()を使って値を変換しています
###シリアルプロッタで値を見てみる
ArduinoIDEの「ツール」→「シリアルプロッタ」を選択
ボリュームを回転させると値に応じてグラフが変化します!
※シリアルプロッタが動作しない方は画面下部のボーレート(seeeduinoとPCが通信する速度の取り決め)を「9600bps」に設定してみてください!
PWM出力について
LEDの明るさを段階的にコントロールできるのは、Arduinoが持つPWMという出力方式のおかげです
PWMは(Pulse Width Modulation)の頭文字をとった略語で、単位時間あたりで電流を流す(ピンをHIGHにする)時間を変えているのです
実際にはピンのON/OFFが高速に切り替わっており、LEDは高速で明滅しているのですが、人間の目には「明るさが変わっているようにみえる」のです
様々なセンサ・アクチュエータ
入力装置としての役割を持つセンサ(ボリューセンサ、ボタン)
出力装置としての役割を持つアクチュエータ(LED、傾きスイッチなど)には沢山の種類があります
上のプログラムに対応したセンサは下記になります。A0に接続して試してみましょう
その際、ArduinoIDEのシリアルプロッタを表示しておいて、どのような振る舞いによって値が変化するのかを確認してみましょう
また、上のプログラムは「振動モータ」にも対応していますので、D3に接続してセンサでコントロールしてみましょう