シグマリオン 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);
}
コメント (0)
Trackbacks (0)
コメントを残す
トラックバック
最近のコメント