//Stroboduino pour Arduino Nano (ou autres compatibles) char Ver[] = "Ver.du 3_10_16"; //Attend 360° pour declencher le flash (180° pour 2 temps) //Ceci autorise un éventuel retard à l'allumage //Nota: tracer un repère à 180° sur la poulie pour un 2 temps //*****************Ajustables si necesssaire***************** int cycle = 4; // 4 pour 4temps ou 2 pour 2temps int D_Flash = 10; //Durée du flash en µs, autour de 10µs //C'est un compromis entre précision(faible étalement du spot ) et luminosité //********************************************************* #include //lcd.begin(16, 2);lcd.clear();colonnes 0-15,lignes 0-1 //lcd.setCursor(15,0)= col 15, ligne 0;lcd.print(" text"); LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); // On instancie un lcd // pins: R/S ==A0, Enable==A1, puis D4-D7==A2, A3, A4, A5 Ne pas oublier // l'eclairage (pin 15 et 16 du LCD), et le contraste à 0.5v environ, pin 3 du LCD #define Etin 8 //une éticelle donne un front descendant #define Inter 4 //Inter du codeur #define Flash 6 //Flash #define Codeur_A 2 //D2 pour entrée codeur A sous interruption #define Codeur_B 3 //D3 pour entrée codeur B //*****************Les variables****************************** int signed long T = 0; //Periode en cours(signée pour le calcul de D_deg) int signed long Ts2 = 0;//Periode en cours/2 int unsigned long prec_H = 0; //Heure du front precedent en µs int unsigned long D_deg = 0;//Délai pour deg_dem degrès en µs,environ T/2, donc tj > 0 int unsigned long N = 0; //N en tours/mn, peut monter à plus de 44 000, 4 temps int unsigned long Nc = 0; //Pour le calcul de N int signed deg_dem = 0; //Compteur des degrés demandés,affiché au LCD, <=0 possible int signed deg_Inc = 0; //Increment en degrès 0,-1ou +1 int deg_Initial = 10; //Affiché au demarrage int T_min = 20000;//En µs,lié à limite de la fonction delayMicroseconds() <16383 int milli_delay = 0; //Delai en ms, T > T_min int micro_delay = 0; //Delai en µs, T > T_min int tcor1 = 10;//Correctif attente avant flash en µs, N>6000t/mn 4 temps int tcor2 = 70;//Correctif attente avant flash en µs, N<6000t/mn 4 temps int debug = 0; //Variable pour debug, optionelle ////////////********Les Fonctions****************************** void Affic_N_et_deg_dem() //Fond d'ecran inchangé,durée environ 7.5ms { N = Nc / T ; //Calculer N en t/mn, 2 ou 4temps lcd.setCursor(11, 0); lcd.print(" ");//Nettoyer lcd.setCursor(11, 0); lcd.print(N); lcd.setCursor(9, 1); lcd.print(" ");//Nettoyer lcd.setCursor(9, 1); lcd.print(deg_dem); deg_dem = deg_dem + deg_Inc;//Si le codeur a été tourneé, deg_Inc = +1 ou -1 } void Delai_et_Flash() //Delai puis flash { if (T < T_min) //Verifier si la fonction dalayMicroseconds() est suffisante { delayMicroseconds(D_deg - tcor1); //Attendre avant flash digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0); } else {//pc(T); milli_delay = ((D_deg / 1000) - 2);//Pour ces D_deg longs, delayMicroseconds(D_deg)ne convient plus. micro_delay = (D_deg - (milli_delay * 1000)); delay(milli_delay); //D'abord les ms delayMicroseconds(micro_delay - tcor2); //puis les µs digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0); } } void IniT()////////////////////while (1); delay(1000);//////////////////////////// { attachInterrupt(0, isr_Rotation_Codeur, FALLING); // interrupt 0 (pin D2), front de Codeur_A, préferable au front montant lcd.clear(); lcd.print(" Bienvenue"); lcd.setCursor(1, 1); lcd.setCursor(13, 1); lcd.print("PhL"); delay(1000); lcd.clear(); lcd.print(" Stroboduino"); lcd.setCursor(0, 1); lcd.print(Ver); //N° de version delay(3000); // Ecran d'accueil pour 3s lcd.clear(); lcd.print(" t/mn: "); lcd.setCursor(0, 1); lcd.print(" Degres: "); Nc = 30000000 * cycle; //Pour calcul de N à partir de T cycle = cycle * 180; // 360 pour 2 temps, 720 pour 4 temps, dans calcul de D_deg deg_dem = deg_Initial; T = 15000; D_deg = T / 2; //Pour le premier affichage de N Affic_N_et_deg_dem(); } void isr_Rotation_Codeur ()////////////////////while (1); delay(1000);///// { if (digitalRead(Codeur_A) == digitalRead(Codeur_B))deg_Inc = 1; //On tourne dans le sens horaire else deg_Inc = -1;//On tourne dans le sens anti-horaire } void setup() { Serial.begin(9600); //Pour debug lcd.begin(16, 2);//16 colonnes, 2 lignes pinMode(Etin, INPUT_PULLUP);//Entrée du front mise à la masse par le thyristor pinMode(Inter, INPUT_PULLUP);//Le codeur met son inter à la masse quand poussé pinMode(Flash, OUTPUT);// Sortie vers la led pinMode(Codeur_A, INPUT_PULLUP);//Entrée du front sur INT 0 pinMode(Codeur_B, INPUT_PULLUP);// IniT();//Attachera l'isr à l'interruption IT 0 } void loop() { while (digitalRead(Etin) == 1); //Attendre descente d'un front d'etincelle prec_H = micros(); //heure de début de cette periode Delai_et_Flash();//Emettre le flash après attente D_deg // pc(T);pc(D_deg); while (digitalRead(Etin) == 0); //Attendre remontée du signal d'etincelle while (digitalRead(Etin) == 1); //Attendre descente du prochain front d'etincelle T = micros() - prec_H; //Descendu, calculer T Delai_et_Flash();//Emettre le flash après attente D_deg Ts2 = T / 2; //On emettra le flash environ 360° après l'étincelle (4temps) ou 180°(2 temps) D_deg = float(T * deg_dem) / float(cycle) + Ts2; //Délai en µs pour les degrés demandés,2 ou 4 temps Affic_N_et_deg_dem();//Cette fonction dure 7.5ms environ, donc à partir de 8000t/mn(4temps) //l'étincelle immédiatement suivante n'est pas detectée donc le flash manque 1 fois sur 3. deg_Inc = 0;//RAZ de l'increment des degrés if (digitalRead(Inter) == 0) //Si l'inter du codeur est poussé, geler l'affichage { delay(1000); while (digitalRead(Inter) == 0);//Encore poussé, attendre delay(500); //Continuer } while (digitalRead(Etin) == 0); //Attendre remontée du signal d'etincelle } //********************************************************** //Macro ps(v) de debug pour imprimer le numero de ligne, le nom d'une variable, sa valeur //puis s'arreter definitivement #define ps(v) Serial.print("Ligne_") ; Serial.print(__LINE__) ; Serial.print(#v) ; Serial.print(" = ") ;Serial.println((v)) ; Serial.println(" Sketch stop"); while (1); //Exemple, à la ligne 140, l'instruction ps(var1); //inprimera "Ligne_140var1 = 18 Sketch stop" //Macro pc(v)de debug pour imprimer le numero de ligne, le nom d'une variable, sa valeur, //puis s'arreter et attendre un clic de souris sur le bouton 'Envoyer'en haut de l'ecran seriel pour continuer. #define pc(v) Serial.print("Ligne_") ; Serial.print(__LINE__) ; Serial.print(#v) ;Serial.print(" = ") ; Serial.println((v)) ; Serial.println(" Clic bouton 'Envoyer' pour continuer") ;while (Serial.available()==0);{ int k_ = Serial.parseInt() ;} //Exemple, à la ligne 145, l'instruction pc(var2); // inprimera "Ligne_145var2 = 25.3 Clic bouton 'Envoyer' pour continuer" //option: debug++;if (debug > 200) { pc(T);pc(Ts2);pc(D_deg);}// Avec une variable debug initialisée à 0 //float gf = 0;//pour boucle d'attente,gf GLOBALE et FLOAT indispensable // gf = 1; while (gf < 2000)gf++;//10= 100µs,100=1.1ms,2000=21.8ms