Advertisement
bipping

step motor_V2

Jun 22nd, 2023
685
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.08 KB | Source Code | 0 0
  1. #include <avr/interrupt.h>
  2. #include <Arduino.h>
  3. #include <Wire.h>
  4. #include <rgb_lcd.h>
  5.  
  6. #define toggle(x) digitalWrite(x, !digitalRead(x))                            //est une macro qui inverse la valeur logique de la broche    
  7. #define potard (map(analogRead(A0), 0, 1023, 11200, 11300))                   //lit la valeur analogique de la broche A0, la mappe entre 11200 et 11300,
  8. //                                                                            //cela permet de définir une plage de valeur pour la vitesse d'avance du moteur.
  9. #define switch 2                                                              //est la broche utilisée pour lire l'état du bouton,
  10.  
  11. #define pul 9                                                                 // sont les broches utilisées pour controler le moteur pas à pas.
  12. #define dir 8                                                                 //
  13. #define ENA 10                                                                //
  14. #define buz 11                                                                // buzzer
  15. #define NOTE_DS6 1245                                                         //sont des constantes pour les fréquences de notes de musique.
  16. #define NOTE_CS6 1109                                                         //
  17.  
  18. rgb_lcd lcd;                                                                  //est une librairie personnalisée qui permet de contrôler
  19. //                                                                            //un écran LCD avec des couleurs.
  20. const int colorR = 255;                                                       //sont les couleurs utilisées pour l'affichage de l'écran LCD
  21. const int8_t colorG = 0;                                                         //
  22. const int8_t colorB = 0;                                                         //
  23. //                                                                            // sont les broches utilisées pour les LED de couleur orange, verte et rouge.
  24. const int8_t(orange) = 7;                                                        // broche 7 orange
  25. const int8_t(vert) = 6;                                                          // broche 6 vert
  26. const int8_t(rouge) = 5;                                                         // broche 5 rouge
  27.  
  28. const int8_t NUM_TIMERS = 7;
  29. const int8_t TIMER_LED_ORANGE = 0;
  30. const int8_t TIMER_LED_VERT = 1;
  31. const int8_t TIMER_LED_ROUGE = 3;
  32. const int8_t TIMER_MOTOR = 2;
  33. const int8_t TIMER_LCD_Origine = 4;
  34. const int8_t TIMER_LCD_avance = 5;
  35. const int8_t TIMER_LCD_toggle = 6;
  36.  
  37. int i = 0;
  38. int8_t i_sens = 1;
  39.  
  40. const unsigned long interval = 500;                                          // est l'interval de temps entre deux clignotements des LED en milli-secondes.
  41.  
  42. unsigned long previousTimers[7];                                             // est un tableau utilisé pour stocker les temps précédents pour chaque tache
  43.  
  44. unsigned long Nombres_de_pas = 0;                                            // est un compteur qui stocke le nombre de pas effectués par le moteur
  45. unsigned long Nombres_de_pas_max = 120000;                                   // est la limite maximale de pas pour le moteur
  46.  
  47. bool stat_switch = false;                                                    // est un booléen qui stocke l'état du bouton switch
  48. bool sens = false;                                                           // est un booléen qui stocke le sens de rotation du moteur
  49. bool Signal_PWM = false;                                                      // est un booléen qui active ou désactive le moteur
  50. bool initialisation = false;                                                 // est un booléen qui active ou désactive l'initialisation
  51. bool dir_init = false;                                                       //est un booléen qui stocke l'état de la direction d'initialisation
  52.  
  53.   byte L[8] = {                                                              //createChar(1, tab);
  54.     0b00000,
  55.     0b11000,
  56.     0b01100,
  57.     0b00100,
  58.     0b01100,
  59.     0b10010,
  60.     0b10001,
  61.     0b00000
  62.     };                                                                       // est un tableau de bytes qui contient la forme pour un caractère personnalisé
  63. //                                                                           // qui sera affiché sur l'écran LCD
  64. ISR(TIMER1_COMPA_vect){                                                      // fonction de service d'interruption qui est appelée lorsque
  65. //                                                                           //le timer 1 atteint une certaine valeur spécifiée.
  66.     if(Signal_PWM == true){
  67.         toggle (pul);                                                        //inverse la valeur logique de la broche
  68.         Nombres_de_pas++;                                                    //incrémente le compteur de pas Nombres_de_pas .
  69.     }
  70. }
  71.  
  72. void LCD_Origine(){
  73.         // fonction qui gère l'affichage de l'écran LCD lorsque le bouton est relacher
  74.           stat_switch = digitalRead(switch);                                  // lit l'état du bouton et l'écrit dans stat_switch
  75.         //                                                                    //
  76.         OCR1A = potard;                                                       // met à jour la vitesse d'avance avec la valeur de potard
  77.         //                                                                    //
  78.         lcd.clear();                                                          // efface l'écran LCD
  79.         lcd.home();                                                           //
  80.         lcd.print("Origine");                                                 // affichage LCD ligne 1 "programme Origine"
  81.         lcd.setCursor(1, 1);                                                  //
  82.         lcd.print(Nombres_de_pas);                                            // affiche la valeur de Nombres_de_pas
  83.         lcd.setCursor(6, 1);                                                  //
  84.         lcd.print(potard);                                                    // affichage la valauer de potard
  85.         lcd.createChar(1,L);                                                  // affiche un caractère personnalisé sur la seconde ligne.
  86.         lcd.setCursor(11, 1);                                                 //
  87.         lcd.write(byte(1));                                                        
  88. }
  89.  
  90. void LCD_avance(){
  91.           // fonction qui gère l'affichage de l'écran LCD lorsque le moteur tourne
  92.         Signal_PWM = true;                                                    // met à jour la Signal_PWM pour activer le moteur
  93.        
  94.         lcd.clear();                                                         // efface l'écran LCD
  95.         lcd.home();                                                          //
  96.         lcd.print("Programme");                                              // affiche "Programme" et "Lambda" sur la première ligne
  97.         lcd.setCursor(10, 0);                                                //
  98.         lcd.print("Lambda");                                                 //
  99.         lcd.setCursor(1, 1);                                                 //
  100.         lcd.print(Nombres_de_pas);                                           // affiche la valeur de Nombres_de_pas sur la seconde ligne
  101.         lcd.setCursor(10, 1);                                                //
  102.         lcd.print(potard);                                                   // affiche des informations sur la position et la vitesse sur la seconde ligne.
  103.         lcd.createChar(1,L);                                                 //
  104.         lcd.setCursor(15, 1);                                                //
  105.         lcd.write(byte(1));                                                  //
  106.         }
  107.  
  108. void LCD_toggle(){ // fonction qui gère l'affichage alternatif de l'écran LCD entre l'affichage de la position actuelle et l'affichage de la position cible
  109.        
  110.         lcd.clear();                                                         // efface l'écran LCD
  111.         lcd.home();                                                          //
  112.         lcd.print("toggle");                                                 // affichage LCD ligne 1 "toggle"
  113.         lcd.setCursor(10, 0);                                                //
  114.         lcd.print("Lambda");                                                 //
  115.         lcd.setCursor(1, 1);                                                 //
  116.         lcd.print(Nombres_de_pas);                                           // affiche la position actuelle et la position cible sur la première ligne
  117.         lcd.setCursor(10, 1);                                                //
  118.         lcd.print(potard);                                                   // affiche des informations sur la position et la vitesse sur la seconde ligne.
  119.         lcd.createChar(1,L);                                                 //
  120.         lcd.setCursor(15, 1);                                                //
  121.         lcd.write(byte(1));                                                  //
  122.         stat_switch = digitalRead(switch);                                   // lit l'état du bouton et l'écrit dans stat_switch
  123.         digitalWrite(rouge, LOW);
  124. }
  125.  
  126. void setup(){
  127.     Serial.begin(115200);                                                       // ça pulse à 115 200 Hertz
  128.     lcd.begin(16, 2);                                                           // set up the LCD's number of columns and rows:
  129.     lcd.setRGB(colorR, colorG, colorB);                                         //
  130.     lcd.print("initialization");                                                // Print a message to the LCD.
  131.  
  132.     pinMode(orange, OUTPUT);                                                    // LED orange
  133.     pinMode(vert, OUTPUT);                                                      // LED vert
  134.     pinMode(rouge, OUTPUT);                                                     // LED rouge
  135.    
  136.     pinMode(A0, INPUT);                                                         // potentiomètre A0
  137.     pinMode(switch, INPUT_PULLUP);                                              // configurer la pin 8 comme sortie pour contrôler la direction du moteur
  138.     pinMode(dir, OUTPUT);                                                       // direction du moteur
  139.     pinMode(pul, OUTPUT);                                                       // vitesse du moteur la frecence est de ~177.77hz
  140.     pinMode(ENA, OUTPUT);                                                       // frein du moteur >> relaché à l'état haut<< mode automatique à l'état bas>>
  141.     pinMode(buz, OUTPUT);                                                       // Buzzer en sortie 10 s'appel buz
  142.  
  143.     digitalWrite(buz, LOW);                                                     // broche 10 buzzer
  144.     digitalWrite(switch, HIGH);                                                 // bouton sur OFF
  145.  
  146.     digitalWrite(vert, HIGH);                                                   // eteint LED vert
  147.     digitalWrite(orange, HIGH);                                                 // allumer LED temoin orange fixe
  148.     digitalWrite(rouge, HIGH);                                                  // eteint LED rouge    
  149.    
  150.     tone(buz, NOTE_DS6, 500);
  151.    
  152.     delay(500);                                                                 // 1 seconde
  153.    
  154.    
  155.     digitalWrite(vert, LOW);                                                    // eteint LED vert
  156.     digitalWrite(rouge, LOW);                                                   // eteint LED rouge
  157.     digitalWrite(orange, LOW);                                                  // allumer LED temoin orange fixe
  158.  
  159.  
  160.     previousTimers[TIMER_LCD_toggle] = micros();                                // initialiser les valeurs à l'heure courante
  161.     previousTimers[TIMER_LCD_avance] = micros();                                // initialiser les valeurs à l'heure courante
  162.     previousTimers[TIMER_LCD_Origine] = micros();                               // initialiser les valeurs à l'heure courante
  163.     previousTimers[TIMER_LED_ORANGE] = millis();                                // initialiser les valeurs à l'heure courante
  164.     previousTimers[TIMER_LED_VERT] = millis();                                  // initialiser les valeurs à l'heure courante
  165.     previousTimers[TIMER_LED_ROUGE] = micros();                                 // initialiser les valeurs à l'heure courante
  166.     previousTimers[TIMER_MOTOR] = micros();                                     // initialiser les valeurs à l'heure courante
  167.    
  168.     TCCR1A = 0;                                                                 // configurer Timer1 pour utiliser l'OCR en mode CTC
  169.     TCCR1B = (1 << WGM12) | (1 << CS11);
  170.    
  171.     OCR1A = potard;                                                             // configurer le registre de comparaison de sortie pour un certain nombre de pas
  172.  
  173.     TIMSK1 |= (1 << OCIE1A);                                                    // activer l'interruption associée à OCR1A
  174.  
  175.     delay(800);                                                                 // attend un peu
  176.  
  177.     sei();                                                                      // activer les interruptions globales
  178. }
  179.  
  180. void loop(){
  181.  
  182.     //Origine
  183.     if(stat_switch == false && Nombres_de_pas == 0 && sens == false){
  184.  
  185.         while(!initialisation) {
  186.         digitalWrite(orange, LOW);                                               // eteint LED orange
  187.         digitalWrite(vert, LOW);                                                 // eteint LED vert
  188.         digitalWrite(ENA, HIGH);                                                 // moteur libre
  189.         digitalWrite(rouge, HIGH);                                               // allumer une LED rouge  
  190.         tone(buz, NOTE_CS6, 80);                                                 // note de musique
  191.         delay(100);                                                              // attend un peu
  192.         tone(buz, NOTE_DS6, 80);                                                 // note de musique
  193.         delay(100);                                                              // attend un peu
  194.         tone(buz, NOTE_DS6, 160);                                                // note de musique
  195.         Signal_PWM = false;                                                       //ordre d'arret du moteur
  196.         initialisation = true;                                                   // Ne recommence pas
  197.         delay(250);                                                              // attend un peu
  198.         digitalWrite(rouge, LOW);                                                // eteint une LED rouge        
  199.         }
  200.  
  201.          if (micros() - previousTimers[TIMER_LCD_Origine] >= 250006) {
  202.           // effectuer une action toute les 250ms appel void LCD_Origine()
  203.            previousTimers[TIMER_LCD_Origine] = micros();                         //mise à jour avec la valeur actuelle de millis()
  204.              
  205.           LCD_Origine();                                                         //appel void LCD_Origine()
  206.          }
  207.           // gère la mise à jour de l'intensité de la LED rouge pour créer un effet de clignotement.
  208.         if(micros() - previousTimers[TIMER_LED_ROUGE] > 10014){
  209.           //                                                                     //
  210.             analogWrite(rouge, i);                                               // régler l'intensité de la LED rouge en fonction de la valeur de la variable i
  211.             i = i + i_sens;                                                      //incrémente ou décrémente la valeur de i en fonction de la valeur de i_sens
  212.             if(i>=255){
  213.               i_sens = -1;                                                       //est -1 pour diminuer l'intensité de la LED rouge.
  214.             }
  215.             if(i<=0){
  216.               i_sens = 1;                                                        //est 1 augmenter l'intensité de la LED rouge.
  217.             }
  218.           previousTimers[TIMER_LED_ROUGE] = micros();                            //
  219.         }
  220.  
  221.       }
  222.  
  223.     //gère l'"avance" du moteur vérifit l'état du bouton ou si le nombre maximum de pas a été atteint, et met à jour l'affichage LCD.
  224.     while (Nombres_de_pas < Nombres_de_pas_max && stat_switch == true && sens == false){
  225.  
  226.         while(dir_init == false){
  227.          digitalWrite(dir, LOW);                      // Tache sens de rotation
  228.          digitalWrite(vert, HIGH);                    // allumer LED temoin vert fix
  229.          digitalWrite(orange, LOW);                   // eteindre une LED orange
  230.          digitalWrite(rouge, LOW);                    // eteindre une LED rouge
  231.          lcd.clear();                                 // on efface tout
  232.          lcd.home();                                  // retour à la ligne
  233.          lcd.print("Programme");                      // affichage LCD ligne 1 "programme principale"
  234.          lcd.setCursor(1, 1);                         //
  235.          lcd.print(Nombres_de_pas);                   //
  236.          digitalWrite(ENA, LOW);                      // moteur sous tention
  237.          dir_init = true;
  238.         }
  239.        
  240.  
  241.          if (micros() - previousTimers[TIMER_LCD_avance] >= 177797) {
  242.           // effectuer une action pour le LCD et pour la moteur en marche avant
  243.            previousTimers[TIMER_LCD_avance] = micros();                         //mise à jour avec la valeur actuelle de millis()
  244.              
  245.           LCD_avance();                                                         //appel void LCD_avance()
  246.          }
  247.  
  248.         // Vérifier si l'utilisateur a appuyé sur le bouton
  249.         if(digitalRead(switch) == LOW) {
  250.          stat_switch = false;                                                   // mise à jour de l'état du bouton
  251.          //                                                                     // Signal_PWM fin de la tache avance
  252.           digitalWrite(vert, LOW);                                              // éteindre la LED verte.
  253.           lcd.clear();                                                          // on efface tout
  254.           lcd.home();                                                           // retour à la ligne      
  255.           lcd.print("toggle");                                                  //
  256.           sens = true;                                                          //changement du sens de rotation
  257.           Signal_PWM = false;                                                    //ordre d'arret du moteur
  258.         }
  259.         //                                                                      //
  260.         //Signal_PWM de fin de la tâche d'avance: si le nombre de pas dépasse le nombre maximum de pas défini, mettre fin à la tâche d'avance
  261.         else if(Nombres_de_pas >= Nombres_de_pas_max) {
  262.           digitalWrite(vert, LOW);                                              //
  263.           lcd.clear();                                                          // on efface tout
  264.           lcd.home();                                                           // retour à la ligne
  265.           lcd.print("toggle");                                                  //
  266.           sens = true;                                                          //changement du sens de rotation
  267.           Signal_PWM = false;                                                    //ordre d'arret du moteur
  268.         }
  269.     }
  270.     // toggle gère l'initialisation de la direction du moteur, l'affichage sur l'écran LCD, la mise à jour du nombre de pas,
  271.     // vérification de la position du moteur et l'état des LED vertes ou oranges en fonction de l'état du bouton.
  272.     if( sens == true && Nombres_de_pas > 0){
  273.            
  274.         if (dir_init == true) {                                                 // Initialisation de la direction du moteur en marche arrière
  275.          digitalWrite(dir, HIGH);                                                //
  276.          digitalWrite(rouge, LOW);                                               //
  277.          digitalWrite(ENA, LOW);                                                 // Mise sous tension du moteur pour la marche arrière
  278.          dir_init = false;                                                       // Mise à jour de la variable dir_init
  279.          lcd.clear();                                                            // pour indiquer que la direction du moteur a été initialisée.
  280.          lcd.home();                                                             // retour à la ligne
  281.          lcd.print("toggle");                                                    // Mise à jour de l'affichage LCD pour afficher "toggle"
  282.          lcd.setCursor(1, 1);                                                    //
  283.          lcd.print(Nombres_de_pas);                                              // Mise à jour du nombre de pas restant
  284.         }
  285.  
  286.         if (micros() - previousTimers[TIMER_LCD_toggle] >= 298820) {           //
  287.           // effectuer une action pour la LCD_toggle                            //
  288.           previousTimers[TIMER_LCD_toggle] = micros();                         //mise à jour avec la valeur actuelle de millis()
  289.           //                                                                   //
  290.           LCD_toggle();                                                        // appel void LCD_toggle
  291.         }
  292.        
  293.         else if (micros() - previousTimers[TIMER_MOTOR] >= 3347) {             //
  294.          // effectuer une action pour le moteur en marche arrière toggle        //
  295.          previousTimers[TIMER_MOTOR] = micros();                                //mise à jour avec la valeur actuelle de micros()
  296.          //                                                                     //
  297.          toggle (pul);                                                          //fait tourner le moteur en vitesse rapide
  298.          Nombres_de_pas--;                                                      //Met à jour le positionnement du moteur      
  299.         }
  300.  
  301.       // fin de la tache recule et arrêt des LEDs orange et verte lorsque le nombre de pas atteint 0.  
  302.       if(Nombres_de_pas == 0) {                                               //
  303.         sens = false;                                                          //
  304.         initialisation = false;                                                //
  305.         digitalWrite(orange, LOW);                                              //
  306.         digitalWrite(vert, LOW);                                                //
  307.      }
  308.    
  309.       if (stat_switch == true) {                                              //
  310.         digitalWrite(orange, LOW);                                              //
  311.         millis();                                                               //
  312.  
  313.         if (millis() - previousTimers[TIMER_LED_VERT] >= interval) {            //
  314.          // effectuer une action pour la LED vert                               //
  315.          previousTimers[TIMER_LED_VERT] = millis();                             //mise à jour avec la valeur actuelle de millis()
  316.          //                                                                     //
  317.           toggle(vert);                                                         //
  318.         }
  319.      }
  320.      else {
  321.         digitalWrite(vert, LOW);                                                //
  322.         millis();                                                               //
  323.          //                                                                     //
  324.          if (millis() - previousTimers[TIMER_LED_ORANGE] >= interval) {         //
  325.           // effectuer une action pour la LED orange                            //
  326.            previousTimers[TIMER_LED_ORANGE] = millis();                         //mise à jour avec la valeur actuelle de millis()
  327.           //                                                                    //
  328.            toggle(orange);                                                      //
  329.          }
  330.      }
  331.     }
  332.      
  333. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement