Breakout dell'encoder rotante PWM a 360 gradi
Breakout dell'encoder rotante PWM a 360 gradi
Descrizione
Questo tipo di interruttore è un encoder rotante incrementale. È un dato di fatto, è il più utilizzato di tutti gli encoder rotanti a causa del suo basso costo e della capacità di fornire segnali che possono essere facilmente interpretati per fornire informazioni relative al movimento come la velocità.
Ruotando, l'encoder rotante può contare la frequenza dell'impulso di uscita in direzione positiva e inversa durante la rotazione, a differenza di un contatore del potenziometro rotante senza contare la limitazione. Con il pulsante sull'encoder rotante, può essere ripristinato allo stato iniziale a partire da zero.
Codice di test
int RedPin = 2;
int YellowPin = 3;
int greenpin = 4;
int apin = 6;
int bpin = 7;
int bottonPin = 5;
int stato = 0;
int longperiod = 5000; // Tempo a verde o rosso
int stivalette = 700; // periodo di tempo in cui si cambia
int targetCount = ShortPeriod;
int count = 0;
void setup ()
{
pinMode (apin, ingresso);
pinMode (bpin, ingresso);
pinMode (bottonpin, input);
pinMode (Redpin, output);
pinMode (YellowPin, output);
pinMode (GreenPin, output);
}
void loop ()
{
conta ++;
if (DigitalRead (ButtonPin))
{
set luci (alti, alti, alti);
}
altro
{
int change = getenCoderturn ();
int newperiod = longperiod + (cambio * 1000);
if (Newperiod> = 1000 && NewPeriod <= 10000)
{
longperiod = newperiod;
}
if (Count> TargetCount)
{
setState ();
conta = 0;
}
}
ritardo (1);
}
int getEnCoderturn ()
{
// return -1, 0 o +1
statico int vecchio = basso;
static int oldb = basso;
int risultato = 0;
int newA = DigitalRead (apin);
int newB = DigitalRead (BPIN);
if (newa! = oldA || newb! = oldb)
{
// qualcosa è cambiato
if (oldA == Low && newa == High)
{
risultato = - (oldb * 2 - 1);
}
}
OldA = newa;
oldb = newb;
risultato di ritorno;
}
int setState ()
{
if (stato == 0)
{
set luci (alti, bassi, bassi);
TargetCount = LongPeriod;
stato = 1;
}
else if (stato == 1)
{
setlight (alti, alti, bassi);
TargetCount = ShortPeriod;
stato = 2;
}
altrimenti if (stato == 2)
{
set luci (bassi, bassi, alti);
TargetCount = LongPeriod;
stato = 3;
}
else if (stato == 3)
{
set luci (bassi, alti, bassi);
TargetCount = ShortPeriod;
stato = 0;
}
}
set luci void (int rosso, int giallo, int verde)
{
DigitalWrite (RedPin, Red);
DigitalWrite (YellowPin, Yellow);
DigitalWrite (GreenPin, Green);
}