第2回:Arduino・ラズパイPICOでマクロキーボード自作(複数文字入力編)

自作マクロキーボード Arduino
ラズパイPICO搭載自作マクロキーボード
記事内には広告が含まれています。

前回、一つのキーで「A」を表示できるようになりました。
今回は、print関数を使って1つのキーで複数の文字入力を行い定型文入力装置にしてみます。
ボタン一つで区数の文字を入力することが出来るので、チャットやメールの定型文を一発で入力できるようにしてみます。

マクロキーでの複数文字入力の説明

前回はKeyboard.h内の
Keyboard.press(‘A’)とKeyboard.release(‘A’)を利用したパターンと、
Keyboard.write(‘A’)を利用したパターンで「A」を表示できたので
今回は、Keyboard.print()関数を使って複数の文字を表示してみます。

もちろんです。以下は、Arduinoでキーを押したときにKeyboard.print()関数を使って「こんにちは、NISSHIYです!これからもよろしくお願いします!」と表示させるスケッチとその詳細な説明です。

Keyboard.print()関数サンプルスケッチ

#include <Keyboard.h> // 標準のHIDライブラリ
 
// ボタンの入力ピンを定義
const int buttonPin = 22; // ボタンが接続されているピン番号
 
void setup() {
  // ボタンピンを入力モードに設定
  pinMode(buttonPin, INPUT_PULLUP); // 内部プルアップ抵抗を有効にして入力モードに設定
 
  // HIDライブラリの初期化
  Keyboard.begin(); // キーボード入力を開始
}
 
void loop() {
  // ボタンの状態を読み取る
  int buttonState = digitalRead(buttonPin); // ボタンの状態を読み取る
 
  // ボタンが押されたかどうかを確認
  if (buttonState == LOW) { // ボタンが押されたとき
    Keyboard.print("Hello I am Nisshy"); // メッセージを送信
    delay(1000); // 1秒の遅延を挿入して、複数回の誤入力を防ぐ
  }
}

各行の説明

  1. ライブラリのインクルード
   #include <Keyboard.h> // 標準のHIDライブラリ
  • Arduinoのキーボード機能を利用するためのKeyboardライブラリをインクルードします。このライブラリを使うことで、Arduinoをキーボードとして使用し、コンピュータにキー入力を送信することができます。
  1. 定数の定義
   const int buttonPin = 2; // ボタンが接続されているピン番号
  • buttonPinは、ボタンが接続されるデジタルピンの番号(ここではピン2)を定義します。
  1. setup関数
   void setup() {
     pinMode(buttonPin, INPUT_PULLUP); // 内部プルアップ抵抗を有効にして入力モードに設定
     Keyboard.begin(); // キーボード入力を開始
   }
  • setup関数は、Arduinoが起動したときに最初に一度だけ実行される関数です。
  • pinMode(buttonPin, INPUT_PULLUP);は、buttonPinを内部プルアップ抵抗を有効にした入力モードに設定します。これにより、ボタンが押されていないときにはピンがHIGHになり、押されたときにはLOWになります。
  • Keyboard.begin();は、キーボード機能を初期化します。これにより、Arduinoがキーボードとして認識されるようになります。
  1. loop関数
   void loop() {
     int buttonState = digitalRead(buttonPin); // ボタンの状態を読み取る
     if (buttonState == LOW) { // ボタンが押されたとき
       Keyboard.print("Hello I am Nisshy"); // メッセージを送信
       delay(1000); // 1秒の遅延を挿入して、複数回の誤入力を防ぐ
     }
   }
  • loop関数は、Arduinoが停止するまで繰り返し実行されるメインのループです。
  • int buttonState = digitalRead(buttonPin);で、ボタンの現在の状態を読み取り、その状態をbuttonStateに保存します。digitalRead(buttonPin)は、ボタンが押されていればLOWを、押されていなければHIGHを返します。
  • if (buttonState == LOW)は、ボタンが押されている場合に以下のコードを実行します。
    • Keyboard.print("Hello I am Nisshy");は、キーボードとしてメッセージ「Hello I am Nisshy」を送信します。これにより、コンピュータにこのメッセージが入力されます。
    • delay(1000);は、1000ミリ秒(1秒)の遅延を入れることで、ボタンが連続して押されるのを防ぎます。これにより、誤って複数回の入力が行われるのを防ぎます。

このスケッチをArduinoにアップロードして、指定したピンにボタンを接続すれば、ボタンが押されるたびに「Hello I am Nisshy」が送信されます。押されたままの場合でも、1秒に一度だけメッセージが入力されるようになります。

第二回まとめ

Keyboard.print()を利用して複数文字を表示できるようになりました。
ボタンを増やすのは難しくないので、定型の文章を登録したボタンをいくつか作るのも面白いと思います。

ArduinoProMicroなど小型のボードにキーを一つだけつけて、キーを押したら長ーいパスワードを自動入力のUSB装置を作ったのですが!!
物理的に盗まれ別のパソコンに接続された場合、パスワードがばれてしまします。
遊びで利用する分には良いですが、実運用にはあまりお勧めしません。
どうしても使いたい人は、最初の数文字、終わりの数文字などは手入力することをお勧めします。

おまけスケッチ(ランダムパスワード作成マシン!)

パスワード自動入力装置には向かないことが分かったので、発想の転換でパスワードを作成する側になってもらうスケッチです。
情シスの管理者で、ひたすらパスワードを作成しないといけない時に利用できるかも?!しれません。

ランダムパスワード作成スケッチ

#include <Keyboard.h>

const int buttonPin = 2; // ボタンが接続されているピン
const int passwordLength = 12; // 生成するパスワードの長さ

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // 内部プルアップ抵抗を有効にする
  Keyboard.begin();
  randomSeed(analogRead(0)); // ランダムシードの初期化
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    String password = generatePassword(passwordLength);
    Keyboard.print(password);
    delay(500); // デバウンス用のディレイ
  }
}

String generatePassword(int length) {
  String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                 "abcdefghijklmnopqrstuvwxyz"
                 "0123456789"
                 "!@#$%^&*()_-+=<>?";
  String password = "";
  for (int i = 0; i < length; i++) {
    int index = random(0, chars.length());
    password += chars[index];
  }
  return password;
}

ランダムパスワード作成スケッチ説明

  1. ハードウェアセットアップ:
    • ボタンをArduinoのデジタルピンに接続し、内部プルアップ抵抗を有効にします。これにより、ボタンが押されていないときにピンが高電位(HIGH)になり。
  2. ソフトウェアセットアップ:
    • Keyboard.begin()関数でキーボードエミュレーションを開始します。
    • randomSeed(analogRead(0))でランダムシードを初期化します。
  3. ループ処理:
    • ボタンが押されると(LOWになると)、generatePassword関数を呼び出してランダムなパスワードを生成し、Keyboard.print関数を使ってそのパスワードを入力します。
    • デバウンスを防ぐために、500msのディレイを入れています。
  4. パスワード生成:
    • generatePassword関数は、指定された長さのランダムなパスワードを生成します。
    • 英字(大文字・小文字)、数字、記号を含む文字セットからランダムに選んでパスワードを作成します。

このコードをArduino IDEにコピーして対応するArduinoボードにアップロードすると、ボタンを押すたびに指定された長さのランダムなパスワードが生成され、USBキーボードとしてコンピュータに入力されます。
※上記のスケッチではパスワード利用時に利用する文字は指定しますが、パスワードの生成要件(大文字、小文字、数字、記号が入っていないとダメなど)は指定してません。
※お気づきかもしれませんが、 String charsを1-6でセットすればサイコロになります。 passwordLengthが1ならサイコロが1つ、2ならサイコロが2つなどの設定もできます。 テキストに書き出してるものを7セグメントなどで表示すれば電子サイコロにもなります。

おまけスケッチのおまけ(ランダムパスワード作成マシン!生成要件付)

パスワード生成のスケッチを、指定された条件を満たすように修正する方法を以下に示します。大文字、小文字、数字、記号を1文字以上含むパスワードを生成します。

生成要件付のスケッチ

/*
  MIT License

  Copyright (c) 2024 Speed Demon. All rights reserved.
  Website: <https://speeddemon.jp>

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
*/

#include <Keyboard.h>

const int buttonPin = 2; // ボタンが接続されているピン番号
const int passwordLength = 12; // 生成するパスワードの長さ

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // 内部プルアップ抵抗を有効にして入力モードに設定
  Keyboard.begin(); // キーボード入力を開始
  randomSeed(analogRead(0)); // ランダムシードを設定
}

void loop() {
  if (digitalRead(buttonPin) == LOW) { // ボタンが押されたとき
    String password = generatePassword(passwordLength); // パスワードを生成
    Keyboard.print(password); // パスワードを送信
    delay(1000); // 1秒の遅延を挿入して、複数回の誤入力を防ぐ
  }
}

String generatePassword(int length) {
  const char upperCaseChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const char lowerCaseChars[] = "abcdefghijklmnopqrstuvwxyz";
  const char digitChars[] = "0123456789";
  const char specialChars[] = "!@#$%^&*()-_=+[]{}|;:,.<>?";

  String password = "";

  // 各カテゴリから1文字ずつ追加
  password += upperCaseChars[random(0, sizeof(upperCaseChars) - 1)];
  password += lowerCaseChars[random(0, sizeof(lowerCaseChars) - 1)];
  password += digitChars[random(0, sizeof(digitChars) - 1)];
  password += specialChars[random(0, sizeof(specialChars) - 1)];

  // 残りの文字をランダムに追加
  const char allChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:,.<>?";
  for (int i = 4; i < length; i++) {
    password += allChars[random(0, sizeof(allChars) - 1)];
  }

  // パスワードの文字をシャッフル
  for (int i = 0; i < length; i++) {
    int r = random(0, length);
    char temp = password[i];
    password[i] = password[r];
    password[r] = temp;
  }

  return password;
}

詳細説明

  1. ライブラリのインクルード
   #include <Keyboard.h>
  • Arduinoのキーボード機能を利用するためのKeyboardライブラリをインクルードします。
  1. 定数の定義
   const int buttonPin = 2; // ボタンが接続されているピン番号
   const int passwordLength = 12; // 生成するパスワードの長さ
  • buttonPinは、ボタンが接続されるデジタルピンの番号(ここではピン2)を定義します。
  • passwordLengthは、生成するパスワードの長さを定義します。
  1. setup関数
   void setup() {
     pinMode(buttonPin, INPUT_PULLUP); // 内部プルアップ抵抗を有効にして入力モードに設定
     Keyboard.begin(); // キーボード入力を開始
     randomSeed(analogRead(0)); // ランダムシードを設定
   }
  • pinMode(buttonPin, INPUT_PULLUP);は、buttonPinを内部プルアップ抵抗を有効にした入力モードに設定します。
  • Keyboard.begin();は、キーボード機能を初期化します。
  • randomSeed(analogRead(0));は、ランダムシードを設定します。これにより、ランダムな値を生成することができます。
  1. loop関数
   void loop() {
     if (digitalRead(buttonPin) == LOW) { // ボタンが押されたとき
       String password = generatePassword(passwordLength); // パスワードを生成
       Keyboard.print(password); // パスワードを送信
       delay(1000); // 1秒の遅延を挿入して、複数回の誤入力を防ぐ
     }
   }
  • digitalRead(buttonPin)でボタンの状態を読み取り、押された場合(LOW)にパスワードを生成して送信します。
  • generatePassword(passwordLength)関数を呼び出して、指定された長さのパスワードを生成します。
  • 生成されたパスワードをKeyboard.print(password);でコンピュータに送信します。
  • delay(1000);は、1秒の遅延を入れてボタンの連続押下を防ぎます。
  1. generatePassword関数
   String generatePassword(int length) {
     const char upperCaseChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     const char lowerCaseChars[] = "abcdefghijklmnopqrstuvwxyz";
     const char digitChars[] = "0123456789";
     const char specialChars[] = "!@#$%^&*()-_=+[]{}|;:,.<>?";

     String password = "";

     // 各カテゴリから1文字ずつ追加
     password += upperCaseChars[random(0, sizeof(upperCaseChars) - 1)];
     password += lowerCaseChars[random(0, sizeof(lowerCaseChars) - 1)];
     password += digitChars[random(0, sizeof(digitChars) - 1)];
     password += specialChars[random(0, sizeof(specialChars) - 1)];

     // 残りの文字をランダムに追加
     const char allChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:,.<>?";
     for (int i = 4; i < length; i++) {
       password += allChars[random(0, sizeof(allChars) - 1)];
     }

     // パスワードの文字をシャッフル
     for (int i = 0; i < length; i++) {
       int r = random(0, length);
       char temp = password[i];
       password[i] = password[r];
       password[r] = temp;
     }

     return password;
   }
  • この関数は指定された長さのパスワードを生成します。
  • 大文字、小文字、数字、記号から1文字ずつ必ず含めます。
  • 残りの文字はすべての文字セットからランダムに選びます。
  • 最後に、生成されたパスワードをシャッフルしてランダム性を高めます。

このスケッチにより、指定された条件を満たすパスワードを生成し、ボタンを押すたびにコンピュータに送信することができます。

コメント

タイトルとURLをコピーしました