パソコン・スマホ備忘録

パソコン、スマホ、マイコン、家電などの備忘録と日記。使えるところを簡潔に解説!

Arduino

Arduinoでボリュームを使ってLEDを調光する。PWM(Pulse Width Modulation)

2019/07/25

ArduinoのPWM(Pulse Width Modulation)でLEDを調光してみます。その時のLEDの両端をオシロスコープで観察して、調光や電力量を視覚的に捉えたいと思います。 PWMは出力に応じてクロックパルスの幅(デューティ比)を変えることで平均電力を変化させることができます。周波数は490Hz固定ですがアナログ的な出力を得ることができます。使えるピンはArduino UNOの場合デジタルピン3, 5, 6, 9, 10,11で数字の前に「~」が付いています。今回は視覚的に分かりやすくするためオシロスコープで波形を見てみました。

回路図(クリックすると大きな画像を見れます)

66c19942ab4ba346fdb64ccc04cde373-3

配線図

44d29d2792be3bad9a9ed98c7bbb20d6

スケッチ
/*
 * ボリュームでLEDを調光する
 */
int Value1; //整数型でValue1を定義。
void setup() { //特に設定することがなくても入れておきます。
}
void loop() {
  Value1 = analogRead(0) ; // ボリュームからの値を読んでいます。0~5Vを1024段階で読みます。最大値は1023になります。
  Value1 =  Value1 / 4;    // 4で割って最大値が255を超えないようにしています。(実験した結果1023/4=255.75で端数切れ捨てで大丈夫でした)因みに3で割るとオーバーフローして途中でLEDが暗くなります。
  analogWrite(3, Value1) ;  // LEDに256段階で書き込みます。
}

Arduinoの開発環境の基はC言語です。プログラムの書き方もほぼC言語でが初心者にも分かりやすいように工夫されています。C言語で使うmain()はArduinoソフトウェアから呼び出されるので書く必要はありません。高度なレジスタ操作なども隠されていて難しいことは考えずに即プログラム(スケッチ)が書けるようになっています。絶対にやらなければならないのは二つだけ。一つはsetup()で、もう一つはloop()です。setup()は、Pinの入出力の指定など最初に一度だけ実行される関数です。その後、loop()の部分が無限に実行されます。 スムーズな調光です! PWM(Pulse Width Modulation)をオシロスコープで見るとこうなります。

このようにPWM(Pulse Width Modulation)を使えば、デジタル回路でもアナログ的な表現をすることができます。また直流電圧を変化させて調光をするよりもPWMを使ったほうがスムーズに調光できると思います。理由は直流電圧の場合LEDの発光っとともにLED自体の抵抗料が変化し流れる電流が電圧に対して直線的に変化しないためです。それに対して流れる電流に関係なく一定の電圧でパルスの幅を変えるなら、実際に流れる電流の影響をあまり受けずに済むからです。 直流で制御するメリットは「フリッカーフリー」ということです。つまり点滅しない持続した光です。一方PWMの場合は人間の目には認識できませんがフリッカーが発生してしまいます。この細かいチラツキはビデオカメラで取った場合機材によっては周期的な干渉が発生し、一定間隔で点滅しているように映ってしまいます。初期状態では周波数は490Hz固定なのでそれほど速い点滅ではありません。周波数をもっと上げられればこうしたフリッカーの問題は解決できると思います。 実際490Hzというのは基本のクロックを分周させてできた周波数なので、その分周比を変えれば大丈夫だと思います。まだ検証はしていませんが、Arduinoでは分周比を変えられるようです。これは今後の課題で実験してみたいと思います。

-Arduino