Programme commandant un écran LCD et un moteur à courant continu
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Programme commandant un écran LCD et un moteur à courant continu



  1. #1
    Sparrounet

    Programme commandant un écran LCD et un moteur à courant continu


    ------

    Bonsoir,

    je souhaite réaliser un découpe-gâteau automatique et pour cela la programmation est indispensable. N'étant pas un expert dans ce domaine, j'ai tout de même réaliser un programme commandant le plateau (mis en rotation par un MCC) et l'écran LCD (servant à sélectionner le nombre de parts). C'est pourquoi je vous demande de jeter un œil à mon programme et de me corriger d'essentielles fautes :


    Code:
    #include <Wire.h> 
    #include <Adafruit_RGBLCDShield.h> 
    #include <utility/Adafruit_MCP23017.h>
    
    Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();  
     
    #define RED 0x1 
    #define YELLOW 0x3 
    #define GREEN 0x2 
    #define TEAL 0x6 
    #define BLUE 0x4 
    #define VIOLET 0x5 
    #define WHITE 0x7 
    #define maSortie       
    
    int pin1Moteur = 5;
    int pin2moteur = 6;
    
    
    
    
    void setup() {
      
      
      Serial.begin(9600);       
      lcd.begin(16, 2);          
      int time = millis();    
      lcd.print("Nbre parts : ");        
    
    
      pinMode(pin1Moteur,OUTPUT);
      pinMode(pin2Moteur,OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
        lcd.setCursor(0, 1);
      
      
      uint8_t buttons = lcd.readButtons();
    
      if (buttons) {
        lcd.clear();
        lcd.setCursor(0,0);
       
        if (buttons & BUTTON_LEFT) {
          nbrPart= nbrPart +1;
          if (nbrPart > 10) {
          nbrPart= 2;  
          }
          
          delay(200);
          
         Serial.print("nbrPart = ");
         Serial.println(nbrPart);
         lcd.print("Nbre parts = ");
         lcd.print(nbrPart);
         
          
        }
        if (buttons & BUTTON_SELECT) {
           lcd.print("Nbre parts validé");
        }
       }
      if (nbrPart=2) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(303);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=3) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(202);
        digitalWrite(5, LOW) 
        digitalWrite(6, LOW);
      }
     if (nbrPart=4) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(151);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=5) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(121);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=6) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(101);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
     } 
     if (nbrPart=7) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(86.5);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=8) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(75);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=9) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(67);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=10) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(60);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
    }

    -----
    Dernière modification par JPL ; 09/05/2017 à 22h48. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    Sparrounet

    Re : Programme commandant un écran LCD et un moteur à courant continu

    Rebonsoir,
    j'ai modifié le programme, ce dernier se compile parfaitement :


    Code:
    #include <Wire.h> 
    #include <Adafruit_RGBLCDShield.h> 
    #include <utility/Adafruit_MCP23017.h>
    
    Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();  
     
    #define RED 0x1 
    #define YELLOW 0x3 
    #define GREEN 0x2 
    #define TEAL 0x6 
    #define BLUE 0x4 
    #define VIOLET 0x5 
    #define WHITE 0x7 
    #define maSortie       
    
    int pin1Moteur = 5;
    int pin2Moteur = 6;
    int nbrPart = 1;
    
    
    
    void setup() {
      
      
      Serial.begin(9600);       
      lcd.begin(16, 2);          
      int time = millis();    
      lcd.print("Nbre parts : ");        
    
    
      pinMode(pin1Moteur,OUTPUT);
      pinMode(pin2Moteur,OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
        lcd.setCursor(0, 1);
      
      
      uint8_t buttons = lcd.readButtons();
    
      if (buttons) {
        lcd.clear();
        lcd.setCursor(0,0);
       
        if (buttons & BUTTON_LEFT) {
          nbrPart= nbrPart +1;
          if (nbrPart > 10) {
          nbrPart= 2;  
          }
          
          delay(200);
          
         Serial.print("nbrPart = ");
         Serial.println(nbrPart);
         lcd.print("Nbre parts = ");
         lcd.print(nbrPart);
         
          
        }
        if (buttons & BUTTON_SELECT) {
           lcd.print("Nbre parts validé");
        }
       }
      if (nbrPart=2) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(303);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=3) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(202);
        digitalWrite(5, LOW); 
        digitalWrite(6, LOW);
      }
     if (nbrPart=4) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(151);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=5) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(121);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=6) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(101);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
     } 
     if (nbrPart=7) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(86.5);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=8) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(75);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=9) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(67);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
     if (nbrPart=10) {
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(60);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
      }
    }
    Dernière modification par JPL ; 09/05/2017 à 22h48. Motif: Ajout de la balise Code (#) pour garder l'indentation

  3. #3
    Bluedeep

    Re : Programme commandant un écran LCD et un moteur à courant continu

    Bonjour

    Si le langage est du C (ce que tu ne précises pas), je ne comprends pas ces lignes :

    Code:
    if (nbrPart=2)
    (et les autres équivalentes).

    En effet, ce test n'a aucune utilité : tu affectes 2 à nbrPart et tu tests la non nullité de l'ensemble; donc le test ne sert à rien.

    Es tu sur que tu ne veux pas écrire plutôt :

    Code:
    if (nbrPart==2)
    ?

  4. #4
    TotalRecall

    Re : Programme commandant un écran LCD et un moteur à courant continu

    C'est de l'arduino. Et effectivement, c'est un == qu'il faut pour tous les tests conditionnels, sinon il fait une assignation !

    A part ça tu as deux Serial.begin(9600); au début, enlève en un.

    Mais c'est surtout le principe de pilotage du moteur sur lequel j'ai un énorme doute :
    Tu veux faire des découpes avec des angles précis, l'angle dépend du nombre de parts.

    Et pour ça tu utilises un moteur à courant continu que tu alimentes par une impulsion dont tu ajustes la longueur selon l'angle.
    C'est horriblement imprécis (surtout vu les timings utilisés), et même si par miracle tu arrivais à trouver la bonne durée pour chaque angle, ça ne fonctionnerait que pour un seul type de moteur dans des conditions très spécifiques.

    Pour ce genre de chose il faut un système précis (moteur pas à pas, servo...) et un asservissement.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Programme commandant un écran LCD et un moteur à courant continu

    Un switch ...case serait bien plus adapté que cette succession de if.

    Code:
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(121);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
    Ce code pourrait avantageusement être mutualisé par une fonction avec la valeur du délai comme paramètre.

  7. #6
    Sparrounet

    Re : Programme commandant un écran LCD et un moteur à courant continu

    Bonjour,
    je vous remercie de vous réponses rapides. Pour ce qui est de l'utilisation du moteur à courant continu, ce sont les professeurs qui nous ont conseillé d'utiliser un moteur à courant continu. Je me doute bien que cela ne sera pas précis mais je ne fais qu'appliquer. Je vais par ailleurs essayer de modifier le programme en remplaçant les if par la fonction switch.

    Merci d'avance
    Sébastien

  8. #7
    Jack
    Modérateur

    Re : Programme commandant un écran LCD et un moteur à courant continu

    switch est une instruction, pas une fonction.

  9. #8
    jacknicklaus

    Re : Programme commandant un écran LCD et un moteur à courant continu

    Tu ne pourrais pas remplacer TOUS ces if affreux par UN SEUL
    Code:
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        delay(606/nbrPart);
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
    visiblement tu as calculé à la main 606 / nombre de part pour obtenir le délai. Généralement, on préfère que les calculs numériques soient pris en charge par le programme plutôt que par le cerveau du programmeur...
    Dernière modification par jacknicklaus ; 10/05/2017 à 17h23.
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  10. #9
    invite73192618

    Re : Programme commandant un écran LCD et un moteur à courant continu

    Code:
        if (buttons & BUTTON_LEFT) {
          nbrPart= nbrPart +1;
          if (nbrPart > 10) {
          nbrPart= 2;  
          }
          
          delay(200);
    Ce bout semble bizarre. Tu souhaites avoir un bouton et que chaque fois que tu appuis dessus l'incrément monte d'un pour sélectionner le bon nombre de part, c'est bien cela? Si oui il manque de le mettre dans une boucle et de bien séparer la partie sélection de la partie découpe.

Discussions similaires

  1. Lisser le courant sur un moteur à courant continu
    Par celestin-h dans le forum Bricolage et décoration
    Réponses: 13
    Dernier message: 19/08/2015, 14h00
  2. Réponses: 22
    Dernier message: 24/04/2015, 10h03
  3. Programme moteur courant continu urgent!!!
    Par invite7d07fbfb dans le forum Électronique
    Réponses: 4
    Dernier message: 08/12/2012, 10h22
  4. Réponses: 8
    Dernier message: 21/03/2012, 12h58
  5. Réponses: 1
    Dernier message: 19/03/2012, 19h13