/* PROGRAMME ARDUINO (ESP32) - PROJET CAPTEURS DE SPORES IFV avec le FABLAB COH@BIT by Aline RE (15.02.2019) Ce programme permet de lire le signal venant d'un encodeur rotatif et de calculer la vitesse de rotation du moteur */ ///////////////////////////////// /// DECLARATION DES VARIABLES /// ///////////////////////////////// const byte pinEncodeurA = 2; // Broche du micro-controlleur à laquelle est relié le signal de l'encodeur volatile byte compteur = 0; // Variable compteurur volatile int vitesse; // Variable de calcul de la vitesse du moteur const int duree_compteur_microsec = 1000000; // Durée pendant laquelle on laisse le compteur s'incrémenter (en micro-secondes) hw_timer_t * timer = NULL; // Crée un objet de type compteur (horloge) const float pas_roue_codeuse = 0.72; // Pas angulaire de la roue codeuse: 500CPR = un cran tous les 0,72° ///////////////////////////////// /// FONCTION D'INITIALISATION /// (exécuté une seule fois) ///////////////////////////////// void setup() { Serial.begin(9600); // Active la communication entre le micro-controlleur et l'ordinateur (et donc interface Arduino) pinMode(pinEncodeurA, INPUT); // Broche encodeur, signal A // On crée une interruption liée à la détection de front descendant sur le signal encodeur , qui lance le programme encodeurTickA à chaque détection attachInterrupt(0, encodeurTickA, FALLING); // On crée une interruption timer (à chaque fin de période, on fait le calcul de vitesse) timer = timerBegin(0, 80, true); // Crée un compteur qui s'incremente toutes les millisecondes: // Horloge ESP32 = 80 MHz, en utilisant un prescaler (diviseur) de 80 on obtient un compteur 1 MHz // /!\ A CHANGER SI UNE AUTRE CARTE QUE L'ESP32 EST UTILISEE (Arduino: 16 MHz) timerAttachInterrupt(timer, &onTimer, true); // Crée une interruption qui lance la fonction onTimer une fois le compteur fini timerAlarmWrite(timer, duree_compteur_microsec, true); // Active l'interruption lorsque le compteur = 1000000 µs = 1s timerAlarmEnable(timer); // Active le compteur delay(100); // Temporisation (en ms) } ///////////////////////////////// /// FONCTIONS INTERRUPTIONS /// ///////////////////////////////// // Programme interruption qui gère le comptage des ticks de l'encodeur void encodeurTickA() { compteur++; // Incrémente de 1 la valeur du compteur } // Programme d'interruption qui calcule la vitesse actuelle du moteur void onTimer() { vitesse = compteur / duree_compteur_microsec; // Vitesse = position / temps compteur = 0; // On réinitialise le compteur } ///////////////////////////////// /// PROGRAMME PRINCIPAL /// (répété en boucle) ///////////////////////////////// void loop() { Serial.println(compteur); // Affiche sur l'ordinateur la valeur du compteur (ouvrir Traceur Série pour voir les courbes, ou Moniteur Série pour voir les valeurs) delay(20); // Temporisation (en ms) }