ホーム > ガジェット > シグマリオン Bluetoothキーボード化

シグマリオン Bluetoothキーボード化

とりあえず使えるようになったので公開。
黄ばみの少ないシグマリオンのキーボードは貴重ですね。

キーボードの左側に電源スイッチがあります。画面にのっかっているスマホはNexus5x、テキストエディタはGoogleドキュメント、日本語入力はiWnnです。

参考にしたもの

https://github.com/T-vK/ESP32-BLE-Keyboard

用意したもの

  • シグマリオン・・・1でも2でも良い
  • ESP32・・・今回はDevkit V1という製品を使用。開発環境はArduino 1.8.19
  • 22pinフラットケーブル変換基盤 (参考)https://www.amazon.co.jp/gp/product/B09139PTX5
  • リチウムバッテリー 適当なもの
  • リチウムバッテリー充電用基板
  • その他 細かい配線用の部品は割愛

制限など
※上記ライブラリの制限なのでそのうち解消されるかな、、、

  • 一部のAndroidで入力機器として認識されない
  • 一部のキー(円マーク、バックスラッシュ、無変換、変換など)が入力できない
    ※ハード的にはすべてのキーのオンオフを認識できています

ソースコードをとりあえず掲載

//NimBLEを使う場合はコメント外す
//#define USE_NIMBLE

#define KEY_ZENKAKU_HANKAKU (0x35+136)
#define KEY_HIRA_KANA (0x88+136)
#define KEY_HENKAN (0x8a+136)
#define KEY_MUHENKAN (0x8b+136)

#define BUZZER_PIN 2

#include <BleKeyboard.h>
BleKeyboard bleKeyboard;

//入力ピンの設定
//シグマリオンのピンで上位8本と下位12本を接続するピンを記述
const int pin_high[] = {4, 15,  16, 13, 17, 12, 5, 14};
const int pin_low[] = {35, 18, 27, 19, 26, 21, 25, 3, 33, 22, 32, 23};

const int high_size = 8;
const int low_size = 12;

//デバッグ用、どのキーを押したか調べる用途
const int key_code [8][12] = {
  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
  {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23},
  {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35},
  {36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47},
  {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59},
  {60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71},
  {72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83},
  {84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95}
};

//キーコードのテーブル。上手くいかないキーあり。
const uint16_t key_char[] = {
  /* 0*/  0, 0,  0, 0, '1', 0, 'k', 0, KEY_LEFT_GUI, KEY_ESC, KEY_MUHENKAN, ' ',
  /*12*/  KEY_LEFT_CTRL, 0,  0, '7', 'u', '8', '9', '0', 'i', 0, 'o', 'p',
  /*24*/  0, KEY_HIRA_KANA,  0, 0x32 + 136, 'x', 'd', 'f', 'g', 'c', KEY_F9, 'v', 'b',
  /*36*/  KEY_F10, 46 + 136,  KEY_BACKSPACE, '3', 'e', '4', '5', 0x34 + 136, 'r', 0, 't', 'y',
  /*48*/  KEY_F6, KEY_F7,  KEY_F8, 's', 'q', '6', '2', KEY_TAB, 'w', 0, 'a', 'z',
  /*60*/  0, 0,  0, 'h', 0, 'j', 'n', 'l', 'm', KEY_LEFT_SHIFT, ',', '.',
  /*72*/  0, 0,  KEY_RIGHT_CTRL, '-', 0x7d + 169, KEY_UP_ARROW, KEY_HENKAN, 0, KEY_LEFT_ARROW, 0, KEY_DOWN_ARROW, KEY_RIGHT_ARROW,
  /*84*/  0, KEY_LEFT_ALT,  0, 0x2f + 136, 0, 0x30 + 136, ';', KEY_ZENKAKU_HANKAKU, '_', 0, '/', KEY_RETURN
};


//ピンの状態を格納する配列
int read_val[high_size][low_size];
//前回のピンの状態を格納する配列
int prev_val[high_size][low_size];


//Ble接続した際に鳴らすピポ音
void pipo() {
  ledcWriteTone(0, 2000);
  delay(120);
  ledcWriteTone(0, 1000);
  delay(120);
  ledcWriteTone(0, 0);
}

void setup() {
  Serial.begin(115200);
  //省エネのために80MHz動作にする。これ以下だと上手く動かなかった。
  setCpuFrequencyMhz(80);

  //入力ピンの初期化
  for (int i = 0; i < high_size; i++) {
    pinMode(pin_high[i], OUTPUT_OPEN_DRAIN);
    digitalWrite(pin_high[i], HIGH);
  }
  //GPIO35番はPULLUP非対応。10kΩのプルアップ抵抗をハード的に追加する。
  pinMode(pin_low[0], INPUT);
  //それ以外のPinは内部プルアップを使う
  for (int i = 1; i < low_size; i++) {
    pinMode(pin_low[i], INPUT_PULLUP);
  }

  for (int l = 0; l < low_size; l++) {
    for (int h = 0; h < high_size; h++) {
      prev_val[h][l] = 1;
    }
  }

  //ブザーの初期化
  ledcSetup(1, 1200, 8);
  ledcAttachPin(BUZZER_PIN, 0);

  bleKeyboard.begin();
  while (!bleKeyboard.isConnected()) {
    Serial.println("Waiting for connecting...");
    delay(500);
  }
  Serial.println("Connected!");
  //接続したらピポ音を鳴らす
  pipo();
}

//キーボードの状態を読み取る関数
void update_read_val() {
  for (int h = 0; h < high_size; h++) {
    digitalWrite(pin_high[h], LOW);
    delay(4);
    for (int l = 0; l < low_size; l++) {
      read_val[h][l] =  digitalRead(pin_low[l]);
    }
    digitalWrite(pin_high[h], HIGH);
  }
}

//押されたキーボードをBleで送信する関数
void send_bleKey(){
  for (int h = 0; h < high_size; h++) {
    for (int l = 0; l < low_size; l++) {
      if (prev_val[h][l] != read_val[h][l]) {
        if (key_char[key_code[h][l]] != 0) {
          Serial.print(key_char[key_code[h][l]]);
          if (prev_val[h][l] == 1) {
            Serial.print(" pressed,");
            bleKeyboard.press(key_char[key_code[h][l]]);
          }
          else {
            Serial.print(" released,");
            bleKeyboard.release(key_char[key_code[h][l]]);
          }
          Serial.println(key_code[h][l]);
        }
        else {
          Serial.printf("unknown key....%d,%d,%d\n",pin_high[h],pin_low[l],key_code[h][l]);
        }
        prev_val[h][l] = read_val[h][l];
      }
    }
  }
}

//メインループ
void loop() {
  if (bleKeyboard.isConnected()) {
    update_read_val();
    send_bleKey();
  }
  else {//Bluetooth接続が切れた場合は再接続を待つ
    Serial.println("Waiting for Re-connecting...");
    delay(1000);
  }
  // シリアルをフラッシュする
  Serial.flush();
  delay(5);
}
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す