Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boitier de commande pour une table élévatrice

Inverseur de moteur DC arduino

9 décembre 2022 à 14:53:10

Salut à tous,

J'ai récupéré un vieux lit médicalisé que j'ai converti en pont élévateur de moto (=table élévatrice).

Le fonctionnement est assez simple: C'est un verin électrique en 24Vdc (donc un moteur DC dedans). On l'alimente dans un sens, ça monte, on l'alimente dans l'autre sens, ça descend...

La carte de contrôle d'origine est cramée, mais il fonctionne bien avec une batterie 18V de visseuse direct sur les fils du moteur. Globalement, ça ne tape jamais plus d'1.5A en 24V. Il y a 3 fils dédiés aux capteurs de fin de course haut et bas (un fil commun donc), comme décrit dans le shémas.

Les objectifs:

1) dans un premier temps, arriver à le faire fonctionner avec 1 bouton "ça monte" et un bouton "ça descend" tout est prenant en compte les fin de courses pour ne pas forcer contre les butées.

2) Ajouter un 3eme bouton "aller tout en bas" pour quand on veut descendre la moto, histoire de ne pas rester appuyé 2 minutes à chaque fois car c'est assez lent.

Voici le câblage actuel:

Et voici le code:

  //Entrées
  const int BoutonUp = 3;
  const int BoutonDown = 4;
  const int BoutonBot = 5;
  const int SensorTop = 6;
  const int SensorBot = 7;
  // Sorties
  const int Relay1 = 13;
  const int Relay2 = 12;
  const int Relay3 = 11;
  const int Relay4 = 10;
  // Variables
  int BoutonUpState;
  int BoutonDownState;
  int BoutonBotState;
  int SensorTopState;
  int SensorBotState;

void setup() {
  
  // Pin Mode Entrées
  pinMode(BoutonUp, INPUT_PULLUP);
  pinMode(BoutonDown, INPUT_PULLUP);
  pinMode(BoutonBot, INPUT_PULLUP);
  pinMode(SensorTop, INPUT_PULLUP);
  pinMode(SensorBot, INPUT_PULLUP);
  //Pin Mode Sorties
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  // Ouverture forcée de tous les relais:
  digitalWrite(Relay1, HIGH);
  digitalWrite(Relay2, HIGH);
  digitalWrite(Relay3, HIGH);
  digitalWrite(Relay4, HIGH); 


   
}

void loop() {

  BoutonUpState = digitalRead(BoutonUp);
  BoutonDownState = digitalRead(BoutonDown);
  BoutonBotState = digitalRead(BoutonBot);
  SensorTopState = digitalRead(SensorTop);
  SensorBotState = digitalRead(SensorBot);
  

  // ESSAYER DE MONTER
  
  // if (BoutonUpState == LOW && BoutonDownState == HIGH && BoutonBotState == HIGH && SensorTopState == LOW){
  if (BoutonUpState == LOW ){
   
    // Fermer les relais 1 et 3
    digitalWrite(Relay1, LOW);   // Relais fermé = LOW
    digitalWrite(Relay2, HIGH);  // Relais fermé = LOW
    digitalWrite(Relay3, LOW);   // Relais fermé = LOW
    digitalWrite(Relay4, HIGH);  // Relais fermé = LOW 
    }
        
    else {
    // Ouvrir tous les relais
    digitalWrite(Relay1, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay2, HIGH);  // Relais fermé = LOW
    digitalWrite(Relay3, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay4, HIGH);  // Relais fermé = LOW
    }

  // ESAYER DE DESCENDRE

    // if (BoutonUpState == HIGH && BoutonDownState == LOW && BoutonBotState == HIGH && SensorBotState == LOW){
    if (BoutonDownState == LOW ){
      
    // Fermer les relais 2 et 4
    digitalWrite(Relay1, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay2, LOW);  // Relais fermé = LOW
    digitalWrite(Relay3, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay4, LOW);  // Relais fermé = LOW 
    }
    
    else {
    // Ouvrir tous les relais
    digitalWrite(Relay1, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay2, HIGH);  // Relais fermé = LOW
    digitalWrite(Relay3, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay4, HIGH);  // Relais fermé = LOW
    }
    


}

Pour l'instant, je teste la fonction la plus basique, sans les sécu hautes et basses.

ça fonctionne, mais pour une raison qui m'échappe, je vois passer 0.1A sur mon alim quand je connecte le pin4 à la masse, et seulement 0.05A quand je connecte le pin3. Aussi, avec le pin3 à la masse, je vois que l'intensité des LEDs de l'Arduino baissent.

Est-ce ce qu'il y  quelque chose dans mon code ou dans mon câblage qui ne va pas?

Merci beaucoup d'avance,

Benjamin

EDIT: J'ai modifié le code, et maintenant ça marche très bien:

  //Entrées
  const int BoutonUp = 3;
  const int BoutonDown = 4;
  const int BoutonBot = 5;
  const int SensorTop = 6;
  const int SensorBot = 7;
  // Sorties
  const int Relay1 = 13;
  const int Relay2 = 12;
  const int Relay3 = 11;
  const int Relay4 = 10;
  // Variables
  int BoutonUpState;
  int BoutonDownState;
  int BoutonBotState;
  int SensorTopState;
  int SensorBotState;

void setup() {
  
  // Pin Mode Entrées
  pinMode(BoutonUp, INPUT_PULLUP);
  pinMode(BoutonDown, INPUT_PULLUP);
  pinMode(BoutonBot, INPUT_PULLUP);
  pinMode(SensorTop, INPUT_PULLUP);
  pinMode(SensorBot, INPUT_PULLUP);
  //Pin Mode Sorties
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  // Ouverture forcée de tous les relais:
  digitalWrite(Relay1, HIGH);
  digitalWrite(Relay2, HIGH);
  digitalWrite(Relay3, HIGH);
  digitalWrite(Relay4, HIGH); 


   
}

void loop() {

  BoutonUpState = digitalRead(BoutonUp);
  BoutonDownState = digitalRead(BoutonDown);
  BoutonBotState = digitalRead(BoutonBot);
  SensorTopState = digitalRead(SensorTop);
  SensorBotState = digitalRead(SensorBot);
  

  // ESSAYER DE MONTER
  
  if (BoutonUpState == LOW && BoutonDownState == HIGH && BoutonBotState == HIGH && SensorTopState == LOW){
  
   
    // Fermer les relais 1 et 3
    digitalWrite(Relay1, LOW);   // Relais fermé = LOW
    digitalWrite(Relay2, HIGH);  // Relais fermé = LOW
    digitalWrite(Relay3, LOW);   // Relais fermé = LOW
    digitalWrite(Relay4, HIGH);  // Relais fermé = LOW
    delay(100); 
    }
        
   

  // ESSAYER DE DESCENDRE

   if (BoutonUpState == HIGH && BoutonDownState == LOW && BoutonBotState == HIGH && SensorBotState == LOW){
   
      
    // Fermer les relais 2 et 4
    digitalWrite(Relay1, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay2, LOW);  // Relais fermé = LOW
    digitalWrite(Relay3, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay4, LOW);  // Relais fermé = LOW
    delay(100);
    }
    
    else {
    //Ouvrir tous les relais
    digitalWrite(Relay1, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay2, HIGH);  // Relais fermé = LOW
    digitalWrite(Relay3, HIGH);   // Relais fermé = LOW
    digitalWrite(Relay4, HIGH);  // Relais fermé = LOW
    }
    


}



-
Edité par BenjaminChrd 10 décembre 2022 à 0:23:14

  • Partager sur Facebook
  • Partager sur Twitter
12 décembre 2022 à 8:24:03

Sur ton premier code, tu fais : "si bouton HAUT enfoncé, aller en haut, sinon STOP", puis pareil pour le bouton bas.

Du coup, quand tu appuis appuis sur un seul des deux boutons, ton moteur va passer son temps à enchainer STOP/MARCHE à cause des if/else.

Ton deuxième code est mieux, mais pas encore optimal niveau if/else.

Par exemple, ton moteur ne va jamais s'arrêter de monter si tu maintient le bouton HAUT.

En effet, ton code va bien arrêter de rentrer dans le IF ligne 53 mais il n’exécute aucune ligne de code pour stopper le moteur donc les relais restent dans leur état actuel et le moteur continu de tourner.

Tu devrais plutôt avoir :

if ( bouton haut enfoncé et bouton bas relaché ) {
    if ( buté haut OK ) {
        MONTER();
    } else {
        STOP();
    }
}

if ( bouton haut relaché et bouton bas enfoncé ) {
    if ( buté bas OK ) {
        DESCENDRE();
    } else {
        STOP();
    }
}

if ( bouton haut relaché et bouton bas relaché ) {
    STOP();
}

J'en profiter aussi pour dire que pendant un delay, ton programme est en pause et ne scan donc pas l'état des butée donc pendant un delay de 100ms, tu peux très bien encastrer une butée.

-
Edité par lorrio 12 décembre 2022 à 8:24:56

  • Partager sur Facebook
  • Partager sur Twitter