ライブラリを使ってスイッチ処理のプログラミングを楽にします。
意外に難しかったスイッチのプログラミング
さて、キーボードを製作するためにはスイッチの検知が必要ということでスイッチ制御のプログラムを作ってきました。気づけばずいぶんと長い時間かかってしまいました。
長い時間かかった、というよりなんだかすごくややこしかったと思います。特に変数の扱い方が難しかったですよね。ところで、スイッチを制御する方法はこれしかないのでしょうか。もっとスイッチを簡単に制御できる方法はないのでしょうか。
そもそもスイッチの制御なんて、電子工作の基本中の基本ですよね。ということはすでにプログラムを作った人がいるはずです。以前の記事で説明しましたが、よく使われる機能はライブラリとしてまとめられている可能性が高いです。
実はArduinoでもスイッチを制御するライブラリがいろいろと用意されています。最初に言ってよ〜、という感じですが、すみません、スイッチ検知のアルゴリズム検討とプログラミングはとてもいい練習になりますので、ちょっと回り道してしまいました。
スイッチライブラリ登場
ということで、これからスイッチライブラリを使用してプログラミングをしていきましょう。
Arduinoでスイッチライブラリを使うとき、ちょっと迷うことがあります。というのはArduinoのスイッチライブラリは1種類ではなく、たくさんの種類が用意されています。そうは言っても「スイッチが押されたかどうかを検知する」という機能しかないはずなのに、なぜそんなにたくさんの種類があるのか、と疑問に思いますよね。
Arduinoのスイッチライブラリは、スイッチを押したことを検知するだけでなく、スイッチの長押しを検知できるライブラリもあります。そのような感じで同じスイッチライブラリといっても、それぞれ用意されている機能に特徴があります。
Arduino IDEのライブラリマネージャでスイッチ制御ができるライブラリを検索してみたのですが、2022年2月時点で10種類以上見つかりました。たくさん用意されているのはいいですが、どれを使ったらよいのか選ぶのに困ってしまいます。
ライブラリの説明を読めばライブラリの特徴がわかりますが、英語ですし、内容もそれほど詳しくありません。私の場合、ライブラリが複数見つかった場合はスケッチのサンプルを見て、プログラミングしやすいライブラリを選択しています。
このシリーズでは多くのライブラリの中から「Switch」という名前のライブラリを使用することにしました。一般的な名前だけあって、機能も十分で使い方も簡単です。今回の記事では、ライブラリをインストール、簡単に使い方の確認をしたあと、テスト用のプログラムを作成して動作確認します。
スイッチライブラリのインストール
それでは「Switch」ライブラリをインストールしましょう。
Arduino IDEを起動して、「ツール」メニューから「ライブラリの管理…」メニューを選択します。
これから「Switch」ライブラリを検索しますが、「Switch」という名前で検索するとたくさん見つかりますので、検索欄に「switch button」と入力してリターンキーを押して検索してください。
それでもたくさん見つかってしまいますが、「Switch」ライブラリは一番下にあると思います。「Switch」ライブラリを見つけたら「インストール」ボタンをクリックしてインストールします。
以下のようになればインストール完了です。
スイッチライブラリの基本的な使い方
スイッチライブラリの基本的な使い方を確認します。
といきたいところですが、以前キーボードライブラリを使いましたので、もう一度使い方を確認しておきましょう。
キーボードライブラリを使用するには、プログラムのヘッダ部で以下のようにキーボードライブラリのヘッダファイルを指定しました。
#include <Keyboard.h>
ヘッダファイルを指定すると、Keyboardオブジェクトが使用できるようになります。例えばPCとの接続処理をしたい場合は以下のようにオブジェクト.メソッド
のように書きました。
Keyboard.begin();
スイッチライブラリは、キーボードライブラリと違う点があります。そこで、キーボードライブラリと対比しながらスイッチライブラリの基本的な使い方を説明します。
最初にArduino IDEで新規スケッチを作成してください。
キーボードライブラリと同様に、最初にスイッチライブラリのヘッダファイルをインクルードする必要があります。ただヘッダファイル名がわからないので、以下の手順でヘッダファイルをインクルードします。「スケッチ」メニュー → 「ライブラリをインクルード」メニュー → 「Switch」を選択します。選択すると、以下のように新規スケッチのヘッダ部に#include文が追加されます。
何だかよくわからない名前ですね…
ところで、キーボードライブラリの時は、この時点でKeyboard
というオブジェクトが使えるようになりました。でも、スイッチライブラリはすぐにのオブジェクトが使えるようになっていないんです。
スイッチライブラリがキーボードライブラリと違う点は、
ということなんです。なぜこのような作業が必要かは次回の記事で詳しく説明します。今回の記事ではスイッチオブジェクトの作り方を説明します。
スイッチオブジェクトを作るには、#include <avdweb_Switch.h>
より後のヘッダ部に、以下の文法で書きます。
Switch 自分で決めたスイッチオブジェクト名(スイッチが接続されているピン番号);
今回の記事では、以下の左側の23番ピンに接続したスイッチを使用することにします。
このスイッチのオブジェクトの名前は自分で決めることができます。左側のスイッチなのでhidariSwitch
にしましょう。このスイッチは23番ピンに接続していますので、オブジェクトを作るには、以下のように書けばOKです。
Switch hidariSwitch(23);
キーボードライブラリではすぐにKeyboard
というオブジェクトが使えましたが、スイッチライブラリはこのようにするとオブジェクトが使えるようになります。
ところで、Keyboard
オブジェクトはPCと接続処理をするbegin()
メソッドや文字をPCに送るprint()
メソッドが用意されていました。
次に、スイッチライブラリの基本的なメソッドを確認します。
スイッチライブラリの基本的なメソッド
それではスイッチライブラリの基本的な使い方を確認します。
基本的な使い方を確認するために、今回の記事では第12回までの記事で作成した、スイッチが押されたらLEDを50msピカッと光らせるプログラムを作成することにしましょう。
スイッチライブラリではスイッチが押されたかを判定するために以下の2種類のメソッドを組み合わせて使用します。
- スイッチライブラリに対して、スイッチ状態の調査を指示するメソッド
- スイッチが押されたかどうかを判定するメソッド
それでは、それぞれのメソッドについて説明します。
スイッチ状態の調査を指示するメソッド
スイッチ状態の調査を支持するメソッドはpoll()
です。引数はありません。
先ほど作ったhidariSwitch
オブジェクト、つまり左側のスイッチの状態の調査を指示する場合は以下のように書きます。
hidariSwitch.poll();
「poll」ってあまり聞きなれない英語かもしれませんが、日本語では「調査」などの意味です。このメソッドは「スイッチ状態を調べてください」という指示だけです。このメソッドを実行すると、スイッチがどのような状態だったかを調べて覚えておいてくれます。
スイッチが押されたかどうかを判定する
pollメソッドでスイッチ状態を調査してもらいましたので、あとはスイッチが押されたかどうかを判定するメソッドを使用します。
スイッチが押されたかどうかを判定するメソッドはpushed()
です。このメソッドは引数はありませんが返り値があります。スイッチが押された時は1、押されてない時は0を返してくれます。
スイッチが押された場合に何か処理をする場合は以下のように書きます。
if( hidariSwitch.pushed() == 1 ) {
// スイッチが押された時の処理を書く
}
これで一通りの準備はできました。
スイッチライブラリの基本的な使い方をまとめておきましょう。繰り返しになりますが、キーボードライブラリとの違いは、自分でオブジェクトを作る、という点です。
- スイッチライブラリを使用するためにヘッダファイルをインクルードする
#include <avdweb_Switch.h>
- スイッチオブジェクトを作る
Switch hidariSwitch(23);
- スイッチライブラリにスイッチ状態の調査を指示する
hidariSwitch.poll();
- スイッチが押されたかどうか調べる
hidariSwitch.pushed();
あとはこれらを使用してスケッチを作成すればOKです。
再度、LEDをピカッと光らせるスケッチ
スイッチライブラリを使用したスケッチは以下のようになります。
まずはご自身で意味がわからないところがないように理解してください。理解できたら実際にArduino Microに書き込んで動作確認してみてください。
/*
* スイッチライブラリを使用して
* スイッチが押されたらLEDを50ms光らせる
*/
// スイッチライブラリをインクルード
#include <avdweb_Switch.h>
// スイッチオブジェクトを作る
Switch hidariSwitch(23);
// 秒表示LEDのピン番号
#define PIN_LED_AO 12 // 青色LED
// スイッチのピン番号
#define PIN_SWITCH 23 // 左側スイッチ
void setup() {
// LED接続ピンの設定
pinMode(PIN_LED_AO, OUTPUT);
// スイッチ接続ピンの設定
pinMode(PIN_SWITCH, INPUT_PULLUP);
// LEDを消しておく
digitalWrite(PIN_LED_AO, LOW);
}
void loop() {
// スイッチライブラリにスイッチ状態の調査を指示
hidariSwitch.poll();
// スイッチが押されていればLEDを50ms点灯する
if( hidariSwitch.pushed() ){
digitalWrite(PIN_LED_AO, HIGH);
delay(50);
digitalWrite(PIN_LED_AO, LOW);
}
}
うまく動きましたか?
スイッチライブラの主要メソッド
今回インストールしたスイッチライブラリには、他にもたくさんの機能があります。その中でも、この入門シリーズでこれから使用する主要なメソッドを以下に説明します。先ほど説明したメソッドも合わせてまとめておきます。
メソッド | 意味 | 使い方の例 |
---|---|---|
poll() | スイッチライブラリにスイッチ状態の調査を指示する。引数、返り値はなし | hidariSwitch.poll(); |
pushed() | pollメソッドでスイッチ状態を調査したあと、スイッチが押されたか判定する。引数はなし、返り値は、押された時が1、そうでない時が0 | if( hidariSwitch.pushed() ) { 処理; } |
longPress() | pollメソッドでスイッチ状態を調査したあと、スイッチが長押しされたか判定する。引数はなし、返り値は、長押しされた時が1、そうでない時が0 | if( hidariSwitch.longPress() ) { 処理; } |
doubleClick() | pollメソッドでスイッチ状態を調査したあと、スイッチがダブルクリックされた(短い間隔で2回カチカチと押された)かどうか判定する。引数はなし、返り値は、ダブルクリックされた時が1、そうでない時が0 | if( hidariSwitch.doubleClick() ) { 処理; } |
オブジェクトを作るところがちょっとわかりづらい感じ?
今回はスイッチライブラリを使ってスイッチ処理のプログラムを作成しました。
ところで、キーボードライブラリと違って、スイッチライブラリは自分でオブジェクトを作りましたが、この部分がちょっとわかりづらい、という人もいるかもしれません。
そこで、次回はキーボードライブラリとスイッチライブラリの使い方について、もう少し詳しく調べます。今回、スイッチライブラリの使い方の流れがちょっと腑に落ちない、という方は、次回の記事をじっくり読んでみてください。
あと、次回の記事では最初に謝罪がありますので許してください。
ミニチャレンジ課題
スイッチライブラリの主要メソッドがわかりましたので、ミニチャレンジ課題に挑戦してみましょう!
左側のスイッチを長押しした時、LEDがピカッと光るスケッチを作ってみてください
左側のスイッチをダブルクリックした時、LEDがピカッと光るスケッチを作ってみてください
更新履歴
日付 | 内容 |
---|---|
2021.9.19 | 新規投稿 |
2022.2.27 | スイッチライブラリ再調査 |