Arduinoでフェーダー操作

Arduinoでフェーダー操作

はじめに

今までで、digitalWrite()、digitalRead()、analogWrite()を記事にしてきたので、残すはanalogRead()です。

ツマミ(ノブ) や フェーダー(スライダー)のような動かせるような入力装置を使ったときに、それらがどの位置にいるか、何%だけつけたか、みたいなものを読み取ります。
これによってボタンのようなON/OFFの2択のような入力だけでなく、多段階の数値を入力することができるようになります。

フェーダーでLED調光する

はじめに

前回のArduinoでのPWM出力でLEDの調光ができるようになったので、今回はフェーダーを使ってLEDの調光をしてみましょう。

用意するもの

Arduino本体 (今回はArduino Uno互換機)
Akizuki : http://akizukidenshi.com/catalog/g/gM-07385/

LED(今回は青色LED)
Akizuki : http://akizukidenshi.com/catalog/g/gI-01321/

スライドボリューム (10kΩ, B)
Akizuki : http://akizukidenshi.com/catalog/g/gP-09238/

抵抗(220Ω)
Akizuki : http://akizukidenshi.com/catalog/g/gR-25221/

ブレッドボードとケーブル
Akizuki : http://akizukidenshi.com/catalog/g/gP-00315/
Akizuki : http://akizukidenshi.com/catalog/g/gC-05371/

半固定抵抗(ボリューム)とは

手っ取り早く理解したい方は マルツのボリュームのページを参考にするといいと思います。

半固定抵抗は抵抗の値を自由に変えられる抵抗の一種です。記号は抵抗に斜め矢印のマークが使われ、回路図では図2段目のように抵抗の真ん中から一本別の線が出ている状態になります。
この位置を変えることで、図の1-2間や1-3間の電位差を変える。つまりは2の電位を変えることができます。
実際には図のように抵抗RR_1R_1に分割するようなものですね。

中学か高校の物理の知識ですが、キルヒホップの法則、あるいはオームの法則から、流れる電流をIとおけば、

(1)   \begin{equation*}V_0 - IR_1 - IR_2 = 0\end{equation*}

ですが、

点2 の電位はV_0より抵抗1だけ低い位置、あるいはGNDより抵抗2だけ高い位置にあるので、

(2)   \begin{eqnarray*}V &=& V_0 - IR_1 \\&=& IR_2\end{eqnarray*}

ですので、電位は

(3)   \begin{equation*}V &=& \frac{R_2}{R_1 + R_2}V_0\end{equation*}

ですね。

つまり、抵抗の位置を変えることで電位を変えれることができます。
どちらかの端にある場合はR_1= 0R_2= 0 になるので、0からV_0の間の値をとることができるというわけですね。

半固定抵抗にはAタイプ、Bタイプ、Cタイプと呼ばれるものがありますが、ここではBタイプを用います。

Arduinoボード

前回同様にLEDをPWM制御できる3番ピンにつなぎます。
半固定抵抗は1-3端子はそれぞれ5VとGNDにつなぎ、2番端子をAnalog In端子につなぎます。今回はA0番ピンにつなぎました。

Arduino IDE

コードの全体

//FADER & LED

int const LED = 3;
int const FADER = A0;

int val;

void setup() {
  pinMode(LED,OUTPUT);
  pinMode(FADER,INPUT);
}

void loop() {
  val = analogRead(FADER) >> 2;
  analogWrite(LED, val);
}

今回は説明する箇所がほぼ皆無ですね。

analogRead()はArduinoにあるアナログインピンから電位を読み取る命令です。ので、Arduino Unoの場合A0ピンからA5ピンのI/Oピンに対して有効です。

ArduinoのanalogRead()は0から1023までの1024段階(10bit)で動作します。
analogWrite()は256段階(8bit)でしたので、analogRead()で読み取ったものをそのままanalogWrite()には直接渡せません。

そのためビット演算子>>で2bit分の右シフトを行ったものを渡します。 これは4で割ることと(ほぼ)同義です。

これで、フェーダーから読み取った値をLEDに送ることで、LEDの調光が可能になりました。

ついでに

void setup() {
  pinMode(3,OUTPUT);
}
void loop() {
  analogWrite(3, analogRead(A0) >> 2);
}

pinModeは初期で入力が指定されていることと、変数の宣言をせずに直接渡すこと、コメントを書かないことで、コードは簡略化できます。

短いコードを書くことも大切ですが、後々に見返したときにわかるように書くことも大事です。
どっちがいいかは知らないですが。

まとめ

今までのdigitalRead()digitalWrite()analogRead()analogWrite()の組み合わせで様々な入出力ができるようになりました。
多くのI/O処理はこの4つを組み合わせて行なっているので、これをマスターすればもうArduinoで様々なことができるようになりますね。

Arduinoカテゴリの最新記事