Advertisement
Ollivier

PorteServo2BP (comments)

Jul 16th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.05 KB | None | 0 0
  1. //===============================================================
  2. // Exploration Hardware
  3. // Ouvrir une porte avec un servomoteur
  4. // Ollivier JULLIEN
  5. // Juillet 2020
  6. //===============================================================
  7.  
  8. //===============================================================
  9. // Ouverture d'une porte avec indicateurs lumineux et sonores
  10. // Commande par deux boutons poussoirs en appui constant
  11. // (ça s'ouvre ou ça se ferme que si on reste appuyé, sinon ça s'arrête)
  12. // Action de la porte par servo FS90
  13. //===============================================================
  14.  
  15. //===============================================================
  16. // Matériel :
  17. // 2 BP (pour moi 1 DFR0029W et 1 DFR0029B)
  18. // 2 LEDs blanches 5 mm
  19. // 2 LEDs rouges 5 mm
  20. // 1 LED bleue 5 mm
  21. // 1 LED verte 5 mm
  22. // 6 résistances 220 ohm
  23. // 1 buzzer SV12-5
  24. // 1 mini-servomoteur FS90
  25. // 1 Arduino Uno
  26. // Câblage
  27. //===============================================================
  28.  
  29. //===============================================================
  30. // ATTENTION :
  31. // La porte au repos est ouvert, donc langle Max est l'angle de la porte fermée
  32. // et l'angle Mini est l'angle de la porte ouverte
  33. // rien ne vous oblige à vous y tenir
  34. //===============================================================
  35.  
  36. #include <Servo.h> // on inclut la bibliothèque de gestion des servomoteurs
  37.  
  38. Servo maPorte; // on crée "notre servo" qu'on nomme "maPorte"
  39. // Plus exactement :
  40. // en fait on crée une occurence de l'objet Servo défini par la bibliothèque,
  41. // que l'on nomme "maPorte".
  42. // on dira donc, plus simplement, "notre servo".
  43.  
  44. int rotationServo = 0; // on crée une variable de type int (nombre entier) que l'on nomme "rotationServo"
  45.                        // à qui on attribue la valeur 0
  46.  
  47. const int rouge = 2; // on crée une constante de type int que l'on nomme "rouge" à qui on
  48.                      // attribue la valeur 2
  49.                      // cette constant nous servira à déterminer la broche de la led rouge 1
  50.                      // ici : la broche n° 2
  51. const int bleu = 3; // on crée une constante de type int que l'on nomme "bleu" à qui on
  52.                     // attribue la valeur 3
  53.                     // cette constant nous servira à déterminer la broche du bouton bleu
  54.                     // ici : la broche n° 3
  55. const int blanc = 4; // on crée une constante de type int que l'on nomme "blanc" à qui on
  56.                      // attribue la valeur 4
  57.                      // cette constant nous servira à déterminer la broche du bouton blanc
  58.                      // ici : la broche n° 4
  59. const int lampe = 5; // on crée une constante de type int que l'on nomme "lampe" à qui on
  60.                      // attribue la valeur 5
  61.                      // cette constant nous servira à déterminer la broche de les leds blanches
  62.                      // ici : la broche n° 5
  63. const int buzzer = 6;// on crée une constante de type int que l'on nomme "buzzer" à qui on
  64.                      // attribue la valeur 6
  65.                      // cette constant nous servira à déterminer la broche du buzzer
  66.                      // ici : la broche n° 6
  67. const int rouge2 = 7;// on crée une constante de type int que l'on nomme "rouge2" à qui on
  68.                      // attribue la valeur 7
  69.                      // cette constant nous servira à déterminer la broche de la led rouge 2
  70.                      // ici : la broche n° 7
  71. const int ok = 8; // on crée une constante de type int que l'on nomme "ok" à qui on
  72.                   // attribue la valeur 8
  73.                   // cette constant nous servira à déterminer la broche de la led verte
  74.                   // ici : la broche n° 8
  75. const int porte = 10; // on crée une constante de type int que l'on nomme "porte" à qui on
  76.                       // attribue la valeur 10
  77.                       // cette constant nous servira à déterminer la broche du servomoteur
  78.                       // ici : la broche n° 10
  79. const int veille = 12;// on crée une constante de type int que l'on nomme "veille" à qui on
  80.                       // attribue la valeur 12
  81.                       // cette constant nous servira à déterminer la broche de la led bleue
  82.                       // ici : la broche n° 12
  83.  
  84. int evol = 1; // on une variable de type int (nombre entier) que l'on nomme "evol"
  85.               // à qui on attribue la valeur de l'incrémentation
  86.               // de l'angle du servo à chaque tour de loop() ici : 1
  87. long tempo; // on crée une variable de type long (grands chiffre) que l'on nomme "tempo" qui servira
  88.             // de repère temporel pour le clignottement des LEDs rouges
  89. int tempoP = 40; // on crée une variable de type int (nombre entier) que l'on nomme tempoP
  90.                  // à qui on attribue la valeur qui définit
  91.                  // le temps (en millisecondes) entre deux incrémentations
  92. int angleMax = 93; // on crée une variablede type int (nombre entier) que l'on nomme angleMax
  93.                    //à qui on attribue la valeur qui détermine
  94.                    // l'angle maximum d'ouverture de la porte
  95. // pour moi, c'est le mini, désolé : à l'angle Max la porte est fermée)
  96. int angleMini = 3; // on crée une variablede type int (nombre entier) que l'on nomme angleMini
  97.                    // à qui on attribue la valeur qui détermine
  98.                    // l'angle minimum d'ouverture de la porte (porte fermée)
  99. // pour moi, c'est le maxi, désolé : à l'angle Mini la porte est ouvert)
  100. bool etatRouge = true; // on crée une variable de type bool (true ou false) que l'on nomme "etatRouge"
  101.                        // à qui on attribue la valeur de true
  102.                        // qui crée un état initial des LEDs rouges
  103. bool buzzFerme = true; // on crée une variable de type bool (true ou false) que l'on nomme "buzzFerme"
  104.                        // à qui on attribue la valeur de true
  105.                        // qui dit que le buzzer de fermeture a déjà sonné ou pas
  106. bool buzzOuvert = false; // on crée une variable de type bool (true ou false) que l'on nomme "buzzOuvert"
  107.                          // à qui on attribue la valeur de false
  108.                          // qui dit que le buzzer d'ouverture a déja sonné ou pas
  109.  
  110. //===============================================================
  111.  
  112. void setup() {
  113.   Serial.begin(9600); // Ouverture de la communication avec le PC (port série) à 9600 baud
  114.   maPorte.attach(porte); // on attribue à "notre servo" la broche de connection
  115.                          // qui a pour valeur la constante porte
  116.                          // donc la broche 10
  117.   pinMode(bleu, INPUT); // on définit la broche du bouton bleu comme une entrée
  118.   pinMode(blanc, INPUT); // on définit la broche du bouton blanc comme une entrée
  119.   pinMode(rouge, OUTPUT); // on définit la broche de la LED rouge1 comme une sortie
  120.   pinMode(rouge2, OUTPUT); // on définit la broche de la LED rouge2 comme une sortie
  121.   pinMode(lampe, OUTPUT); // on définit la broche de la LED lampe comme une sortie
  122.   pinMode(buzzer, OUTPUT); // on définit la broche du buzzer comme une sortie
  123.   pinMode(ok, OUTPUT); // on définit la broche de la LED ok comme une sortie
  124.   pinMode(veille, OUTPUT); // on définit la broche de la LED veille comme une sortie
  125.   rotationServo = angleMax; // on signale que l'angle du servo est angleMax au démarrage
  126.   digitalWrite(lampe, 0); // on eteind la LED lampe
  127. }
  128.  
  129. //===============================================================
  130.  
  131. void loop() {
  132.  
  133.   // début ------------------------------------------------------
  134.   // Action boutons ---------------------------------------------
  135.  
  136.   // _ Action boutons bleu --------------------------------------
  137.   if (digitalRead(bleu) == true) {            // Quand on enfonce le bouton bleu
  138.     actionBoutBleu ();
  139.   // _ Action boutons blanc -------------------------------------
  140.   } else if (digitalRead(blanc) == true) {            // quand on appuie sur le bouton blanc
  141.     actionBoutBlanc ();
  142.   // _ Pas d'action ---------------------------------------------
  143.   } else {            // quand aucun bouton n'est enfoncé
  144.     rien ();
  145.   }
  146.   // Action boutons ---------------------------------------------
  147.   // fin --------------------------------------------------------
  148.  
  149.   // début ------------------------------------------------------
  150.   // Blink ------------------------------------------------------
  151.   if ((digitalRead(bleu) == 1 && rotationServo < (angleMax - 2)) || (digitalRead(blanc) == 1 && rotationServo > (angleMini + 2))) { // si
  152.       // ... le bouton bleu est enfoncé et que l'angle du servo est plus petit que angleMax - 2 |ou| que le bouton blanc est enfoncé et
  153.       // que l'angle du servo est plus grand que angleMini + 2
  154.     flashAlt();            // on fait clignoter les leds rouges alternativement si nécessaire (fonction en dessous)
  155.   }
  156.   // Blink ------------------------------------------------------
  157.   // fin --------------------------------------------------------
  158.  
  159.   // début ------------------------------------------------------
  160.   // Eclairage --------------------------------------------------
  161.   if (rotationServo < (angleMini + 65)) {            //Si le servo à un angle plus petit que l'angle mini + 65
  162.     digitalWrite(lampe, true);            // on allume la lampe (LEDs blanches)
  163.   } else {            // si le servo à un angle plus grand que l'angle mini + 65
  164.     digitalWrite(lampe, false);            // on eteind la lampe
  165.   }
  166.   // Eclairage --------------------------------------------------
  167.   // fin --------------------------------------------------------
  168.  
  169.   // début ------------------------------------------------------
  170.   // ok ---------------------------------------------------------
  171.   if (rotationServo < (angleMini + 2)) {            // si le servo a un angle plus petit que l'angle mini +2
  172.     allumeOK ();
  173.   } else {            // sinon : si le servo a un angle plus grand que l'angle mini +2
  174.     eteintOK ();
  175.   }
  176.   // ok ---------------------------------------------------------
  177.   // fin --------------------------------------------------------
  178.  
  179.   // début ------------------------------------------------------
  180.   // veille -----------------------------------------------------
  181.   if (rotationServo > (angleMax - 2)) {            // si le servo a un angle plus grand que l'angle max - 2
  182.     allumeVeilleuse();
  183.   } else {            // sinon, si le servo a un angle plus petit que l'angle max - 2
  184.     eteintVeilleuse();
  185.   }
  186.   // veille -----------------------------------------------------
  187.   // fin --------------------------------------------------------
  188.  
  189.   // début ------------------------------------------------------
  190.   // Action porte -----------------------------------------------
  191.   actionPorte ();
  192.   // Action porte -----------------------------------------------
  193.   // fin --------------------------------------------------------
  194. }
  195.  
  196. //===============================================================
  197.  
  198. void flashAlt() {
  199.   if (millis() - tempo >= 250) {            // si il s'est écoulé 250 ms depuis le dernier repère temporel enregistré
  200.     etatRouge = !etatRouge;            // si etatRouge = true alors il devient false et inversement
  201.     digitalWrite(rouge, etatRouge);            // on envoie à la broche "rouge" (2) la valeur de "etatRouge" (true ou false)
  202.     digitalWrite(rouge2, !etatRouge);            // on envoie à la broche "rouge2" (7) le contraire de la valeur de "etatRouge" (false ou true)
  203.     tempo = millis();            // la valeur du repère temporel "tempo" devient la valeur en ms du temps écoulé depuis le setup()
  204.     tone (buzzer, 329, 100);            // on fait sonner le buzzer (6) pendant 0.1s en Mi (329)
  205.   }
  206. }
  207.  
  208. void allumeVeilleuse(){
  209.   digitalWrite(veille, true);            // on allume la LED "veilleuse" (LED bleue)
  210.     if (buzzFerme == false) {            // si le buzzer de fermeture n'a pas encore sonné
  211.       delay(150);            // petite pause café de 0.15s pour laisser la porte s'ouvrir complètement
  212.       tone (buzzer, 261, 500);            // premier coup de buzzer de 0.5s (Do) (parfois 262)
  213.       delay(600);            // petite pause café de 0.6s
  214.       tone (buzzer, 261, 700);            // second coup de buzzer de 0.7s (Do) (parfois 262)
  215.       buzzFerme = true;            // on indique que le buzzer de fermeture a (déjà) sonné
  216.     }
  217. }
  218.  
  219. void eteintVeilleuse(){
  220.   digitalWrite(veille, false);            // on eteind la LED "veilleuse" (LED bleue)
  221.   buzzFerme = false;            // on indique que le buzzer de fermeture n'a pas encore sonné
  222. }
  223.  
  224. void allumeOK () {
  225.   digitalWrite(ok, true);            // on allume la lampe OK (LED verte)
  226.     if (buzzOuvert == false) {            // si le buzzer d'ouverture n'a pas été activé
  227.       delay(150);            // petite pause café de 0.15s pour laisser la porte se fermer complètement
  228.       tone (buzzer, 493, 75);            // premier coup de buzzer de 0.075s (Si) (parfois 494)
  229.       delay(150);            // petite pause café de 0.15s
  230.       tone (buzzer, 493, 75);            // second coup de buzzer de 0.075s (Si) (parfois 494)
  231.       buzzOuvert = true;            // on indique que le buzzer d'ouverture à (déjà) sonné
  232.     }
  233. }
  234.  
  235. void eteintOK () {
  236.   digitalWrite(ok, false);            // on éteind la lampe OK (LED verte)
  237.   buzzOuvert = false;            // on indique que le buzzer d'ouverture n'a pas (encore) sonné
  238. }
  239.  
  240. void actionPorte () {
  241.   maPorte.write(rotationServo);            // ENFIN, pour finir on fait tourner le servo à l'angle obtenu
  242.   delay(tempoP);            // on fait une pause de la valeur de temporistation pour laisser le servo tourner
  243.                             // et temporiser le mouvement de la porte
  244. }
  245.  
  246. void actionBoutBleu () {
  247.   if (rotationServo < angleMax) {            // Si l'angle du servo est plus petit que l'angle max
  248.     rotationServo += evol;            // on applique une rotation d'un anglle de la valeur de evolP au servo
  249.   }
  250. }
  251.  
  252. void actionBoutBlanc () {
  253.   if (rotationServo > angleMini) {            // Si l'angle du servo est plus grand que l'angle mini
  254.     rotationServo -= evol;            // on applique une rotation d'un anglle de la valeur de evolP au servo
  255.   }
  256. }
  257.  
  258. void rien () {
  259.   digitalWrite(rouge, false);            // et on vérifie que les leds clignotantes sont éteintes
  260.   digitalWrite(rouge2, false);
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement