Super Duper mikrotonala MIDI Converter (2 / 5 steg)
Steg 2: Läsa kvadratur kod roterande pulsgivare
Jag vill lägga till några kontroller för att ändra värden i farten som antalet steg per oktav och MIDI basnot. Så köpte jag dessa Bourns rotationsencoder.
Jag hittade denna kretsar blogg inlägg om behandlingen rotationsencoder hjälp, även om jag fann det lite svårt att följa som någon ny till världen av Arduino. Jag ska försöka att ytterligare förklara några av uppgifterna nedan.
Inlägget nämner att pulsgivare generera kvadratur kod. Jag kopierade kvadratur kod produktion mönster ovan från databladet för min kodare. Det visar att när rotera medsols påstår av AB signalutgång upprepade gånger cykel genom 00, 10, 11 och 01. (Ordningen återförs för moturs.)
Så då koden från ovan refererade inlägget (utdrag nedan), i stort sett vad den gör är butik 4 relevanta bitar i old_AB: tidigare kodaren läsning (00, 10, 11 eller 01) följt av nuvarande kodaren läsning (också, 00, 10, 11 eller 01). Den array [enc_states] innehåller tre möjliga svar till kodaren läsningar: 0--ingen förändring, 1--increment för CW och -1--dekrement för CCW.
/ * Returnerar ändring encoder tillstånd (-1,0,1) * /
int8_t read_encoder()
{
statisk int8_t enc_states [] = {0, - 1,1,0,1,0,0, -1, - 1,0,0,1,0,1,-1,0};
statisk uint8_t old_AB = 0;
/**/
old_AB << = 2; kom ihåg tidigare tillstånd
old_AB | = (ENC_PORT & 0x03); Lägg till nuvarande tillstånd
Return (enc_states [(old_AB & 0x0f)]);
}
Så, till exempel, om den föregående behandlingen var 00 och den aktuella behandlingen är 10, sedan (binära) 0010 kartor till enc_state [2] = 1, vilket innebär ökning eftersom kodaren flyttas medsols. Ett annat exempel, om den föregående behandlingen var 00 och den aktuella behandlingen är 11, då det finns ett läsfel eller buller så som mappar till enc_state [B0011] = 0--ingen förändring. Läsaren kan träna andra 14 möjliga kombinationer av tidigare och nuvarande behandlingen se hur de mappar till enc_states [].