Digisparkキーボードのファームウェア書き換え方法
Qiitaの検索等から来られた方はまずこちらを見ていただけるとありがたいです。下の画像のようなものを販売しているBoothのページになります。(画像は試作品)
まずはArduino IDEの導入とボードマネージャの追加を行ってください。すでに済んでいる場合はスキップしてください。
Arduino IDEの導入方法は調べればたくさん記事が出てくるのでここでは省略させていただきます。
ボードマネージャの追加も調べれば出てきますが、一応他者様が作成された記事のリンクを貼らせていただきます。こちらを参考にしてください。
導入はここまで
コードの書き換え
Arduino IDEを起動し、新しいプロジェクトが開かれていることを確認してください。
そしてこちらのリンクのコードをそのままコピペしてください。(もともと書かれているテキストはすべて上書きしてしまって大丈夫です)
10行ほどのコメントアウト部の下に
//この下にある波括弧とダブルクオーテーションの中の文字列を変更して使用してください:
char Text_1[] = {"Text_1"};
char Text_2[] = {"Text_2"};
のような部分があります。この中のText_1
とText_2
をお好みの文字列に変更して下さい
その下に
//自動で改行させたい場合は下の行をコメント解除して下さい:
//#define ENDENTER_TRUE
とあります。コメント解除すると文字列を入力した後に自動で改行(=Enterキー)されますので必要に応じて変更して下さい
ひらがな、カタカナ、漢字、特殊記号などはうまく入力させることができません。ご注意ください。
これらマルチバイト文字を使用したい場合Google日本語入力のインストールが必要となります
プログラムの書き込み
コードの一番初めの行の #include <DigiKeyboard.h>
の Digikeyboard
がオレンジ色になっていることを確認してください。なっていない場合、以下の操作をしてください。
- 操作①:ウィンドウ上部の「ツール」タブをクリック
- 操作②:「ボード:うんたらかんたら」にカーソルを合わせる
- 操作③:右に出てくるメニューの中の「Digistump AVR Boards」にカーソルを合わせる
- 操作④:そのまた右に出てくるメニューの中の「Digispark (Default - 16.5mhz)」をクリックして選択
- 操作⑤:ウィンドウ右下の文字が` COM〇のDigispark(Default - 16.5mhz)`になっていることを確認
これで Digikeyboard
がオレンジ色になっているはずです
この時点ではまだパソコンにDigisparkキーボードを挿さないでください。すでに挿してしまっている場合は抜いてください。
ここからコンパイルを行います。
ウィンドウ左上にある、円の中に右向き矢印が入ったようなボタンを押します。物理的に押さないでくださいね
するとコンパイルが始まります。少し待ちましょう。使用されるパソコンによってはそこそこ時間がかかるかもしれませんが気長に
グローバル変数は○○バイトのRAMを使用しています。
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
このような表示が出たらコンパイル完了です。
SW1と書かれている方のボタンを押しながらパソコンのUSBポートに挿してください。書き込みが始まります。
失敗する場合はUSBポートを変える、コンパイルからもう一度やり直す、あまり良くない方法ですが本体全体を少し押し下げ、USB端子を押し付けるようにするなどしてください。これでほぼ確実に書き込みができるはずです。
コンパイル完了から60秒以上経っても差し込まれていない場合は
> Please plug in the device ...
> Press CTRL+C to terminate the program.
> Device search timed out
このような表示が出ます。
また、無事に書き込みができた場合は
> Starting the user app ...
running: 100% complete
> > Micronucleus done. Thank you!
このような表示が出ます。これで完了です。お疲れさまでした!
心配な方はメモ帳を起動するなどして試しに動かしてみてください。動作確認をする前に一度挿しなおすことをオススメします
つかいかた
適当なUSBポートに挿し、1秒ほど待ってからボタンを押すとプログラム通りに文字列が打たれるはずです。
どんな使い方があるの? と思うかもしれませんが意外と使えます
例えばコピペ用キーボードだったり、パスワード自動入力だったり、乱数打ち込むキーボードだったり、、、
アイデア次第工夫次第でなんでもできますね。ちなみに僕はChromebookログイン用の自動入力デバイスとして使っています。というか開発動機がそれ。
番外編
ここからはプログラミング上級者向けになります。そもそもこれができる人は自分で作れそう
プログラム次第では、ただ文字列を自動で入力させるだけでなく、特定のキーストロークを自動化させることも可能です
主に使う関数は
- DigiKeyboard.sendKeystroke()
- DigiKeyboard.press()
- DigiKeyboard.delay()
- DigiKeyboard.releaseall()
これだけではなんかさみしいので以前ひまつぶしに作ったちょwwwwおまwwwwwwwww有名人じゃんwwwwwwwwwwww
とそれなwwwwwwwwwwww通知止まらんwwwwwwwwwwwwwwwwwww
を入力させるプログラムを置いておきます。Twitterでバズってるツイートのリプ欄でたまにみるやつですね。
正直需要なんてない気しかしないけど使用する際は普通のキーボードを使って日本語入力にしておいてください。動作保証は致しかねます。 無理やり日本語入力てきなことをさせてるので
#include <DigiKeyboard.h>
byte Pin0_old_data = 1;
byte Pin2_old_data = 1;
byte Pin0_new_data = 1;
byte Pin2_new_data = 1;
void setup() {
// put your setup code here, to run once:
pinMode(0, INPUT);
pinMode(2, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
Pin0_old_data = Pin0_new_data;
Pin2_old_data = Pin2_new_data;
Pin0_new_data = digitalRead(0);
Pin2_new_data = digitalRead(2);
if (Pin0_old_data == 1 && Pin0_new_data == 0){
COY();
}
if (Pin2_old_data == 1 && Pin2_new_data == 0){
STT();
}
DigiKeyboard.sendKeyStroke(0);
delay(50);
}
void COY(){
DigiKeyboard.sendKeyStroke(KEY_C);
DigiKeyboard.sendKeyStroke(KEY_Y);
DigiKeyboard.sendKeyStroke(KEY_O);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.print("wwww");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_O);
DigiKeyboard.sendKeyStroke(KEY_M);
DigiKeyboard.sendKeyStroke(KEY_A);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.print("wwwwwwwww");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_Y);
DigiKeyboard.sendKeyStroke(KEY_U);
DigiKeyboard.sendKeyStroke(KEY_U);
DigiKeyboard.sendKeyStroke(KEY_M);
DigiKeyboard.sendKeyStroke(KEY_E);
DigiKeyboard.sendKeyStroke(KEY_I);
DigiKeyboard.sendKeyStroke(KEY_J);
DigiKeyboard.sendKeyStroke(KEY_I);
DigiKeyboard.sendKeyStroke(KEY_N);
DigiKeyboard.sendKeyStroke(KEY_SPACE);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_J);
DigiKeyboard.sendKeyStroke(KEY_A);
DigiKeyboard.sendKeyStroke(KEY_N);
DigiKeyboard.sendKeyStroke(KEY_N);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.print("wwwwwwwwwwww");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
}
void STT(){
DigiKeyboard.sendKeyStroke(KEY_S);
DigiKeyboard.sendKeyStroke(KEY_O);
DigiKeyboard.sendKeyStroke(KEY_R);
DigiKeyboard.sendKeyStroke(KEY_E);
DigiKeyboard.sendKeyStroke(KEY_N);
DigiKeyboard.sendKeyStroke(KEY_A);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.print("wwwwwwwwwwww");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_T);
DigiKeyboard.sendKeyStroke(KEY_U);
DigiKeyboard.sendKeyStroke(KEY_U);
DigiKeyboard.sendKeyStroke(KEY_T);
DigiKeyboard.sendKeyStroke(KEY_I);
DigiKeyboard.sendKeyStroke(KEY_SPACE);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_T);
DigiKeyboard.sendKeyStroke(KEY_O);
DigiKeyboard.sendKeyStroke(KEY_M);
DigiKeyboard.sendKeyStroke(KEY_A);
DigiKeyboard.sendKeyStroke(KEY_R);
DigiKeyboard.sendKeyStroke(KEY_A);
DigiKeyboard.sendKeyStroke(KEY_N);
DigiKeyboard.sendKeyStroke(KEY_N);
DigiKeyboard.sendKeyStroke(KEY_SPACE);
DigiKeyboard.delay(50);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(50);
DigiKeyboard.print("wwwwwwwwwwwwwwwwwww");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
}
書き込み方は同じです。バズツイへのリプにお使いください。
ある程度プログラミングできる人なら何をやっているのか大体読めると思います。好きに改造してください。
ちなみに Serial.print();
を DigiKeyboard.print();
に置き換えればシリアル通信で送っているデータをキーボード入力で送れるようになります。また、 .println();
とすれば改行もしてくれるのでいい感じに使い分けてあげてください。
2021-10-14追記
コメントにもある通りプログラム次第ではマウスとかも作れます
その場合は<digiMouse.h>
をインクルードしてください
このページの内容は以上です。