お籠り生活の続く中です。Zoomで会議をしている方はとても多いでしょうね。クロマキーなどを自作したりして、、。私もそうですが。Zoomには便利なショートカットキーが色々ありますがなかなか使えません。ホスト側の操作を少しでも楽にしたいと考え、簡単な操作ボタンをArduinoで作ってみることにします。
操作しやすそうなボタンを手持ち部品から探すと次のものです。
ずいぶん昔の部品なのですが、キートップが入れられ、精度が高くボタン操作は超スムーズな逸品です。裏にTKCというマークがきざまれているので、メーカーは東海通信工業で、1990年頃の製品と思われます。当時の日本製の品質はあらためて凄いと思います。もちろん、操作しやすいボタンなら何をつかってもOKです。
手持ちには8キ―と4キーのものがありますが、8キーを使うと操作が却って煩雑になりそう。この際は次のショートカットキーを選んで、単純に4キーに収めることにします。もちろんキーはいつでも取り換えられますが。
さて、これをArduinoで簡単に作りたいと思います。Arduino LeonardoやMicroなどは本体にUSB通信を含むATmega32U4なので、Keyboardライブラリを使えば直接USBキーが作れます。しかし、現時点では手持ちがUnoやMega256、ESPなどばかり。そういう方は多いことでしょう。今さら購入もなんですので、この際は試しにUnoで作ることに。
Arduino UnoはUSB接続部分に周辺マイコンとしてATMEGA16U2を使っています。そのファームウェアを書き換えることでUnoをUSBキーボード・コントローラーに変えてしまいます。上の写真では左上のほうにある小さなICがATMEGA16U2です。
純正のArduino Unoなら問題ないですが、コンパチモデルでもOK。ただしUSB接続マイコンが上記のものでないとだめ(CH340Gなどだとどうにもなりません)。また、次に書きますように、本体のATMEGA328PがSMDでなくDIP型の方が使いやすいです。
ファームウェアを書き換えると、このマイコンはUSBキーボードに化けてしまいます。それをArduino UNOとしてプログラミングする時には、再びATMEGA16U2のファームウェアを元のファームウェアに戻す必要があります。そうするとテスト中何度もファームウェアを入れ替えなくてはならなくなりますので、それを避けるために次の工夫をします。まず無圧ソケットで次のような部品を2つ作り、別のUNOでプログラミングされた本体のATMEGA328Pをこれと入れ替えながら調整するようにします。
28ピン無圧ソケットに普通の28ピンソケットを履かせて、さらにその下に丸ピンソケットを履かせます。丸ピンソケットは14ピンのを2つ差し込む方が簡単にできます。
これでATMEGA328Pに下駄をはかせてUNOに差し込んでおくわけです。こうすれば他のUNOでプログラミングしたものと簡単に取り替えられますから。
こうして細工をした2つのUNO(または互換機)を用意します。
紛らわしいのでKeyboardに化けさせる側に何かで印をつけておくといいですね。ここでは黄色のシールを貼ることにします。
USBインターフェイスであるATMEGA16U2のファームウェアを書き換えるためには、Atmel社(現在はMicrochip社)のFLIPというツールを使います。これは" atmel flip download"で検索すれば簡単に見つかりますのでWindowsにインストールしておきます。とても簡単なツールです。
ファームウェアはGithubのArduino-keyboard-0.3.hexをみつけてコピーしておきますが、それを収容するフォルダーにもパスにも日本語や特殊記号がはいらないように作っておきます。そうしないとFLIPがトラブるためです。また、このファームウエアをいれたあとで、必要に応じてArduino Unoのファームウェアに戻すために、次の場所からhexファイルをコピーして、この同じフォルダーに入れておくのが賢いです。
C:\ProgramFiles (x86)\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial\Arduino-usbserial-atmega16u2-Uno-Rev3.hex
ここまでできたら、まずはArduinoのテスト用スケッチを書き込んでおきます。例はこの記事の最後の方につけておきます。
Windows PCにATMEGA16U2を認識させるためには、次のように左上の方にある3対並んだピンの一番左2つをジャンパーピン(黄色)で閉じておきます。もちろんメスーメスのデュポンワイヤーでも構いません。
その状態でPCにUSB接続をします。そして数秒後にジャンパーピンを抜くことによってWindowsがATMEGA16U2を認識します。デバイスマネジャー画面を立ち上げていればその状態が観察できます。もしPCにATMEGA16U2ドライバーがないときはそこでインストールしてしてから同じことをやり直します。
そしてFLIPを立ち上げてファームウェアを書き換えるのですが、次のように行います。
最初に上の左のようにICの絵をクリックしてデバイスを選択します。次にUSBケーブルの絵をクリックして上の右のようにUSBを選択します。すると次の左のようになります。
そしてOpenをクリックすればATMEGA16U2と接続が確立して上の右のようになります。次にFileをクリックして、先ほど準備しておいたファイルkeyboard-0.3.hexを指定します。
上図右のように選びます。そしてFLIPの左下にあるRunをクリックすればファームウェアが書き換えられます。
次の図の左下のようにVerifyPASSが表示されればおしまい。FLIPを終了させてUSBをさしなおすことにより、USB-HIDキーボードと認識されます。
なお、上図右は、Arduino-UNOに戻すために、ファームウェアを同じ手順で元のArduino-usbserial-atmega16u2-Uno-Rev3.hexに書き直した時の状態です。
テストのためのArduino-Unoのスケッチは次のように簡単に作りました。まだスイッチ部品との接続などは行っておらず、まずはUSBキーボードとして機能することの確認を行うのみです。USB-HID(ヒューマンインターフェイスデバイス)キーボードではキーは同時に6つまで押せ、それにシフトやAltなどを加えた状態を識別しますので、送る信号は1バイトの0x00を加えた8バイト、そしてキーを離す信号も同じフォーマットの0x00を8バイト送ります。これを「レポート」と称します。HIDのアーキテクチャに従うため壮大な無駄?をしてますがHIDは遅いので何ら問題ないわけです。
/* **************************************************
* USB-Keyboard for Arduino-UNO *
* Test version V00 April 30, 2020 *
* (c) Akira Tominaga, All rights reserved. *
****************************************************
*/
byte KbD[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
// KbD[0]=Modifier for USB Keyboard -code
#define rGUI B10000000 // right Windows key
#define rALT B01000000 // right Alt key
#define rSFT B00100000 // right Shift key
#define rCTL B00010000 // right Ctl key
#define lGUI B00001000 // left Windows key
#define lALT B00000100 // left Alt key
#define lSFT B00000010 // left Shift key
#define lCTL B00000001 // left Ctl key
// KbD[1] shoule always be 0x00
// KbD[2] to KbD[7] include scan-codes (max 6 codes)
// Alphabet code = ASCII val-0x5D (from a=0x61 to 0x04)
#define Csub 0x5D // Character value to subtract
// Function key code F1=0x3A, F2=0x3B, etc
#define ScF1 0x3A // USB KB code for F1 key
#define ScF2 0X3B // USB KB code for F2 key
// Space key code =0x2c
#define ScSp 0x2c // USB KB code for Space key
byte Chr = 'a'-Csub; // set initial key = a
void setup() { // Setup **************************
Serial.begin(9600);
}
void loop() { // Arduino loop ******************
KbD[2] = Chr;
KbWrite();
delay(1);
Chr = Chr+0x01;
KbD[2] = Chr;
KbD[0] = 0x00+lSFT; // test modifier (Shift)
KbWrite();
delay(1);
Chr = Chr+0x01;
KbD[2] = Chr;
KbWrite();
delay(1);
KbD[2] = ScSp; // Space key
KbWrite();
Chr = Chr+0x01; // increase char code
if(Chr>'z'-Csub){ // if exceeded 'z'
Chr = 'a'- Csub; // then re-set to 'a'
}
delay(3000);
}
/********************************
* *** User defined functions ***
* *****************************/
// *** KbWrite() write character as HID KB report
void KbWrite(void)
{
Serial.write(KbD, 8); // make
KbD[2] = 0x00; // clear character
KbD[0] = 0x00; // clear modifier
Serial.write(KbD, 8); // break
}
USB keyboardは 標準USB HID(ヒューマンインターフェイスデバイス)として機能しますからドライバーの準備は不要です。差し込めば即USB keyboardとして働きますから、予めメモ帳などを開いておけばそこに文字が書き込まれていきます。上のプログラムではメモ帳に次のように出力されていきます。
ここまでで少し長くなり、4月最後の夜も更けてきました。
少しおまたせすることになってすみませんが、ここまでで、UNOを使うやり方が大体ご理解いただけたかもしれません。文字コードの参照先や、この操作ボタンを使うとZoomホストの操作がどれくらい楽になるかなどを含めて、近日中に同じ題名(その2)を書きたいと思います。
当面はこの装置を試作して次のZoom会議に使うのが優先ですみません^^;
©2020 Akira Tominaga, All rights reserved.