|
/* 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)
|
|
}
|