LoginSignup
1
2

XIAO ESP32-C3でBLEロータリーエンコーダデバイスを作る

Last updated at Posted at 2024-05-17

はじめに

5年ほど前、苦労してロータリーエンコーダデバイスを作りました
が、時代は変わりました。
今はもっと簡単にロータリーエンコーダデバイスを作ることができます。
image.png

#準備するもの
まず、なにはともあれロータリーエンコーダを用意します。
ロータリーエンコーダは押し込みクリックが入った5ピンのものが望ましいです。
残念ながら2024/5/19現在、秋月電子では販売されていません。
6月にaitendoさんが店舗を再開されるそうなので、そちらで手に入るようになるかもしれません。
自分はこちらで購入しました。
image.png

次にXIAO ESP32-C3を購入します。
スクリーンショット 2024-05-17 085336.png

最後に、はんだ付けに必要な機材一式をそろえてください。

これで準備は完了です。

作り方(ハードウェア)

まず、ロータリーエンコーダの側面の太いピン(固定用ピン)を両方ともカットします。
image.png

その後、ピンが3本出ている側の中央のピンを腹側に曲げます。
中央のピンから、2本出ている側のGNDに近いピンに、下図のようにはんだ付けします。
スクリーンショット 2024-05-17 073655.png

はんだ付けが終わったら、念のため絶縁テープなどで保護します。
スクリーンショット 2024-05-17 073629.png

ロータリーエンコーダをひっくり返し、2本出ている側のピンがGNDに接続されるように配置し、はんだ付けします。
image.png

以上でハードウェアは完成です。

作り方(ソフトウェア)

ArduinoIDEにこちらのライブラリをインストールします。
PlatformIOを使っている方はPlatform.iniを下記のようにすればOKです。

[env:seeed_xiao_esp32c3]
;platform = https://github.com/platformio/platform-espressif32.git
platform = espressif32
board = seeed_xiao_esp32c3
framework = arduino
monitor_speed = 115200
lib_deps = 
	t-vk/ESP32 BLE Mouse@^0.3.1

下記のプログラムをビルドし、ボードに書き込みます。
static BleMouse bleMouse("ELIX_Mouse2");
の部分を変更することで、BLEで検出されるデバイス名を変更することができます。

#include <Arduino.h>
#include <BleMouse.h>

#define ENC_A D3
#define ENC_B D1
#define ENC_G D2
#define ENC_CLK D10

volatile int old_value = 0x11;
volatile int value = 0;
volatile int D;
volatile int count = 0;
volatile int wheelStep = 1;
volatile bool dirty = false;
volatile bool clicked = false;
static BleMouse bleMouse("ELIX_Mouse2");

void rotary(){
  value = (digitalRead(ENC_B)<<1) | digitalRead(ENC_A);
  if(old_value != value){
    dirty = true;
    int D = ((old_value << 1) ^ value) & 3;
    if(D < 2){
      count +=1;
    }else{
      count -=1;
    }
    old_value = value;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(ENC_A, INPUT_PULLUP);
  pinMode(ENC_B, INPUT_PULLUP);
  pinMode(ENC_G, OUTPUT);
  pinMode(ENC_CLK, INPUT_PULLUP);
  digitalWrite(ENC_G, LOW);
  bleMouse.begin();
  delay(100);
  attachInterrupt(ENC_A, rotary, CHANGE); //GPIOInt
  attachInterrupt(ENC_B, rotary, CHANGE); //GPIOInt
}

void loop() {
  if(digitalRead(ENC_CLK) == LOW){
    if(!clicked){
      clicked = true;
      if(bleMouse.isConnected()) {
        bleMouse.click(MOUSE_LEFT);
      }else{
        Serial.println("LClick");
      }
    }
  }else{
    clicked = false;
  }
  if(dirty){
    noInterrupts();
    dirty = false;
    if(count >= 1){
      if(bleMouse.isConnected()) {
        bleMouse.move(0, 0, -wheelStep*count, -wheelStep*count);
      }else{
        Serial.println("Right");
      }
      noInterrupts();
      count = 0;
      interrupts();
    }else if(count <= -1){
      if(bleMouse.isConnected()) {
        bleMouse.move(0, 0, -wheelStep*count, -wheelStep*count);
      }else{
        Serial.println("Left");
      }
      noInterrupts();
      count = 0;
      interrupts();
    }
    interrupts();
  }
  delay(10);
}

使用方法

PC>Bluetoothデバイス>Bluetoothデバイスの追加を選択します。
image.png

ESP32-C3に給電し、[デバイスの追加]ボタンを押します。
image.png

オーディオデバイス、マウス、キーボード...を選択します
image.png

すると作成したロータリーエンコーダデバイスが検出されます。
検出されない場合はESP32-C3をPCに近づけるか、付属のアンテナを取り付けます。
image.png

検出されたデバイスをクリックするとデバイスの準備完了です。
image.png

image.png

ロータリーエンコーダを回転させることでマウスホイールと同等の動作をします。
また、ロータリーエンコーダの軸を押し込むと左クリックの動作をします。

以上です。
あとは自由にアプリケーションを作成して遊びましょう。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2