HOME | Raspberry Pi | ビジネス書籍紹介 | 2021-09-19 (Sun) Today's Access : 150 Total : 354144. Since 10 Sep. 2019

M5Stackキーボードを利用する
2020.03.27

YouTubeでポイントを説明しています。画像をクリックすると再生できます。

今回はM5Stack用キーボードをラズベリーパイで利用します。
M5Stack用カード型キーボード UNIT CardKB は、M5Stackにフル機能のQWERTY(クワーティ)配列キーボードを実装できるユニットです。 QWERTY配列は、デファクトスタンダードなキー配列です。 CardKBでは、複数のボタンの組み合わせ(Sym + Key、Shift + Key、Fn + Key)で豊富なキーの値を出力することが可能です。 Grove Aポート(I2Cインタフェース)経由でM5Coreと通信します。アドレスは0x5Fに設定されています。

このキーボードの特徴は、普通のキーボードのようにファンクションキーやシフトキーを押しながら、別のキーを押すことはしません。
ファンクションキーなどを押して、LEDが点滅している間に、別のキーを押すといった感じで、片手操作が可能です。


■Arduino Leonardo(Pro Micro)のHID(キーボード)機能を使う
Arduino LeonardoはPCなどとUSB接続したとき,自身をHID(ヒューマン・インターフェイス・デバイス/入出力装置)として認識させる機能が標準で備わっています。 CardKBをI2C接続でLeonardoを介することで、キーボードとして利用することが可能になります。
HID機能はArduinoの中でもATmega32u4マイコンを搭載したLeonardoやMicro,ProMicro,他にDue,Zeroなど限られたボードで動作します。

■構成図

テスト環境は以下の通りです。
・UNIT CardKB
・Arduino Leonardo (micro, Pro Micro)
・Raspberry Pi Zero W
ラズパイのディストリビューションは、Raspbian Stretch です。

■Arduino Leonardo 動作確認
開発環境に、PlatformIOを用います。
詳細は、→ Arduino開発環境構築 PlatformIO を参考にしてください。

$ platformio device list
/dev/ttyACM0
------------
Hardware ID: USB VID:PID=2341:8036 LOCATION=1-1:1.0
Description: Arduino Leonardo

/dev/ttyAMA0
------------
Hardware ID: 20201000.serial
Description: ttyAMA0
$ platformio boards "Leonard"
Platform: atmelavr
---------------------------------------------------------------------
ID               MCU        Freq.  Flash  RAM    Name
---------------------------------------------------------------------
leonardo         ATMEGA32U4 16MHz  28KB   2.50KB Arduino Leonardo
leonardoeth      ATMEGA32U4 16MHz  28KB   2.50KB Arduino Leonardo ETH
プロジェクトの作成
$ mkdir -p ~/leonardo/M5Stack
$ cd ~/leonardo/M5Stack
$ platformio init -b leonardo

動作確認 - L チカ・プログラム
ArduinoはD13にLEDが接続されていることが多いのですが、Leonardoはそれが接続されていません。
Leonardo では。RXはD17、TXはD30をLOWにするとLEDを点灯できます。
$ vi src/led.ino

#define TX_LED 30
#define RX_LED 17

void setup() {
  pinMode(TX_LED, OUTPUT);
  pinMode(RX_LED, OUTPUT);
}

void loop() {
  digitalWrite(TX_LED, LOW);
  delay(1000);
  digitalWrite(TX_LED, HIGH);
  digitalWrite(RX_LED, LOW);
  delay(1000);
  digitalWrite(RX_LED, HIGH);
  delay(1000);
}

$ platformio run -t upload

■CardKB と Leonardo のI2C接続
 CardKB   Leonardo 
SCL  -  3
SDA  -  2
5V  -  Vcc
GND  -  GND

CardKB 添付のGroveケーブルを切断して、片側にピンヘッダーを取り付けます。
CardKB と Leonardo をI2C接続します。

ラズベリーパイとLeonardoをUSBケーブルで結ぶとこんな感じになります。

全体の様子です。ラズパイとLeonardoはUSBケーブルで繋がっています。

■キーボード入力の検出
まずは、キーボードからの入力を検出してみます。
→ Ref.M5Stack Arduinoサンプルコード(GitHub)

キーボードの打鍵情報を検出して表示するプログラムを書いてみました。 アスキーコードの範囲を超えるキー情報は16進で表示しています。
$ vi detectKey.ino

#include <Wire.h>

#define CARDKB_ADDR 0x5F

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

void loop()
{
 Wire.requestFrom(CARDKB_ADDR, 1);
 while(Wire.available()) {
  int key = Wire.read();
  if (key != 0) {
   if (key>0x7F) {
    Serial.println(key, HEX);
   } else {
    Serial.println((char)key);
   }
  }
 }
}
platformIO のデバイスモニターで確認してみます。
$ platformio device monitor -p /dev/ttyACM0 -b 115200
--- Miniterm on /dev/ttyACM0 115200,8,N,1 --- --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- a 9A
CardKB の [A]を押すと、a と表示され、ファンクションキー[fn]を押した後に[A]を押すと、16進表記で 9A と表示されます。
ボタンの組合せによるコード情報は下記を参照してください。
→ Ref.CardKB ドキュメント

■Arduino Leonardo をUSBキーボードとして認識させる

ここまでの操作は、ラズパイにTeraTermで接続した状態でも確認できましたが、 HID機能を利用する際には、ラズパイに直接モニターを繋ぐか、VNC接続した状態で、LXターミナル上で確認作業を行ってください。
USBキーボードとして認識させるには、KeyboardライブラリーのKeyboard.begin()を使用します。
ここでは、CardKB の [fn] を押した後に、[SPACE]を押すと、Arduino Leonard がキーボードをエミュレートし、 再度、[fn]と[SPACE]でエミュレートを解除するようにデザインしています。
キーボードをエミュレートしている状態で、CardKB のキーを押すと、ラズベリーパイに普通のキーボートと同様に 文字を入力することができるようになります。
$ vi emulateKeyboard.ino

#include <Wire.h>
#include <Keyboard.h>

#define CARDKB_ADDR 0x5F

boolean emulate = false;

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

void loop()
{
 Wire.requestFrom(CARDKB_ADDR, 1);
 while(Wire.available()) {
  byte key = Wire.read();
  if (key != 0) {
   if (key==0xAF) { // [fn]+[SPACE]
    if (emulate) {
     Keyboard.end();
     emulate = false;
    } else {
     Keyboard.begin();
     emulate = true;
    }
   } else {
    if (emulate) {
     if (key<=0x7F) Keyboard.write(key);
    }
   }
  }
 }
}
$ platformio run
/home/pi/leonardo/M5Stack/src/zw_0801_emulateKeyboard.ino:2:22: fatal error: Keyboard.h: No such file or directory
********************************************************
* Looking for Keyboard.h dependency? Check our library registry!
*
* CLI > platformio lib search "header:Keyboard.h"
* Web > https://platformio.org/lib/search?query=header:Keyboard.h
*
********************************************************

$ platformio lib search "header:Keyboard.h"
Found 7 libraries:

Keyboard
========
#ID: 891
Allows an Arduino/Genuino board with USB capabilites to act as a Keyboard.

Keywords: device, control
Compatible frameworks: Arduino
Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, Teensy, TI MSP430
Authors: Arduino
...

$ platformio lib show 891
....
Versions
--------
1.0.1, released Tue Mar 8 16:05:47 2016
1.0.2, released Wed May 9 08:02:23 2018
...

ライブラリーをインストールします。
$ platformio lib install 891
Keyboard @ 1.0.2 has been successfully installed!

$ platformio run -t upload

■補足:Keyboard.print()
Keyboardライブラリーはprint()およびprintln()関数をサポートしています。
→ Ref. Arduino Keyboard
しかし、Keyboard.print() を使うと、一部のアスキーコードが別のコードに置換されてしまいます。

Keyboard ライブラリー は以下のような場所に配置されています。
$ sudo find / -name Keyboard.h -print
/home/pi/leonardo/M5Stack/.pio/libdeps/leonardo/Keyboard_ID891/src/Keyboard.h
....
$ vi /home/pi/leonardo/M5Stack/.pio/libdeps/leonardo/Keyboard_ID891/src/Keyboard.cpp
.... 同じディレクトリにある、Keyboard.cpp をみても print()関数の記述がないので、どこかで別のソースコード内でオーバーライドされているようです。
write()関数は1バイト送信なので、print()と同様に文字列を扱えるように、emulateKeyboard.ino に独自に関数を追加します。
void writeln(char *cmd) {
 while (*cmd) {
  Keyboard.write(*cmd);
  cmd++;
 }
 // Keyboard.write(0x0d);
}
※改行したくない場合もあるので、改行コードの送信はコメントアウトしています。

■応用例
ここまでの内容では、普通にUSBキーボードを接続して打鍵したほうが早いという結果に終わってしまいます。
ここからが重要です。CardKBにショートカットキーを対応させます。ファンクション[fn]、シンボル[Sym]、シフト[↑]キーを合わせると50個以上の設定が可能です。
下記の例では、[fn]キーを押した後に、[m]を押すと、コンソールにメディアプレーヤーの起動用のコマンドが自動的に入力され、演奏が開始されます。
if (key!=0xAF) {
 if (emulate) {
  if (key>0x7F) {
   switch(key) {
    case 0xAC: // [fn]+[m]
     writeln("mplayer /home/pi/Music/*\n"); break;
    default: break;
   }
  } else {
   	Keyboard.write(key);
  }
 }
}
今回はキーボードを接続していますが、Arduino にセンサーを接続して、取得したデータにより、自動的にコマンドを入力するようなことも可能です。

アスキーコード以外の制御コードも、Keyboard.write()関数で送信できるので、Windowsパソコンでも応用が効くと思います。 Arduino Leonardoを介して、Androidスマホなど、その他のデバイスのキーボードとしても使えます。

こんな感じで実装してみると、おしゃれに演出できます。
Arduino Leonardo ElectroCookie Pink Edition

emulateKeyboard.ino コーディング例
#include <Wire.h>
#include <Keyboard.h>

#define CARDKB_ADDR 0x5F

boolean emulate = true;

void setup()
{
	Serial.begin(115200);
	Wire.begin();
	Keyboard.begin();
}

void writeln(char *cmd) {
	while (*cmd) {
		Keyboard.write(*cmd);
		cmd++;
	}
}

void loop()
{
	Wire.requestFrom(CARDKB_ADDR, 1);
	while(Wire.available()) {
		byte key = Wire.read();
		if (key != 0) {
			if (key==0xAF) { // [fn]+[SPACE]
				if (emulate) {
					Serial.println("stop keyboard emulating");
					Keyboard.end();
					emulate = false;
				} else {
					Serial.println("start keyboard emulating");
					Keyboard.begin();
					emulate = true;
				}
			} else {
				if (emulate) {
					if (key>0x7F) {
						switch(key) {
							case 0xA2: // [fn]+[l]
								writeln("ls -al\n"); break;
							case 0xAC: // [fn]+[m]
								writeln("mplayer /home/pi/Music/*\n"); break;
							default:
								break;
						}
					} else {
						// [Sym]+[d] mozc
						Keyboard.write(key);
					}
				} else {
					if (key>0x7F) {
						Serial.println(key, HEX);
					} else {
						Serial.println((char)key);
					}
				}
			}
		}
	}
	delay(10);
}

【参考文献】
M5Stack用カード型キーボードユニット UNIT CardKB スイッチサイエンス
Arduino Leonardo(Pro Micro)のHID(キーボード)機能を使う(ショートカットキー実行,コマンド実行)
 Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2019.12.13 モバイルバッテリーによる瞬間停電対策
2020.01.01 1280x800 HDMI MONITOR
2020.01.12 micro:bitをコマンドラインで使う
2020.02.04 サーマルプリンタを使う
2020.03.27 M5Stackキーボードを利用する
2020.04.10 電卓を制御して数字を表示する
2020.05.06 箱庭回路 蓄電&昇圧回路
2020.06.29 液晶キャラクターディスプレイLCD1602A
2020.08.03 Seeeduino XIAO
2020.08.09 LGT8F328P - Arduino clone
2020.09.18 電流計測モジュール INA219
2020.09.04 箱庭回路 センサーライト
2020.09.29 シガーライターIC s090c
2020.10.13 自動給水装置 LM393+NE555
2020.12.05 FM放送受信 TEA5767
2021.01.30 DVD Player LED
2021.02.16 癒しの電子回路
2021.03.06 疑似コンソール
2021.04.13 GPIO拡張
2021.08.08 電子ペーパー
2021.09.04 AVRマイコン・ATTiny85


ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場! 高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。 DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。 作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。

DIPスイッチで動作電圧を3.3Vと5Vに切り替えられるUNO互換ボード
KEYESTUDIO Plus Board for Arduino UNO R3 with Type-C USB Cable, 3.3V 5V 1.5A Output Current, More Powerful Controller Board USB-シリアルチップ:CP2102 / 動作電圧:5Vまたは3.3V(DIPスイッチ制御)/ 外部電源:DC 6-15V(9V推奨)/ デジタルI / Oピン:14(D0〜D13)/ PWMチャネル:6(D3 D5 D6 D9 D10 D11)/ アナログ入力チャネル(ADC):8(A0-A7)/ DC出力機能の各I / Oポート:20 mA / 3.3Vポートの出力能力:50 mA / フラッシュメモリ:32 KB(うち0.5 KBはブートローダーによって使用されます)/ SRAM:2 KB(ATMEGA328P-AU)/ EEPROM:1 KB(ATMEGA328P-AU)/ クロック速度:16MHz / オンボードLEDピン:D13

エレクトロクッキー Leonardo R3 ATmega32u4 ボード DIY Arduino工作用 - ピンクエディション


Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。 この本では,ベイズ統計学のきほんをやさしく紹介していきます。

Interface 2021年10月号
☆特集:~ 格好良さアップ! 機能&信頼性アップ ! ~「 3Dプリンタ & メカ設計入門 」
☆特集2:Pico達人への道…「 C/C++でMicroPython拡張 」


トランジスタ技術 2021年9月号
☆特集:~ 直流・交流・非接触・センサ微小電流の測定ノウハウ ~「電流を正しく測る技術」

トランジスタ技術スペシャル 2021年7月号 宇宙ロケット開発入門
これから開発・活用が進むと期待されている宇宙空間への交通・物流インフラとして、小型・低価格ロケットが注目を集めています。本書では、基本構造から制御メカニズムまで、小型宇宙ロケット開発の基礎知識を実例を交えて解説します。

日経Linux 2021年9月号
【特集1】おうち時間をLinuxデスクトップで楽しむ! Linux環境を作るワザ
【特集2】徹底図解で丸わかり! 「WSL2」入門   Windows 11の新機能を速報!
【特集3】IT自動化ツール AnsibleでWeb導入を自動化
【特集4】ラズパイで楽しむLinuxライフ 「今、会議中」と家族に伝えるプレートをPythonで作ろう


ラズパイマガジン2021年秋号
特集1 サクッと動くパーツ&ライブラリ総覧
特集2 ArduinoライブラリでラズパイPicoを動かす
特集3 古いラズパイをフル活用! Node-REDで 楽しい電子工作
特集4 空気の汚れをラズパイで検知しよう
特集5 ラズパイで楽しむLinuxライフ
特集6 NVIDIAのAIボードが6000円台に!
特集7 M5StickCで始める電子工作 iPhoneからサーボモーターを制御しよう


トランジスタ技術スペシャル 2021年 4月号 No.154「達人への道 電子回路のツボ」
初学者が実用的な電子回路を設計できるようになるためのポイントをまとめました。学校の教科書だけではつかめない基本電子回路やOPアンプ/トランジスタの使い方の実際を、いろいろな視点から解説しています。


Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品
【仕様概要】CPU:ARM 1.2GHz 4コア、GPU:2コア 3D・動画支援、RAM:1GB、ネットワーク:LAN/Wi-Fi/Bluetooth、インターフェース:USB/HDMI/オーディオ/GPIO(UART/I2C/I2S/SPI...)。

ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換 (3)


ESPr Developer 32
スイッチサイエンス(Switch Science)

協和ハーモネット UL1007 AWG24 耐熱ビニル絶縁電線 リール巻 100m 黒


白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81


サンハヤト TTW-203 テストワイヤ
ブレッドボードとスルーホール間の接続に便利なワイヤですブレッドボード用のオスピンと基板のスルーホール用のバネ性のある端子を組み合わせたテストワイヤです

無水エタノールP 500mlx2個パック(掃除)


ケイバ(KEIBA) マイクロニッパー MN-A04


熱収縮チューブφ1.5
印字無しで綺麗☆ シュリンクチューブ 絶縁チューブ 防水 高難燃性 収縮チューブ (2m, ブラック(黒))


サンハヤト SAD-101 ニューブレッドボード


白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02


【Amazon.co.jp限定】エーモン 電工ペンチ 全長約255mm (1452)


[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠


Copyright © 2011-2022 Sarako Tsukiyono All rights reserved®.