0
0

RaspberryPiWのBLEを使用してPC1のキーボード入力をPC2に渡す

Last updated at Posted at 2024-07-26

はじめに

この記事は以下に該当する読者を想定しています。

  • Windows11
  • Arduino IDE 2.3.2
  • Arduino IDEでArduino系を使い慣れている
  • Rasberry Pi Pico W を購入したが、Pythonプログラム用にRasberry Pi系を購入してセットアップするのが面倒で、Arduino IDEにRasberry Pi Pico ボードを追加してLチカまではできるようになり、次はBLEにでも挑戦してみよう、ぐらいの段階

目次

  1. 発端
  2. 発想
  3. 成果物
  4. シリアル通信部分抜粋
  5. BLE部分抜粋
  6. 考察・感想・その他

1.発端

発端は以下の通りです。

  • ノートPCを持っていた。
  • Windows11 Home搭載・ハンドヘルドタイプのゲーム用PCを購入し、ごく稀にキーボードが欲しくなりそうだと思った。
  • 購入して眠らせているRaspberry Pi Pico W があった。
  • びっくりするほど暇だった。

2.発想

  1. 元々持っていたノートPC(以下、PC1)とRaspberry Pico W(以下、PicoW)間でUSBシリアル通信を行う。
  2. PicoWをBLEキーボードのフリをさせ、新しく購入したゲーム用PC(以下、PC2)とペアリングする。
  3. PC1からUSBシリアル通信で送られてきたキーボード入力をBLEでPC2に流す。

3.成果物

MyBLEKeyboard.ino
#include <KeyboardBLE.h>

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  KeyboardBLE.begin("MyBLEKeyboard");
  delay(5000);
}

void loop() {
  static bool led_state = false;
  static uint32_t last_blink_time = 0;
  const uint32_t blink_cycle = 1000;

  static uint32_t last_serial_check_time = 0;
  const uint32_t serial_check_cycle = 5;

  delay(1);

  uint32_t now = millis();

  if(now - last_blink_time > blink_cycle) {
    last_blink_time = now;
    led_state = !led_state;
    digitalWrite(LED_BUILTIN, led_state);
  }

  if(now - last_serial_check_time > serial_check_cycle) {
    last_serial_check_time = now;
    if(Serial.available()) {
      char key = Serial.read();
      Serial.print("get:");
      Serial.println(key);

      KeyboardBLE.print(key);
    }
  }
}

加えて、ツールで以下を選択する必要があります。

  • ボード: "Raspberry Pi Pico W"
  • IP/Bluetooth Stack: Bluetoothが含まれるいずれか

LEDの点滅部分は、動いている感を出したかっただけなので読み飛ばしてください。

4.シリアル通信部分抜粋

Serial.ino
void setup() {
  Serial.begin(115200);
}

void loop() {
  if(Serial.available()) {
    char key = Serial.read();
    Serial.print(key);
  }
}

Arduino系と同じ書き方でOKでした。
Arduino系を使い慣れていれば説明は不要かと思います。

5.BLE部分抜粋

BLE.ino
#include <KeyboardBLE.h>

void setup() {
  KeyboardBLE.begin("MyBLEKeyboard");
  delay(5000);
}

void loop() {
  delay(1000);
  KeyboardBLE.print('a');
}

抜粋としていますが、説明のための最小構成です。
1秒に1回、'a'を送信するコードです。

  1. KeboardBLE.h をincludeする必要があります。(ボードと一緒にインストールされるので、特に追加作業はありません)
  2. KeyboardBLE.begin("MyBLEKeyboard"); で初期化します。PC2から引数で与えた文字列のキーボードデバイスとして検出できるようになります。(引数なしの場合はデフォルトのPicoW BLE Keyboardとなります。)
  3. KeyboardBLE.print('a'); で、接続済みデバイスへ引数のキーを送信します。
  4. 前述の通り、ツールでIP/Bluetooth Stack: Bluetoothが含まれるいずれか を選択する必要があります。初期状態では、IPv4 Only が選択されており、コンパイルエラーが出ます。

PicoWとPC2のペアリング操作は、PC2に標準で備わっているBluetooth機能で行います。

6.考察・感想・その他

  • ほぼスケッチ例のKeyboardBLE->BLESerial がそのまま使用できた。
  • つまづくとすれば、IP//Bluetooth Stack: の部分ぐらいか。
  • PC1とPicoWのUSBシリアル通信には、マイコンシリアル通信で使い慣れたTera Termを使用したが、Tera Termが処理してくれないキー(半角/全角キーやファンクションキーなど)をどう送るかが課題。案としては、あきらめる、使用頻度が低いキーをその辺に割り当てる、キーボード入力をすべてフックするWindowsアプリを探すか作る等が考えられるが、本題とは別の話なのでここで一旦良しとする。
  • 買ってから全く触っていないPicoWがあったのでPicoWを使用したが、基板むき出しのPicoWより、パッケージングされたM5ATOM S3 Liteの方が本件に適していたかもしれない。(PicoWの方がBluetoothのバージョンが上なので全くメリットがないわけではないが)
  • 結論 : キーボードを買った方がいい。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0