M5StickCとATTiny85でのUSBキーボード制御

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

M5StickC(ESP32)とATTiny85を接続し、USBキーボード制御を作りました。ATTiny85をパソコンに接続することで、M5StickC経由で好きな文字列を入力することができます。

今回はM5StickCと接続していますが、ESP32や他のArduino、Raspberry PiなどI2Cが使えるものであれば問題ないと思います。

ATTiny85とは?

KKHMF Digispark Kickstarter ATTINY85 USB 超小型開発ボードArduino互換
KKHMF
¥599(2023/11/28 16:29時点)
Arduino IDE 1.0+にサポートする (OSX/Win/Linux)

下の記事でちょっとだけ触ったことがある、小さなArduino端末です。特徴としてUSB端子を持っていて、パソコンに差すとキーボードやマウスとして振る舞うことが可能です。

接続方法

今回はI2C接続にしました。キーボードとして動かすのでUARTでもいいのですが、複数接続できるI2Cの方が流用しやすいかなと、、、

端子M5StickCATTiny85
GNDGNDGND
SDAGPIO0P0
SCKGPIO26P2

上記の3本接続しました。M5StickCがI2C Master、ATTiny85がI2C Slaveとして動かします。また、ATTiny85の5VからM5StickCの5V inに追加で接続することで、給電しながら動かすこともできます。

接続に利用しているのは秋月電子で購入した「スルホール用テストワイヤ TP-200 (10本入)」です。はじめて利用しましたが、便利ですね。

アマゾンだと結構高いのでちょっと手が出ませんでした。

ATTiny85側スケッチ

#include "DigiKeyboard.h"
#include "TinyWireS.h"
#define SLAVE_ADDR 0x50
void receiveEvent(uint8_t howMany) {
  // LED ON
  digitalWrite(1, HIGH);
  // Receive
  char sendText[256];
  memset(sendText, 0, sizeof(sendText));
  for ( int i = 0 ; i < howMany ; i++ ) {
    sendText[i] = TinyWireS.receive();
  }
  // Keyboard Send
  DigiKeyboard.sendKeyStroke(0);
  DigiKeyboard.println(sendText);
  // LED OFF
  digitalWrite(1, LOW);
}
void setup() {
  TinyWireS.begin(SLAVE_ADDR);
  TinyWireS.onReceive(receiveEvent);
}
void loop() {
  TinyWireS_stop_check();
  DigiKeyboard.delay(100);
}

利用ライブラリ

開発環境は『USB直挿しマイコン Digispark(ATTINY85)』を参考に構築してください。I2C Slaveとして動かしますので、TinyWireSをライブラリフォルダに追加します。

コード自体は非常にシンプルです。受信した文字列をキーボード出力しているだけです。DigiKeyboard.delay()を定期的に呼び出さないと、パソコン側からキーボードとして認識しなくなるので注意しましょう。

LEDは必須ではないですが、本当に送れているのかがわからないので、光らせた方がいいです。また、キーボードの送信が完了したらI2Cで完了を送信したほうが、きれいな制御になると思います。

M5StickC側スケッチ

#include <M5StickC.h>
#include <Wire.h>
#define SLAVE_ADDR 0x50
void setup() {
  M5.begin();
  Wire.begin(0,26);
}
const char str[] = "lang-ship.com";
void loop() {
  M5.update();
  if (M5.BtnA.wasPressed()) {
    Wire.beginTransmission(SLAVE_ADDR);
    for ( int i = 0 ; i < strlen(str) ; i++ ) {
      Wire.write(str[i]);
    }
    Wire.endTransmission();
  }
}

BtnAを押すと、固定文字列をI2Cで送信するサンプルです。本当はこのスケッチを動かす前にI2C Scanner的なのを動かして、I2CとしてATTiny85が認識しているかを確認したほうがいいです。

まとめ

できそうだなと思ったので、目的もなく作ってみました。M5StickCに他のマイコンを接続するのは反則っぽくて、あまり好きじゃないのですが、ATTiny85だったら安いからいいかな。。。

M5StickCからUSBを制御できると、MQTTとかと連携することでリモートのパソコンなどのキーボードを遠隔から操作できるようになります。

ちなみに純正M5StickC Proto Hatだとちょっとだけ長さが足りなくて、入りませんでした。。。

コメント