日々の記録

ほどよく書いてきます。

Arduino Pro MicroでUSB-HIDデバイス(キーボードなりすまし作戦)

2023年05月04日 14時26分36秒 | AVR

Arduino Pro MicroというATMega32U4というUSBがそのあま接続できるマイコンボードを買った。
アマゾンで2つで2500円くらい。

サイズが小さくて、特定の目的のために使うものならば結構使い勝手がいいのではないだろうか。

マイコンに書き込むプログラムは下記のようなもの。
A&Dの電子天秤はRS232Cが2400baudがデフォルトのようなので、2400baudでやっている。あれ、パリティーとかストップとか7bit 8bitとかそのへんどうなってんだろ?多分世の中のメジャーな設定になっているはず。

#include "Keyboard.h"

void setup() {
  // open the serial port:
  Serial.begin(2400,SERIAL_7E1);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  // check for incoming serial data:
  if (Serial.available() > 0) {
    // read incoming serial data:
    char inChar = Serial.read();   
    Keyboard.write(inChar);
  }
}

 

しかし、肝心の電子天秤が今ないので、一旦作業は保留。さてうまく通信できるかな。
そして、次の疑問。RS232Cって何ボルトの電圧振幅必要なのかな??

今使っているOSがUbuntuなので、Windowsとはちょっと違う認識方法だが、うまく行っている様子。
Bus2にデバイス8としてArduinoがぶら下がっているようだが、CDC_ACM, HIDの2パターンで認識されていて、Arduino IDEなどからはおそらくシリアルポート越しの書き込み、HIDデバイスはHIDデバイスとして書き込まれるのかな、なんて思っている。

$ lsusb
Bus 002 Device 008: ID 2341:8036 Arduino SA Leonardo (CDC ACM, HID)
Bus 002 Device 004: ID 045e:0039 Microsoft Corp. IntelliMouse Optical
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 5986:051b Acer, Inc 
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
        |__ Port 2: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 3: Dev 8, If 2, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 3: Dev 8, If 0, Class=Communications, Driver=cdc_acm, 12M
        |__ Port 3: Dev 8, If 1, Class=CDC Data, Driver=cdc_acm, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
        |__ Port 2: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
        |__ Port 2: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M

 

 

HIDデバイスのコードを書き込んだデバイスであっても接続すると、シリアルポートの書き込み先にデバイスが出てくる。

 

ふと思ったが、キーを適当に叩くようなプログラムを入れておけば良かったんじゃないだろうか。よしやってみよう。
デバイス認識に時間かかりそうだから、5秒待たせて出力。

できた。この機能、シリアル通信の中身をテキストファイルに吐き出すのにも少し便利かもしれない。
いや、シリアル-USB変換使ってTeraTermとかで受信したらそれでOKかもしれないけど。

Keyboardには次の関数があるらしい。
Keyboard.begin()
Keyboard.end()
Keyboard.press()
Keyboard.print()
Keyboard.println()
Keyboard.release()
Keyboard.releaseAll()
Keyboard.write()

 

文字だが、あくまでもHIDデバイスなので送信できる文字に制約がある。Shiftを押して操作みたいなこともできるが、処理が煩雑になるので一旦は数字の伝送に専念してみる。

例えば、
+-,.0123456789abcdefghijklmnopqrstuvwxyz<>?_/ という文字を送信すると
~-,.0123456789abcdefghijklmnopqrstuvwxyz<>?=/ という文字になって返ってくる
+の記号がうまく処理できていないことがわかる
なんでだろうかと調べてみると、日本語キーボードと英語キーボードの配置が違う生だったようだ。

日本語キーボードに慣れないかと思って調べたらやっているひとがいた。
が、どうやったらいいのかわからないので色々調べている。

 

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする