第1回:電子部品を動かそう!
第2回: Arduinoの準備
第3回:デジタル出力でLEDを点灯制御しよう
※この記事は2019年7月25日に公開した記事を再編集し、2022年3月25日に再度公開しました。
デバプラでは、Arduinoのさまざまな応用や作品例をご紹介していますが、どんなものを作るにも大事なのは基礎知識!
ということで、今回あらためてお届けするのは、Arduino(アルディーノ)電子工作の基本の「キ」。教えてくれるのは、『これ1冊でできる!Arduinoではじめる電子工作 超入門』などの入門編の書籍でも有名な、福田和宏さんです。
◆
前回まではArduinoのデジタル出力に接続したLEDに、HIGH(5V)またはLOW(0V)を掛け、LEDの点灯、消灯を切り替えられるようにしました。
しかし、デジタル出力は2つの状態でしか出力できないため、明るさを調節するといった制御ができません。
この際活用できるのが「PWM」出力です。HIGHとLOWの状態を繰り返しきり変えて出力することができ、LEDの明るさの調節などに利用できます。
今回はPWMを使ってLEDの点灯する明るさを調節する方法を説明します。また、PWM出力を利用し、じわっとLEDが点灯するプログラムの作り方についても説明します。
目次
デジタルでは明るさ調節ができない
LEDは流れる電流によって明るさが変化すると前回説明しました。例えば、LEDに接続する電流の量を調節するための抵抗が330Ωの場合と10kΩの抵抗を接続する場合では、抵抗が小さな330Ωを接続した場合の方が電流が多く流れ、LEDが明るく点灯します。または、LEDに接続する電源電圧を変えることでも流れる電流の量が変化します。
5Vの電圧と3.3Vの電圧をかける場合では、5Vの電圧をかけた場合の方が明るく光ります。前回説明したLEDに流れる電流と抵抗の関係を表した式から、明るく点灯させたいならば「抵抗を小さくする」または「電圧を大きくする」のいずれかの状態に変化できれば良いこととなります。
しかし、Arduinoのデジタル出力は、HIGH(5V)またはLOW(0V)の2通りしか出力できず、そのまま接続しても電圧や抵抗の値を変化させることはできません。つまり、LEDの明るさは調節できないこととなります。ただし、HIGH、LOWの2通りしか出力できなくても、工夫次第でLEDの明るさを変化させることが可能です。
デジタル出力でLEDの明るさを変化させる
デジタル出力だけでLEDの明るさを変化させてみましょう。明るさはLEDを点滅させることで調節が可能となります。手順を追って実際に動かして、LEDの明るさが変化することを確かめてみましょう。利用した電子部品は、第2回で使ったLEDや抵抗と同じです。次のようにLEDを接続します。この際、LEDは、Arduinoのデジタル5番端子に接続します。
次に以下のようにプログラムを作成してArduinoに転送します。すると、LEDが1秒間隔で点滅するようになります。
プログラムでは、11行目の「digitalWrite( LED_PIN, HIGH )」でHIGHを出力してLEDを点灯した後、12行目の「delay( ON_TIME )」で指定した時間だけ待機しています。時間はミリ秒単位で指定するようになっており、1000と指定すれば1秒間LEDが点灯していることとなります。
次に14行目の「digitalWrite( LED_PIN, LOW )」でLOWを出力してLEDを消灯した後、15行目の「delay( OFF_TIME )」で指定した時間だけLEDを消灯します。これを繰り返し実行することでLEDが点滅するようになっています。
では、点灯、消灯している時間を短くしてみましょう。3行目の「const int ON_TIME」で点灯の時間、4行目の「const int OFF_TIME」で消灯の時間を変えられます。両方の値を「500」に変更し、プログラムを転送してLEDの状態を確認します。すると点滅の速度が速くなります。続いて、「250」、「100」、「75」、「50」・・・と値を小さくしてゆくと点滅速度が速くなり、「10」程度になると常時点灯しているように見えます。人間の目はあまりにも点滅が速いと、目が追いついていかなくなり常時点灯しているように見えてしまいます。
次に、点灯と消灯している時間の割合を変化させてみます。「ON_TIME」、「OFF_TIME」をどちらに「10」に設定します。次に、「ON_TIME」の値を「9」、「8」、「7」・・・「1」と順に変更してLEDの点灯状態を確認してみます。すると、数値を小さくするとLEDが段々と暗くなるのが分かります。
これは、LEDの点灯している時間が短くなり、発光する量が少なくなるため暗く見えています。つまり、「点灯している時間」を変化させてもLEDの明るさを調節できると分かります。この方法を利用することで、点灯、消灯しか制御できないArduinoのデジタル出力だけでもLEDの明るさを制御できるようになります。
PWMで明るさを調節する
前述したように、HIGHとLOWの割合を調節して短い周期で点滅をすればLEDの明るさを調節できます。しかし、独自に点滅プログラムを作成して制御するには現実的ではありません。他のプログラムの処理に時間がかかってしまうと、点滅する間隔がずれてしまい、明るさが変化してしまうためです。
Arduinoでは、HIGHとLOWを周期的に出力できるPWM(パルス幅変調:Pulse Width Modulation)が利用できます。PWMは指定した割合でHIGH、LOWを周期的に切り替える機能で、前述したようなLEDの明るさ調節などに活用できます。
ただし、ArduinoでPWMに利用できる端子が決まっています。端子の数字の横に「〜」マークが付いている端子(3、5、6、9、10、11番端子)がPWM出力が可能です。そのほかではPWM出力できないので注意しましょう。
また、PWMはArduinoのマイコン上で発生させるため、プログラムの動作に影響が無く安定した出力ができるのが特徴です。
ここでは、5番端子にLEDを接続して試してみます。前述した回路と同じようにLEDを接続しておきます。
次に以下のようにプログラムを作成してArduinoに転送すると、LEDが薄暗く点灯します。
PWMで出力する場合は、6行目の「pinMode()」で対象の端子を出力モードに設定しておきます。実際に出力する場合は、10行目の「analogWrite()」を利用します。対象の端子番号を指定し、その後にHIGHにしている割合を0から255の範囲で指定します。「0」にすると常にLOWが出力され、「255」にすると常にHIGHが出力されます。「127」とすればHIGHとLOWが半々の割合で出力されるようになります。
このプログラムでは、3行目の「const int DUTY」でPWMの割合を指定できるようにしています。この値を変更してLEDの明るさが変化するのを確かめてみましょう。
じわりとLEDを点滅させる
PWM出力して、LEDの点灯方法も広がります。そこで、PWMを徐々に変化させ、LEDがじわりと明るくなる効果を実現してみましょう。
以下のようにプログラムを作成します。
プログラムでは、loop()関数内で利用する「i」変数にPWMの割合を格納して、徐々に値を増やすようにしてLEDが徐々に明るくなるようにしています。
14行目のwhileの処理では、iが255に達するまで値をSTEPで指定した値ずつ増やしています。増やした値は15行目のanalogWrite()で出力してLEDの明るさを変化させています。また、16行目のPWMの出力を変更するごとにWAITTIMEで指定した時間だけ待機するようにしています。
255まで達したら、逆に0に達するまでPWMの割合を減らして、徐々に暗くなるようにしています(21〜25行目)。3行目のWAITTIMEや4行目のSTEPの値を変更することで、点滅速度を変化させることが可能です。
今回は、LEDの明るさを制御できるようにしてみました。次回は大きな電流が流れるモーターの制御方法について説明します。
——————————————————————————————————————–
※LEDに関する基礎知識をもっと知りたい方はROHM「エレクトロニクス豆知識」をチェック!
今回の連載の流れ
第1回:電子部品を動かそう!
第2回: Arduinoの準備
第3回:デジタル出力でLEDを点灯制御しよう
第4回:LEDの明るさを調節する(今回)
第5回:モータを動かし自動制御する
第6回:スイッチの状態を読み取る
第7回:アナログ入力で電圧を読み取る
まとめ:Arduino電子工作のまとめ! マイコンを使った電子工作基礎の基礎編