360도 PWM 로터리 인코더 브레이크 아웃
360도 PWM 로터리 인코더 브레이크 아웃
설명
이 유형의 스위치는 증분 로터리 인코더입니다. 사실, 저렴한 비용과 속도와 같은 모션 관련 정보를 제공하기 위해 쉽게 해석 할 수있는 신호를 제공 할 수있는 능력으로 인해 모든 로터리 인코더에서 가장 널리 사용됩니다.
회전함으로써, 로터리 인코더는 회전 중에는 제한 제한이없는 로터리 전위차계 카운터와 달리 회전 중에 출력 펄스 주파수를 양의 반대 방향으로 계산할 수 있습니다. 로터리 인코더의 버튼을 사용하면 0에서 시작하여 초기 상태로 재설정 할 수 있습니다.
테스트 코드
int redpin = 2;
int 옐로 핀 = 3;
int greenpin = 4;
int apin = 6;
int bpin = 7;
int buttonpin = 5;
int state = 0;
int longperiod = 5000; // 녹색 또는 빨간색 시간
int shorperiod = 700; // 변경시기
int targetCount = shorperiod;
int count = 0;
void setup ()
{
PINMODE (apin, 입력);
PINMODE (BPIN, 입력);
PINMODE (ButtonPin, 입력);
PINMODE (Redpin, 출력);
PINMODE (옐로 핀, 출력);
PINMODE (Greenpin, 출력);
}
void loop ()
{
카운트 ++;
if (digitalread (buttonpin))
{
세트 라이트 (높음, 높음, 높음);
}
또 다른
{
int change = getencoderturn ();
int newperiod = longperiod + (Change * 1000);
if (newperiod> = 1000 && newperiod <= 10000)
{
longperiod = newperiod;
}
if (count> targetCount)
{
setstate ();
count = 0;
}
}
지연 (1);
}
int getencoderturn ()
{
// return -1, 0 또는 +1
정적 int olda = 낮음;
정적 int oldb = 낮음;
int result = 0;
int newa = digitalread (apin);
int newb = digitalread (bpin);
if (newa! = olda || newb! = oldb)
{
// 무언가가 변경되었습니다
if (olda == low && newa == High)
{
결과 = - (Oldb * 2-1);
}
}
Olda = Newa;
Oldb = Newb;
반환 결과;
}
int setstate ()
{
if (state == 0)
{
세트 라이트 (높음, 낮음, 낮음);
TargetCount = longperiod;
상태 = 1;
}
else if (state == 1)
{
세트 라이트 (높음, 높음, 낮음);
TargetCount = shorperiod;
상태 = 2;
}
else if (state == 2)
{
세트 라이트 (낮음, 낮음, 높음);
TargetCount = longperiod;
상태 = 3;
}
else if (state == 3)
{
세트 라이트 (낮음, 높음, 낮음);
TargetCount = shorperiod;
상태 = 0;
}
}
void setlights (int red, int yellow, int green)
{
DigitalWrite (Redpin, Red);
DigitalWrite (Yellowpin, Yellow);
DigitalWrite (Greenpin, Green);
}