第21回 動作確認版言い訳キーボード

いよいよ言い訳キーボードを製作します。今回はとりあえず動作する確認版になります。

目次

言い訳キーボードの仕様

第18回の記事で仕様を決めましたが、もう一度簡単に確認します。

言い訳キーボードには3個のスイッチがあります。これらのスイッチを押すと、適当に選んだいずれかの文字列をPCに送ることにしました。

左側スイッチ 中央スイッチ 右側スイッチ
「起きたら」
「トイレが」
「飼い犬が」
「頭痛がひどいので」
「水漏れで修理するため」
「動物病院に行くため」
「休暇を取得いたします」
「急遽お休みします」
「終わり次第出社します」

言い訳キーボードをPCに接続して、順番に「左側スイッチ」→「中央スイッチ」→「右側スイッチ」と押していくと、休む理由が自動的に生成されるわけです。

必要な知識の確認

ここまでの説明で、言い訳キーボードを製作するための知識は一通り習得できたはずです。

ここで、言い訳キーボードの製作に必要な知識を整理しておきましょう。今までの復習になりますので、あやふやなところがないか、もう一度確認してみてください。

キーボードの処理

Ardunio Microをキーボードとして振る舞うには「キーボードの接続処理」と「文字をPCに送る」という動作が必要です。

Keyboardライブラリを使えば、簡単に実現できましたよね。以下の命令を使用すれば実現できます。

#include <Keyboard.h>  // キーボードライブラリのヘッダファイルインクルード

Keyboard.begin();  // キーボード接続処理

Keyboard.print("ABC");  // PCに文字列「ABC」を送る

スイッチの処理

スイッチの処理は自分で命令を組み合わせるとプログラミングが大変でしたが、スイッチライブラリを使うと簡単でしたよね。

言い訳キーボードでは、スイッチが押されたかどうかの検知だけですので、以下の命令だけでOKです。

#include <avdweb_Switch.h>  // スイッチライブラリのヘッダファイルインクルード

Switch hidariSwitch(23);  // 23番ピンに接続されているスイッチのインスタンス生成

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

if( hidariSwitch.pushed() ) {  // スイッチが押されているかの判定
  // スイッチが押されていた時の処理
}

乱数

スイッチが押されたら、3個の文字列の中から1つ適当に選ぶ必要があります。何か適当に選ぶには乱数が必要です。3個から選ぶので以下の命令で0〜2の乱数を生成すればOKです。

randomSeed( analogRead(A1) );  // 乱数の初期化

uint8_t number = random(3);  // 0〜2のランダムな数字を変数numberに代入

生成した乱数に応じて処理を変える

乱数を生成したあと、数字に応じて文字列をPCに送る必要があります。

生成した数字に応じて処理を変えるにはどうしたらよいでしょうか。すぐに思いつくのはif文を使用して数字に応じて処理を切り分ければ実現できそうですよね。例えば以下のようなスケッチです。

randomSeed( analogRead(A1) );  // 乱数の初期化

uint8_t number = random(3);  // 0〜2の数字を変数numberに代入

// numberが0の時の処理
if( number == 0 ) {
	// 処理A
}

// numberが1の時の処理
if( number == 1 ) {
	// 処理B
}

// numberが2の時の処理
if( number == 2 ) {
	// 処理C
}

これでも動作しますが、スケッチがちょっと長くて見づらいですよね。

数字に応じて処理を変える、というのはこのようにif文で実現できますが、もう一つ便利な構文があったのを覚えているでしょうか。

それは「switch文」です。

上の動作をswitch文で書き直すと以下のようになります。忘れてしまったら、基礎編1の第41回を読み返してみてください。

randomSeed( analogRead(A1) );  // 乱数の初期化

switch( random(3) ){

  // 乱数が0の時の処理
  case 0:
    // 処理A
    break;

  // 乱数が1の時の処理
  case 1:
    // 処理B
    break;

  // 乱数が2の時の処理
  case 2:
    // 処理C
    break;

}

必要な知識は以上ですが、日本語入力に関して補足がありますので次に説明します。

日本語入力

今まで、Keyboardライブラリを使用して「A」などの英文字をPCに送信していました。今回製作する言い訳キーボードは日本語を入力しますので、日本語入力の方法について確認しておきましょう。

日本語入力が「ローマ字入力」と「かな入力」で異なるところがありますので、それぞれ説明します。

ローマ字入力

PCを日本語ローマ字入力モードにしているとき、例えば「起きたら」と入力する場合、以下のようにキーを押しますよね。

okitara(スペースキー)(リターンキー)

「okitara」と入力すると「おきたら」とひらがなで未確定の状態で入力され、そのあとスペースキーを押すと「起きたら」に変換され、リターンキーを押すことにより確定します。

Keyboardライブラリを利用して「起きたら」と日本語入力するには、上のようなキー入力を再現します。具体的には以下のようにスケッチに書きます。

Keyboard.print( "okitara(スペースキー)(リターンキー)" );

ここで(スペースキー)の部分は半角スペースを入力すればOKです。

問題は(リターンキー)の部分です。リターンキーの文字ってないですよね。

コンピュータの世界ではリターンキーやタブキー、バックスペースキーなどの文字で表せないキーは特殊な書き方をします。

例えばリターンキーであれば、

\n

というように「 \ 」の後にローマ字を書きます。注意点としては、「 \ 」は「バックスラッシュ」と呼ばれるもので、よく出てくる「 / 」(スラッシュ)と向きが逆になります。

「 \ 」の後のローマ字が「n」の時はリターンキーを意味しますが、例えば「 \t 」であればタブキー、「 \b 」であればバックスペースキーを意味します。

ところで「 \ 」の入力ですが、OSによって異なります。かなりややこしいので、わからない場合はこの記事からコピペして利用してください。

まずWindowsの場合ですが、フォントが日本語の場合は「¥」になります。またフォントがローマ字の場合は「ろ」が書いてあるキーを押すと入力できます。

次にmacOSの場合ですが、optionキー +「¥」キーで入力できます。

以上をまとめると、「起きたら」と入力する場合は以下のようにスケッチに書くことになります。

Keyboard.print("toirega \n");

かな入力

日本語をかな入力している場合は、押しているキーのローマ字を書けばOKです。ちょっとわかりづらいので具体的に説明します。

「起きたら」と入力する場合、キーを「6gqo(スペースキー)(リターンキー)」と押していると思います。先程のローマ字の時と同じようにこの入力を以下のように再現すればOKです。

Keyboard.print("6gqo \n");

言い訳キーボードのスケッチ

以上で必要な知識が一通り確認できましたので、言い訳キーボードのスケッチを作成してみます。

特に新しい項目はありませんので、じっくり解読してみてください。

動作確認する場合は、PC側の入力モードを「日本語」「ローマ字入力」に設定してください。

/*
 * 動作確認版言い訳キーボード
 * 
 *  PC側の入力モードが「日本語入力」で「ローマ字入力」の場合のスケッチです
 */

// キーボードライブラリとスイッチライブラリ
#include <Keyboard.h>
#include <avdweb_Switch.h>

// スイッチのピン番号の定義
#define SWITCH_HIDARI 23
#define SWITCH_CHUO   22
#define SWITCH_MIGI   21

// スイッチクラスのインスタンスを生成
Switch hidariSwitch(SWITCH_HIDARI); // 左側スイッチ
Switch chuoSwitch(SWITCH_CHUO);     // 中央スイッチ
Switch migiSwitch(SWITCH_MIGI);     // 右側スイッチ


void setup() {

  // キーボード接続処理
  Keyboard.begin();

  // スイッチ接続ピンの入力設定
  pinMode(SWITCH_HIDARI, INPUT_PULLUP);
  pinMode(SWITCH_CHUO,   INPUT_PULLUP);
  pinMode(SWITCH_MIGI,   INPUT_PULLUP);

  // 乱数の初期化
  randomSeed(analogRead(A1));

}



/*
 * ループ関数
 */
void loop() {

  // スイッチライブラリに左側スイッチ状態の調査を指示
  hidariSwitch.poll();
  
  // 左側スイッチが押されたら、主部を適当に選んでPCに送信
  if( hidariSwitch.pushed() ){
    // 0〜2の乱数を生成して、数字に応じて文字列をPCに送る
    switch(random(3)){
      case 0:
        Keyboard.print("okitara \n");
        break;
      case 1:
        Keyboard.print("toirega \n");
        break;
      case 2:
        Keyboard.print("kaiinuga \n");
        break;
    }
  }


  // スイッチライブラリに中央スイッチ状態の調査を指示
  chuoSwitch.poll();
  
  // 左側スイッチが押されたら、主部を適当に選んでPCに送信
  if( chuoSwitch.pushed() ){
    // 0〜2の乱数を生成して、数字に応じて文字列をPCに送る
    switch(random(3)){
      case 0:
        Keyboard.print("zutuugahidoinode \n");
        break;
      case 1:
        Keyboard.print("mizumoredeshuurisurutame \n");
        break;
      case 2:
        Keyboard.print("doubutubyouinnniikutame \n");
        break;
    }
  }

  // スイッチライブラリに右側スイッチ状態の調査を指示
  migiSwitch.poll();
  
  // 左側スイッチが押されたら、主部を適当に選んでPCに送信
  if( migiSwitch.pushed() ){
    // 0〜2の乱数を生成して、数字に応じて文字列をPCに送る
    switch(random(3)){
      case 0:
        Keyboard.print("kyuukawoshutokuitashimasu \n");
        break;
      case 1:
        Keyboard.print("kyuukyooyasumishimasu \n");
        break;
      case 2:
        Keyboard.print("owarishidaishusshashimasu \n");
        break;
    }
  }

}

スケッチの問題点

今回のスケッチは、動作はしますがちょっと問題があります。

というのは、文字列を変更したい場合、それぞれ文章はスイッチ文の中に書かれていますので、スケッチの中から修正するところを探す必要があります。

実は、もう少し文字列を見やすく扱える方法がありますので、次回以降、文字列の扱いを見直して言い訳キーボードのスケッチを見やすく、修正しやすくします。

更新履歴

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