パルスハンドルとは
CNC工作機械で使うことの多い手動パルスハンドルです。AB位相信号を使っているエンコーダーやリニアスケールでも同じプログラムで処理できるはずです。差動出力の場合はAB位相信号のマイナスも同時に出力するタイプもあります。購入時には確認が必要です。
※ESP32は3.3V入力なので10kΩ程度の抵抗を入れてください。
5V系・3.3V系信号レベル変換
https://www.cepstrum.co.jp/hobby/5v33v/5v33v.html
ESP32でのサンプルプログラム
割り込みによってAB位相信号の変化を検出しカウントします。
GPT3よりESP32のカウンターについて
"ESP32には、16チャンネルの8ビットカウンター/タイマーであるLED PWM、または2チャンネルの16ビットカウンター/タイマーであるRMT(Remote Control)があります。ただし、AB位相カウンターを実装するには、外部のカウンター回路を使用するか、GPIOピンを割り込みに割り当てて、割り込みハンドラでカウントする必要があります。"
#include <esp32-hal.h>
#define ENC_A 18 // Encoder Phase A input pin
#define ENC_B 19 // Encoder Phase B input pin
int pulseCount = 0;
void IRAM_ATTR handleEncoderInterrupt() {
static bool aLastState = false;
static bool bLastState = false;
bool aState = digitalRead(ENC_A);
bool bState = digitalRead(ENC_B);
if((aLastState == LOW) && (aState == HIGH) && (bState == LOW)){pulseCount++;}
if((bLastState == LOW) && (bState == HIGH) && (aState == HIGH)){pulseCount++;}
if((aLastState == HIGH) && (aState == LOW) && (bState == HIGH)){pulseCount++;}
if((bLastState == HIGH) && (bState == LOW) && (aState == LOW)){pulseCount++;}
if((bLastState == LOW) && (bState == HIGH) && (aState == LOW)){pulseCount--;}
if((aLastState == LOW) && (aState == HIGH) && (bState == HIGH)){pulseCount--;}
if((bLastState == HIGH) && (bState == LOW) && (aState == HIGH)){pulseCount--;}
if((aLastState == HIGH) && (aState == LOW) && (bState == LOW)){pulseCount--;}
aLastState = aState;
bLastState = bState;
}
void setup() {
Serial.begin(115200);
pinMode(ENC_A, INPUT);
pinMode(ENC_B, INPUT);
attachInterrupt(digitalPinToInterrupt(ENC_A), handleEncoderInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_B), handleEncoderInterrupt, CHANGE);
}
void loop() {
Serial.printf("%d\n",pulseCount);
delay(10);
}
動作確認
シリアルモニタにカウント数を表示します。