まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

Arduino IDE1.0.1/Leonardで足らないUSBキーを追加する

Arduino IDE1.0.1とDavinciのLeonardo化の続き。
HID USBキーボードでどのキーが押されたかは、UsageIDというので与えられる。
http://www.usb.org/developers/devclass_docs/Hut1_11.pdf[pdf] のp.53〜 10 Keyboard/Keypad Page (0x07) 

表示不能な特殊キーとモディファイア(SHIFT,CTRL,ALT等)の番号を見ると、どうも違うのでソースを追ってみた。
特殊キーとモディファイアの定義は以下。
hardware/arduino/cores/arduino/USBAPI.h

keyboard.press()は以下。
hardware/arduino/cores/arduino/HID.cpp

 keyboard.press()では、与えられた数値が0x00〜0x7fを印字可能なキー、0x80〜0x87をモディファイアキー、0x88〜を表示不能な特殊キーとみなしている。
0x00〜0x7fは const uint8_t _asciimap[128] で定義されてあるテーブルで変換される。これはUSキー配列相当となっているので、日本語キーボード相当にしたければここをいじればよい。
0x88以上は、その値から0x88を引いた数値がUsageIDとしてUSB経由で送信される。つまり、ファンクションキーF7は #define KEY_F7 0xC8 と定義されているが、実際は0xC8ー0x88=0x40が送信される。

  ということで未定義のPrintScreenキーなどを追加してみた。

#define KEY_PRINTSCREEN                         0xCE
#define KEY_SCROLLLOCK                         0xCF
#define KEY_PAUSE                         0xD0

 といってもいきなりソースを修正するのは恐れ多いので、スケッチで実験してみる。

/* Button for Keyboard (Arduino Leonardo only) */

/*
  Button
 
 Turns on and off a light emitting diode(LED) connected to digital  
 pin 13, when pressing a pushbutton attached to pin 2. 
 
 
 The circuit:
 * LED attached from pin 13 to ground 
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 
 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.
 
 
 created 2005
 by DojoDave 
 modified 30 Aug 2011
 by Tom Igoe
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int keymacroPin = 3;
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

#define KEY_PRINTSCREEN                         0xCE
#define KEY_SCROLLLOCK                         0xCF
#define KEY_PAUSE                         0xD0


void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(keymacroPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  digitalWrite(keymacroPin, HIGH);

  Keyboard.begin();
}

void loop(){
  if (digitalRead(keymacroPin)==LOW) {
    // not implemented
  }

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == LOW) {     
    // turn LED on:    
    digitalWrite(ledPin, HIGH); 
    delay(30);
    while(buttonState == LOW){
      buttonState = digitalRead(buttonPin);
      // Keyboard.press(ctrlKey);
      Keyboard.press(KEY_PRINTSCREEN);
    }
  } 
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW); 
    Keyboard.release(KEY_PRINTSCREEN);
  }
  delay(100);
}

 これは、Windowsマシンに接続してボタンを押すと画面のスナップショットをクリップボードにコピーする。定義されていないキーもこれで使用できた。

Arduino IDE1.0.1とDavinciのLeonardo化

Arduino IDE 1.0.1がリリースされた。目玉はLeonardoの正式対応とマルチリンガル対応。MacOSXにインストールするとメニューが日本語化されていた。
 Leonardo正式対応ということで手持ちのDavinciを使ってUSB HID Keyboardのテストをやってみたが、コンパイルは通っても動作しない。これはDavinciのLeonardo相当ファームが古いのでは?と思い更新してみた。
 ファーム更新はAVR-ISP mkIIを使用する。Davinciにハンダ付けした6ピンのISP端子に写真の様に接続する。また、AVR-ISP mkIIでの書き込みでは別に電源が必要なため、DavinciにUSBケーブルを接続した。 また、Devinci上のショートプラグはショートしている。(写真右下にちょろっと見える)
2012isp
 
 書き込みはArduino-IDE1.0.1の[ツール]→[マイコンボード]でArduino Leonardoを選択。次に[ツール]→[書込装置]でAVRISPmkIIを選択。そして[ツール]→[ブートローダを書き込む]を実行。AVR-ISP mkII 装置のLEDがオレンジ色に光り、一分程で終了。
なぜか1回ではうまくいかず、DavinciをUSBケーブルでMac本体に接続してもシリアルポートを認識しなかった。2回目の書き込みでうまくいった。
ついでながら従来DavinciはWindows環境ではデバイスドライバをインストールできなかったのが、ファーム書き換えでArduino IDE1.0.1付属のデバイスドライバで認識できるようになった。まあLeonardoで書き換えられたんだからそうだろう。
 現在、発売されたばかりのArduino LeonardoとATmega32U4搭載マイコンボードを注文している。LeonardoのハードはほぼATmega32U4そのものなので、マイコンボードの方も書き換えられないかなあと思っている。

 HID-USB Keyboardのテストは以下。https://gist.github.com/2775713

/* Button for Keyboard (Arduino Leonardo only) */

/*
  Button
 
 Turns on and off a light emitting diode(LED) connected to digital  
 pin 13, when pressing a pushbutton attached to pin 2. 
 
 
 The circuit:
 * LED attached from pin 13 to ground 
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 
 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.
 
 
 created 2005
 by DojoDave 
 modified 30 Aug 2011
 by Tom Igoe
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int keymacroPin = 3;
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(keymacroPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  digitalWrite(keymacroPin, HIGH);

  Keyboard.begin();
}

void loop(){
  if (digitalRead(keymacroPin)==LOW) {
    // not implemented
  }

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == LOW) {     
    // turn LED on:    
    digitalWrite(ledPin, HIGH); 
    delay(30);
    while(buttonState == LOW){
      buttonState = digitalRead(buttonPin);
      // Keyboard.press(ctrlKey);
      Keyboard.press(' ');
    }
  } 
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW); 
    Keyboard.release(' ');
  }
  delay(100);
}

2012mouse

 これは以前作ったマウスクリックと同じようなもので、今回はボタンを押すとスペースキーを押しっぱなしにしたのと同じような動作になる。Arduino-IDE 1.0非公式のやり方ではKeyboard.write()でUSBキーボードの文字を押した動作になるが、押しっぱなしにする機能はなかった。Arduino1.0.1からはKeyboard.press()とKeyboard.release()で指示できる。このため前回はGoogle日本語モールス入力がスペースキーでは出来なかったのでマウスクリックにしたが、今回はスペースキーでOKになった。また、モディファイア(CTRLキー、SHIFTキー)も指示できるようだ。

 Mouse&Keyboardライブラリの使い方。Mouse & Keyboard libraries[arduino.cc]

モディファイアの定義などは以下にある。
hardware/arduino/cores/arduino/USBAPI.h

ちょっと抜き出すと:

#define KEY_LEFT_CTRL           0x80
#define KEY_LEFT_SHIFT          0x81
#define KEY_LEFT_ALT            0x82
#define KEY_LEFT_GUI            0x83
#define KEY_RIGHT_CTRL          0x84
#define KEY_RIGHT_SHIFT         0x85
#define KEY_RIGHT_ALT           0x86
#define KEY_RIGHT_GUI           0x87

#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_ESC                         0xB1
#define KEY_INSERT                      0xD1
#define KEY_DELETE                      0xD4
#define KEY_PAGE_UP                     0xD3
#define KEY_PAGE_DOWN           0xD6
#define KEY_HOME                        0xD2
#define KEY_END                         0xD5
#define KEY_CAPS_LOCK           0xC1
#define KEY_F1                          0xC2
#define KEY_F2                          0xC3
#define KEY_F3                          0xC4
#define KEY_F4                          0xC5
#define KEY_F5                          0xC6
#define KEY_F6                          0xC7
#define KEY_F7                          0xC8
#define KEY_F8                          0xC9
#define KEY_F9                          0xCA
#define KEY_F10                         0xCB
#define KEY_F11                         0xCC
#define KEY_F12                         0xCD




 うれしかったのは(1)Windowsでのデバイス認識、(2)USB-HIDキーボードの正式サポート。これであれがやっとできる!

参考:
2012/5/22 Arduino-1.0.1リリース[Arduino Wiki]
Arduino Leonardoへのガイド[スイッチサイエンス]

追記:モディファイアの設定も効いた。
      Keyboard.press(ctrlKey);
      Keyboard.press('a');
で全選択ができる(WindowsでCTRL+A)。
なお、ArduinoIDE1.0.1のMacOSX版では、Arduino(Leonardo)のシリアルポートがUSBケーブルの挿し直しなどで番号が変わってしまった場合にエラーとなる。ArduinoIDE1.0では接続すべきポートをサジェストしてくれていた。

ctrlaltdel.ino WindowsXPでこれを接続してボタンを押すとタスクマネージャが起動します。 

追記:
      Keyboard.press(shiftKey);
      Keyboard.press('2');
で表示されたのは'@'でした。つまりUSキーボード相当の扱いだと思われます。
 

Arduino 20x4 LCDの動作確認

手持ちの20桁×4行のLCDキャラクタディスプレイモジュール[20×4行][白色LEDバックライト付]SC2004CSWBを接続してみた。特に問題なし。
キャラクタLCDを制御するライブラリはこちら

スケッチ内でLCDの初期化を行う箇所。引数はrs,enable,D5,D5,D6,D7の順。
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); 
接続はArduino UNOの rs=9ピン、enable=8ピン、D5:7は7,6,5,4ピンに接続する。

20x4 LCDのピンは以下のとおり。

1.Vss(GND)
2.Vdd(+5V)
3.VLC(コントラスト)
4.RS
5.R/W
6.E
7.DB0
8.DB1
9.DB2
10.DB3
11.DB4
12.DB5
13.DB6
14.DB7
 
2012lcd20x4

ソースはこちら

Harpy届いたのでLチカ

株式会社鳥人間からHarpyというArduino互換ボードが出たので試しに買ってみた。
買ったのはHarpy nanoスターターキットで、Harpy nano本体、Arduinoのシールドを取り付けるアダプタ、USB-シリアル変換(5V/3.3V両対応)、6VACアダプタ、USBケーブルのセットで4980円。USB-シリアル変換は持っていなかったのと、世界最小のADK(Android Open Accessory Development Kit)ということで。
2012harpy01
 標準的なArduino UNOとの大きさ比較。面積は半分以下。白い基板がいいね。

主要部品はATmega328とMAX3421Eで、これはUSBホストシールドを搭載した状態と同じらしい。
USBホストに電源を供給する必要があるため、ACアダプタが必要。5Vの供給はUSBコネクタのみ、3.3Vは主要デバイスに。

 MacOSX(Lion)+Arduino IDEで動作確認してみた。Harpy USBシリアルのジャンパプラグを3.3Vに設定し、Arduino IDEで[Tools]→[Board]を"Arduino Pro or Pro mini(3.3V/8MHz) w/ATmega328"に指定して接続する。
2012harpy03

 購入時はLEDが点灯しっぱなし。ではLチカで確認してみる。Arduino IDEの[File]→[Examples]→[1.Basics]からBlinkを選ぶ。回路図を見ると、Harpy nanoはLEDがATmega328のPD6端子に接続されていたので、スケッチのpinMode(13,OUTPUT)……といった端子を指定してある箇所"13"をすべて"6"に書き換える。
 MacOSXで実行した場合、Upload時にシリアル・インターフェースの接続状況が変わっていたら訊ねてくれるので便利。

 こちらはH2A nanoボード。Harpy nanoに接続する。Arduinoのシールドが使える。
2012harpy02

 デモ用に3色LEDとタクトスイッチが1個付いている。LEDはカソード側がI/Oに接続されている。赤が2、青が3、緑が4。スイッチはA0で、押すとGNDに接続される。使用時はプルアップする。LEDのアノード側は共通で、ハンダブリッジで3.3Vに接続されてあるので2,3,4ピンを他の用途に使う時はハンダを取ればよい。
ピン配置はこちらを参考にしました。

ソースはhttps://gist.github.com/22a83dc4e21b7e39f9a5 。本体側の黄色から順に点灯する。タクトスイッチを押すと早送り。

2012harpy04

あと、試してみたらLチカ程度ではACアダプタはいらないみたい。
けっこう眩しいですよ。

PS/2キーボード変換器の製作(9)

これまでの実験から方針確認。

・キーボード入力について
(1)PS/2キーボード入力はArduinoのPS2Keyboardライブラリからスキャンコードを取得できるよう作りなおす
(2)USBキーボード入力はUSBホストシールドまたはAndroid ADKが使用できそうだが未確認
(3)キーボードへの出力(LED制御、キーリピート等)が必要

・キーボード出力について 
(1)Davinci(Arduino Leonardo)のKeyboard.write()で確認したが単発のキーしか認識しない。
(2)DavinciはUSB複合デバイスとして認識されるのでWindowsで毎回デバイスを問い合わされる。Disableにする方法はないか?
(3)Arduino Leonardoは正式サポートではないので今後変わる可能性がある。
(4)代替手段としてV-USBがある。未確認。部品は揃えてある。
(5)PS/2出力を実現するPS2devというのがあるらしい。

プランB
78K0の作例を元に作る。

PS2KeyboardExt2の確認

以前PS2Keyboardライブラリを試したが、PS2KeyboardExt2というのもあったので試した。

http://arduino.cc/playground/Main/PS2KeyboardExt2 目的としてはPS2Keyboardの代替としてCTRLやALTなどの修飾キーの取得とコードサイズの縮小を目的としたものらしい。ソースはそのまま貼り付けてあるだけなので以下の様にライブラリに置いた。
(1)librariesディレクトリ以下にPS2KeyboardExt2というディレクトリを作る。 
(2)PS2KeyboardExt2ディレクトリ以下にPS2Keyboard.cppとPS2Keyboard.hをコピペして置く。
(3)PS2Keboard.cppのソース中"Wprogram.h"を"Arduino.h"に修正。(Arduino IDE1.0用)

もしPS2Keyboardライブラリをインストール済みだったら競合するのでディレクトリごとどこかに退避しておく。

 配線はPS2CLK(pin5)がArduino UNOのpin3、PS2DATA(pin1)がArduino UNOのpin4に接続。
サンプルスケッチをコピペして開き、動作を確認。
サイズは以下のとおり。
 Binary sketch size: 5170 bytes (of a 32256 byte maximum)
 修飾キー(CTRL,ALT)が取得できなかったのは?だが、これを元に動作を追いかけてみる。

Arduino TVout Library

Arduinoにはソフトだけでビデオ出力を可能にするTVout Libraryがある。
 Arduino tvoutを参考にSync出力に割り当てたピンから1KΩ、Videoに割り当てたピンから470Ωを通して合成し、ビデオ入力端子に接続する。
 ライブラリはdownloadsからTVoutBeta1.zipをダウンロードする。
ライブラリは展開すると以下の3つがあるが、このうちTVoutをArduino-IDEディレクトリのContents/Resources/Java/libraries以下にTVout、TVoutfontsコピーし、Arduino-IDEを再起動する。(MacOSXの場合)
 
TVoutBeta1/pollserial
TVoutBeta1/TVout
TVoutBeta1/TVoutfonts 

Syncに割り当てるピンは7、Videoに割り当てるピンは9。Syncは割り当てを変えられないらしい。

あとはContents/Resources/Java/libraries/TVout/examples/DemoNTSC//DemoNTSC.pdeを開いてコンパイル、転送。

 で、はまったのがビデオ出力。最初、VHSビデオデッキの入力につないでいたのだが全然映らない。ブラウン管テレビの入力に接続したら映った。東芝のHDDレコーダRD-E301のライン入力はOKだったので録画してみた。これです。
 ソフトのみでこれだけの表示ができるとはびっくりですよ。

Davinci(Leonardo) マウスクリック

DavinciでUSBキーボードまわりを調べているけど、ちょっとわからないのでUSBマウスのほうで遊んでみた。
Mouse.press()で左ボタンを押した状態、Mouse.release()で離す。
 ソースはこちら。→https://gist.github.com/2651911

2012mouse
Davinciの5番ピン(D2)とGND間にキーを付ける。これがUSBマウスの左ボタンに対応する。
おまけで4番ピン(D3)を押すとモールスコードを発生するようにした。
Google日本語入力モールスバージョンで遊んでみよう。

あと、Arduino IDEでわかったこと。
pinMode(番号、INPUT) ; digitalWrite(番号,HIGH); でプルアップが指定できる。

Arduino Leonardo(Davinci)でHID-Keyboard動作確認

TETRASTYLEさんの記事を参考に実験しました。

開発環境:MacBookPro/MacOSX Lion/Arduino IDE 1.0
※自分の環境ではWindowsではDavinciのドライバをインストールできなかった(認識しない)
→ Arduinoメモ

Leonardo っぽいので紹介されているArduino Leonardoの互換品、DavinciでHIDキーボードの動作確認。

2012davinci
配線はこんな感じで、ワイアを2本付けます(D2とGND)。ワイアをショートさせるとHIDキーボードからキー入力されます。
 
実験結果:MacOSX、WindowsXP、Windows7(32bit)、Windows7(64bit)でOK

MacOSXでのデバイス認識
2012davinci_usb
 
WindowsXPでのデバイス認識(Davinci自体は?になってるがHID標準キーボード、HID標準マウスが見える)
davinci

こちらからはArduino IDE 1.0rc2のソースが取得できる→http://code.google.com/p/arduino/wiki/Arduino1

展開したあと、arduino-1.0-rc2/hardware/arduino/cores/arduino/ の中にある
USBAPI.h
HID.cpp
が参考になる。

USB HID Keyboard作例メモ

メモ。 Arduino/AVRでUSBデバイス(HID Keyboard)を実現するには、32U4を使った内蔵USB I/Fで行うものと、V-USBと言ってソフト制御のみで行うものがあるらしい。

Beating Level 1-4 in Bit.Trip runner with no hands!
iPadにArduinoをつなぎ,Webブラウザ上でProcessingを使ってセンサデータを可視化
How to bulid iPad with Arduino + Processing.js
Project Log : Arduino USB


V-USB Reference Projects
おなかすいたwiki V-USB
Virtual USB Keyboard
サブキーボード

 キーボード変換I/FではPS/2入力とUSB Bポートがあればいいので、ピンはたくさんはいらない。

これ、本命っぽい
Arduino®-Leonardo USB HID Keyboard & Mouse Tutorial and Advanced Serial Port Examples
 

Newton Keyboard to USB Converter
記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ