1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ESP32を使ったパルスハンドルのサンプル

Last updated at Posted at 2023-04-26

パルスハンドルとは

CNC工作機械で使うことの多い手動パルスハンドルです。AB位相信号を使っているエンコーダーやリニアスケールでも同じプログラムで処理できるはずです。差動出力の場合はAB位相信号のマイナスも同時に出力するタイプもあります。購入時には確認が必要です。

IMG_0843.JPG
IMG_0844.JPG

※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);
}

動作確認

シリアルモニタにカウント数を表示します。

image.png

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?