Attiny85 3 key keyboard prototypeing

 3つ、最終的には4つのキーからなるキーボードをATtiny85で作る。
ATtiny85をdigispark化する所まで前回したので、スイッチを作ってプロトタイプを作る。
https://funasover.blogspot.com/2024/06/attiny85digispark.html

アマゾンで売っているものだと、こんな感じのもの。一つのボタンで、パスワードを一発でいれたり、特定のフォルダーを開いたり・・・という使い方。


【AttinyのHID化】

HID(Human Interface Device)、つまりマウスやキーボードのこと。
digispark化しただけだと、小さいArduinoを作っただけで、キーボードとして、そもそもOSが認識してくれない。

・digikeyboard
digikeyboardというライブラリーを入れてHID化する事は、沢山WEBで確認できる。
結論から言うと”上手く動かない”
切り分けはしていないが、ボードマネージャーとしてATTinyCoreと、digikeyboardの組みあわせだと動かない(わかる人から見たら当然なのかもしれないが)
単キーの出力”A”とか”enter"とかなら動いたのだが、一度に文字列を出力すると思いもしない文字列しか出力してくれなかった。


FPSゲームのデモモードをキープするために、digisparkを使っているのを見つけた
これにならって、AdafruitのTrinketKeyboardを使う。

【TrinketKeyboardライブラリー】

https://github.com/adafruit/Adafruit-Trinket-USB/tree/master

”Code”をクリックして、Download ZIPを選択して、DLしてしまう。

欲しい、TnkerKeyboardのフォルダを
C:\Users\(ユーザ名)\Documents\Arduino\libraries\
の下にコピーする。
(TnkerKeyboardのフォルダをZIPにして、IDEからZIP指定するという手段でもOK)
コピーしてからIDEを立ち上げると、ライブラリーが取り込まれていて、Exampleが見えるようになっているはず。

【回路】

本当は4つのキーボードにしたいが、PB5(1番ピン)はResetの問題があるので、まずは3つ、PB0(5番ピン)、PB1(6番ピン)、PB2(7番ピン)にスイッチをつける。
PB0を例とするとPB0--スイッチ--GNDと接続、押されたらGNDに落ちるように構成。

【スケッチ】

#include <TrinketKeyboard.h>
// Attiny85
// PB5(reset)-|   |-VCC
//        PB3-|   |-PB2
//        PB4-|   |-PB1
//        GND-|   |-PB0

#define KEY_ESCAPE 0x29
const int PB0pin = 0;
const int PB1pin = 1;
const int PB2pin = 2;
//const int PB5 = 5;
bool outputState = true;

void setup() {
   pinMode (PB0pin, INPUT_PULLUP);
   pinMode (PB1pin, INPUT_PULLUP);
   pinMode (PB2pin, INPUT_PULLUP);
   //pinMode (PB5, INPUT);

   TrinketKeyboard.begin(); //start USB stuff
}
void loop() {
  TrinketKeyboard.poll();
   if (digitalRead(PB0pin) == LOW)
  {
    TrinketKeyboard.pressKey(KEYCODE_MOD_LEFT_SHIFT, KEYCODE_A);
    // this should type a capital A
    TrinketKeyboard.pressKey(0, 0);
    // this releases the key
    delay(150);
  }

  if (digitalRead(PB1pin) == LOW)
  {
    // type out a string using the Print class
    TrinketKeyboard.print("Hello World!");
    TrinketKeyboard.pressKey(0,KEYCODE_ENTER);
    // this should push enter key
    TrinketKeyboard.pressKey(0, 0);
    // this releases the key
    delay(100);
  }
    if (digitalRead(PB2pin) == LOW)
  {
    // type out a string using the Print class
    TrinketKeyboard.print("PB2 key pushed");
    delay(100);
  }
  delay(1);
}


解説を簡単にすると、
#include <TrinketKeyboard.h>
はTrinketKeyboardを使う以上はインクルードしておく。
setup内で
TrinketKeyboard.begin(); //start USB stuff
をコールする。これがないと、HIDとして認識せず、”これはキーボードですよ!”とPCに向かって言わない。
Loopの中で
TrinketKeyboard.poll();
をまず呼ぶ。スケッチ例によると説明によると10msec毎にこの関数を呼ばないと、コンピューターが、キーボードが停止したと思ってエラーを出すと書いてある。
しかし、キーが押されたらdelayで待たないと連続的に文字や文字列が入るので、delay(100)とか待たせるが、止まったりはしない。

TrinketKeyboard.pressKey(KEYCODE_MOD_LEFT_SHIFT, KEYCODE_A);
TrinketKeyboard.pressKey(0, 0);

この場合はシフトを押しながらAのキーを押し、(0,0)で離すという操作をしている。引数の”0”は何も押さないを意味しているので、Enterだけを押したい場合は、

TrinketKeyboard.pressKey(0,KEYCODE_ENTER);

という事になる。

スケッチの書き込みは、
のLチカと同じ。

書き込み時に、
 warning: "__SFR_OFFSET" redefined
 "__SFR_OFFSET" が再定義されていると警告がでる。
これについては、Adafruitのフォーラムに質問があがっていて
結論・・・警告だから気にするなという事で、そのまま。

【動作】


順にスイッチを押していくと、上のように出力される。
スイッチのチャタリングもあるので、短い文字の時はdelay()の時間を調整が必要でやや長め。長い文字列の時は、まあ100msecも待てば複数回入る事はない。

無事に目的に一つ近づき、3キーボードの一発入力のプロトタイプは動作を確認する事ができた。














コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

ILI9341 240X320 Arduino

Attiny85 FuseRest