ボタンを押している長さに応じてふわっとLチカ【マイコンLチカ道場 Arduino編 1-6】

PWM幅をボタンを押している間増加させている波形Arduino
スポンサーリンク

はじめに

このページは「マイコン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チカに挑戦していきましょう。

このページの実験は下記の製品で試すことが出来ます。
Arduino Uno Rev3 アルドゥイーノ ウノ ATmega328P【正規代理店品】プログラミング ロボット 電子工作 アルデュイーノ 正規品 アルディーノ 電子パーツ 電子工作キット
Arduinoオフィシャルストア
初めての方は正規品か、互換品でもUSB-シリアル変換にAtmega16U2が使われているものがオススメです。安価な互換品はCH340G等が使われており、トラぶると面倒かもしれません。
Arduino電子工作
スポンサーリンク
このページをシェアする
のぶをフォローする
スポンサーリンク
スポンサーリンク
のぶらぼ
タイトルとURLをコピーしました