Bonjour,
Ayant réussi à faire un séquenceur midi stable sur Teensy 4.1 je me lance dans le projet de conception d'un appareil trés complet (100% assisté par IA pour la création)
La base du fonctionnement : au moins 16 encodeurs rotatifs pour les 16 pas de la mesure pour pouvoir y régler tout un tas de paramètres: vélocité, longueur, hauteur, et autres infos CC.
Plus tard dans l'idéal plusieurs lignes de 16 ainsi que d'autres encodeurs rotatifs ailleurs, pour avoir le moins de menus et triple fonctions cachés
L'idée étant que cet outils complet ultra personnalisé me permet de me passer de tout un tas d'autres appareils moins efficaces dans ce que je veux faire (et bien plus chers). Avec aussi 8 sorties midi et plusieurs écrans OLED voir tactile
Mais là si j'arrivais bien à gérer les potards analogiques direct sur teensy (grace à un menu de paramètres sensibilité/smoothing notamment). Je n'arrive à rien avec ces encodeurs numériques.
Enfin disons qu'avec un seul encodeur direct sur Teensy j'arrive à avoir les 3 signaux UP DOWN CLK.
Mais ensuite pour pouvoir en brancher beaucoup GPT me conseille d'utiliser des 74HC165
Donc déjà est-ce que 74HC165 semble le bon choix ??? Et si oui y a t-il des qualités douteuses ? Ou des version différents. Car là après des heures de test il a semblé que la 1ere puce testé ne donnait rien sur pin11 alors qu'une autre oui
Et là je passe par des journées de branchements tests sur breadboard selon les directives de GPT sans savoir si c'est vraiment la bonne direction.
Du coup avant de continuer j'aurais aimé savoir si vous avez un avis là dessus (j'ai rien trouvé à mon niveau sur internet)
Voilà merci
Je montre le code de test de l'encodeur
Code:const int PIN_PL = 5; // 74HC165 pin 1 (SH/LD) const int PIN_CLK = 6; // 74HC165 pin 2 (CLK) const int PIN_DATA = 7; // 74HC165 pin 9 (Q7) byte lastRaw = 0xFF; int lastAB1 = 0; int lastAB2 = 0; int pos1 = 0; int pos2 = 0; int lastSW1 = 1; int lastSW2 = 1; byte read165() { byte data = 0; digitalWrite(PIN_PL, LOW); delayMicroseconds(5); digitalWrite(PIN_PL, HIGH); for (int i = 0; i < 8; i++) { data <<= 1; data |= digitalRead(PIN_DATA); digitalWrite(PIN_CLK, HIGH); delayMicroseconds(5); digitalWrite(PIN_CLK, LOW); } return data; } int quadDelta(int oldAB, int newAB) { if (oldAB == 0 && newAB == 1) return +1; if (oldAB == 1 && newAB == 3) return +1; if (oldAB == 3 && newAB == 2) return +1; if (oldAB == 2 && newAB == 0) return +1; if (oldAB == 0 && newAB == 2) return -1; if (oldAB == 2 && newAB == 3) return -1; if (oldAB == 3 && newAB == 1) return -1; if (oldAB == 1 && newAB == 0) return -1; return 0; } void printRaw8(byte data) { for (int i = 7; i >= 0; i--) { Serial.print((data >> i) & 1); } } void setup() { Serial.begin(115200); pinMode(PIN_PL, OUTPUT); pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DATA, INPUT); digitalWrite(PIN_PL, HIGH); digitalWrite(PIN_CLK, LOW); byte raw = read165(); int enc1A = (raw >> 7) & 1; // 165 pin 11 int enc1B = (raw >> 4) & 1; // 165 pin 12 int sw1 = (raw >> 5) & 1; // 165 pin 13 int enc2A = (raw >> 4) & 1; // 165 pin 14 int enc2B = (raw >> 3) & 1; // 165 pin 3 int sw2 = (raw >> 2) & 1; // 165 pin 4 lastAB1 = (enc1A << 1) | enc1B; lastAB2 = (enc2A << 1) | enc2B; lastSW1 = sw1; lastSW2 = sw2; lastRaw = raw; Serial.println("Test 2x EC11 via 74HC165"); Serial.println("E1: A=11 B=12 SW=13"); Serial.println("E2: A=14 B=3 SW=4"); } void loop() { byte raw = read165(); int enc1A = (raw >> 7) & 1; int enc1B = (raw >> 6) & 1; int sw1 = (raw >> 5) & 1; int enc2A = (raw >> 4) & 1; int enc2B = (raw >> 3) & 1; int sw2 = (raw >> 2) & 1; int ab1 = (enc1A << 1) | enc1B; int ab2 = (enc2A << 1) | enc2B; int d1 = quadDelta(lastAB1, ab1); int d2 = quadDelta(lastAB2, ab2); if (d1 != 0) { pos1 += d1; Serial.print("E1 "); if (d1 > 0) Serial.print("+1"); else Serial.print("-1"); Serial.print(" pos="); Serial.print(pos1); Serial.print(" RAW="); printRaw8(raw); Serial.println(); lastAB1 = ab1; } else if (ab1 != lastAB1) { lastAB1 = ab1; } if (d2 != 0) { pos2 += d2; Serial.print("E2 "); if (d2 > 0) Serial.print("+1"); else Serial.print("-1"); Serial.print(" pos="); Serial.print(pos2); Serial.print(" RAW="); printRaw8(raw); Serial.println(); lastAB2 = ab2; } else if (ab2 != lastAB2) { lastAB2 = ab2; } if (sw1 != lastSW1) { Serial.print("E1 SW "); Serial.println(sw1 == 0 ? "DOWN" : "UP"); lastSW1 = sw1; } if (sw2 != lastSW2) { Serial.print("E2 SW "); Serial.println(sw2 == 0 ? "DOWN" : "UP"); lastSW2 = sw2; } if (raw != lastRaw) { lastRaw = raw; } delay(2); }
-----



