C'est court mais c'est souvent quand l'aimant est sur l'axe moteur et que le disque produit 6 ticks par tour.
Je sais aussi récupérer la largeur d'impulsion du signal issu d'un récepteur de radiocommande.
val = pulseIn (pulse, HIGH);
Pb, j'ai 3 voies à récupérer
Déjà demander les valeurs des voies dans le bon ordre, celui du train complet.
Mais faire les deux ensembles ? La lecture pulseIn n'était pas bloquante ? Auquel cas je vais sauter des ticks.
Je n'ai aucune idée de la façon qu'il faut s'y prendre... Pendant qu'on compte l'un peut-on mesurer l'autre ?
"Lire un encodeur en quadrature" -> dans le programme indiqué, il n'est pas en quadrature, mais seulement dans un sens. Pour la quadrature, il faut faire quelque chose comme:
A ma connaissance pulseIn( ) est bloquante. Du coup pour en lire deux en même temps, il faut faire autre chose.
Pour une seule largeur d'impulsion, on peut utiliser pulseIn( ) même si c'est bloquant car la lecture de l'encodeur est par interruption.
Pour lire plusieurs largeurs d'impulsions, il faut alors passer par une interruption. Dans le genre:
attachInterrupt(2,largeur, CHANGE)
volatile word temps; // Si le temps tient dans un word, sinon un long
word montant; // Instant du front montant
void largeur()
{
if (digitalRead(2) == HIGH) montant = micros(); // Sur front montant on mémorise l'heure
else temps = micros() - montant; // Sur front descendant, on met à jour le temps
}
Pour un disque en quadrature et 3 largeurs à mesurer, il faut alors 5 interruptions (Uno exclue)
En passant tout par interruption, les variables se mettent à jour toutes seules.
Merci pour la réponse.
Je viens de tester une mesure de largeur avec arrêt des interruptions pendant la mesure : je perds des ticks comme je m'y attendais
Puis sans arrêt des interruptions, tout semble fonctionner, s'il y a des pertes de ticks elles sont peu nombreuses.
Je vais utiliser un pro mini par voie avec son moteur à encodeur. Je gagnerais en fils car les moteurs sont éloignés l'un de l'autre.
Pour éviter les pertes et pour aller plus vite (calculs plus précis), il vaut mieux utiliser digitalReadFast() de la bibliothèque du même nom.
Dans le cas ou chaque largeur à mesurer est seule sur son micro, en utilisant digitalRead() si le signal a une impulsion très courte, sur front montant on déclenche l'interruption et si le signal est redescendu trop tôt (la lecture se fait sans doute à la fin du digitalRead()) on va penser qu'il s'agit d'un front descendant.
Si on fait plusieurs mesures en même temps, pendant une fonction d'interruptions les autres sont en suspend. Les mesures seront plus courtes.
Si les largeurs sont crées à partir de la bibliothèque servo.h et si c'est le même timer qui les gère, il n'y a qu'un seul état haut à la fois et il doit être possible de mesurer 3 impulsions en tenant compte du fait que l'on a un front montant sur la sortie N quand on a un front descendant sur la sortie N-1.