2021/12/01

Arduino: タクトスイッチが押されたらLEDを5回点滅させる

概要

Arduinoに接続されたタクトスイッチ(ボタンスイッチ)が押下されたとき,LEDを5回点滅させてその後は再びボタンスイッチが押下されるまで消灯状態を維持するプログラムを紹介します. ボタンスイッチの押下判定方法や一定回数同じ処理を繰り返す方法の参考になれば幸いです.

デモ

先に実行例をどうぞ.

開発環境

Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン2番にボタンスイッチを接続してください.なお,ボタンスイッチはActive Lowとしています.つまり押しているときはLOW,離しているときはHIGHです. デジタルピン12番にLEDを接続してください.なお,LEDはHIGH出力で消灯,LOW出力で点灯するように配線しているので注意してください. LEDをHIGH出力で点灯,LOW出力で消灯にしたい場合は,ソースコードの14行目と15行目の定義を入れ替えます. Arduinoのピン配置については,公式Webページを参照してください.

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円 (互換品)
SW1 ボタンスイッチ 各社 1 10円 (互換品)
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円 (互換品)
LED1 LED 各社 緑色 1 10円 (互換品)
その他 リード線など 適量

ソースコード

GitHub Gistにて公開します.

実行例で使用しているソースコードでは,LEDを下記のような設定で点滅させています.

番号 発光色 周期 [ミリ秒] 点灯時間 [ミリ秒] 消灯時間 [ミリ秒] 点滅回数 [回]
LED1 1000 500 500 5

簡単にソースコードを説明します.

ボタンスイッチについては20ミリ秒周期(INTERVAL_TIME)状態(btn_val)を確認し,2回連続(BTN_COUNT_THRESH)で同じ状態(btn->last_val)だった場合その状態をボタンスイッチの状態(btn->state)としています. これはボタンスイッチのチャタリングによる誤動作を低減するための処理です.

LEDの点滅状態を列挙型で表現しています(LED_BLINK_STATE_E)現在のLEDの点滅状態(led_blinking_state)によって処理を切り替えています初期のLEDの点滅状態はLED_STOP_OFFです. LEDが点滅停止中の場合,つまりled_blinking_stateがLED_STOP_OFFの場合は,led_blinking_startがtrueになるまで状態遷移しません. LEDが点滅中の場合,つまりled_blinking_stateがLED_BLINK_ONもしくはLED_BLINK_OFFの場合は,led_blinking_periodがインクリメントされます.これは何周期同じ点滅状態に留まっているかを示しています.1周期は20ミリ秒周期(INTERVAL_TIME)です. led_blinking_periodが25(LED_BRINK_PERIOD)を超過したとき,つまり20ミリ秒 x 25 = 500ミリ秒を超過したときに状態遷移が発生します. LED_BLINK_ONの場合はLED_BLINK_OFFに遷移します. LED_BLINK_OFFの場合は,LEDの点滅回数(led_blinking_count)がインクリメントされます. led_blinking_countが5(LED_BRINK_COUNT)を超過したとき,LEDの点滅は終了してLED_STOP_OFFに遷移します.それ以外の場合はED_BLINK_ONに遷移します.

セットアップ関数ではボタンスイッチとLEDの初期化を行い,周期実行用の変数に初期値を代入します.

ループ関数では,233行目で現在の時刻を取得しています.現在の時刻と前回に周期実行を行ったときの時刻との差分がinterval_timeを超過した場合は,周期実行を行います.ボタンスイッチの状態を確認し,ボタンスイッチが押下されている場合LEDの点滅を開始します

ArduinoによるLED制御に関する記事

ArduinoによるLED制御を取り上げた,他の記事を紹介します.

製品紹介

0 件のコメント:

コメントを投稿