できること

ArduinoのPWM機能を使ってLEDを調光してみよう

Arduinoに可変抵抗器(ポテンショメータ)を取り付けて、サーボモーターを制御する方法を以前の記事、「Arduinoと市販のロボットアームでロボット制御の基本を学ぼう」で紹介しました。
可変抵抗器を使った制御はLEDにも応用できます。

LEDなどの光を出すデバイスの明るさを調整(制御)することを「調光」と呼び、一般的に可変抵抗器(ポテンショメータ)を使用します。
本記事では、Arduinoを使ってLEDの調光がどのようなものか試してみます。

 

目次

  1. LEDの動作原理と2種類の調光
  2. 準備
  3. 可変抵抗器でLEDに流れる電流を調整し調光
  4. ArduinoのA/D変換とPWMを使ったLEDの調光
    • 構成
    • 配線
    • スケッチ全体
    • ArduinoのA/D変換を使った可変抵抗器の読み取り
    • ArduinoのPWMをDACの代わりに使用しLEDを調光
  5. まとめ

 

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-distance-measurement-02

 

Arduino IDE

arduino-distance-measurement-04

 

ブレッドボード

raspberrypi-gpio-06

 

抵抗

220Ω(LEDの破損防止用)

how-to-control-led-with-arduino-pwm-01

 

可変抵抗器

how-to-control-led-with-arduino-pwm-02

 

可変抵抗器は、どのようなものでも使用できます。シャフトが回転するタイプよりスライダー形式の方が調光器らしいかもしれません。本記事ではシャフトが回転するタイプを使用します。

最初の「可変抵抗器で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行目で変換した値を設定しています。

lets-try-using-arduino-hardware-01

Arduino Unoの外観

 

5. まとめ

今回は、LEDを調光する2つの方法を紹介しました。
1つめの「可変抵抗器でLEDに流れる電流を調整し調光」する方法の方が回路は簡単です。しかし、Arduinoのようなマイコンボードが利用できる場合は、2つめの「ArduinoのA/D変換とPWMを使ってLEDを調光」する方法をお勧めします。

1つめの方法だと、可変抵抗器の回転量と、実際のLEDの明るさの対応を変更するための抵抗を変更する必要があります。ブレッドボードを使った実験では、抵抗の交換は簡単ですが、実際の機器に組み込んだあとだと簡単な作業ではありません。

2つめの方法では、スケッチの量が若干増えますが、あとで明るさの対応を変更するのは簡単です。実用的な電子機器ではよく利用されるテクニックなので、マスターすると電子機器の設計の幅が広がるでしょう。

アバター画像

エレクトロニクスやメカトロニクスを愛するみなさんに、深く愛されるサイトを目指してDevice Plusを運営中。

https://deviceplus.jp

高専ロボコン2015 出場ロボット解剖計画