0. はじめに
本家?の「Digispark USB Development Board」は、いつからか現在も販売していない。
Amazonで「digispark attiny85」を検索すると、互換品?が多数ヒットする。1個当たりの価格は本家の$\frac{1}{3}$ほどで、日本に在庫を置いているのか注文して2日後には手元に届くショップもある。
以降、この製品を単にボードと略す。
このボードはマウスやキーボードをお手軽にシミュレーションするには打って付けの製品である。しかし、このボードは、書き込んだプログラム(スケッチ)が動き出すまでに、5〜6秒のタイムラグがある。
http://digistump.com/wiki/digispark/tutorials/connectingから引用
If you unplug the Digispark and plug it back in or attach it to another power source there will be a delay of 5 seconds before the code you programmed will run. This 5 second delay is the Digispark Pro checking to see if you are trying to program it.
このボードにとっては意図された仕様であるが、setup()
にてキーボードwrite
やprint
を実行したいときは、この5秒の待ちが無駄に長く邪魔である。
今回の記事は、この5秒をとり除く方法の説明である。
当Qiitaをはじめ日本のサイトを多数検索したが、これを実現する方法を探し出せなかった。海外のサイトで見つけた方法で実現できたので、備忘録も兼ねてここにまとめておく。
1. 環境
執筆時点の当方の環境は以下の通り。
・PC : MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
・OS : macOS Big Sur version 11.2.3 (20D91)
・Arduino IDE : 1.8.13 for Mac OS X
記事の内容はWindowsでも同じはず。M1 Macで動作するかは不明である。
2. ブートローダを書き替える
解決策はズバリ、「5秒待たないブートローダ」に書き替える、である。
上記引用文書にあるように、「電源ONからの5秒間は新たなプログラム(スケッチ)を書き込むチャンスの時間」である。よって「書き込み前に一度USBポートから抜き、書き込み指示をしてから再びUSBポートに挿す」動作が必要なわけだ。
「5秒待たないブートローダ」にはこの書き込みチャンスは無い。代わりに、P0ポートをPull-Downすることで「プログラムの書き込みを待つ」仕様となる。
順を追って説明する。
2.1 書き込みコマンドと新ブートローダの入手
今回の解決策は、こちらの動画から得た内容であるが、動画で説明している入手先のリンクはすでに切れている。ネットを探し同等のダウンロード先を見つけた。
・書き込みコマンドの入手先
MacOS : https://github.com/micronucleus/micronucleus/tree/master/commandline/builds/x86_64-apple-darwin/micronucleus
Windows : https://github.com/micronucleus/micronucleus/tree/master/commandline/builds/x86_64-mingw32/micronucleus.exe
多分、libusb0.dllも必要。
・新ブートローダの入手先
こちら:https://github.com/overfl0/NocInformatykaBoard/blob/master/upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex
(こちらが本家かも:https://github.com/micronucleus/micronucleus/tree/v1.11/upgrade/releases/micronucleus-1.11-entry-jumper-pb0-upgrade.hex)
当然だが、ボードに書き込むブートローダなので、Mac/Windowsの区別は無い。拡張子がhexだから中身はバイナリだと思ったがテキストだ。
2.2 新ブートローダを書き込む
書き込みコマンドと新ブートローダを同じディレクトリに保存する。ターミナルを開き、そのディレクトリにカレントを移動する。
書き込みコマンドの引数に新ブートローダを指定して実行するのだが、このとき、先にボードをUSBポートに挿してはダメだ。micronucleus
コマンドを投入して「Please plug in the device ...」と出てきたら、USBポートに挿す合図である。
$ ./micronucleus --run micronucleus-1.11-entry-jumper-pb0-upgrade.hex
> Please plug in the device ...
このタイミングでボードをUSBポートに挿す。すると「Device is found!」と出て書き込みが始まる。
> Device is found!
connecting: 33% complete
> Device has firmware version 1.11
> Available space for user applications: 6330 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 99 page size: 64
> Erase function sleep duration: 792ms
parsing: 50% complete
> Erasing the memory ...
erasing: 66% complete
> Starting to upload ...
writing: 83% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
Micronucleus done. Thank you! が出たら書き込み成功である。ボード上のプログラム(ステッチ)は初期化されたので、何も起きない。(プログラムが無いとLEDが早い点滅を繰り返すらしい)
Windowsの場合だと、引数の /runが必要みたいだ。--run
が不要かも?
> micronucleus.exe /run micronucleus-1.11-entry-jumper-pb0-upgrade.hex
3. ボードにプログラム(スケッチ)を書き込む
新しいブートローダは、Arduino IDEからスケッチを「マイコンボードに書き込む」ときの手順が、以下のように変更されている。
- ボードの
P0
ポートをpull-downする(P0
とGND
をジャンパー線でつなぐ) - Arduino IDEのメニュー「マイコンボードに書き込む」か ⌘U
-
Please plug in the device ...
が出たら、ボードをUSBポートに挿す -
Micronucleus done. Thank you!
が出たら書き込み完了。USBポートから抜き、ジャンパー線も外す。
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
> Please plug in the device ...
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.11
> Available space for user applications: 6330 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 99 page size: 64
> Erase function sleep duration: 792ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
プログラムの書き込みが終わると、ボードがリセットされ書き込んだプログラムが起動される。このため、注意点としては、キーボード送出のプログラムを書いた時に、Arduino IDE上のカーソル位置にキーが送出され、プログラムコードを壊す可能性がある。自分は/* */
の間にカーソルを置き⌘Uすることで、キーが送出されても影響が少ないようにしている。(時々忘れてコードが壊される、そのときは⌘Zで戻している)
4. いざ起動
下の動画をご覧いただきたい。(↓クリックするとYouTubeで再生する)
画面に映っている_ストップウォッチ_の時間を見ると、
50.287 電源LEDが点灯
50.687 pin#1のLED点灯
52.547 最初の文字T
が送出された
53.247 最後のEnter
が送出された
53.837 pin#1のLED消灯 (1秒ディレイ後の)
であった。つまり、
・ボードに電源が入った0.4秒後にsetup()
が呼ばれた
・最初のT
がタイプされるまでに0.9秒のタイムラグがある$^{注)}$
・T
〜Enter
までの24文字のタイプに0.7秒を要した
注)DigiKeyboard.sendKeyStroke(0)
により、PCとの間でHIDキーボードのハンドシェイクが行われたものと想定する。
#include <DigiKeyboard.h>
void setup() {
pinMode(1, OUTPUT);
digitalWrite(1, true);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.print("This board is started!");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(1000);
digitalWrite(1, false);
}
void loop() {
}
体感的には1秒ぐらいでタイプを開始した感じで、すこぶる快適である。これで当初の目的を達成できた。
おまけ;動画で使用していた電源スイッチ付きUSBアダプタは便利である。ボードをUSBポートから何度も抜き差しを行うので、このスイッチは重宝する。
終わりに
このボードの既ユーザ各位には周知の事実かもしれないが、これまで不便を感じていた方々の参考になれば幸いである。また、間違い等があればご指摘いただけるとありがたい。
追伸;
マウスとキーボードを同時にシミュレーションするため、DigiKeyboard
とDigiMouse
両方のコードを書くとライブラリ重複エラーとなり上手くいかない。~~Report形式のデータを直接生成するしかないか?・・・あきらめ状態。~~2021.7.18変更
Adafruit-Trinket-USBのTrinketHidComboライブラリを使用すると、マウスとキーボードを同時にシミュレーション出きることがわかった。これでDigispark ATtiny85の使い道が広がった。
以上
参考URL