Digisparkで果物をエンターキーにしてみた


ビッグエンターキーという無駄にデカいエンターキーがありますが、どんなものでもエンターキーになれば面白いんじゃないかと思ったので、果物や野菜など何でもエンターキーになるHIDデバイスを作ってみました。

環境

Arduino IDE 1.8.13
Digispark互換ボード

回路図


0番ピンが送信ピンで、2番ピンが受信ピンになっています。0番ピンと2番ピンのの間には1MΩの抵抗が入っています。2番ピンと直列に0.1μFのコンデンサーをつなぎ、果物を接続します。

スケッチ

enterkey.ino
#include <DigiKeyboard.h>

#define REPEAT_TIME 25
#define FIRST_REPEAT_TIME 500
#define KEYUP_THRESHOLD 50
#define KEYDOWN_THRESHOLD 75
#define OUT_PIN 0
#define IN_PIN 2

unsigned long timer = 0;
int keytimes = 0;

void setup() {
  pinMode(OUT_PIN, OUTPUT);
  pinMode(IN_PIN, INPUT);
}

int get_touch() {
  int t = 0;
  int i;
  for(i = 0; i < 10; i++){
    digitalWrite(OUT_PIN, HIGH);
    while(digitalRead(IN_PIN) != HIGH) t++;
    digitalWrite(OUT_PIN, LOW);
    pinMode(IN_PIN, OUTPUT);
    digitalWrite(IN_PIN, LOW);
    DigiKeyboard.delay(1);
    pinMode(IN_PIN, INPUT);
  }
  return t;
}

void loop() {
  int touch = get_touch();
  if(touch > KEYDOWN_THRESHOLD && (timer == 0 || keytimes >= 2)){
    DigiKeyboard.sendKeyStroke(0x28);
    DigiKeyboard.delay(REPEAT_TIME);
    keytimes = min(keytimes + 1, 2);
    timer = millis();
  }else{
    if(touch <= KEYUP_THRESHOLD){
      timer = 0;
      keytimes = 0;
    }
    DigiKeyboard.sendKeyStroke(0);
    DigiKeyboard.delay(REPEAT_TIME);
  }
  if(millis() >= timer + FIRST_REPEAT_TIME){
    timer = 0;
  }
}

書き込み

Arduino開発環境の設定方法はこの記事を参考にしてください。
[メモ] Digispark(ATTiny85) Arduino開発環境で、Lチカ

設定が終わったら、Arduino IDEで
ツール > ボード > Digispark (Default - 16.5mhz)を選択します。
マイコンボードに書き込むをクリック。USBを抜き差しすると書き込みができます。

デモ