/* ****************************** Sketch utilisé pour le Tachymetre de la CNC FAKIR de Renaud ILTIS;********************** Sensor Optique utilise : QRD1114 ==> Gotronic; Afficheur EA DIPS082-HNLED ==> reichelt.de; Disque sur moteur CNC ==> 3 secteurs blancs et les 3 autres secteurs decoupés pour eviter toute reflexion parasite; Le détecteur délivrera 3 impulsions par tour, donc 3 flancs montants et 3 flancs descendants; Seuls les flanc montants seront exploités par l'interruption N° 0 (broche 2 de l'arduino); ********************************************************************************************************** ********************** Ce sketch est à copier dans une page vierge de l'environnement Arduino; ****************** ********************************************************************************************************** */ //*********************************** Début du Sketch;***************************************** #include // Importation dans le sketch, de la bibliothèque de gestion des afficheurs LCD; LiquidCrystal lcd(12, 10, 7, 6, 5, 4); // mode 4 bits avec RW à la masse, (affectation des pin de l'afficheur aux pins Arduino nano); // RS en pin 12 ; // EN en pin 10 ; // D4 en pin 7 ; // D5 en pin 6 ; // D6 en pin 5 ; // D7 en pin 4 ; const int Controle = 11; // 1 pour mesurer les largeurs d'impulsions PWM (entrée pin 12 du CD4093 sortie pin 10); // Non utilisé ici, sketch différent; // 0 pour mesurer le nombre de tours/mn (entrée pin 1 du CD4093, sortie pin 10); // Le 4093 est en fait cablé en un sélecteur a 2 entrées (1 et 12, une sortie 10, et pin de sélection 13); // Pin 13 = 0 ==> Entrée tachymètre validée; // Pin 13 = 1 ==> Entée PWM validée; (Non utilisé dans ce sketch; // Nota: Le circuit CD 4093 comporte 4 portes Nand avec 2 entrées trigger chacune // ce qui permet la remise en forme des impulsions; //************* entete déclarative = déclarer ici variables et constantes globales;*************** volatile long Compteur = 0; // variable de Comptage utilisée dans la procédure Interrupt Service Routine de l'interruption N° 0; long Compteur0 = 0; // variable pour mémoriser la dernière valeur du compteur; unsigned long Micros0 = 0; // variable mémorisation valeur micros(); unsigned long FenetreComptage = 500000; // 1 Seconde = 1000000 de microsecondes; // Il semblerait que 500000 µS (0.5 S) soit la 1/2 période de comptage; // Si je mets 1000000 (1 S), à vitesse maximum du moteur,l'afficheur indique environ 67000 Trs/Mn:; // Ce qui est très exactement le double de la valeur recherchée; // J'ai effectué un controle avec mon fréquencemètre; // Par exemple: valeur affichée au fréquencememètre = 1650 Hz, donc vitesse de rotation =; // 1650/3= 550 Hz ==> 550 Trs/S (3 secteurs sur le disque donc 3 impulsions par tours; // Donc 550 x 60 (Sec) = 33000 Trs/Mn. L'afficheur du tachymètre indique 33040 Trs/Mn; // Cette différence est probablement du au fait que l'Arduino Nano est équipé d'un résonnateur céramique; // (précision 0.8%)et non d'un Quartz 16 Mhz (précision 0.001%). Mon fréquencemètre est lui équipé d'un quartz 10 Mhz fonctionnant // en enceinte thermostatée; la précision du tachymètre est tout de même de 40/33040 = 0.00121 soit 0.12% // Le moteur de la CNC a un KV de 2850 ==> vitesse maxi (à vide) = 2850 x 12 = 34200 Trs/Mn; // La vitesse de rotation maxi que j'ai pu obtenir (à vide), est 33800 Trs/mn, ce qui peut s'expliquer par le fait que le moteur; // Entraine son arbre et le roulement 608ZZ associé, ce qui constitue déjà une charge; long NbrePoles = 3; // Nbre de flancs montants comptés sur une rotation du disque; // par la routine d'interruption ComptageImpulsions; long Minute = 60; // 60 secondes dans une minute....; long TrMn = 0 ; // Valeur à afficher; void setup() // Procédure éxécutée une seule fois en début de sketch; { pinMode(Controle, OUTPUT); // La broche 11 de l' Arduino est déclarée en entrée; attachInterrupt(0, ComptageImpulsions, RISING); // Acive l'interruption N°0 (broche 2)détection des fronts montants; // délivrés par le détecteur optique; //(N°1 broche 3); // RISING : détection sur fronts montants uniquement; // FALLING : détection sur front descendant uniquement; // CHANGE : détection sur fronts montants et descendants; digitalWrite(Controle, LOW); // La broche 11 de l' Arduino est mise à 0; // Selectionne les impulsions en provenance du Tachymetre (Pin 1 4093); // digitalWrite(Controle, HIGH); // Selectionne les impulsions PWM (Pin 12 4093 non utilisé ici); lcd.begin(8, 2); //active l'afficheur LCD 2 lignes de 8 caractères; lcd.noDisplay(); // Désactive l'afficheur pour éviter les clignotements lors des réécritures //mais conserve la valeur de l'affichage existant; lcd.clear(); //Efface les 2 lignes de l'afficheur en vue de l'affichage des nouvelles valeurs; lcd.setCursor(0, 0); // Curseur sur Colonne 0 Ligne 0; lcd.print(" FAKIR"); // Notre CNC préférée; lcd.setCursor(0, 1); // Curseur sur Colonne 0 Ligne 1; lcd.print("R. ILTIS"); // Saluons au passage le concepteur de la machine; lcd.display(); // Réactive l'afficheur avec les nouvelles valeurs; delay(2000); // Pendant 2 secondes; lcd.noDisplay(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Tours/Mn");// Reste affiché tant que le tachymetre est en fonctionnement; lcd.display(); } // fin de la fonction setup(); void loop() // Procédure éxécutée en boucle et en permanence jusqu'à la coupure de l'alimentation; { // Les 4 premières lignes sont extraites du sketch donné en exemple dans Arduino : "Blink Without Delay"; unsigned long currentMicros = micros(); if (currentMicros - Micros0 >= FenetreComptage) // si le delai de 1 seconde s'est écoulé; { Micros0 = micros() ; // réinitialise Micros0; Compteur0 = Compteur; // mémorise Comptage actuel; Compteur = 0; // réinitialise Comptage; TrMn = Compteur0 * Minute / NbrePoles; lcd.noDisplay(); EffacerLigne1(); // Efface la ligne N°1 (du bas) de l'afficheur en prévision d'un nouvel affichage; //lcd.setCursor(2, 1); CentrerAffichage(); lcd.display(); } } // fin de la fonction loop(); // fonction appelée lors de l'arrivée d'un flanc montant ou descendant sur la broche N°2; // Interruption 0.(Ou broche N°2 Interruption 1; void ComptageImpulsions() // ISR de gestion d'interruption; { Compteur = Compteur + 1; // incrémente la variable Compteur sur les flancs; // montants des impulsions produites par le capteur optique; } // fin ISR gestion interruption; void CentrerAffichage() // Centre le texte sur l'afficheur selon le nombre de digits de la valeur calculée; { if (TrMn < 5500) // fonctionnement stable du moteur à partir de 6000 Tr/mn; { lcd.setCursor(3, 1); lcd.print("00"); // Si la vitesse de rotation du moteur est < 5500 Trs/Mn, on affiche 00 au centre de l'afficheur; } else { lcd.setCursor(2, 1); lcd.print(TrMn); } } /* void EffacerLigne0() //Fonction neutralisée car non utilisée dans ce sketch; // Procedure d'effacement de la ligne 0 (Celle du haut); // pour afficher la nouvelle valeur { for (int j = 0; j < 8; j++); { lcd.setCursor(j, 0); // N° de colonne et N° de ligne; //delay(1); lcd.write(1022); (lcd.write 1022 = blank); } } */ void EffacerLigne1() //; // Procedure d'effacement de la ligne 1 (Celle du bas); // avant l'affichage d'une nouvelle valeur (lcd.write(1022) = BLANK ==> efface tous les caractères de la ligne); { for (int k = 0; k < 8; k++) { lcd.setCursor(k, 1); // k=N° de colonne et 1 = N° de ligne; lcd.write(1022); // Efface l'un après l'autre les 8 digits de la ligne 1 de l'afficheur; } }