文字化けしないキーボード
2023.07.01 /2023.10.25更新
YouTube でも紹介しています。画像をクリックすると再生できます。
Ubuntu Server の初期インストール時に、ネットワークとSSH接続設定さえ行えば、あとはノートパソコンからログインして作業を進めることができます。
この初期インストールの際に日本語キーボードを使うと、ネットワーク設定ファイルをviで開いたときに、IPアドレス指定に使う「[」「]」やファイル保存時の制御文字「:」などが文字化けしてしまい非常に面倒です。
そこで今回は文字化けしない仮想キーボードを作りました。
※日本語キーボードを用いたときには、: ← [Shift] +、[ ← @、] ← [ で対応していました。

システム構成は下記のようになります。

ATmega32u4チップ搭載のマイコンでHIDキーボード機能を動作させ、Raspberry Pi にUSB接続して、
ノートパソコンからはTeraTermでマイコンボードにBluetooth接続します。
●Adafruit ItsyBitsy 32u4 3V@8MHz

・ATmega32u4 onboad chip in QFN package
・3.3V power and logic, 8 MHz clock rate, 2KB RAM and 28K FLASH
・Can act as a USB HID Keyboard, Mouse, MIDI or plain USB 'CDC' serial device (default)
・On-board red pin #13 LED
・23 GPIO total - 6 analog in, 1x SPI port, 1x I2C port, 1x Hardware Serial port and 10 more GPIO, 4 of which have PWM
・Special Vhigh output pin gives you the higher voltage from VBAT or VUSB, for driving NeoPixels, servos, and other high-current devices. Digital 5 level-shifted output for high-voltage logic level output.
●HC-06 Bluetooth Serial Port Module
ItsyBitsy 32u4 をこのモジュールにシリアル接続して、パソコンとBluetooth通信を行います。
Bluetooth 2.0 serial port module.
| MODEL | HC-06 |
| Work band | 2.4G |
| Communication interface | UART3.3V TTL |
| Working voltage | 3.6~6V |
| Air Speed | 2Mbps |
| Communication level | 3.3V |
| Communication current | 40mA |
| Receiving sensitivity | -85dBm @ 2Mbps |
| Reference distance | 10m |
※5Vロジックを使用する場合
ItsyBitsy 32u4 3V/8MHz では、HC-06に直接接続できますが、5V系のLeonardoやPro Microを使用する場合は注意が必要です。

ArduinoのRXDをモジュールのTXDに接続し、ArduinoのTXDを抵抗分圧器を介してモジュールのRXDに接続するだけです。この分圧器は、Arduino から送信された 5V ロジック信号をモジュールに適した +3.3V ロジック信号に変換するために提供されます。
How to use HC-06 Bluetooth Module
| ItsyBitsy | - | HC-06 |
| RX | - | TXD |
| TX | - | RXD |
| GND | - | GND |
| 3V | - | VCC |
ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
$ mkdir ~/ItsyBitsy32u4
$ cd ~/ItsyBitsy32u4
$ pio boards ItsyBitsy
Platform: atmelavr
==========================================================================
ID MCU Freq Flash RAM Name
---------------- ---------- ----- ----- ------ ---------------------------
itsybitsy32u4_3V ATMEGA32U4 8MHz 28KB 2.50KB Adafruit ItsyBitsy 3V/8MHz
itsybitsy32u4_5V ATMEGA32U4 16MHz 28KB 2.50KB Adafruit ItsyBitsy 5V/16MHz
$ pio init -b itsybitsy32u4_3V
●ATコマンドモードによるHC-06モジュールの設定
HC-02ではラズベリーパイに繋いで簡単に設定できました。
HC-02(RXD,TXD,GND,VCC,KEY)→RaspberryPi(TX,RX,GND,3V,3V)。
番外編 mirco:bit 磁気・加速度センサ
しかし、HC-06ではラズベリーパイのデバイスモニターが反応しません。
そこで、ItsyBitsyにプログラムを書き込んで自動設定しました。

Raspberry Pi 3 model A に繋いでいます。
電源投入後、他のデバイスとペアリングされていない状態であれば常にATモードになっています。(赤色LEDが素早く点滅)
【setup.ino】
#define INTERVAL (50)
void atcommand(char *cmd)
{
long elapsed;
Serial.println(cmd);
Serial1.write(cmd);
while (!Serial1.available());
while (Serial1.available()) {
Serial.write(Serial1.read());
elapsed = 0;
while (!Serial1.available()) {
elapsed += INTERVAL;
delay(INTERVAL);
if (elapsed >= 500) break;
}
if (elapsed >= 500) break;
}
Serial.write(0x0a);
}
void setup()
{
Serial.begin(9600);
while (!Serial);
Serial1.begin(9600);
atcommand("AT");
atcommand("AT+VERSION");
atcommand("AT+NAMEhc_06_keyboard");
atcommand("AT+PIN5678");
atcommand("AT+BAUD6");
}
void loop() {}
●ソースコード解説
1. void setup()部分
Serial.begin(9600);
while (!Serial);
USBシリアル(ItsyBitsy←→RaspberryPi)の通信速度を9600に設定して、
インスタンスが生成されるのを待ちます。
Serial1.begin(9600);
HC-06の初期通信速度は9600です。(ItsyBitsy←→HC-06)
atcommand("AT");
接続を確認します。
atcommand("AT+VERSION");
バージョンを確認します。
AT+NAMEhc_06_keyboard
Bluetooth名を「hc_06_keyboard」に変更します。
AT+PIN5678
PIN番号を「5678」変更します。初期値は「1234」です。
AT+BAUD6
ボーレートを変更(9600→38400)します。
2. atcommand(char *cmd)部分
Serial.println(cmd);
Serial1.write(cmd);
発行したATコマンドをRaspberry Pi と HC-06に送信します。
HC-06には改行コードなしでコマンドを送信します。
while (!Serial1.available());
while (Serial1.available()) {
Serial.write(Serial1.read());
elapsed = 0;
while (!Serial1.available()) {
elapsed += INTERVAL;
delay(INTERVAL);
if (elapsed >= 500) break;
}
if (elapsed >= 500) break;
}
HC-06からの応答文字列を取りこぼさないように制御しています。
●実行
$ pio device list
/dev/ttyACM0
------------
Hardware ID: USB VID:PID=239A:800D LOCATION=1-1:1.0
Description: ItsyBitsy 32u4 3V 8MHz
/dev/ttyAMA0
------------
Hardware ID: 3f201000.serial
Description: ttyAMA0
$ pio run -t upload
ビルドします。
$ pio device monitor -p /dev/ttyACM0 -b 9600
PlatformIOのデバイスモニタに接続します。
再起動後は通信速度が38400に変更されます。
※HCシリーズのATコマンド仕様は機種により異なるのでデータシートで確認してください。
●Bluetoothループバックテスト
設定が完了したところで、ソースコードを書き替えます。
Bluetooth接続した相手からの入力文字列をそのまま返すループバックテスト用のプログラムです。
void setup()
{
Serial1.begin(38400);
}
void loop() {
if (Serial1.available()) Serial1.write(Serial1.read());
}

WINDOWSパソコンから Bleutoothデバイスの追加を行ってみます。

ペアリングします。設定変更した、PINコードを入力します。
メニューバーの[WINDOWS]アイコンを右クリック→デバイスマネージャー

ペアリングが完了するとデバイスマネージャーのポート(COMとLPT)に仮想COMポートが追加されます。
追加されたCOMポートを右クリック、プロパティを選択します。

BAUDRATE(ビット/秒)から38400を選択します。
先程のデバイスマネージャーの画面から[操作]→[デバイスとプリンター]を選択します。

hc_06_keyboardを右クリックして、[プロパティ]を選択します。

[サービス]タブをクリックします。

Bluetoothサービス・シリアルポート(SPP)'Port'をチェックします。

TeraTermを起動して、COMポート経由で接続します。
[設定]→[シリアルポート]を選択します。

スピードに 38400 を選択します。

HC-06の赤色点滅から点灯に変わります。

画面から12345と打ち込むとそのまま入力文字がループバックされて表示されます。
●HID Keyboard
それでは、Amega32u4マイコンを仮想キーボードとして利用します。
$ pio pkg search "header:Keyboard.h"
arduino-libraries/Keyboard
Library ~ 1.0.4 ~ Published on Thu May 5 12:36:32 2022
Allows an Arduino board with USB capabilities to act as a Keyboard. This library plugs on the HID library. It can be used with or without other HID-based libraries (Mouse, Gamepad etc)
$ vi platformio.ini
[env:itsybitsy32u4_3V]
platform = atmelavr
board = itsybitsy32u4_3V
framework = arduino
lib_deps =
arduino-libraries/Keyboard
この設定でビルドすると、~/ItsyBitsy32u4/.pio/libdeps/itsybitsy32u4_3V/Keyboard/src に
ライブラリーがインストールされます。
$ ls ~/ItsyBitsy32u4/.pio/libdeps/itsybitsy32u4_3V/Keyboard/src
Keyboard.cpp KeyboardLayout_es_ES.cpp Keyboard_es_ES.h
Keyboard.h KeyboardLayout_fr_FR.cpp Keyboard_fr_FR.h
KeyboardLayout.h KeyboardLayout_it_IT.cpp Keyboard_it_IT.h
KeyboardLayout_da_DK.cpp KeyboardLayout_sv_SE.cpp Keyboard_sv_SE.h
KeyboardLayout_de_DE.cpp Keyboard_da_DK.h
KeyboardLayout_en_US.cpp Keyboard_de_DE.h
プログラム作成時、Keyboard.cpp, Keyboard.h、KeyboardLayout_en_US.cppの内容を参考にします。
#include <Keyboard.h>
char buf[32];
void setup()
{
Serial1.begin(38400);
Keyboard.begin();
}
void loop()
{
byte key, key1, key2, key3;
while(Serial1.available()) {
key = 0x00;
key1 = Serial1.read(); delay(10);
key2 = Serial1.read(); delay(10);
key3 = Serial1.read();
switch(key1) {
case 0x0d: key = 0x0a; break;
case 0x1b:
key = KEY_ESC;
if (key2==0x5b) {
switch(key3) {
case 0x41: key = KEY_UP_ARROW; break;
case 0x42: key = KEY_DOWN_ARROW; break;
case 0x43: key = KEY_RIGHT_ARROW; break;
case 0x44: key = KEY_LEFT_ARROW; break;
}
}
break;
case 0x01: // ネットワーク設定
Keyboard.write("sudo vi /etc/netplan/50-cloud-init.yaml",39);
Serial1.println("sudo vi /etc/netplan/50-cloud-init.yaml");
break;
default: key = key1; break;
}
if (key) Keyboard.write(key);
sprintf(buf,"[0x%02x] 0x%02x:0x%02x:0x%02x\r\n", key, key1, key2, key3);
Serial1.print(buf);
}
delay(10);
}
●コードの要点
TeraTerm を利用してBluetooth通信を行う場合、日本語キーボード独特のコード体系はパソコン側のキーボード・ドライバにより吸収されるため、
文字や記号は見た目と同じアスキーコードとして送信され、そもそも文字化けは発生しません。
プログラムでは、[ESC][↑][↓][←][→]などの制御コードをHIDキーコードへの変換を行います。
| 制御キー | 送信されるデータ | HIDキーコード |
| [ESC] | [0x1b] | KEY_ESC |
| ↑ | [0x1b][0x5b][0x41] | KEY_UP_ARROW |
| ↓ | [0x1b][0x5b][0x42] | KEY_DOWN_ARROW |
| → | [0x1b][0x5b][0x43] | KEY_RIGHT_ARROW |
| ← | [0x1b][0x5b][0x44] | KEY_LEFT_ARROW |
このように矢印キーを押したときには3バイトの制御データが送信されてきます。
HIDキーコードを下記で確認できます。
$ cat ~/ItsyBitsy32u4/.pio/libdeps/itsybitsy32u4_3V/Keyboard/src
// Misc keys
#define KEY_UP_ARROW 0xDA
#define KEY_DOWN_ARROW 0xD9
#define KEY_LEFT_ARROW 0xD8
#define KEY_RIGHT_ARROW 0xD7
#define KEY_BACKSPACE 0xB2
#define KEY_TAB 0xB3
#define KEY_RETURN 0xB0
#define KEY_MENU 0xED
#define KEY_ESC 0xB1
........
プログラム内での処理は下記のようになります。
byte key, key1, key2, key3;
while(Serial1.available()) {
key = 0x00;
key1 = Serial1.read(); delay(10);
key2 = Serial1.read(); delay(10);
key3 = Serial1.read();
switch(key1) {
case 0x0d: key = 0x0a; break;
case 0x1b:
key = KEY_ESC;
if (key2==0x5b) {
switch(key3) {
case 0x41: key = KEY_UP_ARROW; break;
case 0x42: key = KEY_DOWN_ARROW; break;
case 0x43: key = KEY_RIGHT_ARROW; break;
case 0x44: key = KEY_LEFT_ARROW; break;
}
}
break;
default: key = key1; break;
}
if (key) Keyboard.write(key);
}
switch()文のdefault部分が通常の文字・記号の処理です。

Ubuntu Server の初期インストールの様子です。
Raspberry Pi 3 model B+ にHDMIモニターを接続、ノートパソコンのキーボードを使って、TeraTerm・仮想キーボード経由で入力しています。
●注意点とカスタマイズ
HID KEYBOARD では、ASCIIコード中の制御コード0x00~0x07,0x0B~0x1F,0x7fが無効です。つまり、 [CTRL]+C などは使えません。
ネットワーク設定の際に、pingコマンドなどを発行すると停止できなくなってしまいますので注意しましょう。
しかし、これを逆手に取ると便利な機能を追加できます。例えばキーボードで[CTRL] + a を押すと、0x01 が送信されます。
これにネットワーク設定ファイルを開くコマンドを付与できてしまいます。
case 0x01: // ネットワーク設定
Keyboard.write("sudo vi /etc/netplan/50-cloud-init.yaml",39);
break;
この要領で多くのコマンドを登録することが可能です。

仮想キーボードはとても小さいので、文字化け対策に英語キーボードを購入するよりも便利かもしれません。
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|