はじめに
このページは「マイコンLチカ道場 Arduino編」の「1-6:ボタンを押している長さに応じてふわっとLチカ」に対応するページです。PWM幅をボタンを押している時間に応じて増加させて、ふわっとLEDを点灯させるような動作をさせてみます。
今回も、前回と同様にMsTimer2ライブラリを使用して、割り込みでスイッチ入力を使う方法を試してみました。
回路図とブレッドボード接続図
今回の回路図・接続も前回「ふわっとLチカをスイッチでオンオフ」と同じです。
1個の青色LEDと、1個のタクトスイッチを使用します。プルアップ抵抗は内蔵ではなく、外付けとしています。
ピン9に並列で追加しているコンデンサと抵抗は、PWM波形を鈍らせてオシロで見るためのCRフィルタです。(C=1μF、R=10kΩ)オシロで見ない場合は無くても問題ありません。
プログラム(スケッチ)を書いてみる
今回のプログラムは下記になります。
#include <MsTimer2.h>
const int LED1 = 9; //LEDを接続するピン(PWM出力490Hz:3,9,10,11、980Hz:5,6)
int led_width = 0; //ledのPWM幅用の変数
const int SW1 = 2; //スイッチを接続するピン
int sw_state = HIGH; //スイッチの状態保存用の変数
void setup() {
pinMode(LED1, OUTPUT); //LED1ピンを出力にする
pinMode(SW1, INPUT); //SW1を入力に設定
MsTimer2::set(10, sw_time); //10ms毎に関数sw_timeを実行
MsTimer2::start(); //割り込み有効
}
void loop() {
}
void sw_time(){
sw_state = digitalRead(SW1); //SW1の状態を読み込み、sw_stateに代入
if (sw_state == LOW && led_width < 255){ //スイッチONかつled_widthが255未満の場合
led_width +=1; //led_widthを1増やす
}
if (sw_state == HIGH && led_width > 0 ){ //スイッチOFFかつled_widthが0より大きい場合
led_width -=1; //led_widthを1減らす
}
analogWrite(LED1, led_width); //LED1をPWMで点灯させる
主な動作説明はコメント文に記載しています。今回もミリ秒単位で指定した時間で関数を呼び出すことが出来る、MsTimer2ライブラリを使用しています。(詳細は前回の記事を参照ください)
「MsTimer2::set(10, sw_time)」で10ms毎に関数sw_timeを実行させています。
ここで、スイッチが押されていると変数led_widthを1増加、押されていないとled_widthを1減少させるような処理をしています。led_widthの変化幅は0~255で、それがLEDのPWM幅となっています。
10ms毎に割り込みを発生させてled_width増減させるので、明るさMAXまで約2.55秒となるはずです。
「analogWrite(LED1, led_width);」をメインのloop内に記載しても動きましたが、led_widthが更新されてないのにずっと実行し続けるのは無駄だろうと思い、関数sw_timeの中に入れてみました。
これによってメインのloop文は空っぽになってしまいました。こういうのもアリなんですね。
動作確認
下記が実際に動作させたときの波形になります。
スイッチを押すまではLEDは消灯しており、押すとゆっくり光り始めます。押し続けると約2.5秒で明るさはMAXになってそこからは一定で光り続けています。
Ch3のフィルタ後の波形では、PWM信号をCRフィルタを通して鈍らせることで、PWM幅の変動をアナログ値のような感覚で見ることが出来ます。
スイッチを離すと、こんどはLEDが徐々に暗くなっていきます。約2.5秒で完全に消えてしまいました。その時の波形が下記になります。
今度は、スイッチを短く押して離してみました。LEDは徐々に光り始めますが、離したタイミングで暗くなり始めて最後には消えます。その時の波形が下記になります。
まとめ
PWM幅をボタンを押している時間に応じて増加させて、ふわっとLEDを点灯させるような動作をさせてみました。今回も、MsTimer2ライブラリを使用して、割り込みでスイッチ入力を使う方法を試してみました。
引き続き難しいLチカに挑戦していきましょう。