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

# はじめに

5年ほど前、苦労して[ロータリーエンコーダデバイスを作りました](https://qiita.com/ELIXIR/items/69e34b2d068d7ffba9e3)。
が、時代は変わりました。
今はもっと簡単にロータリーエンコーダデバイスを作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c4321237-c44c-3c9d-10ae-64897ada6dcc.png)

#準備するもの
まず、なにはともあれロータリーエンコーダを用意します。
ロータリーエンコーダは押し込みクリックが入った5ピンのものが望ましいです。
残念ながら2024/5/19現在、秋月電子では販売されていません。
6月にaitendoさんが店舗を再開されるそうなので、そちらで手に入るようになるかもしれません。
自分は[こちら](https://www.amazon.co.jp/gp/product/B07RR7RF59/)で購入しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/97dd294a-bb22-4132-3733-a3915dcf1798.png)

次に[XIAO ESP32-C3](https://akizukidenshi.com/catalog/g/g117454/)を購入します。
![スクリーンショット 2024-05-17 085336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d0520413-4ffc-8e53-04a0-f712cfcbbc63.png)

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

これで準備は完了です。


# 作り方（ハードウェア）
まず、ロータリーエンコーダの側面の太いピン（固定用ピン）を両方ともカットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/51c7529a-9f3c-b4e2-5e14-c9be99c0b528.png)

その後、ピンが3本出ている側の中央のピンを腹側に曲げます。
中央のピンから、2本出ている側のGNDに近いピンに、下図のようにはんだ付けします。
![スクリーンショット 2024-05-17 073655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b92fa6b4-4eb3-7367-a351-6de2d75cf947.png)

はんだ付けが終わったら、念のため絶縁テープなどで保護します。
![スクリーンショット 2024-05-17 073629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/0635df05-841f-d8da-0e24-cc49a5db7cdf.png)

ロータリーエンコーダをひっくり返し、2本出ている側のピンがGNDに接続されるように配置し、はんだ付けします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b4e049f9-32b3-e9b2-45ec-45e0c0d07897.png)

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

# 作り方（ソフトウェア）
ArduinoIDEに[こちら](https://github.com/T-vK/ESP32-BLE-Mouse)のライブラリをインストールします。
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/92be4a17-2e9d-39d1-1396-71ea2852458f.png)

ESP32-C3に給電し、[デバイスの追加]ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/5bfcfb60-c3d1-8b85-762e-ef40973865a0.png)

オーディオデバイス、マウス、キーボード...を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d7960690-745b-71bb-7652-d0d97351ab32.png)

すると作成したロータリーエンコーダデバイスが検出されます。
検出されない場合はESP32-C3をPCに近づけるか、付属のアンテナを取り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/de137963-b53d-7df1-831d-c865042bb6a6.png)

検出されたデバイスをクリックするとデバイスの準備完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/5971653b-7047-0ffe-b746-a9f1e151d448.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/feccc8d2-a698-d184-4edb-cef2d98f8e4d.png)

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

以上です。
あとは自由にアプリケーションを作成して遊びましょう。
<iframe width="560" height="315" src="https://www.youtube.com/embed/kPN7ekCxt6o?si=BTzVFULIBtVa_FXI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>