第7回 スイッチの制御

キーボードとは切っても切れない関係の「スイッチの制御方法」について考えてみます。

目次

キーボードのスイッチ制御

Keyboardライブラリを使用すれば、以下のことができることはわかりました。

  • Arduino MicroをPCに接続した時、PCがキーボードとして認識するための処理を行う (Keyboard.begin()を使用)
  • PCに文字を送る (Keyboard.print()を使用)

Arduino Microをキーボードして動作させるためには、あと一つのことが実現できればいいですよね。

その一つのこととは

「スイッチが押されたことを検知する」

という動作です。

この動作ができれば、以下の手順でArduino Microをキーボードとして動作させることができます。

  1. Keyboard.begin()でPCと接続した時、PCにキーボードとして認識してもらう
  2. スイッチが押されたことを検知する
  3. 押されたスイッチに対応する文字をKeyboard.print()でPCに送る
  4. (2)に戻る

これから「スイッチが押されたら、スイッチに対応する文字をPCに送る」というプログラムを考えていくわけですが、プログラムの作り方を失敗すると、PCに大量の文字を送ったりして大変なことになる可能性があります。

そのような意図せずできてしまったキーボードは「どっきりキーボード」として用途はあるかもしれません。

でも、学校の友達や会社の同僚が重要な文書を編集しているときに「どっきりキーボード」を使わせたら大変なことになります。下手をすると人間関係までに悪影響が出る可能性もありますので、ここは慎重に進めたいと思います。

今回の記事では、このような制御の代わりに、以下の制御をプログラミングして動作確認することにします。

「スイッチが押されたら、一定時間LEDを点灯する」

これでしたらプログラミングに失敗しても、せいぜいLEDがついたままとか、妙なパターンで光るなど、人間関係までに影響するということはなさそうですので安心です。

使用するスイッチとLED

これからスイッチが押されたらLEDを点灯させるわけですが、使用するスイッチとLEDを決めておきましょう。

特に深い意味はありませんが、以下のスイッチとLEDを使用することにします。

使用するLEDとスイッチ

スイッチが押されたらLEDを3秒間点灯する

最初にスイッチが押されたら3秒間LEDを点灯させるプログラムを考えてみましょう。

まずスイッチ状態はどのように調べればよいか、もうわかりますよね。「digitalRead(ピン番号)」を使用すると、スイッチが押されていない場合は「1」、押されている場合は「0」となるので、これでスイッチ状態がわかります。

あとは「スイッチが押されたら、LEDを点灯する」という動作ですが、「〜だったら、〜する」という文法がありましたよね。そうです「if文」です!

それでは最初にプログラムを日本語で考えてみます。

if(スイッチが押されている状態だったら) {
  LEDを3秒間点灯する
}

このようにプログラミングすればうまくいきそうです。

それではif文のところをもう少し具体的にプログラムを書いてみましょう。digitalRead() で23番ピンに接続しているスイッチの状態を確認するわけですから、

if(digitalRead(23) == 0) {
  LEDを3秒間点灯する
}

このように書けばよさそうです。あとは「LEDを3秒間点灯する」という部分ですが、どのようにプログラミングすればいいでしょうか。

LEDをONにしたりOFFにするのは digitalWrite(ピン番号, 状態); でした。12番ピンに接続しているLEDをONにする場合 digitalWrite(12, HIGH);、OFFにする場合は digitalWrite(12, LOW); と書けばOKです。

あとは「3秒間」という部分ですが、ここは時間待ちをすれば実現できます。具体的には delay(時間); を使用すればOKです。引数の単位はミリ秒ですので、3秒待つのであれば delay(3000); と書きます。

これらをまとめると「LEDを3秒間点灯する」という動作は、以下のプログラムで実現できますよね。

digitalWrite(12, HIGH);
delay(3000);
digitalWrite(12, LOW);

ここまでのプログラムをまとめてみましょう。

if(digitalRead(23) == 0) {
  digitalWrite(12, HIGH);
  delay(3000);
  digitalWrite(12, LOW);
}

最初の日本語で書いたプログラムと対応関係は大丈夫でしょうか。最初からC言語の文法を使ってプログラムを書くのではなく、今回考えたように日本語から動作を考えていくとわかりやすい場合もありますので、ご自身に合った方法でプログラミングをしてみてください。

なお、実際のプログラムでは、ピン番号をそのままプログラム中に書くとわかりづらかったり、変更するのも大変なので、#defineで定義しておきます。

ご自身でプログラムを作成するのが一番ですが、以下ご参考としてプログラムの一例を示します。新しい文法は出てきていませんので、詳しい説明は省略します。

ブレッドボードの準備ができたら、プログラムを書き込んで動作させてみてください。

Arduino Microが動作を始めたら、左側のスイッチをプチッと押してみてください。押したあと青色LEDが3秒間点灯すれば成功です!

/*
 *  スイッチ制御プログラム
 *  内容: スイッチを押すと一定時間LEDを点灯させる
 */

// 青色LEDのピン接続番号
#define LED_BLUE  12

// 左側スイッチのピン接続番号
#define SWITCH_HIDARI  23

// スイッチの状態
#define OFF 1
#define ON  0

// 点灯時間(単位:ms)
#define TENTOU_JIKAN 3000


void setup() {
  // LEDのピンを出力に設定
  pinMode(LED_BLUE, OUTPUT);

  // スイッチのピンを入力に設定
  pinMode(SWITCH_HIDARI, INPUT_PULLUP);

  // 最初はLEDをOFFに設定しておく
  digitalWrite(LED_BLUE, LOW);
}


void loop() {

  // 左スイッチ状態を読み取り、ONだったらLEDを一定時間点灯する
  if( digitalRead(SWITCH_HIDARI) == ON ) {
    // LEDを点灯
    digitalWrite(LED_BLUE, HIGH);
    // 一定時間待つ
    delay(TENTOU_JIKAN);
    // LEDを消す
    digitalWrite(LED_BLUE, LOW);
  }
  
}

スイッチが押されたらLEDをピカッと点灯する

なんだかあっさりできてしまいました。あとは「LEDを3秒間点灯する」という部分を「スイッチに対応した文字をKeyboard.print()でPCに送る」という命令に書き換えればキーボードが完成しそうな気がしてきました。

せっかくスイッチ制御のプログラムを作成しましたので、もう少しこのプログラムの動作を確認してみましょう。

先ほどは「LEDを3秒間点灯する」という動作でしたが、今度は「LEDをピカッと点灯する」という動作に変更してみます。

「ピカッと光らせる」という動作は、基礎編パート1でキッチンタイマーを作ったときにプログラミングしました。LEDを50ミリ秒だけ点灯すると、LEDがピカッと光ったように見えました。

それでは、今回作成したプログラムで「スイッチが押されたらLEDをピカッと点灯する」にはどうしたらいいでしょうか。

そうです「3秒時間まち」というところを「50ミリ秒時間待ち」に変更すれば実現できます。

先ほどのプログラムで点灯時間は

#define  TENTOU_JIKAN  3000

とdefineで定義してありますので、この「3000」を「50」に変更するだけです。

それでは、先ほどのプログラムの3000を50に変更して、Arduino Micro動作させてみてください。

どうでしたか?

スイッチを押すと「ピカッ」と光りましたか???

思った通りに光らなかったのではないでしょうか。

「スイッチが押されたらLEDをピカッと点灯する」というプログラミングをしたはずなのに「スイッチを押している間、LEDが点灯」という動作になってしまったと思います。

プログラムはどうみても「スイッチが押されたらLEDをピカッと点灯する」というように書いているはずですが、なぜこのような動作になってしまっているのでしょうか。Arduino Microの内部で何が起こっているのでしょうか。

原因

ということで、これから原因をみつけて正しいプログラムを作成する必要が出てきてしまいました。

現時点ではArduino Microの内部で何が起きているのかわかりませんが、このままのプログラムを「スイッチが押されたら文字をPCに送る」という動作に書き換えてそのキーボードを他の人に使ってもらったら、人間関係にも及ぶような何かとんでもないことが起こってしまうかもしれません。

ということで、次回以降の記事ではこのような動作になってしまう原因を明らかにして、うまく動作するプログラムを考えていきます。

次回以降の記事を見る前に、まずはなぜこのような動作になるのか、じっくり考えてみるとプログラミングの力がつくと思います。結果、わかったらすごいですし、わからなくても考えることによって力がつきます。このようなプログラミングを通して一緒にプログラミング力をつけていきましょう!

更新履歴

日付 内容
2021.8.4 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次