2022/01/27

Arduino: タクトスイッチ押下を外部割込みで検出し,LEDの点滅方向を切り替える

概要

Arduinoに4個のLEDを接続し,このうち1個のみを順番に点灯させます. LEDの点灯順序は左方向または右方向で,タクトスイッチを押下することで方向が切り替わります. タクトスイッチの押下は,立ち下がりエッジで外部割込みを発生させて検出します.

初期点灯順序 右方向
点滅周期 [ミリ秒] 1000

デモ

先に実行例をどうぞ. LEDは左から順に,ソースコード上のLED4,LED3,LED2,LED1です. 黒色のタクトスイッチがSW_PINに接続されています.

開発環境

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

回路

回路図

デジタルピン9番, 10番, 11番および12番にLEDを接続してください.なお,LEDはHIGH出力で消灯,LOW出力で点灯するように配線しているので注意してください. 逆にしたい場合は,ソースコードの82行目の定義の0と1を入れ替えます. Arduinoのピン配置については,公式Webページを参照してください.

回路図

回路部品

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

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

ソースコード

GitHub Gistにて公開します.

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

  • 38行目の関数はタクトスイッチ押下による外部割込み発生時に実行され,LEDの点滅方向を切り替えます.チャタリング対策として外部割込み処理の前回実行時刻を変数sw_prev_timeに格納しておき,その時刻から変数sw_ineffective_time以上の時間が経過していた場合のみにLEDの点滅方向が切り替わります
  • 61行目はLEDの点滅状態を更新する関数です.変数ledsの下位4bitがLEDが接続されたデジタルピンの状態を示しており,この状態をdigitalWrite()関数で各デジタルピンに反映しています
  • 74行目が外部割込み処理の設定です.詳細は,公式Webページを参照してください.第1引数はINT.0,デジタルピン2番を示します.第2引数では割込み発生時に実行する関数を指定します.第3引数は割込み発生のトリガーを指定するもので,今回は立ち下がりエッジです

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

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

製品紹介

0 件のコメント:

コメントを投稿