まごころせいじつ堂

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

Davinci

PS/2キーボード変換器の製作(13) ハードウェアはできたが……

ハードウェアはできた。Daviciマイコンボードに6Pのmini-DINコネクタを接続、CLKとDATAをプルアップしてケース収納。
2012key01
2012key02
2012key03

 あとはPS/2のスキャンコードをUSB-UIDに変換(済)、Arduino Leonardoのkeyboard.press()に変換、さらに日本語キーボードの配列に変換するだけなのだが、問題点発覚。

以前調査した、Arduino IDE1.0.1でのコード変換部分。
Arduino IDE1.0.1/Leonardで足らないUSBキーを追加する
[HID.cpp]
	uint8_t i;
	if (k >= 136) {			// it's a non-printing key (not a modifier)
		k = k - 136;
	} else if (k >= 128) {	// it's a modifier key
		_keyReport.modifiers |= (1<<(k-128));
		k = 0;
	} else {				// it's a printing key
		k = pgm_read_byte(_asciimap + k);
		if (!k) {
			setWriteError();
			return 0;
		}
		if (k & 0x80) {						// it's a capital letter or other character reached with shift
			_keyReport.modifiers |= 0x02;	// the left shift modifier
			k &= 0x7F;
		}
	}
 上記ソースはkeybord.press()でコードを変換している箇所。与えられた数値が0x00〜0x7fを印字可能なキー、0x80〜0x87をモディファイアキー、0x88〜を表示不能な特殊キーとみなしている。0x00〜0x7fは const uint8_t _asciimap[128] で定義されてあるテーブルで変換される。0x88以上は、その値から0x88を引いた数値がUsageIDとしてUSB経由で送信される。つまり、ファンクションキーF7は #define KEY_F7 0xC8 と定義されているが、実際は0xC8ー0x88=0x40が送信される。
 ここで漏れてしまうキーは、UIDが0x78より大きいもので、日本語キーボード関連で影響がありそうなものは
[ろ](0x87)、[かたかな/ひらがな](0x88)、[¥](0x89)、[変換](0x8a)、[無変換](0x8b)、[かたかな](0x92)、[ひらがな](0x93)、[全角/半角](0x94)。
特に最後の[全角/半角](0x94)は日本語キーボードと認識している場合どうしたものか。USB-HIDをそのまま送出する方法を探すしかないのか。

 ターゲットとなるPCがキーボードを日本語配列と認識している場合、ALT+[`]が[全角/半角]と同等か調査し、もし違っていればUSB-UIDを直接送出する方法を探す。

追記: 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('`');
    delay(10);
    Keyboard.release('`');
    Keyboard.release(KEY_LEFT_ALT);
 
WindowsXPにてこれで日本語入力が切り替わることを確認。助かった。MacOSXではそのままALT+`扱い。 

Arduino LeonardoとATmega32U4搭載マイコンのピン接続表

Arduino Leonardoと32U4を搭載したマイコン基板の端子について調べた。

本家Arduino Leonardo
ATmega 32U4-Arduino Pin Mapping  ※2012/5/28現在、表にミスあり。32U4のpin30に対応するのはDigitalPin10。
ATmega32U4搭載マイコンボード[スイッチサイエンス] ※現行品はシルク印刷にミスあり。
ダ・ヴィンチ32U[ストロベリーリナックス]

 これらのマイコン基板の端子とATmega32U4のピン対応一覧をExcelにまとめた。
一応テスタを使ってよくわからない所は確認したが、使うときは自己責任でどうぞ。

32U4.xls[Google Drive]

 
32U4 pin# Pin Name Leonardo 32U4Breakout Davinci
1 PE6(INT.6/AIN0) Digital Pin7 14.E6 30.PE6
2 Uvcc +5V 6.VCC 2.+5V
3 D- RD- - -
4 D+ RD+ - -
5 UGND UGND - -
6 Ucap UCAP - -
7 VUSB Vbus - -
8 PB0(SS/PCINT0) RXLED 1.B0 22.PB0
9 PB1(PCINT1/SCLK) SCK 2.B1 23.PB1
10 PB2(PDI/PCINT2/MOSI) MOSI 3.B2 24.PB2
11 PB3(PDO/PCINT3/MISO) MISO 4.B3 25.PB3
12 PB7(PCINT7/OCA0/OC1C/#RTS) Digital Pin11(PWM) 18.B7 29.PB7
13 RESET RESET 5.RST 3.RST
14 Vcc +5V 6.VCC 2.+5V
15 GND GND 21.GND 1,17,32 GND
16 XTAL2 XTAL2 - -
17 XTAL1 XTAL1 - -
18 PD0(OC0B/SCL/INT0) Digital Pin3(SCL)(PWM) 10.D0 4.PD0
19 PD1(SDA/INT1) Digital Pin2(SDA) 9.D1 5.PD1
20 PD2(RXD1/AIN1/INT2) Digital Pin0(RX) 7.D2 6.PD2
21 PD3(TXD1/INT3) Digital Pin1(TX) 8.D3 7.PD3
22 PD5(XCK1/#CTS) TXLED (TXLED) 9.PD5
23 GND1 GND 21.GND 1,17,32 GND
24 AVCC AVCC 6.VCC 2.+5V
25 PD4(ICP1/ADC8) Digital Pin4 11.D4 8.PD4
26 PD6(T1/#OC4D/ADC9) Digital Pin12 19.D6 (シルク誤記D6) 10.PD6
27 PD7(T0/OC4D/ADC10) Digital Pin6(PWM) 13.D7 11.PD7
28 PB4(ADC11/PCINT4) Digital Pin8 15.B4 26.PB4
29 PB5(PCINT5/OC1A/#OC4B/ADC12) Digital Pin9(PWM) 16.B5 27.PB5
30 PB6(PCINT6/OC1B/OC4B/ADC13) Digital Pin10(PWM) 17.B6 28.PB6
31 PC6(OC3A/#OC4A) Digital Pin5(PWM) 12.C6 12.PC6
32 PC7(ICP3/CLK0/C4A) Digital Pin13 20.C7 13.PC7
33 PE2(#HWB) HWB HWB 16.HWB
34 Vcc1 +5V 6.VCC 2.+5V
35 GND2 GND 21.GND 1,17,32 GND
36 PF7(ADC7/TDI) Analog In 0 23.F7 21.PF7
37 PF6(ADC6/TDO) Analog In 1 24.F6 20.PF6
38 PF5(ADC5/TMS) Analog In 2 25.F5 19.PF5
39 PF4(ADC4/TCK) Analog In 3 26.F4 18.PF4
40 PF1(ADC1) Analog In 4 27.F1 15.PF1
41 PF0(ADC0) Analog In 5 28.F0 14.PF0
42 AREF AREF 22.AREF 31.REF
43 GND3 GND 21.GND 1,17,32 GND
44 AVCC1 AVCC 6.VCC 2.+5V

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キーボード相当の扱いだと思われます。
 

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
が参考になる。

Arduinoメモ

Arduino Unoを買ったままでほったらかしてたので動作確認してみた。
 arduino本家
ここから最新のArduinoIDEをダウンロードする。
USB-Serial通信のドライバは、MacOSXの場合はFTDIのサイトからダウンロード(Getting Startにリンクあり)、Windowsの場合はダウンロードしたzipファイルの中、driversのフォルダ。

Arduino UnoにはサンプルとしてBlinkがあらかじめ書きこんであった。IDEからBlinkを開き、LEDが点滅する周期を書き換えて転送し確認する。ボード上のPort13にLEDが接続済みなので、わざわざブレッドボードなど使わなくてもOK。

 安価なArduino Davinciを持っているのだが、これはデフォルトでは選択できない。Boards.txt内でコメントアウトされているらしいので有効にする。
Windowsの場合はhardware\arduino\boards.txt。改行コードがLFなので注意。
MacOSXの場合は以下を参考にした。
TETRASTYLE-dev-BLOG
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt

追記:Arduino Davinciで動作確認。
Windows7(32bit)ではデバイスドライバを認識しなかった。Strawberry-Linuxのページを参照して.infをダウンロードしてもできず。
MacOSXではBoardをArduino Leonardに設定すればサンプルのBlinkが動いた。基板上の赤いLEDが点滅する。ただしスケッチをコンパイルしてアップロードするごとにリセットされ、モデムとして認識される。これは32U4でUSBの機能を実現しているせいかもしれない。(Arduino UnoはUSBは別チップ)


記事検索
プロフィール

hardyboy

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