Arduinoに可変抵抗器(ポテンショメータ)を取り付けて、サーボモーターを制御する方法を以前の記事、「Arduinoと市販のロボットアームでロボット制御の基本を学ぼう」で紹介しました。
可変抵抗器を使った制御はLEDにも応用できます。
LEDなどの光を出すデバイスの明るさを調整(制御)することを「調光」と呼び、一般的に可変抵抗器(ポテンショメータ)を使用します。
本記事では、Arduinoを使ってLEDの調光がどのようなものか試してみます。
目次
- LEDの動作原理と2種類の調光
- 準備
- 可変抵抗器でLEDに流れる電流を調整し調光
- ArduinoのA/D変換とPWMを使ったLEDの調光
- 構成
- 配線
- スケッチ全体
- ArduinoのA/D変換を使った可変抵抗器の読み取り
- ArduinoのPWMをDACの代わりに使用しLEDを調光
- まとめ
1. LEDの動作原理と2種類の調光
ほとんどの電子機器は、電源のON/OFFや機能の動作状況を表示するためにLEDを使用しています。これは、マイコンボードのデジタル出力端子にLEDをつなげて、プログラムからON/OFFを切り替えることで実現できます。皆さんも「Lチカ」の実験などで試したことがあるでしょう。
今回は、単純なON/OFFではなく、LEDの明るさを調整(調光)してみます。
最初に、LEDの動作原理を理解しておく必要があります。
LEDは、内部の半導体に電流が流れる際に作り出されるエネルギーを光として放出する電子部品です。そのため、どの程度の電流が流れるかによってLEDの明るさは決まります。ただし、過大な電流を流すと破損してしまうので、LEDを使用する際は、抵抗を使って流れる電流を制限します。
一般的なLEDを5Vの電源で明るく光らせるには、220Ω程度の抵抗を使用し、抵抗値が大きくなるにつれLEDは暗くなります。
LEDを調光する方法は二通りあります。
1つめは「可変抵抗器でLEDに流れる電流を調整し調光」する方法、2つめは「ArduinoのA/D変換とPWMを使ってLEDを調光」する方法です。
本記事では、この二通りの方法を実験します。
どちらの方法も可変抵抗器を使用し、シャフトの回転量に合わせてLEDの明るさが変化します。
可変抵抗器の仕組みは以前の記事、「Arduinoと市販のロボットアームでロボット制御の基本を学ぼう」を参照してください。
2. 準備
本記事では、二通りの調光方法を実験します。
次のものを用意してください。
Arduino Uno
Arduino IDE
ブレッドボード
抵抗
220Ω(LEDの破損防止用)
可変抵抗器
可変抵抗器は、どのようなものでも使用できます。シャフトが回転するタイプよりスライダー形式の方が調光器らしいかもしれません。本記事ではシャフトが回転するタイプを使用します。
最初の「可変抵抗器でLEDに流れる電流を調整し調光」する実験では、ArduinoボードとArduino IDEは使用しません。
ブレッドボードに電源を直接接続して実験を進めます。5Vの電源を用意してください。これ以上の電圧だとLEDが破損する場合があります。
ブレッドボード用電源ボードのような製品があると、電源とブレッドボードを接続しやすくなります。
電源の接続方法が「DCジャック」のものや「USBコネクタ」のものなど、さまざまな製品があります。手持ちの電源に合わせて選定してください。
3. 可変抵抗器でLEDに流れる電流を調整し調光
最初の実験ではArduinoを使用せず、可変抵抗器の抵抗値が変化させて、LEDの様子を直接確認してみます。
それでは始めましょう。ブレッドボードを用意して、次のように配線してください。
- ブレッドボードの電源ラインに電源を接続。(電源ライン[+]には5Vを、電源ライン[-]にはグランドを接続。)
- 電源ライン[+]に、可変抵抗器の1番を接続。
- 可変抵抗器の2番を、LEDの長い方の端子に接続。
- LEDの短い方の端子に、抵抗(220Ω)の片方のリード線を接続。
- 抵抗のもう一方のリード線を、電源ライン[-]に接続。
電源をONにすると、LEDが点灯します。
可変抵抗器のシャフトを回転させると、回転量に合わせて回路を流れる電流が変化します。その結果、LEDを通過する電流が変化するので、増減する電流に合わせてLEDの明暗が変化します。
この実験の回路は、最もシンプルな調光器の構造と同じです。
可変抵抗器の抵抗値は、シャフトの動作に合わせて0Ωから定格の抵抗値まで変化する電子部品です。
LEDの短い方の端子に接続した220Ωの抵抗は、LEDが最も明るく光る時の電流を決定すると同時に、LEDの破損を防止するように機能しています。
LEDの破損を防止する抵抗がないと、可変抵抗器の抵抗値が0Ωの際、LEDの電流を制限できず大電流によって破損してしまいます。
220Ωの抵抗によって、回路に接続された抵抗値の合計は、220Ωから220Ω+可変抵抗器の定格Ωの範囲で変化します。
4. ArduinoのA/D変換とPWMを使ったLEDの調光
「可変抵抗器でLEDに流れる電流を調整し調光」する方法を理解したら、スケッチから調光する実験に移ります。
構成
「ArduinoのA/D変換とPWMを使ったLEDの調光」では、可変抵抗器の抵抗値の変化がLEDの明るさには直接影響しません。
Arduinoボードのアナログ入力ピンに接続した可変抵抗器の回転量は、A/D変換の機能を使って0〜1023の整数値(1024段階)としてスケッチに送られます。
スケッチは、その値に比例するように、PWMの機能に0〜255の整数値(256段階)を設定することで、デジタル入出力ピンに接続したLEDの明るさを変化させます。
配線
「ArduinoのA/D変換とPWMを使ったLEDの調光」はArduinoを使用します。先ほど実験に使った回路を次のように変更してください。
- ブレッドボードの電源ラインを、電源からArduinoに変更。(電源ライン[+]には5Vピンを、電源ライン[-]にはGNDピンを接続。)
- LEDの長い方の端子を、可変抵抗器の2番の代わりに、Arduinoのデジタル入出力ピンの6番に接続。
- 可変抵抗器の1番は、そのまま。
- 可変抵抗器の2番を、Arduinoのアナログ入力ピンのA0に接続。
- 可変抵抗器の3番を、ブレッドボードの電源ライン[-]に接続。
スケッチ全体
作成するスケッチは以下の通りです。このスケッチの動作は、最初の実験と同じで、可変抵抗器の回転に合わせてLEDの明るさが変化します。
int blueLED = 6; int dimmerPIN = A0; int dimmerValue = 0; int ledValue = 0; void setup() { pinMode(dimmerPIN, INPUT); pinMode(blueLED,OUTPUT); Serial.begin(9600); } void loop(){ dimmerValue = analogRead(dimmerPIN); ledValue = map(dimmerValue, 0, 1023, 0, 255); analogWrite(blueLED, ledValue); }
ソースコードに難しい点はないと思います。
最初に変数の定義とピン番号の設定を行い、setup()関数でピンの動作を指定します。その後、loop()関数で可変抵抗器の読み取りとLEDの出力を行います。
ArduinoのA/D変換を使った可変抵抗器の読み取り
loop()関数の中で、可変抵抗器の回転量を読み取る部分を抜粋します。
dimmerValue = analogRead(dimmerPIN);
この一行で、アナログ入力ピンのA0に接続した可変抵抗器の電圧を読み取り、A/D変換によって0〜1023の整数値として変数dimmerValueに格納します。
ArduinoのPWMをDACの代わりに使用しLEDを調光
Arduinoは可変抵抗器の回転量を0〜1023の整数値で読み取ります。それに比例してLEDの明るさを制御するには、0V〜5Vの電圧を0〜1023の1024段階で設定するのが理想的です。
一般的に、電圧をアナログ的に変化させるには『DAC(「D/A変換」「D/Aコンバーター」とも呼ばれます)』と呼ばれるマイコン内のモジュールや外付けのICを使用します。
ただしこのDACは、A/D変換と異なり回路が複雑なため、一般的にマイコンには搭載されません。ArduinoにもDACを搭載したArduinoボードはなく、使用したい場合は別途、シールドなどを追加する必要があります。
そこでLEDの調光をDACなしで簡単に行う方法として、Arduinoボードに標準で搭載されているPWM(Pulse Width Modulation)の機能を使用します。
PWMは、設定された数値に応じて電圧が変化するのではなく、PWMが搭載されているデジタル入出力ピンの出力を高速でON/OFFする機能です。
接続したLEDも高速でON/OFFしますが、人間の目にはONし続けているように見えてしまうことを利用します。
明るさを調整するには、設定される数値に応じて、ON/OFFする時間の比率(デューティー比)を変更します。OFFしている時間より、ONする時間の方が長ければ長いほど、明るさが増して見え、反対にONしている時間よりOFFしている時間が長ければ、より暗く光ります。
loop()関数の中で、実際にLEDに明るさを設定している部分を抜粋します。
ledValue = map(dimmerValue, 0, 1023, 0, 255); analogWrite(blueLED, ledValue);
Arduinoに搭載されているPWMに設定できる値は0〜255の整数値です。
そこで1行目で、可変抵抗器から読み取った0〜1023の値を、PWMの設定範囲に合った0〜255の値に比率を維持したまま変換します。
map()関数の引数には4つの数字が並んでいます。この後ろの2つの数字を変更すると可変抵抗器の回転量にあったLEDの明るさが変わります。
設定できる範囲は0〜255です。0はLEDが消灯した状態なので、LEDを完全にOFFしたくない場合は、この数値を大きくします。また、255はLEDが最も明るく光る状態です。数値を小さくすると、LEDの点灯を暗くできます。
2行目は、LEDがつながるデジタル入出力ピンの6番のPWN機能に、1行目で変換した値を設定しています。
5. まとめ
今回は、LEDを調光する2つの方法を紹介しました。
1つめの「可変抵抗器でLEDに流れる電流を調整し調光」する方法の方が回路は簡単です。しかし、Arduinoのようなマイコンボードが利用できる場合は、2つめの「ArduinoのA/D変換とPWMを使ってLEDを調光」する方法をお勧めします。
1つめの方法だと、可変抵抗器の回転量と、実際のLEDの明るさの対応を変更するための抵抗を変更する必要があります。ブレッドボードを使った実験では、抵抗の交換は簡単ですが、実際の機器に組み込んだあとだと簡単な作業ではありません。
2つめの方法では、スケッチの量が若干増えますが、あとで明るさの対応を変更するのは簡単です。実用的な電子機器ではよく利用されるテクニックなので、マスターすると電子機器の設計の幅が広がるでしょう。