Shield relais (partie 2)

Dans la partie précédente, si l’on remplace l’ampoule par un petit moteur, le montage et le programme fonctionnent : le moteur se met en marche puis s’arrête. Ce montage fonctionne aussi très bien avec une carte Arduino Uno complétée par le shield relais. Par contre, pas de possibilité de régler la vitesse ou le sens de rotation du moteur sans équipement complémentaire.

Pour arriver à fixer à volonté vitesse et sens de rotation, on va utiliser comme alimentation non pas un boîtier de piles qui fournit une tension fixe mais la sortie M1 du DFRduino ; en effet, on sait qu’il est possible de commander la vitesse et le sens d’un moteur à courant continu à partir de cette sortie. Cette sortie sera ensuite, grâce aux relais, aiguillée vers le moteur à animer.

Tant qu’à faire, on a ici branché 4 moteurs, tous connectés à cette même sortie M1. Voici le schéma de principe réalisé avec Fritzing (l’agrandir si nécessaire pour mieux le visualiser). Le shield qui se pose au-dessus du DFRduino n’est pas représenté sur le schéma, on a juste fait figurer les 4 connecteurs de 4 contacts chacun qui sont présents sur le shield.

Fichier hébergé par Archive-Host.com

Voici un programme de démo qui fait tourner, successivement, chaque moteur en avant puis en arrière. Pas d’interactivité dans ce petit programme, on déroule juste une séquence.


// shield relais V4

// commande de 4 moteurs
// vitesse et sens variables
// un seul moteur commandé à la fois

// correspondances pin - relais
// ok pour DFR0144 V2.1

byte Pin_relais[4] = {2,7,8,10};

// On utilise la sortie moteur M1 du DFRduino
// comme source d'alim pour les 4 moteurs à commander
 
int Pin_M1_sens = 4 ; // le sens M1 est commandé par la Pin 4

int Pin_M1_pwm = 5 ; //  la vitesse M1 est commandée par la Pin 5
 
 
void setup(){
  
  for(int i = 0; i < 4; i++)  pinMode(Pin_relais[i],OUTPUT);
 
  pinMode(Pin_M1_sens,OUTPUT);
 
  pinMode(Pin_M1_pwm,OUTPUT);
 
 
}
 
void loop(){  
  
  
    ////////////////////premier moteur ///////////////////////////

  /// mettre en marche 5 secondes le premier moteur en marche avant
  
  // en faisant coller le relais 1 : COM1 et NO1 en contact
  
  // l'alimentation est prise de la sortie M1 du DFRduino
  
  // pour tous les moteurs
  
  ///////////////////moteur 1 /////////////////////////////////
  
  controle(1,1,10);// moteur 1, sens avant, vitesse 10
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  //////////////////////////////////////////////////////
  
  controle(1,0,10);// moteur 1, sens arriere, vitesse 10
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  
  //////////////////// moteur 2 ////////////////////////////////
  
  controle(2,1,10);// moteur 2, sens avant, vitesse 10
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  //////////////////////////////////////////////////////
  
  controle(2,0,10);// moteur 2, sens arriere, vitesse 10
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  
  /////////////////////moteur 3 ///////////////////////////////
  
  controle(3,1,5);// moteur 3, sens avant, vitesse 10
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  //////////////////////////////////////////////////////
  
  controle(3,0,5);// moteur 3, sens arriere, vitesse 10
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  
   
  /////////////////////moteur 4 ///////////////////////////////
  
  controle(4,1,5);// moteur 4, sens avant, vitesse 5
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);
  
  //////////////////////////////////////////////////////
  
  controle(4,0,5);// moteur 4, sens arriere, vitesse 5
  
  delay(5000);
  
  controle(0,0,0) ; // arret tous moteurs
  
  delay(1000);       
 
}


// la procedure de controle des moteurs

void controle (int m, int sens, int v)         
 
 // m : 1, 2, 3, 4  choix moteur
 // si m = 0 arret tous moteurs

 // sens : 1 ou 0 (avant ou arrière)
 // v : vitesse de 0 à 10, 

{       
        int pwm, i;
        
        // couper l'alim des relais : les contacts NC et COM ne se touchent plus 
        for(i = 0; i < 4; i++)  digitalWrite(Pin_relais[i],LOW);
        
        delay(100);
        
        if (m >0) {
        
        // alimenter le relais correspondant au moteur désiré
        digitalWrite(Pin_relais[m-1],HIGH);
        
        // paramétrer la sortie moteur M1 du DFRduino
        // qui va alimenter le moteur choisi
        
        pwm = map(v, 0,10, 0,255); // ramener vitesse à l'intervalle 0 255
        digitalWrite(Pin_M1_sens,sens);  // fixer sens
        analogWrite (Pin_M1_pwm,pwm);    // fixer vitesse
        delay(100);
        
        }                            
}

Est-ce la solution miracle pour transformer un DFRduino à deux sorties moteur en un DFRduino à 4 sorties ? Eh non ! En effet les 4 moteurs s’alimentent sur la même sortie M1 de la carte donc ne peuvent pas être utilisés simultanément avec des vitesses ou des sens différents ce que l’on ferait si on avait 4 sorties indépendantes.

Shield relais (partie 1)

Voici un shield qui permet de commander par programme un ensemble d’interrupteurs.

Fichier hébergé par Archive-Host.com

Pour ce premier exemple, on a choisi un montage limpide (on utilise les contacts COM et NO du relais 1) et un programme très rustique.


// shield relais V0

//Pin2 commande le relais 1
 
void setup(){

  pinMode(2,OUTPUT);

}
 
void loop(){  

  // mettre en marche 5 secondes en faisant coller le relais 1 
  // COM1 et NO1 en contact
  // la lampe s'allume

  digitalWrite(2,HIGH);

  delay(5000);

  // stopper une seconde l'alim du relais 1 
  // COM1 et NO1 ne sont plus en contact
  // la lampe s'éteint

  digitalWrite(2,LOW);

  delay(1000);
 
}

En portant la pin 2 à l’état haut, les contacts COM1 et NO1 se touchent ce qui ferme le circuit et permet à la lampe de s’allumer.

COM désigne le contact commum
NO veut dire Normally Open
NC veut dire Normally Closed

Quand la bobine du relais n’est pas alimentée, COM et NO ne sont pas en contact mais COM et NC le sont.

Quand la bobine du relais est alimentée, COM et NO sont en contact mais COM et NC ne le sont pas.

Remarquer qu’il faut alimenter la carte DFRduino par sa prise d’alim (au moins 7,5v) ; l’alimentation USB ne délivre pas assez de tension pour faire coller le relais.

Le modèle est un DFRobot DFR0144 Version 2.1.

Ruse : les programmes présents aujourd’hui (16/06/2013) sur le site de DFRobot sont écrits pour une version antérieure du shield… et ne fonctionnent pas avec le shield V 2.1 à cause d’une correspondance pin/ relais qui a changé.

Pour cette version 2.1 la correspondance pin / relais est la suivante :

PIN 2 -> relais 1
PIN 7 -> relais 2
PIN 8 -> relais 3
PIN 10 -> relais 4