Hello,
avec un Nano j'ai réalisé un montage assez classique (vu plusieurs fois) de lecture d'un pied à coulisse numérique, aucun problème les valeurs lues sont exactes. Les sorties du pied à coulisse semblent (Clock et Data) assez universelles.
Ensuite j'ai voulu faire la même chose avec un comparateur numérique (sans marque, un peu ancien) qui comporte aussi les Clock et Data, mais en fait le protocole des données est différent et je n'arrive pas à lire des valeurs cohérentes.
Avec un oscilloscope j'ai visualisé les Clock et Data, il semble qu'à partir du 4 ème bit clock du premier "groupe" le data est stable et correspond à la mesure, avant c'est instable ça change continuellement,
le deuxième "groupe" c'est plutôt au 6 ème bit clock que c'est stable.
Ces parties stables changent quand le comparateur est enfoncé et indique une nouvelle valeur.
J'ai demandé de l'aide à l'IA sans succès, Perplexity a essayé de définir des fenêtres stables avec des temps, mais je ne suis pas sûr que ce soit le plus adapté et fiable, après trop d'erreurs l'IA baisse les bras et moi aussi !
Si vous avez une idée de ce protocole utilisé par ce comparateur et comment faire une lecture fiable, je vous remercie par avance !
/*
Lit les valeurs du comparateur en ne considérant que les parties stables du signal Data.
Les parties stables sont définies par une fenêtre de temps après chaque front descendant du signal Clock.
*/
// Définition des broches
const int clockPin = 2; // Broche connectée au signal Clock du comparateur
const int dataPin = 3; // Broche connectée au signal Data du comparateur
// Paramètres de la fenêtre stable (à ajuster selon votre oscilloscope)
const unsigned long stableWindowStart = 34; // Début de la fenêtre stable en microsecondes
const unsigned long stableWindowEnd = 386; // Fin de la fenêtre stable en microsecondes
// Variables globales
volatile unsigned long lastClockTime = 0; // Temps du dernier front descendant de Clock
volatile bool newDataAvailable = false; // Indique si une nouvelle donnée est disponible
volatile bool currentDataValue = false; // Stocke la valeur actuelle du signal Data
// Fonction d'interruption pour détecter les fronts descendants du signal Clock
void IRAM_ATTR clockInterruptHandler() {
unsigned long currentTime = micros();
// Vérifie si le temps écoulé depuis le dernier front est suffisant (anti-rebond)
if (currentTime - lastClockTime > 50) { // Ajuster cette valeur selon les besoins
lastClockTime = currentTime;
// Vérifie si on est dans la fenêtre stable
if (currentTime - lastClockTime >= stableWindowStart && currentTime - lastClockTime <= stableWindowEnd) {
// Lit la valeur du signal Data
currentDataValue = digitalRead(dataPin);
newDataAvailable = true; // Marque une nouvelle donnée comme disponible
}
}
}
void setup() {
Serial.begin(115200); // Initialise la communication série
// Configure les broches en entrée
pinMode(clockPin, INPUT_PULLUP); // Utilise la résistance de pull-up interne
pinMode(dataPin, INPUT);
// Attache l'interruption au signal Clock (front descendant)
attachInterrupt(digitalPinToInterrupt(clockPin), clockInterruptHandler, FALLING);
Serial.println("Lecture des données du comparateur...");
}
void loop() {
// Vérifie si une nouvelle donnée est disponible
if (newDataAvailable) {
newDataAvailable = false; // Réinitialise le flag
// Affiche la valeur stable du signal Data
Serial.print("Data Stable: ");
Serial.println(currentDataValue);
}
}
Pour identifier le protocole, il faudrait plus d'acquisitions à l'oscilloscopes accompagné des valeurs affichées sur le comparateur. Et répéter ça sur différentes mesures, dont une mesure faite à 0 et puis quelques mesures sur différentes cotes connues faites avec des cales, par exemple.
Bonjour et merci de vous intéresser à mon problème !
Oui j'ai une photo de mesures différentes que j'avais d'ailleurs donnée à l'IA mais ça n'a pas aidé.
Le comparateur j'ai cherché, les sans marques se ressemblent un peu mais ça n'a m'a pas aidé pour le moment.
Après plusieurs essais avec protocole de type A l'IA : En conclusion, il est peu probable que vous puissiez décoder ce signal directement avec un simple code Arduino. Vous devrez utiliser un décodeur CAN spécialisé ou un analyseur de protocole pour comprendre et décoder les données transmises par le comparateur.
readData() applique un filtre sur l'horloge en testant s'il y a moins de 20μs entre 2 fronts cela ne peut pas fonctionner la période de ton horloge est de 96kHz comme te l'indique ton oscillo et on peut aussi le voir à l'écran, la base de temps est réglée à 50μs par division et on compte environ 5 périodes d'horloge par division.
Le signal semble bien propre, le filtre est peut-être inutile.
Ensuite, à la réception du 48ème bits tu lances un décodeur. Mais comme tu n'es pas certain que c'est le bon protocole il y a de fortes chances pour que le code soit rejeté. A ce niveau et pendant les investigations, il serait plus productif de faire afficher les 6 octets en binaire pour essayer d'identifier un pattern.
A noter, il semble y avoir un marqueur de début sous la forme du signal d'horloge à 1 pendant environ 50μs (tu pourrais filtrer avec un test sur le signal d'horloge à 1 pendant plus de 40μs par exemple).
Merci fdufnews.
Mes compétences sont (très !) limitées c'est pour ça que j'ai essayé avec l'IA, mais je m’aperçois que l'IA part facilement vers de mauvais choix et que je devrais mieux analyser ce qui se passe et mieux diriger les essais.
Je dois m'absenter mais je regarde ça dès que possible.
Ce qui m'a étonné c'est qu'il y a une première partie instable dans data, alors que l'afficheur du comparateur est parfaitement stable, et la partie stable qui change effectivement si le comparateur mesure quelque chose, pareil pour la seconde partie.
En néophyte je me suis dit qu'il fallait s'occuper de ces parties stables pour lire la valeur...
Il va me falloir un peu de temps pour essayer de comprendre !
Alors ça tombe bien ton programme parce que j'avais commandé un autre comparateur numérique, le mien semblant ne pas fonctionner du tout au début : pas d'affichage etc. et je viens de recevoir le neuf qui est un SHAHE avec prise USB.
Donc avec ton programme j'ai peut-être la possibilité de lire le nouveau comparateur.
C'est peut-être du même style que les règles DHAHE version USB,
Ceci dit J'aimerais bien quand même aussi lire l'ancien comparateur.
Alors tout ça c'est en fait pour un banc de relevé de diagramme de distribution d'arbres à cames, 2 moteurs pas à pas sont commandés par le Nano et tourne l'arbre de 1° en 1° , la levée est donc mesurée par le pied à coulisse numérique (pour le moment) et transmise par le Nano vers un tableau Libre Office avec macro : Capture avec OpenDaqCalc sous LibreOffice Calc,
ça fonctionne, mais j'aimerais remplacer le pied à coulisse par le comparateur.
Le montage et des courbes (levée, vitesse, accélération) pour exemple :