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:
// 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 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?