2017年9月3日日曜日

Digispark+gcc USB キーボードデバイス作成チュートリアル

下の赤色LEDはCAPSランプになっていて、他のキーボードの CAPS LOCK キーにも連動して点滅する

概要


Digispark+gcc チュートリアルの Part2 です。 

Digispark にファームウェアを書き込んで、USB キーボードとして動作させる方法を説明します。これは Code and Life さんの記事 USB HID keyboard with V-USB を参考にして Digispark  で動作するようにアレンジしたものです。

ファームウェアを C言語で書いて avr-gcc でコンパイルし、USB  で接続した Digispark に書き込みます (Arduino の開発環境を使いません)。

Raspberry Pi, FreeBSD で動作確認しました。

※ Windows のコマンドラインから Digispark に生のファームウェアを書き込む手順は、1回目の記事 参照

1. 開発環境の準備


以前の記事 「Digispark+gcc Lチカチュートリアル(RaspberryPi, Linux, FreeBSD 版)」 の 1. 2. を実行して、必要なツールをインストールし、Digispark への書き込みソフト micronucleus
を実行できるようにしておく。

2.  ソースコードのダウンロードとコンパイル


(1) Digispark_kbd.zip をダウンロードして(「エラー」と表示された場合もそのままダウンロードできる)、ローカルに展開する。
(2) make コマンド(Raspberry Pi では make コマンド、FreeBSD では gmake コマンド) を実行すると main.c がコンパイルされてバイナリ (Intel HEX) 形式のファームウェア sample1.hex が生成する。

3. ファームウェアの書き込み


1. で準備した書き込みツール micronucleus をパスの通った場所に置き
# micronucleus --run sample1.hex
を実行する(root 権限が必要)。

> Please plug in the device ...
> Press CTRL+C to terminate the program.

と表示されるので、この状態で USB 端子に Digispark を挿入するとファームウェアが書き込まれる。

4. 動作確認


(1) ファームウェアを書き込んだ Digispark を PC の USB 端子に挿入すると、5-6 秒後に USB キーボードとして認識される。Raspberry Pi, FreeBSD では dmesg コマンドを実行すると、USB デバイスの名前が確認できる(ベンダID=0x16c0, デバイスID=0x05dc)。

Raspberry Pi の例

% dmesg
[522793.926120] usb 1-1.3: New USB device found, idVendor=16c0, idProduct=05dc
[522793.926166] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[522793.926185] usb 1-1.3: Product: V-USB
[522793.926201] usb 1-1.3: Manufacturer: KBD
[522793.945119] input: KBD V-USB as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/0003:16C0:05DC.0005/input/input4
[522794.000287] hid-generic 0003:16C0:05DC.0005: input,hidraw0: USB HID v1.01 Keyboard [KBD V-USB] on usb-20980000.usb-1.3/input0

FreeBSD の例

% dmesg
ugen0.5: <KBD> at usbus0
ukbd0: <KBD V-USB, class 0/0, rev 1.10/1.00, addr 12> on usbus0
kbd2 at ukbd0

Windows の例

Windows PC に挿した場合は HID キーボードデバイスとして認識されたことが、デバイスマネージャから確認できる。

 

(2) 基板上の LED (PB1 に接続) は CAPS LOCK ランプとして機能している。Digispark を接続した PC のキーボードの SHIFT+CAPSLOCKキーを押すと、本来のキーボードの CAPS LOCK ランプと同時に、Digispark 上の LED も点滅する。

(3) Digispark の P0 端子(PB0)と GND 端子をショートさせると、キーボードの "x" キーを押して離す動作が実行されて、画面上に x と表示される。




3 件のコメント:

  1. はじめまして。
    Arduinoの開発環境でも同じこと(CapsLockLEDの制御)は出来ますか?

    返信削除
  2. 実は Arduino の開発環境を使っていないため分かりません。すみません。
    検索してみたところ、海外の掲示板でも同じことをしたいと書いている人がいましたが、2017/9 の段階では Digispark のライブラリではできないみたいです。
    https://digistump.com/board/index.php?topic=2757.0

    返信削除
  3. ありがとうございます。
    同じ問題に直面してる人は見つかるんですけどね。

    返信削除