2014年2月18日火曜日

Arduinoで昔のMacのキーボードをUSBに変換する

押入れ整理してたらこんなものを見つけました。
学生の頃使ってたMacintosh ColorClassicのケースと付属品一式。
往年はレポートやら何やらに色々と活躍してくれましたが、何しろ画面が狭く(512×384ピクセルw)、WindowsPCを買ってからは使う機会が減っていきました。ただ、このフォルムは気に入っていたので、ガワだけは何かに使えるかと思い、押入れにそっと仕舞っていましたが、仕舞ったまま忘れてました。

で、先日、ColorClassicのケースをipadのケースにしているブログを見つけて「コレだ!」と天啓を受けまして、「ipad持ってないし、windows8タブレット入れたら普通にPCとして使えるんじゃね?」と思い、手始めに純正のキーボードを最近のPCに接続できるよう、USB化してみようと思った次第です。

さて、手持ちのMacのキーボードですが、ColorClassicに付属していたApple Keyboard IIというキーボードです。バス仕様はADB(Apple Desktop Bus)という独自仕様のもので、基本的にPC用のものとは互換性がありません。
ずいぶん前、AppleがiMacを出してUSBを全面採用した際に、その筋の方々が使い慣れたキーボード類を使うため、ADB→USBのコンバータが販売されていたのですが、いまやそれも10年以上前のお話で、コンバーター自体が入手困難、もしくは非常に高価となってしまっています。

「こりゃダメか~」と諦めかけていたところ、「ADB to USB converter on Da Vinci」というブログフィードを発見。なんでも、Da Vinci32UというArduino準拠なマイコンボード上で、Arduino用ADB-USBコンバータを動かすというものです。Da Vinci32Uも安くていい感じだそうです。

詳しくはリンク先を参照いただくとして、元ネタサイトの補足をしながら試行錯誤の様子を貼っていきます。

Da Vinci 32U入手

まずはDa Vinci32Uの入手。
Da Vinci32UはArduinoという規格に準拠したマイコンボードで、StrawberryLinuxという企業のオリジナル製品です。ArduinoはUSBと汎用のI/Oポートを持っており、ArduinoIDEという開発環境で動作を自由にプログラムできるというものです。
今回使用したのはDa Vinci32U with Arduino bootloaderという製品。価格は1,260円、送料が400円、代引手数料が300円で合計1,960円と安価。千石電商など、店頭販売している電子部品店などもあるそうです。
今回はStrawberryLinuxの直販サイトで注文して即日発送、3日ほどで届きました。

思ったより小さいです。親指ぐらいの大きさです。USBのポートがmini-Bなのですが、普通のAと思っていたのでサイズ感を見誤っていましたw
付属品はピンヘッダとピンフレームとジャンパのみ、ハンダ付けはされていません。
とりあえず、ピンヘッダをハンダ付けしてみました。直接配線してもいいですが、接触不良起こしそうなのと、後々の動作確認が簡単そうだったので。
久しぶりにハンダゴテ握りましたが、割とうまくいきましたw

ソースの入手とドライバ&開発環境構築

お次、Da Vinci32Uのドライバのインストール。
先ほどの商品ページの中程に「Arduino-1.0.1/2/3Windows用ドライバとファームウェア」というリンクがありますのでダウンロードします。zipを解凍すると「da-vinci-32u.inf」というファイルが有りますので、コレを右クリックして「インストール」。
終わったら、Da Vinci32UとPCをUSBケーブルで繋ぎます。USBケーブルは最近のスマホに使われているmicro-Bでなく、mini-Bという若干マイナーなものです。手元になければ先ほどの販売サイトでも売っています。
正常にインストールされていれば、デバイスマネージャにシリアルポートとしてDa Vinci32Uが現れます。この際どのポートか(COM4など)を控えておきます。

お次、なにはともあれ、コンバータのソースをダウンロードします。
gitHub上のtmk_keyboardというプロジェクトが開発を行っています。こちらからありがたく頂きます。右側の「Download」リンクをクリックすると一式がzipに固められて落とせます。
解凍先はどこでもいいですが、Cドライブ直下とかのほうがパスがらみのトラブルが無くていいかと思います。

お次、開発環境の構築。
ダウンロード先は以下。


バージョンはArduinoIDEは1.0.5、WinAVRは20100110版を使用、いずれもWindows用インストーラ版です。インストールは、いずれもインストーラを実行し指示に従うだけです。インストール先はCドライブ直下などがいいそうです。

インストールが終わったら、ArduinoIDEの設定です。
まずは、使用ボードの設定。「Arduino-1.0.1/2/3Windows用ドライバとファームウェア」のzipの中にある、「1.0.3\board.txt」を

<ArduinoIDEのインストール先>\hardware\arduino\

に格納します。元々あるboard.txtはリネームしてバックアップしといたほうが良いかと思います。

そして、おもむろにArduinoIDEを起動。
ツール→マイコンボードに「Da Vinci 32U」があるので選択。
ツール→シリアルポートにリストされているシリアルポートから、デバイスマネージャで調べたポートを選択(COM*)。

今回の手順ではArduinoIDEでコンパイルは行いません。ArduinoIDEは、WinAVRというフリーのコンパイラでコンパイル&リンクしたモジュールを書き込みさせるためだけに使用します。
書き込みを行わせるためのコマンドがあるのですが、わかりにくいのでArduinoIDEで雛形を出してもらいます。
ファイル→環境設定を選択
 「より詳細な情報を表示する」の「書き込み」をチェック。
 ファイル→スケッチの例→01.Basic→Blinkを選択
 「→」(書き込む)ボタンクリック
とすると、↑のオレンジの枠にズラズラと文字が流れます。
その中に、
C:\Arduino\hardware/tools/avr/bin/avrdude -CD:\Arduino\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega32u4 -cavr109 -P\\.\COM3 -b57600 -D -Uflash:w:C:\Users\<ユーザ名>\AppData\Local\Temp\build653557085927138997.tmp\Blink.cpp.hex:i 
みたいな行があるかと思います。これが書き込み用のコマンドですので控えておきます。

ビルド&ライト

お次、ビルド。
コマンドラインを立ち上げて、
<ソースの解凍先>\converter\adb_usb
に移動して、
make all
でOKのはずですが、手元のWindows8.1(32bit)環境では、
0 [main] sh 2312 sync_with_child: child 4744(0x14C) died before initialization with status code 0xC0000142 
みたいな感じで落ちてしまいうまく行きません。
Google先生に聞いてみたところ、このフォーラムで、このファイル(msys-1.0.dll)と<WinAVRのインストール先>\utils\bin配下のものとを差し替えると現象が回避できるとのことでしたので、試してみたところうまくいきました。

成功すると、
<ソースの解凍先>\converter\adb_usb\adb_usb_lufa.hex
ができているはずです。これが書き込むイメージファイルです。

お次、書き込み。
先ほどArduinoIDEに吐出させた書き込みコマンドの雛形の.hexファイル部分を、WinAVRでmakeしてできた.hexファイルのパスに差し替えます。
C:\Arduino\hardware/tools/avr/bin/avrdude -CD:\Arduino\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega32u4 -cavr109 -P\\.\COM3 -b57600 -D -Uflash:w:<ソースの解凍先>\converter\adb_usb\adb_usb_lufa.hex:i 
こんな感じ。
ボードのリセットボタンを押して、ゆっくりとLEDが点滅している間に上記のコマンドを実行します。
avrdude done. Thank you.
とか出てれば成功。
これでDa Vinci32UにADB→USBコンバータが書き込まれました。

テスト&配線

次はハードウェア側。
こんな感じでつなぎます。
下の丸はキーボード側のコネクタを正面から見た図です。
キーボード側のデータI/OはPD0(上図の4番)で、その他にGND(1番)と5V(2番)を接続します。
さらに、5Vとデータを1kΩの抵抗でつないでプルアップする必要があるそうです。

配線してブレッドボード上でテスト。
できましたw
パワーキーもOFFにするだけなら効きます(OFF時にONにすることは無理みたい)。
このままだと実用に耐えないので、ハンダコテと格闘しながらできたのがこちら。
ADBはSビデオ端子と形状が同じ(厳密には異なるそうですが)なので、不要なSビデオ端子ケーブルをぶった切ってつなげました。抵抗は適当なジャンク部品から取り外して使用。ケースはパナレーサーのパンク修理用のパッチが入ってたケースが測ったようにぴったりでしたw

完成(∩´∀`)∩ワーイ

接続するとこんな感じ。
普通に文字も入力できますが、キーボードは101配列にも関わらず、106配列として認識されているようで、キーボード上の印字と異なる文字が出ます。
ちょっと困るので、この辺を参考に強制的に101配列として認識させます。
なお、この場合、日本語入力については半角/全角キーがなくなるので、適当なキーバインドをIMEを有効にするキーバインドとして登録する必要があります。

ひとまず、この状態でこの文章を書いてますが、
  • ファンクションキーやpgup/pgdnがない
  • カーソルキーの並びが使いにくい
  • 106キーに慣れきってしまったので特殊文字や日本語が入力しづらい
と、若干使いづらく(´・ω・`)な感じですw