はじめに
5年ほど前、苦労してロータリーエンコーダデバイスを作りました。
が、時代は変わりました。
今はもっと簡単にロータリーエンコーダデバイスを作ることができます。
#準備するもの
まず、なにはともあれロータリーエンコーダを用意します。
ロータリーエンコーダは押し込みクリックが入った5ピンのものが望ましいです。
残念ながら2024/5/19現在、秋月電子では販売されていません。
6月にaitendoさんが店舗を再開されるそうなので、そちらで手に入るようになるかもしれません。
自分はこちらで購入しました。
次にXIAO ESP32-C3を購入します。
最後に、はんだ付けに必要な機材一式をそろえてください。
これで準備は完了です。
作り方(ハードウェア)
まず、ロータリーエンコーダの側面の太いピン(固定用ピン)を両方ともカットします。
その後、ピンが3本出ている側の中央のピンを腹側に曲げます。
中央のピンから、2本出ている側のGNDに近いピンに、下図のようにはんだ付けします。
はんだ付けが終わったら、念のため絶縁テープなどで保護します。
ロータリーエンコーダをひっくり返し、2本出ている側のピンがGNDに接続されるように配置し、はんだ付けします。
以上でハードウェアは完成です。
作り方(ソフトウェア)
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デバイスの追加を選択します。
ESP32-C3に給電し、[デバイスの追加]ボタンを押します。
すると作成したロータリーエンコーダデバイスが検出されます。
検出されない場合はESP32-C3をPCに近づけるか、付属のアンテナを取り付けます。
ロータリーエンコーダを回転させることでマウスホイールと同等の動作をします。
また、ロータリーエンコーダの軸を押し込むと左クリックの動作をします。
以上です。
あとは自由にアプリケーションを作成して遊びましょう。