2020年8月22日土曜日

Arduino向けのボタン管理クラスを作ってみた


背景

ArduinoのGPIOを利用してボタンを実装する際に、ボタンが押された時だけ検知したい場合、過去の状態や状態の変化時間を保持したりする必要があり結構手間です。
プロジェクトごとに必要な機能を実装することで対応してきましたが、面倒になってきたのでライブラリとしてまとめてみました。

使い方を紹介します。

使ったもの

  • Arduino IDEをインストールしたPC
  • ProMicro + microUSBケーブル
  • ブレッドボード
  • ボタン
  • LED
  • 抵抗
  • ジャンパワイヤ


ライブラリをインストール

ライブラリマネージャー(スケッチ -> ライブラリをインクルード -> ライブラリの管理で 開けます)からbutton_asukiaaaをインストールしてください。


回路の準備

ボタンを10ピンとGNDに接続しました。
LEDのアノード(+)を9ピンに接続し、カソード(-)は1kΩの抵抗を経由してGNDに接続しました。


プログラム

LEDのピンの割り当て以外はサンプルプログラムと同じです。
ProMicroには13番に割り当てられているLEDが無く、13番ピンも引き出されていないので、9番ピンでLEDを光らせます。
ProMicroの内蔵LEDを制御できはするのですが、外付けのLEDを光らせる方が分かりやすい見た目になるので、LEDを外付けしています。)

#include <button_asukiaaa.h>

#define PIN_BTN 10
#define PIN_LED 9

button_asukiaaa::Button btn(PIN_BTN);

void setup() {
btn.begin();
pinMode(PIN_LED, OUTPUT);
Serial.begin(9600);
}

void loop() {
btn.update();
if (btn.changedToPress()) {
Serial.println("pressed");
} else if (btn.changedToRelease()) {
Serial.println("released");
}
digitalWrite(PIN_LED, btn.isPresseing());
}

要所を説明します。

ボタンのピン情報を渡しつつボタンを定義します。
#define PIN_BTN 10
button_asukiaaa::Button btn(PIN_BTN);

ボタンに利用するピンを初期化する必要があるので、setupでbeginを実行します。
void setup() {
btn.begin();
// ..
}

loop内でupdateを呼ぶことで、ボタンのピンの状態を確認します。
void loop() {
btn.update();
// ..
}

ボタンの状態が変わった時だけ何かしたいときは、changedToPresseやchangedToReleaseを利用することで実現できます。
このプログラムでは、押された時に「pressed」を、話された時に「released」をシリアルポートに送信します。
  if (btn.changedToPress()) {
Serial.println("pressed");
} else if (btn.changedToRelease()) {
Serial.println("released");
}


ボタンの状態によって動作を変えたい時は、isPressingやisReleasingを利用することで実装できます。
このサンプルプログラムでは、押された時だけLEDを接続するピンの電位を上げてLEDを光らせています。

  digitalWrite(PIN_LED, btn.isPresseing());

動作確認

ProMicroにプログラムを書き込み、シリアルポートで出力を見ながら動作を確認します。

ボタンを押すとpressedが送信され、離すとreleasedがシリアルポートに送信されます。
ボタンを押している間LEDが光ります。



まとめ

ライブラリで定義したボタンのクラスを利用することで「ボタンの状態が変わった時」の実装を楽にできました。

更新履歴

2020.10.11
ボタンの機能をutils_asukiaaaからbuttons_asukiaaaに独立させたので、後者のライブラリを使う説明に変更しました。

0 件のコメント :