第13回 スイッチライブラリ

「スイッチライブラリ」を使って、難しいスイッチの処理を簡単なスケッチで実現します。

目次

意外に難しかった「スイッチが押されたことの検知」処理

キーボードを製作するために、「スイッチが押されたことを検知」する必要があるということで、スイッチ制御のスケッチを作りました。

振り返ってみると、意外に難しくて時間がかかってしまいました。アルゴリズムはややこしいですし、変数の扱い方も難しかったですよね。


ところで、スイッチを制御するスケッチってこんなに面倒なの?と思われたかもしれません。

もっとスイッチを簡単に制御できる方法はないのでしょうか?

そもそもスイッチの制御なんて、電子工作の基本中の基本ですよね。

ということはすでに同じようなスケッチを作った人がいるはずです。

このように、よく使われる機能はライブラリが用意されている可能性が非常に高いです。

実は、Arduinoにはスイッチ制御のライブラリが用意されているんです。

最初に言ってよ〜、という感じですが、申し訳ございませんでした。

スイッチ検知のスケッチ作成を通して、基礎編パート1でカバーできなかった項目を説明したかったので、ちょっと回り道してしまいました。


それではスイッチライブラリを使ってスケッチを作成していきましょう!

スイッチライブラリの準備

これからスイッチライブラリをインストールして、ライブラリの使い方を確認していきます。

Arduinoのスイッチライブラリ

Arduinoのライブラリを使うとき、ちょっと迷うことがあります。

今回のスイッチのライブラリや、他にもよく使われているセンサー部品を制御するライブラリを探すと、複数種類見つかることがあります。

このあと、ライブラリマネージャーでスイッチライブラリを検索してインストールしますが、そのときたくさんのスイッチライブラリが見つかります

「スイッチが押されたかどうかを検知する」という機能しかないはずなのに、なぜたくさんの種類があるのか、と疑問に思いますよね。


スイッチライブラリには、単純にスイッチを押されたことを検知するだけのものや、それ以外にもスイッチの長押しを検知できるものもあります。

このように、スイッチライブラリといっても、それぞれ提供されている機能が異なっています

となると、どのライブラリを選べば良いか迷いますよね。

今回は、それぞれのライブラリに付属しているサンプルスケッチを見て、スイッチ制御機能がある程度充実していて使いやすい「Switch」というライブラリを選択しました。

このライブラリは、スイッチが押されたことを検知するだけでなく、スイッチの長押しやダブルクリックを検知する機能が用意されています。(長押しやダブルクリックを検知するスケッチはかなり複雑になりそうですよね)


今回の記事では、このライブラリをインストールして、簡単に使い方の確認をします。

また、テスト用のスケッチを作成して動作確認します。

Switchライブラリのインストール

それではSwitchライブラリをインストールしましょう。

Arduino IDEを起動して、開いているウィンドウの「ライブラリマネージャー」のアイコンをクリックします。

これから「Switch」ライブラリを検索しますが、「Switch」という名前で検索すると、非常に多くのライブラリが検索結果に表示されてしまいます。

そこで、検索欄に「switch dalen」と入力してください。(「dalen」はこのライブラリの作者名です)

おそらくライブラリが1つだけ検索結果に表示されると思いますので、「インストール」ボタンをクリックしてインストールします。(複数見つかった場合は「Switch」というライブラリ名のあとの作者名のところに「by Albert van Dalen」と書かれているライブラリを探してみてください)

次のようになればインストールが完了です!

Switchライブラリの基本的な使い方

スイッチライブラリの基本的な使い方を確認する前に、ライブラリの使い方を復習しておきましょう!

以前、キーボードライブラリを使いましたので、その使い方を簡単に確認しておきます。

キーボードライブラリ使い方復習

ヘッダファイルのインクルード

ライブラリを使用するには、ヘッダヘッダファイルをインクルードする必要があります。

キーボードライブラの場合は、スケッチの先頭に次のように書きました。

#include <Keyboard.h>

このようにに書くと、キーボードライブラリが使用できるようになります。

メソッドを使う

Keyboardオブジェクトが使用できるようになります。

ライブラリは、オブジェクト.メソッドというようにスケッチに書きましたよね。

例えば、Arduino Microをキーボードとして動作させる場合、PCとの接続処理はKeyboardオブジェクトに対して、begin()メソッドを使います。

Keyboard.begin();

キーボードライブラリの場合はこのように利用しますが、Switchライブラリを含む一般的なライブラリはもう1ステップ必要な処理があります

Switchライブラリの使い方を具体的にみていきましょう!

Switchライブラリの基本的な使い方

Switchライブラリは、キーボードライブラリに追加してもう1ステップ処理が必要です。

そこで、キーボードライブラリと対比しながらスイッチライブラリの基本的な使い方を確認していきます。

ヘッダファイルのインクルード

最初はキーボードライブラリと同様、ライブラリを利用するためにヘッダファイルをインクルードします。

それではArduino IDEで新規スケッチを作成してください。ファイル名は「switch_library」としておきます。

今回利用するヘッダファイル名がわからないので、Arduino IDEのメニューを利用しましょう。

Arduino IDEの「スケッチ」メニュー から「ライブラリをインクルード」メニューを選択して、「Switch」を選択します。

選択すると、次のようにスケッチに#defineが自動的に入力されます。

(ヘッダファイルの名前がちょっとわかりづらいですが、最初の「avd」は作者の「Albert van Dalen」さんの頭文字かな、と思います。この方はWebサイトを持っているので、そのSwitchライブラリ、という意味でしょうかね)

これでライブラリを利用する準備ができました!

オブジェクトの作成

ところで、キーボードライブラリは、この時点でKeyboardというオブジェクトが使えるようになりました。

でも、Switchライブラリはすぐにオブジェクトが使えるようになっていないんです。

Switchライブラリがキーボードライブラリと違う点は、

Switchライブラリは自分でオブジェクトを作る必要がある

ということなんです。

Switchライブラリに限らず、他の一般的なライブラリもこのステップが必要になっています。

なぜこのような作業が必要かは次回の記事で詳しく説明します。


それでは、オブジェクトを作成する方法を確認していきます。

オブジェクトを作るには、#include <avdweb_Switch.h>以降のヘッダ部(setup関数より前)に、次のように書きます。

Switch 自分で決めたブジェクト名(スイッチが接続されている端子名);

今回作成するスケッチでは、次の左側のA5番端子に接続してあるスイッチを使用することにします。

これから、このスイッチを制御するためのオブジェクトを作成します。

ちょっとわかりづらいところですが、キーボードライブラリを思い出してみましょう。キーボードライブラリのときは、キーボードとして制御するためにKeyboardオブジェクトが最初から用意されていて、それを使いましたよね。

Switchライブラリの場合は自分でオブジェクトを作る必要があるため、これから左側のスイッチを制御するためのオブジェクトを作成します。

オブジェクトを自分で作る場合、そのオブジェクトの名前は自分で決めることができます。左側のスイッチなのでhidariSwitchにしてみます。

また、このスイッチはA5端子に接続していますので、オブジェクトを作るには、次のように書けばOKです。

Switch hidariSwitch(A5);  // 書き方は Switch オブジェクト名(接続端子名);

このようにするとhidariSwitchという名前のオブジェクトが使えるようになります。

ところで、KeyboardオブジェクトはPCと接続処理をするbegin()メソッドや、文字をPCに送るprint()メソッドが用意されていました。

Switchライブラリにもいくつかメソッドが用意されています。

次に、Switchライブラリの基本的なメソッドを確認します。

メソッドを使う

それではメソッドを確認することにより、Switchライブラリの基本的な使い方を確認していきます。

使い方を説明するだけでは理解が深まりませんので、これから「スイッチが押されたらLEDを50msピカッと光らせるスケッチ」を作成することにします。


Switchライブラリでは、スイッチが押されたかを判定するために次の2種類のメソッドを組み合わせて使用する仕組みになっています。

  1. スイッチ状態の調査を指示するメソッド
  2. スイッチが押されたかどうかを判定するメソッド

ポイントは、スイッチが押されたか判定する前に、必ず「スイッチ状態の調査を指示する」必要がある、という点です。

それでは、それぞれのメソッドについて説明します。

❶ スイッチ状態の調査を指示するメソッド

スイッチ状態の調査を指示するメソッドはpoll()です。引数はありません。

先ほど作ったhidariSwitchオブジェクト、つまり左側のスイッチの状態の調査を指示する場合は以下のように書きます。

hidariSwitch.poll();

「poll」ってあまり聞きなれない英語かもしれませんが、日本語では「調査」などの意味です。

このメソッドは「スイッチ状態を調べてください」という指示だけです。

このメソッドを実行すると、Switchライブラリはスイッチがどのような状態だったかを調べて覚えておいてくれます。

❷ スイッチが押されたかどうかを判定するメソッド

pollメソッドでスイッチ状態を調査してもらいましたので、次は調査したスイッチ状態を教えてもらいます。

スイッチが押されたかどうかを判定するメソッドはpushed()です。

このメソッドは引数はありませんが、戻り値があります。戻り値の値と意味は次のようになります。

pollメソッドの戻り値意味
0スイッチは押されていない
1スイッチが押された

例えば、スイッチが押された場合に何か処理をする場合は以下のように書きます。

if( hidariSwitch.pushed() == 1 ) {
  // スイッチが押されたときの処理
}

これで一通りの準備はできました!


Switchライブラリの基本的な使い方をまとめておきます。(繰り返しになりますが、キーボードライブラリとの違いは「自分でオブジェクトを作る」必要があるという点に注意していただければと思います)

  1. スイッチライブラリを使用するためにヘッダファイルをインクルードする
    #include <avdweb_Switch.h>
  2. スイッチオブジェクトを作る
    Switch hidariSwitch(A5);
  3. スイッチライブラリにスイッチ状態の調査を指示する
    hidariSwitch.poll();
  4. スイッチが押されたかどうか調べる
    hidariSwitch.pushed();

あとはこれらを使用してスケッチを作成すればOKです。

再度、LEDをピカッと光らせるスケッチ

Switchライブラリを利用して、A5端子のスイッチが押されたかどうか調べることができるようになりました。

あとはスイッチが押されたことを検知したらLEDをピカッと光らせればスケッチ完成です。

スケッチは次のようにまとめてみました。

/*
 * Switchライブラリ利用版
 * スイッチが押されたらLEDを50ms光らせる
 */

#include <avdweb_Switch.h>

#define PIN_BLUE_LED 12 // 青色LEDの接続端子
#define PIN_SWITCH A5   // 左側スイッチの接続端子

// pollメソッドの戻り値
#define SWITCH_OFF 0  // スイッチOFF
#define SWITCH_ON  1  // スイッチON

Switch hidariSwitch(PIN_SWITCH);  // A5端子に接続しているスイッチのオブジェクトを作成する

void setup() {

  pinMode(PIN_BLUE_LED, OUTPUT);      // LED接続ピンの設定
  pinMode(PIN_SWITCH, INPUT_PULLUP);  // スイッチ接続ピンの設定

}

void loop() {

  // スイッチ状態の調査を指示
  hidariSwitch.poll();

  // スイッチが押されていればLEDを50ms点灯する
  if( hidariSwitch.pushed()== SWITCH_ON ){
    digitalWrite(PIN_BLUE_LED, HIGH);
    delay(50);
    digitalWrite(PIN_BLUE_LED, LOW);
  }

}

loop関数の処理はpollによりスイッチ状態を調べてもらって」、「pushedによりスイッチが押されたかどうか判定する」という処理になっています。

ライブラリを使うことによって、スケッチ作成が簡単になって、読みやすくなっていますよね。

【補足】Switchライブラリの主なメソッド

Switchライブラリには、他にもたくさんの機能があります。

その中でも、このシリーズ記事でこれから使用する主要なメソッドをまとめておきます。

メソッド意味
pollスイッチ状態の調査を指示する。引数、返り値はなし
例)hidariSwitch.poll();
pushedスイッチが押されたか判定する。引数はなし。返り値は、押されたときが1、そうでないときが0
例)if( hidariSwitch.pushed() ) { 押されたときの処理; }
longPressスイッチが長押しされたか判定する。引数はなし。返り値は、押されたときが1、そうでないときが0
例)if( hidariSwitch.longPress() ) { 長押しされたときの処理; }
doubleClickスイッチがダブルクリックされたかどうか(短い間隔で2回カチカチと押されたかどうか)判定する。引数はなし。返り値は、押されたときが1、そうでないときが0
例)if( hidariSwitch.doubleClick() ) { ダブルクリックされたときの処理; }

オブジェクト作成がちょっとわかりづらいですよね…

今回はSwitchライブラリを使ってスイッチ処理のスケッチを作成しました。

キーボードライブラリと違って、Switchライブラリは自分でオブジェクトを作りましたが、この部分がちょっとわかりづらいかもしれません。

そこで、次回はキーボードライブラリとスイッチライブラリの使い方について、もう少し詳しく比較してみます。

今回の記事では、まずはSwitchライブラリの使い方の流れを理解していただければと思います。

ミニチャレンジ課題

Switchライブラリの主要メソッドがわかりましたので、ミニチャレンジ課題に挑戦してみましょう!

課題

ミニチャレンジ課題1

左側のスイッチを長押ししたとき、LEDがピカッと光るスケッチを作ってみてください

ミニチャレンジ課題2

左側のスイッチをダブルクリックしたとき、LEDがピカッと光るスケッチを作ってみてください

解答例

どちらのスケッチも、メソッドを変更するだけでOKです。

ミニチャレンジ課題1

30行目のメソッドをlongPressに変更すると、スイッチの長押しを検知できます。

/*
 * Arduino入門基礎編パート2 第13回
 *   ミニチャレンジ課題1 解答例
 */

#include <avdweb_Switch.h>

#define PIN_BLUE_LED 12 // 青色LEDの接続端子
#define PIN_SWITCH A5   // 左側スイッチの接続端子

// pollメソッドの戻り値
#define SWITCH_OFF 0  // スイッチOFF
#define SWITCH_ON  1  // スイッチON

Switch hidariSwitch(PIN_SWITCH);  // A5端子に接続しているスイッチのオブジェクトを作成する

void setup() {

  pinMode(PIN_BLUE_LED, OUTPUT);      // LED接続ピンの設定
  pinMode(PIN_SWITCH, INPUT_PULLUP);  // スイッチ接続ピンの設定

}

void loop() {

  // スイッチ状態の調査を指示
  hidariSwitch.poll();

  // スイッチが長押しされたらLEDを50ms点灯する
  if( hidariSwitch.longPress()== SWITCH_ON ){
    digitalWrite(PIN_BLUE_LED, HIGH);
    delay(50);
    digitalWrite(PIN_BLUE_LED, LOW);
  }

}

ミニチャレンジ課題2

30行目のメソッドをdoubleClickに変更すると、スイッチのダブルクリックを検知できます。

/*
 * Arduino入門基礎編パート2 第13回
 *   ミニチャレンジ課題2 解答例
 */

#include <avdweb_Switch.h>

#define PIN_BLUE_LED 12 // 青色LEDの接続端子
#define PIN_SWITCH A5   // 左側スイッチの接続端子

// pollメソッドの戻り値
#define SWITCH_OFF 0  // スイッチOFF
#define SWITCH_ON  1  // スイッチON

Switch hidariSwitch(PIN_SWITCH);  // A5端子に接続しているスイッチのオブジェクトを作成する

void setup() {

  pinMode(PIN_BLUE_LED, OUTPUT);      // LED接続ピンの設定
  pinMode(PIN_SWITCH, INPUT_PULLUP);  // スイッチ接続ピンの設定

}

void loop() {

  // スイッチ状態の調査を指示
  hidariSwitch.poll();

  // スイッチがダブルクリックされたらLEDを50ms点灯する
  if( hidariSwitch.doubleClick()== SWITCH_ON ){
    digitalWrite(PIN_BLUE_LED, HIGH);
    delay(50);
    digitalWrite(PIN_BLUE_LED, LOW);
  }

}

更新履歴

日付内容
2021.9.19新規投稿
2022.2.27スイッチライブラリ再調査
2025.2.11Arduino IDE2対応
ミニチャレンジ課題解答例追加
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次