transmission de données via RDF2173X

bonjour a tous
j’ai besoin de faire un système de commande a distance de deux servo ( pour bouger une caméra sur un quadrirotor )
le soucis est que je ne peux pas utiliser ma télécommande RC ( ca serais trop simple ) pour les commander car
le pilotage doit ce faire a distance de la RC
j’ai des modules RDF2173X qui je pense peuvent convenir
je pense utiliser un code tout bête ( voir en bas )
il me permet de faire bouger le servo suivant la position d’un potar ( deux pour être précis monter sur un joystick )
seulement au niveau de la transmission des données c’est la ou je bloque
je ne sais pas du tout comment utiliser ces modules
la doc constructeur ( en pièces jointes )
j’ai plusieurs modes ( du modules ) a ma disposition
un ou tx rx sont utilisé
et d’autre ou je peux me servir de rx tx et in1 comme boutons classiques
avez vous une idée de ce qui serais le mieux ?
et un lien expliquant la transmission via tx rx ?
merci a vous

PS: mon code de base qui fonctionne quand le servo et le potar sont branché sur le meme arduino

// --- Programme Arduino ---
// par X. HINAULT - 02/2010 
// www.mon-club-elec.fr 

// --- Que fait ce programme ? ---
/* Positionne un servomoteur à l'aide d'une résistance variable (potentiomètre) 10K*/

// --- Fonctionnalités utilisées ---
// Utilise la conversion analogique numérique 10bits sur les voies analogiques  analog 0, 
// Utilise les servomoteurs 

// --- Circuit à réaliser ---

// Connecter  sur la broche 2 (configurée en sortie)  la broche de commande d'un servomoteur. 
// Broche Analog 0 (=broche 14) en entrée Analogique  : 
// connecter  la sortie d'une résistance variable connectée entre 0V et 5V.

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include <Servo.h> // librairie pour servomoteur

// --- Déclaration des constantes ---
const int POS_MIN=550; // largeur impulsion pour position 0° servomoteur 
                       // POS_MIN=550 pour futaba S3003 
const int POS_MAX=2330; // largeur impulsion pour position 180° servomoteur
						 // POS_MAS=2330 pour futaba s3003

int angle_servo=0; // variable pour angle du servomoteur
int angle_servo2=0;


// --- constantes des broches ---

const int broche_servo=2; //declaration constante de broche 
const int Voie_0=0; //declaration constante de broche analogique
const int broche_servo2=3; //declaration constante de broche 
const int Voie_1=1; //declaration constante de broche analogique


// --- Déclaration des variables globales ---
int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
int mesure_brute2=0;// Variable pour acquisition résultat brut de conversion analogique numérique

float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur
Servo mon_servo2;  // servo 2


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

mon_servo.attach(broche_servo, POS_MIN, POS_MAX);  
mon_servo2.attach(broche_servo2, POS_MIN, POS_MAX);

// attache l'objet servo à la broche de commande du servomoteur

// ------- Broches en sortie -------  

pinMode(broche_servo, OUTPUT); //met la broche en sortie 
pinMode(broche_servo2, OUTPUT); //met la broche en sortie 


// ------- Broches en entrée -------  


// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------  


} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal --- 

// acquisition conversion analogique numérique (100µs env.) 
//sur broche analogique indiquée - résultat 10bits (0-1023) 
mesure_brute=analogRead(Voie_0); 
mesure_brute2=analogRead(Voie_1); 


angle_servo=map(mesure_brute,0,1023,0,180); 
angle_servo2=map(mesure_brute2,0,1023,0,180); 

// convertit la valeur mesurée comprise entre 0 et 1023 en un angle entre 0 et 180

// map(value, fromLow, fromHigh, toLow, toHigh); // permet changement d'échelle simplifié

mon_servo.write(angle_servo); // positionne le servo à l'angle voulu

delay (10); // pause entre 2 mesures et modif position servomoteur

mon_servo2.write(angle_servo2); // positionne le servo à l'angle voulu

delay (10); // pause entre 2 mesures et modif position servomoteur

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---

RFDP8.RF.Modules.Manual.pdf (4 MB)

Bonsoir

Le mode 2 définit dans la table du bas de la page 2 devrait convenir pour établir une liaison entre 2 arduino à 9600 baud.

Tu configures broches de mode comme indiqué, tu connectes RX du module à TX de l'Arduino et TX à RX. Et tes 2 Nonos devraient pouvoir parler entre elles. SI tu utilises déjà la liaison série de l'Arduino pour autre chose (ne serais que du debug sur PC), utilise SoftSerial pour créer une autre liaison série virtuelle sur d'autres broches.

Il faudra définir un protocole entre les 2 cartes un peu sécurisé car en radio il y a le risque de perdre des données. Donc prévoir de pouvoir se resynchroniser, sinon le servo 2 va recevoir la consigne 1 et vice-versa au 1er octet perdu.

ok pour le mode 2 as tu un lien expliquant comment faire la resynchro et la liaison série ? merci

Si tu fais le map() sur la carte de départ, tu n’as que des angles à transferer. C’est à dire des valeurs entre 0 et 180.
Utilise des valeurs différentes pour synchroniser.

Par exemple 250 comme marqueur de début et 251 comme marqueur de fin.

Tu envois par :

Serial.write( 250 );
Serial.write( angle_servo );
Serial.write( angle_servo2 );
Serial.write( 251 );

Coté réception tu dois recevoir 4 octets commençant par un 251.
Quelque chose comme cela devrait convenir :

loop()
{
  if ( Serial.available() )
  {
    byte c = Serial.read();
    if ( c == 250 )
    {
      while ( Serial.available() < 3 )
        ;
      angle1 = Serial.read();
      angle2 = Serial.read();
      c = Serial.read();
      if ( c == 251 )
      {
        //... c'est bon on peut utiliser les valeurs reçues
      }
    }
  }
}

impec merci a toi
j’avoue ne pas connaitre du tout les liaisons sans fils donc je vais essayer de faire un code qui marche

Commence par tester sur table avec des fils entre tes 2 arduinos pour mettre au point la base. N'oublie pas que pour autant, ce test sera dans des conditions parfaites sans pertes de données.

Ensuite branche les modules, toujours sur table, puis écarte de plus en plus.

merci a toi je teste ca le temps de coder et on véra si ca marche