Go Down

Topic: Commander 12 servomoteur avec NRF24L01 (Read 527 times) previous topic - next topic

LgdMicka

Bonjour à tous, j'ai un projet en cours qui consiste à commander 12 servomoteur à distance.

J'utilise 2 Arduino Mega, 2 NRF24L01, 12 boutons poussoirs (à terme cela deviendra une télécommande).
Pour l'instant mes boutons poussoirs sont installés sur une plaque d'essais, protégés par une résistance et reliés aux broches 2 à 13 de l'Arduino émetteur.

Le mouvement attendu est: j'appuie sur le bouton 1, le servo 1 fait 90°, je re-appuie sur le bouton 1, le servo 1 revient en position initiale. Et ainsi de suite jusqu'au servo 12
Je ne suis pas une pointure en programmation, j'ai trouvé des bouts de codes sur le net et pour l'instant j'arrive à commander mes 6 premiers servo sans problèmes, par contre mon programme ne fonctionne plus à partir du 7ème servo...


Voici le programme utilisé sur l'émetteur:

Code: [Select]
// les librairies nécessaires au fonctionnement du nRF24L01
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


// L'entrée où est branché le premier bouton (les autres sont adjacents)
  #define BOUTON 2

int val[] = {0, 0, 0, 0, 0, 0};    // État des boutons
int old_val[] = {0, 0, 0, 0, 0, 0}; // État précédent des boutons
int state[] = {0, 0, 0, 0, 0, 0}; // État de la LED
byte message;  // ce qui sera envoyé à  l'autre Arduino

void setup(){
  Mirf.cePin = 47; // CE branché sur 8
  Mirf.csnPin = 49; // CSN branché sur 9
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
 
  Mirf.channel = 65;
  Mirf.payload = sizeof(byte); // taille de ce qu'on va envoyer
  Mirf.config();
 
  Mirf.setTADDR((byte *)"nrf02"); // on baptise les deux modules
  Mirf.setRADDR((byte *)"nrf01");
 
 
  // configuration des entrées numériques associées aux boutons:

  for (int i=0; i <= 5; i++){
    pinMode(BOUTON+i, INPUT);
  }

}

void loop(){

   for (int i=0; i <= 5; i++){

    val[i] = digitalRead(BOUTON+i);

    // Y a-t-il eu un changement?
    if ((val[i] == HIGH) && (old_val[i] == LOW)){
      state[i] = 1 - state[i];
      delay(10);
    }
   
    old_val[i] = val[i];
   
  }

 // mise à  jour du message à  envoyer à l'autre Arduino:
 message = B00000000;
 if (state[0]){
   message = message + B00000001;
 }
  if (state[1]){
   message = message + B00000010;
 }
   if (state[2]){
   message = message + B00000100;
 }
   if (state[3]){
   message = message + B00001000;
 }
   if (state[4]){
   message = message + B00010000;
 }
   if (state[5]){
   message = message + B00100000;
 }
   if (state[6]){
   message = message + B01000000;
 }
   if (state[7]){
   message = message + B10000000;
 }
 
 // on peut maintenant envoyer le message
 
  Mirf.send((byte *)&message);
 
  while(Mirf.isSending()); // On attend aussi longtemps que le message n'a pas été envoyé
 
}


Et voici le programme utilisé par l'Arduino récepteur:
Code: [Select]
/*****************************************************************
Code du récepteur. 
Allume ou éteint des LEDs à  partir des informations
reçues de l'émetteur.
 
 4 avril 2012.
 
 electroniqueamateur.blogspot.com
******************************************************************/

// les librairies nécessaires au fonctionnement du nRF24L01
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
Servo servo10;
Servo servo11;
Servo servo12;

byte message;
// La sortie où est branchée la première LED (les autres sont adjacentes)


void setup(){

  Mirf.cePin = 47; // CE branché sur 8
  Mirf.csnPin = 49; // CSN branché sur 9
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.channel = 65;
  Mirf.payload = sizeof(byte); // taille de ce qu'on va recevoir
  Mirf.config();

  Mirf.setTADDR((byte *)"nrf01"); // on baptise les deux modules
  Mirf.setRADDR((byte *)"nrf02");

  // configuration des sorties (Servo)
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
 
  servo1.attach(2);
  servo2.attach(3);
  servo3.attach(4);
  servo4.attach(5);
  servo5.attach(6);
  servo6.attach(7);
  servo7.attach(8);
  servo8.attach(9);
  servo9.attach(10);
  servo10.attach(11);
  servo11.attach(12);
  servo12.attach(13);
}

void loop(){


  byte data[Mirf.payload]; // data va contenir les donnéees reçues
 
  if(!Mirf.isSending() && Mirf.dataReady()){

    Mirf.getData(data); // réception du message

    message = data[0];

    // on fait bouger les servos


if (message >= B10000000){
    servo8.write(90);
    message =  message - B10000000;}
else
   {servo8.write(180); }

if (message >= B01000000){
    servo7.write(90);
    message =  message - B01000000;}
else
   {servo7.write(180); }

if (message >= B00100000){
    servo6.write(90);
    message =  message - B00100000;}
else
   {servo6.write(180); }
   
if (message >= B00010000){
    servo5.write(90);
    message =  message - B00010000;}
else
   {servo5.write(180); }


if (message >= B00001000){
    servo4.write(90);
    message =  message - B00001000;}
else
   {servo4.write(180); }

   
if (message >= B00000100){
    servo3.write(90);
    message =  message - B00000100;}
else
   {servo3.write(180); }
   
 
if (message >= B00000010){
    servo2.write(90);
    message =  message - B00000010;}
else
   {servo2.write(180); }
   
  }
 
if (message >= B00000001){
    servo1.write(90);
    }
else
   {servo1.write(180); }
   
 
}


Quelqu'un aurait une solution?

dfgh

#1
Mar 09, 2018, 08:59 pm Last Edit: Mar 09, 2018, 11:18 pm by dfgh
hello

ce n'est pas le bon endroit pour ce genre de question
demande au modo de déplacer ton post

teste ces codes
code émetteur
Code: [Select]
// les librairies nécessaires au fonctionnement du nRF24L01
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


// L'entrée où est branché le premier bouton (les autres sont adjacents)
  #define BOUTON 2

int val[] =     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};    // État des boutons
int old_val[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // État précédent des boutons
int state[] =   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // État de la LED
byte message;  // ce qui sera envoyé à  l'autre Arduino

void setup(){
  Mirf.cePin = 47; // CE branché sur 8
  Mirf.csnPin = 49; // CSN branché sur 9
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
 
  Mirf.channel = 65;
  Mirf.payload = sizeof(byte); // taille de ce qu'on va envoyer
  Mirf.config();
 
  Mirf.setTADDR((byte *)"nrf02"); // on baptise les deux modules
  Mirf.setRADDR((byte *)"nrf01");
 
 
  // configuration des entrées numériques associées aux boutons:

  for (int i=0; i <= 11; i++){
    pinMode(BOUTON+i, INPUT);
  }

}

void loop(){

   for (int i=0; i <= 11; i++){

    val[i] = digitalRead(BOUTON+i);

    // Y a-t-il eu un changement?
    if ((val[i] == HIGH) && (old_val[i] == LOW)){
      state[i] = 1 - state[i];
      delay(10);
    }
   
    old_val[i] = val[i];
   
  }

 // mise à  jour du message à  envoyer à l'autre Arduino:
 message = B00000000;
   if (state[0]){
   message = message + B00000001;
 }
   if (state[1]){
   message = message + B00000010;
 }
   if (state[2]){
   message = message + B00000011;
 }
   if (state[3]){
   message = message + B00000100;
 }
   if (state[4]){
   message = message + B00000101;
 }
   if (state[5]){
   message = message + B00000110;
 }
   if (state[6]){
   message = message + B00000111;
 }
   if (state[7]){
   message = message + B00001000;
 }
   if (state[8]){
   message = message + B00001001;
 }
   if (state[9]){
   message = message + B00001010;
 }
   if (state[10]){
   message = message + B00001011;
 }
   if (state[11]){
   message = message + B00001100;
 }
 
 // on peut maintenant envoyer le message
 
  Mirf.send((byte *)&message);
 
  while(Mirf.isSending()); // On attend aussi longtemps que le message n'a pas été envoyé
 
}



code recepteur
Code: [Select]
/*****************************************************************
Code du récepteur. 
Allume ou éteint des LEDs à  partir des informations
reçues de l'émetteur.
 
 4 avril 2012.
 
 electroniqueamateur.blogspot.com
******************************************************************/

// les librairies nécessaires au fonctionnement du nRF24L01
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
Servo servo10;
Servo servo11;
Servo servo12;

byte message;
// La sortie où est branchée la première LED (les autres sont adjacentes)


void setup(){

  Mirf.cePin = 47; // CE branché sur 8
  Mirf.csnPin = 49; // CSN branché sur 9
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.channel = 65;
  Mirf.payload = sizeof(byte); // taille de ce qu'on va recevoir
  Mirf.config();

  Mirf.setTADDR((byte *)"nrf01"); // on baptise les deux modules
  Mirf.setRADDR((byte *)"nrf02");

  // configuration des sorties (Servo)
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
 
  servo1.attach(2);
  servo2.attach(3);
  servo3.attach(4);
  servo4.attach(5);
  servo5.attach(6);
  servo6.attach(7);
  servo7.attach(8);
  servo8.attach(9);
  servo9.attach(10);
  servo10.attach(11);
  servo11.attach(12);
  servo12.attach(13);
}

void loop(){


  byte data[Mirf.payload]; // data va contenir les donnéees reçues
 
  if(!Mirf.isSending() && Mirf.dataReady()){

    Mirf.getData(data); // réception du message

    message = data[0];

    // on fait bouger les servos


if (message >= B00001100){
    servo12.write(90);
    message =  message - B00001100;}
else
   {servo12.write(180); }

if (message >= B00001011){
    servo11.write(90);
    message =  message - B00001011;}
else
   {servo11.write(180); }
   
if (message >= B00001010){
    servo10.write(90);
    message =  message - B00001010;}
else
   {servo10.write(180); }


if (message >= B00001001){
    servo9.write(90);
    message =  message - B00001001;}
else
   {servo9.write(180); }




if (message >= B00001000){
    servo8.write(90);
    message =  message - B00001000;}
else
   {servo8.write(180); }

if (message >= B00000111){
    servo7.write(90);
    message =  message - B00000111;}
else
   {servo7.write(180); }

if (message >= B00000110){
    servo6.write(90);
    message =  message - B00000110;}
else
   {servo6.write(180); }
   
if (message >= B00000101){
    servo5.write(90);
    message =  message - B00000101;}
else
   {servo5.write(180); }


if (message >= B00000100){
    servo4.write(90);
    message =  message - B00000100;}
else
   {servo4.write(180); }

   
if (message >= B00000011){
    servo3.write(90);
    message =  message - B00000011;}
else
   {servo3.write(180); }
   
 
if (message >= B00000010){
    servo2.write(90);
    message =  message - B00000010;}
else
   {servo2.write(180); }
   
  }
 
if (message >= B00000001){
    servo1.write(90);
    }
else
   {servo1.write(180); }
   
 
}



edit : modif d'un if oublié dans le code récepteur ( c'est corrigé)

LgdMicka

Ton code fonctionne très bien jusqu'au 6eme servo mais à partir du 7eme, les servos s'ouvre en meme temps de façon aléatoire?

dfgh

code recepteur
Code: [Select]
/*****************************************************************
Code du récepteur. 
Allume ou éteint des LEDs à  partir des informations
reçues de l'émetteur.
 
 4 avril 2012.
 
 electroniqueamateur.blogspot.com
******************************************************************/

// les librairies nécessaires au fonctionnement du nRF24L01
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
Servo servo10;
Servo servo11;
Servo servo12;

byte message;
// La sortie où est branchée la première LED (les autres sont adjacentes)


void setup(){

  Mirf.cePin = 47; // CE branché sur 8
  Mirf.csnPin = 49; // CSN branché sur 9
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.channel = 65;
  Mirf.payload = sizeof(byte); // taille de ce qu'on va recevoir
  Mirf.config();

  Mirf.setTADDR((byte *)"nrf01"); // on baptise les deux modules
  Mirf.setRADDR((byte *)"nrf02");

  // configuration des sorties (Servo)
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
 
  servo1.attach(2);
  servo2.attach(3);
  servo3.attach(4);
  servo4.attach(5);
  servo5.attach(6);
  servo6.attach(7);
  servo7.attach(8);
  servo8.attach(9);
  servo9.attach(10);
  servo10.attach(11);
  servo11.attach(12);
  servo12.attach(13);
}

void loop(){


  byte data[Mirf.payload]; // data va contenir les donnéees reçues
 
  if(!Mirf.isSending() && Mirf.dataReady()){

    Mirf.getData(data); // réception du message

    message = data[0];

    // on fait bouger les servos


if (message == B00001100){
    servo12.write(90);
    message =  message - B00001100;}
else
   {servo12.write(180); }

if (message == B00001011){
    servo11.write(90);
    message =  message - B00001011;}
else
   {servo11.write(180); }
   
if (message == B00001010){
    servo10.write(90);
    message =  message - B00001010;}
else
   {servo10.write(180); }

if (message == B00001001){
    servo9.write(90);
    message =  message - B00001001;}
else
   {servo9.write(180); }

if (message == B00001000){
    servo8.write(90);
    message =  message - B00001000;}
else
   {servo8.write(180); }

if (message == B00000111){
    servo7.write(90);
    message =  message - B00000111;}
else
   {servo7.write(180); }

if (message == B00000110){
    servo6.write(90);
    message =  message - B00000110;}
else
   {servo6.write(180); }
   
if (message == B00000101){
    servo5.write(90);
    message =  message - B00000101;}
else
   {servo5.write(180); }


if (message == B00000100){
    servo4.write(90);
    message =  message - B00000100;}
else
   {servo4.write(180); }

   
if (message == B00000011){
    servo3.write(90);
    message =  message - B00000011;}
else
   {servo3.write(180); }
   
 
if (message == B00000010){
    servo2.write(90);
    message =  message - B00000010;}
else
   {servo2.write(180); }
   
  }
 
if (message == B00000001){
    servo1.write(90);
    }
else
   {servo1.write(180); }
   
 message = B00000000;
}

LgdMicka

Avec ce programme aucuns servos ne s'ouvre...

dfgh

Code: [Select]
/*****************************************************************
Code du récepteur. 
Allume ou éteint des LEDs à  partir des informations
reçues de l'émetteur.
 
 4 avril 2012.
 
 electroniqueamateur.blogspot.com
******************************************************************/

// les librairies nécessaires au fonctionnement du nRF24L01
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
Servo servo10;
Servo servo11;
Servo servo12;

byte message;
// La sortie où est branchée la première LED (les autres sont adjacentes)


void setup(){

  Mirf.cePin = 47; // CE branché sur 8
  Mirf.csnPin = 49; // CSN branché sur 9
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.channel = 65;
  Mirf.payload = sizeof(byte); // taille de ce qu'on va recevoir
  Mirf.config();

  Mirf.setTADDR((byte *)"nrf01"); // on baptise les deux modules
  Mirf.setRADDR((byte *)"nrf02");

  // configuration des sorties (Servo)
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
 
  servo1.attach(2);
  servo2.attach(3);
  servo3.attach(4);
  servo4.attach(5);
  servo5.attach(6);
  servo6.attach(7);
  servo7.attach(8);
  servo8.attach(9);
  servo9.attach(10);
  servo10.attach(11);
  servo11.attach(12);
  servo12.attach(13);
}

void loop(){


  byte data[Mirf.payload]; // data va contenir les donnéees reçues
 
  if(!Mirf.isSending() && Mirf.dataReady()){

    Mirf.getData(data); // réception du message

    message = data[0];

    // on fait bouger les servos


if (message == B00001100){
    servo12.write(90);
   }
else
   {servo12.write(180); }

if (message == B00001011){
    servo11.write(90);
    }
else
   {servo11.write(180); }
   
if (message == B00001010){
    servo10.write(90);
    }
else
   {servo10.write(180); }

if (message == B00001001){
    servo9.write(90);
    }
else
   {servo9.write(180); }

if (message == B00001000){
    servo8.write(90);
    }
else
   {servo8.write(180); }

if (message == B00000111){
    servo7.write(90);
    }
else
   {servo7.write(180); }

if (message == B00000110){
    servo6.write(90);
    }
else
   {servo6.write(180); }
   
if (message == B00000101){
    servo5.write(90);
    }
else
   {servo5.write(180); }


if (message == B00000100){
    servo4.write(90);
    }
else
   {servo4.write(180); }

   
if (message == B00000011){
    servo3.write(90);
    }
else
   {servo3.write(180); }
   
 
if (message == B00000010){
    servo2.write(90);
    }
else
   {servo2.write(180); }
   
  }
 
if (message == B00000001){
    servo1.write(90);
    }
else
   {servo1.write(180); }
   
 message = B00000000;
}

LgdMicka

Toujours aucun mouvement des servo...

Sinon le mouvement j'appuie sur le bouton 1, le servo 1 s'ouvre, je relâche le bouton 1, le servo 1 se referme me semble plus simple à réaliser... cependant je ne trouve pas de code à envoyer qui soit reconnu...

Ca parait être le code le plus simple du monde mais je n'y arrive pas...

Emmetteur:

J'appuie sur le bouton 1, le message "1" s'envoie
J'appuie sur le bouton 2, le message "2" s'envoie
Ainsi de suite jusqu'au bouton 12

Récepteur:

Si le message est "1", le servo 1 s'ouvre, sinon il reste à son état initial
Si le message est "2", le servo 2 s'ouvre, sinon il reste à son état initial
Ainsi de suite jusqu'au servo 12

Je n'arrive pas à traduire ça en language Arduino.

Go Up