Arduinos et liaison RF

Les radios commandes, déclencheurs divers et variés. Les circuits électroniques et autres bidouillages.

Arduinos et liaison RF

Messagede J-C le Jeu 08 Décembre 2011, 18:57

Je voulais savoir si quelqu'un avait testé un code faisant communiquer entre eux 2 arduinos via une liaison série RF.
Je viens de ressortir mon matos de test Arduino, mais 2 modules APC220 et d'autres modules RF. J'ai bien envie de tester la librairie softserial pour éviter les conflits (de canards) surtout si je veux piloter des servos.
Enfin, bon, si vous avez des bouts code, je suis preneur.

A+
JC
Avatar de l’utilisateur
J-C
Plus de 1000 messages
 
Messages: 1770
Inscription: Jeu 15 Mai 2008, 9:14
Localisation: Sud des Landes

Re: Arduinos et liaison RF

Messagede rdd le Ven 09 Décembre 2011, 7:12

PaZencore de mon côté, j'ai terminé de brancher/souder/implanter la télécommande (carte Roméo + apc220 + boussole + lcd 2x16 + Rx vidéo 2.4g + viseur camescope), et je l'ai codé à 80% (potars, boutons, diodes, lcd, etc ...).

Il me reste à assembler la partie nacelle (carte UNO + apc220 + boussole + Tx vidéo 2.4g) et je pourrais commencer les tests de communication en réél (pour l'instant l'apc220 est sur le Pc qui joue la nacelle).

Pour l'instant j'étais parti sur tes derniers tests, à savoir la librairie Serial 'classique' .... mais je vais suivre ce post avec grand intérêt :wink:
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 7:15

Pour ma part, j'ai utilisé la librairie NewSoftSerial (http://arduiniana.org/libraries/newsoftserial/) pour les raisons que j'avais expliqué là: viewtopic.php?f=6&t=3191&st=0&sk=t&sd=a&start=20#p31196 (le code est un peu plus bas)

Le problème de conflit entre les librairies Servo et NewSoftSerial est quasiment invisible pour moi à l'usage puisque je "detach" les servos après chaque mouvement (à l'origine pour diminuer la consommation).
J'ai essayé de voir (trop récemment) d'où pouvait venir ce conflit. A vue de nez, les appels de la fonction "cli()" dans NewSoftSerial.cpp ne peuvent pas aider au bon fonctionnement de Servo (puisque ça coupe sauvagement les interruptions :( ). Mais bon, je n'ai pas assez de recul pour affirmer que c'est mieux et/ou que ça ne crée pas d'autres problèmes.

Sinon, à noter quand même, NewSoftSerial a l'énorme avantage de disposer de la fonction available.... rien n'empêche donc de développer avec NewSofSerial puis de repasser sur le vrai UART du microcontroleur (avec la fonction Serial) dès que tout semble ok (aux éventuels problèmes de conflits près) et qu'on est prêt à envoyer tout ça en l'air.
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede rdd le Ven 09 Décembre 2011, 7:23

Deltakap a écrit:Le problème de conflit entre les librairies Servo et NewSoftSerial est quasiment invisible pour moi à l'usage puisque je "detach" les servos après chaque mouvement (à l'origine pour diminuer la consommation).


Ça c'est une bonne nouvelle ! C'est quand même plus pratique pour les phases de développement d'avoir l'APC sur un autre 'port' que l'UART où est branché l'USB ...

Deltakap a écrit:Sinon, à noter quand même, NewSoftSerial a l'énorme avantage de disposer de la fonction available.... rien n'empêche donc de développer avec NewSofSerial puis de repasser sur le vrai UART du microcontroleur (avec la fonction Serial) dès que tout semble ok (aux éventuels problèmes de conflits près) et qu'on est prêt à envoyer tout ça en l'air.


Est-ce qu'à votre connaissance il y a des différences sensibles entre les deux modes de fonctionnement UART ou SoftSerial ? Par exemple en terme de performances ?

Pour les cartes qui disposent d'un port "APC220/Bluetooth" (la Romeo, le shield IO de la Uno ....) la question ne se pose pas il reste tout de même plus naturel d'utiliser la lib Serial... mais quand l'APC est raccordée fil à fil, ça peut être pratique d'utiliser un autre couple d'entrée digitales.
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 7:54

rdd a écrit:Est-ce qu'à votre connaissance il y a des différences sensibles entre les deux modes de fonctionnement UART ou SoftSerial ? Par exemple en terme de performances ?

Il semble que NewSoftSerial ait des limitations avec l'utilisation de multiples instances (mais bon, je n'en utilise qu'une alors je n'ai pas cherché à comprendre où elles sont ;) et avec des vitesses de 300 et 1200 bauds (L'APC fonctionne de 2400 à 9600... donc pas grave non plus)
Je n'ai pas encore testé (suffisamment) la librairie SoftwareSerial, celle des dernières version d'Arduino et héritée de NewSoftSerial. Une tentative de compilation sur Arduino 1.0 m'indiquait hier un problème avec la fonction available (ce qui serait extrèmement facheux... mais bon, c'est trop frais pour affirmer quoi que ce soit, je me suis peut être planté ailleurs :mrgreen: )

rdd a écrit:Pour les cartes qui disposent d'un port "APC220/Bluetooth" (la Romeo, le shield IO de la Uno ....) la question ne se pose pas il reste tout de même plus naturel d'utiliser la lib Serial

Oui, dans ce cas, aucun intérêt de s'embêter avec ces gestions soft de port série.... mais sur mon arduino nano, il n'y a qu'un UART... coincé donc, sauf de démonter à chaque fois l'APC pour reprogrammer l'arduino et c'est vraiment pénible.
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede rdd le Ven 09 Décembre 2011, 7:58

Deltakap a écrit:
rdd a écrit:Pour les cartes qui disposent d'un port "APC220/Bluetooth" (la Romeo, le shield IO de la Uno ....) la question ne se pose pas il reste tout de même plus naturel d'utiliser la lib Serial

Oui, dans ce cas, aucun intérêt de s'embêter avec ces gestions soft de port série.... mais sur mon arduino nano, il n'y a qu'un UART... coincé donc, sauf de démonter à chaque fois l'APC pour reprogrammer l'arduino et c'est vraiment pénible.


Sur la romeo c'est pareil, il n'y a qu'un uart, le port pour l'apc220 ne lui est pas dédié, il est cablé sur D0/D1. Mais ce port est pratique quand même d'abord pour l'implantation c'est 'plug and play' et pour le dev, je retire tout simplement l'apc quand je branche l'usb.
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 8:13

rdd a écrit:et pour le dev, je retire tout simplement l'apc quand je branche l'usb.

C'est clair, dans notre cas, ces librairies séries par soft n'ont d'intérêt que pour éviter de retirer l'APC pour libérer le port usb à chaque fois qu'on veut modifier le programme du microcontroleur (c'est juste un peu plus confortable pendant la phase de développement).
Après, c'est pas trop la peine de se prendre le chou (enfin si, j'aime bien :mrgreen: ) si des conflits de librairies empêchent de développer le programme.... au pire, il suffit bien sûr d'enlever et de replacer l'APC.
En fonctionnement normal, un seul port suffit et celui de l'UART fonctionne parfaitement et sans aucun conflit ;)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 8:58

J-C a écrit:Enfin, bon, si vous avez des bouts code, je suis preneur.

On peut par exemple décider de tout coder sur un seul octet (byte). C'est ce que j'ai fait jusque là, l'inconvénient étant un codage de tilt sur 64 positions seulement, ce qui fait un déplacement pas très "smooth", mais largement suffisant en pratique.

Le principe est d'envoyer quelque chose genre "Serial.print(byte1,BYTE);" coté émetteur et d'utiliser dans le loop de la nacelle un bout de programme du style:
Code: Tout sélectionner
if (Serial.available()) {
    inByte = Serial.read();
   // action en fonction du inByte............
}

(Serial si UART, mySerial par exemple si serial soft)


Une autre possibilité est d'envoyer une chaine de caractères (c'est ce que j'essaie de faire en ce moment ;).
Même principe coté émetteur, sauf qu'on envoie des caractères avec un Serial.Println.
Coté récepteur, ce code semble être une bonne base pour commencer:
Code: Tout sélectionner
// zoomkat 10-4-10 serial servo test
// type servo position 0 to 180 in serial monitor
// for writeMicroseconds, use a value like 1500
// for IDE 0019 and later
// Powering a servo from the arduino usually DOES NOT WORK.

String readString;
#include <Servo.h>
Servo myservo;  // create servo object to control a servo

void setup() {
  Serial.begin(9600);
  myservo.attach(7);  //the pin for the servo control
  Serial.println("servo-test-21"); // so I can keep track of what is loaded
}

void loop() {

  while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
   char c = Serial.read();  //gets one byte from serial buffer
   readString += c; //makes the string readString
    }
  }

  if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured string
    int n;
    char carray[6]; //converting string to number
    readString.toCharArray(carray, sizeof(carray));
    n = atoi(carray);
    myservo.writeMicroseconds(n); // for microseconds
    //myservo.write(n); //for degees 0-180
    readString="";
  }
}


Le signal envoyé sera une chaine comme "1:987" où 1 est le device (par exemple 1 pour le tilt, 2 le pan, 3 l'apn, 4 le zoom, 5 l'emetteur vidéo, 6 le canal vidéo, etc, etc.... voui, ça reste ambitieux :mrgreen: ) et 987 la valeur à appliquer au device (ici avec une grande précision :mrgreen: )

Bon, c'est juste pour donner une idée, je suis en plein dedans. A affiner et à suivre donc.... ;)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede rdd le Ven 09 Décembre 2011, 9:04

Deltakap a écrit:On peut par exemple décider de tout coder sur un seul octet (byte). C'est ce que j'ai fait jusque là, l'inconvénient étant un codage de tilt sur 64 positions seulement, ce qui fait un déplacement pas très "smooth", mais largement suffisant en pratique.


Pourquoi 64 ? Un BYTE c'est 0-254 non ? le tilt, s'il représente un angle, se satisfait de cette plage non ? C'est plus problématique pour le PAN qui pourrait aller de 0 à 360° ... et qu'il faudrait recoder sur 0-254 si on veut rester sur un BYTE.

Deltakap a écrit:Le signal envoyé sera une chaine comme "1:987" où 1 est le device (par exemple 1 pour le tilt, 2 le pan, 3 l'apn, 4 le zoom, 5 l'emetteur vidéo, 6 le canal vidéo, etc, etc.... voui, ça reste ambitieux :mrgreen: ) et 987 la valeur à appliquer au device (ici avec une grande précision :mrgreen: )


Pareil ... je suis parti dans de l'ambitieux : changement de fréquence de l'APC en plein vol, changement de canal vidéo en plein vol, étalonnage des boussoles sans le Pc, 12 nacelles programmables, 12 programmes d'autokap plus un 'programme manuel', etc ... mais vu le temps qu'il fait, ça occupe le bonhomme :lol:

Pour l'instant je partais sur du deux lignes : Commande <ret> valeur <ret> mais ton idée de séparateur est pas mal, ça donnerait CMD:VALEUR ...
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 9:21

rdd a écrit:Pourquoi 64 ?

Parce que je bouffe 2 bits pour coder le "device", pour lui expliquer que la valeur (sur les 6 bits qui restent) est à envoyer au tilt, au pan ou à l'apn :?

rdd a écrit:C'est plus problématique pour le PAN qui pourrait aller de 0 à 360° ... et qu'il faudrait recoder sur 0-254 si on veut rester sur un BYTE.

En fait, pour le pan, j'envoie juste les 3 commandes "tourne dans un sens", "tourne dans l'autre sens" et "arrete toi" (avec trois vitesses dans chaque sens). Une tempo arrête la rotation du pan si par malheur la liaison hf est perdue en cours de route
Code: Tout sélectionner
if (millis()-timer > 5000) {pan_servo.detach();
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 9:28

rdd a écrit:changement de fréquence de l'APC en plein vol


Pour le plaisir, voici le principe ;) (c'était juste un test pour voir comment ça marche)
Un fil à souder entre une pin de l'arduino (ici la 4, à mettre en output high en fonctionnement normal, hors configuration) et celle qui va bien sur l'APC (pin 7) (http://www.zartronic.fr/doc/E2/E2N1P142 ... n_v100.pdf)

et un bout de code de ce style là:

Code: Tout sélectionner
#include <NewSoftSerial.h>
NewSoftSerial mySerial(3, 2);

const int SetAPCPin =  4;

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(SetAPCPin, OUTPUT);
 
  //digitalWrite(SetAPCPin, HIGH);//normal operation
  digitalWrite(SetAPCPin, LOW); //set parameters

}



void loop()
{
  //mySerial.println("RD"); // lecture de la config réelle de l'APC
  mySerial.println("WR 475000 1 9 3 0"); //écriture de la config dans l'APC
 
  while (mySerial.available())
  {
    char cmdChar = mySerial.read ();
    Serial.print(cmdChar); // affiche la réponse de l'APC
  }
  delay(2000);
}
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede rdd le Ven 09 Décembre 2011, 9:42

C'est exactement ce que j'ai fait (en copiant sur toi :oops: ) : pin 7 de l'APC soudé sur D4 en dur au dos de la carte Romeo. Pour le code, je rajoute un test (envoi de "RD" à l'APC et analyse de sa réponse) pour vérifier qu'il a bien pris le paramètre. Maintenant il va falloir coder le fait que la télécommande demande à la nacelle de changer la fréquence de son APC ... la télécommande sera donc dans le noir pendant un lapse de temps :?

int set_APCFreq(int freq) {
  int inc_byte = 0;
  String Response;
  String Setting;
  digitalWrite(APC_Set_Pin, HIGH);
  delay(50);
  Response= "";
  Setting = "WR ";
  Setting += String(freq);
  Setting += "000 3 9 0 0";
  digitalWrite(APC_Set_Pin, LOW);
  delay(5);
  Serial.println(Setting);
  delay(200);
  digitalWrite(APC_Set_Pin, HIGH);
  delay(50);
  digitalWrite(APC_Set_Pin, LOW);
  delay(5);
  Serial.println("RD");
  delay(200);
  while (Serial.available() > 0) {
    inc_byte = Serial.read();
    Response += String(char(inc_byte));
  }
  digitalWrite(APC_Set_Pin, HIGH);
  Setting = "PARA ";
  Setting += String(freq);
  Setting += "000 3 9 0 0";
  if (Setting!=Response) { return 0; } else { return 1;}
}

Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 10:09

rdd a écrit:C'est exactement ce que j'ai fait (en copiant sur toi :oops: )

Pas de :oops: à avoir ;), si je ne voulais pas que ce soit utilisé, je garderais tout pour moi :D
Au contraire, ça fait plaisir que ça serve à quelque chose !

Un truc qui serait envisageable avec cette possibilité de reconfiguration de l'APC à la volée, c'est de faire un peu comme les emetteurs/recepteurs radiocommande 2.4Ghz qui n'utilisent plus de quartz comme leurs ancètres (pour que tout le monde ne pilote pas son avion RC sur la même fréquence) mais une recherche automatique des canaux libres à l'allumage, une sorte de broadcast du réseau, pour que tout le monde ne se retrouve pas sur le même canal de transmission.

Une autre solution simple serait de démarrer un dialogue emetteur/nacelle sur une certaine fréquence (à déterminer), que la nacelle par exemple choisisse au pif une autre fréquence, envoie cette info à l'emetteur et que les deux se retrouvent sur cette nouvelle fréquence commune. En cas de pas de bol et de conflit avec un autre participant, il suffirait que le nouvel arrivant coupe son émetteur et sa nacelle pour se réattribuer une nouvelle fréquence de fonctionnement.

Bon, c'est pas indispensable, mais pourquoi pas quand on va jouer à plusieurs ;) Et puis là, au niveau définition de protocole, il y a de quoi s'amuser :)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede rdd le Ven 09 Décembre 2011, 14:25

arf ... la lib NewSoftSerial n'est pas compatible Arduino 1.0 :evil: :evil: Obligé de repasser sur Arduino 023 pour le code de la nacelle alors que celui de la télécommande est en 1.0 :? si avec ça j'arrive au bout :roll:
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 14:46

rdd a écrit:arf ... la lib NewSoftSerial n'est pas compatible Arduino 1.0 :evil: :evil: Obligé de repasser sur Arduino 023


Je viens de m'apercevoir aussi de ça tout à l'heure.... heureusement, la librairie SoftwareSerial de l'aduino 1.0 fonctionne sans changer le code déjà existant:
il y a juste à remplacer:
#include <NewSoftSerial.h>
NewSoftSerial mySerial(3, 2);

par
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2);

et ça fonctionne pareil qu'avant ;)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede J-C le Ven 09 Décembre 2011, 17:55

Bon je tape l'incruste dans votre discussion.

Perso, le codage d'une instruction sur un octet ne me dérangerait pas : Haut Bas Droite Gauche Clic (et à la limite on double tout pour avoir rapide/lent et une fonction zoom ou autre en plus du clic).
Au départ j'avais une nacelle avec 2 servos modifiés 360°... Alors, je ne suis pas habitué à la proportionnalité sur le Tilt.
L'inconvénient de ma proposition est la fréquence d'envoi des instructions. Car si on reste trop longtemps sur haut, on arrive vite en butée. Ceci étant, je pensais brider la fréquence d'envoi pour les direction et utiliser une interruption pour envoyer le clic sans subir le bridage . Et c'est l'arduino d'envoi qui est "bridé" le récepteur lui est "à l'écoute" en réactivité maximum.

A+
JC
Avatar de l’utilisateur
J-C
Plus de 1000 messages
 
Messages: 1770
Inscription: Jeu 15 Mai 2008, 9:14
Localisation: Sud des Landes

Re: Arduinos et liaison RF

Messagede Deltakap le Ven 09 Décembre 2011, 18:09

J-C a écrit:Bon je tape l'incruste dans votre discussion.

Bah, c'est ton post ;)


J-C a écrit:Car si on reste trop longtemps sur haut, on arrive vite en butée.

En butée? tu veux dire avec trop de signaux envoyés? (et un remplissage du buffer de réception?)

Si ça n'est que ça, c'est facile à régler: il suffit de transmettre uniquement les signaux qui changent (avec le risque, il est vrai, de ne pas pouvoir arrêter un servo (sauf après une éventuelle tempo) en cas de perte de signal hf.... pas grave pour un pan 360°, plus embêtant pour un tilt avec servo 360° (sauf si il a des butées avec interrupteurs)

Sinon, j'ai pas compris ta phrase ;)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede J-C le Ven 09 Décembre 2011, 19:58

En fait si tu restes bloqué sur le bouton "haut", à chaque cycle, tu envoies l'instruction et à chaque cycle, tu incrémentes ton déplacement, bilan ça bouge vite. Ou alors, comme tu l'as suggéré, on remplit le buffer et bilan dès qu'on lâche le bouton, ça continue de bouger.

L'idée est de "brider" l'envoi des commande de direction et de pouvoir intercaler à la demande la commande de clic. Comme l'arduino récepteur est "aux aguets" il lit tout ce qui arrive et finalement à le temps de vider le buffer. La réactivité devrait être suffisante pour déclencher la photo voulue.

A+
JC
Avatar de l’utilisateur
J-C
Plus de 1000 messages
 
Messages: 1770
Inscription: Jeu 15 Mai 2008, 9:14
Localisation: Sud des Landes

Re: Arduinos et liaison RF

Messagede Deltakap le Sam 10 Décembre 2011, 11:25

J-C a écrit:En fait si tu restes bloqué sur le bouton "haut", à chaque cycle, tu envoies l'instruction et à chaque cycle, tu incrémentes ton déplacement, bilan ça bouge vite.

As-tu le bout de code qui fait ça?


Rien à voir, mais la nouvelle librairie SerialSoftware d'arduino 1.0 est toujours incompatible avec Servo (misère!!!)
Tout comme NewSoftSerial, elle fonctionne parfaitement avec la vieille librairie Servo de l'Arduino 0016 (en remplaçant quand même wiring.h par arduino.h dans servo.cpp pour être compatible arduino 1.0.... bonjour la bidouille... et ça ne supporte bien sûr que 2 servos en pin 9 et 10 :evil: )


Pour info, un des changements d'arduino 1.0:
Migrating Libraries
If your sketch includes any libraries that have not been designed for 1.0 then you will need to change the library if it uses any of the old header files that have been replaced with the new Arduino.h file. If you include any of these libraries, change:

#include "wiring.h"
#include "WProgram.h"
#include "WConstants.h"
#include "pins_arduino.h"
To:
#include "Arduino.h"

source: http://blog.makezine.com/archive/2011/1 ... -know.html
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede Deltakap le Mer 14 Décembre 2011, 16:44

J-C a écrit:Je voulais savoir si quelqu'un avait testé un code faisant communiquer entre eux 2 arduinos via une liaison série RF.
Je viens de ressortir mon matos de test Arduino, mais 2 modules APC220 et d'autres modules RF. J'ai bien envie de tester la librairie softserial pour éviter les conflits (de canards) surtout si je veux piloter des servos.
Enfin, bon, si vous avez des bouts code, je suis preneur.

Pour faire communiquer ensemble mes deux arduinos par radio, j'a opté pour les modems APC220
(http://www.zartronic.fr/doc/E2/E2N1P142 ... n_v100.pdf)

L'APC220 est un module de communication half-duplex sur la bande des 433Mhz.
Avantages:
- pas trop cher (on trouve sur la bay deux APC avec antennes et un adaptateur usb pour 35€)
- pas d'interférences avec la vidéo en 2.4Ghz
- portée suffisante pour nos besoins (donné pour 1000m à 2400 bauds, testé à 250m à 9600bds... je ne pouvais pas aller plus loin :))
- alimentation de 3.5 à 5.5V
- paramétrable (vitesse de transfert HF et UART, fréquence (parmi plus de 100 canaux), puissance d'émission, parité)
- certaines cartes d’extensions arduino permettent de le connecter directement sans souder quoi que soit.
Inconvénients....
- c'est du half-duplex, un APC220 est tour à tour émetteur ou récepteur, pas les deux en même temps
- Il semble qu'il en existe plusieurs modèles (avec des puissances mais surtout des gammes de fréquences différentes.... faut absolument les acheter par deux au même moment et au même fournisseur... bon, en même temps, je ne sais pas si ils se vendent seul :mrgreen: )
- relative lenteur (transferts à 9600 bauds maxi, soit environ 1000 caractères/s, mais surtout un temps de passage d'émetteur à récepteur "très" important)


Ce dernier point est très important dans le choix du dialogue entre radiocommande et nacelle !!! (et donc du bout de code à développer)
Si le choix d'un dialogue en ASCII (chaines de caractères classiques) avec acquittement de commande parait le plus simple et naturel, des heures de tests :evil:, montrent que c'est inutilisable pour avoir une commande proportionnelle sur les servos :(
Un cycle "envoi d'une commande et réception de l'acquittement de cette commande" prend près d'1/2 seconde !!!! 480ms en fait, on est très loin du rafraîchissement toutes les 20ms d'un système de radiocommande classique !
La seule solution est donc d'envoyer les commandes de servos sans acquittement en retour.... comme une radiocommande classique, et de réserver l'acquitement pour des commandes qui sont moins exigeantes en terme de réactivité (changement du paramétrage de l'APC, etc..)

A suivre donc.... ;)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede Deltakap le Mer 14 Décembre 2011, 18:15

(la suite...)

Actuellement, les sketches utilisés sur mon émetteur et sur ma nacelle ne permettent que de commander les servos et le déclenchement de l'apn (et c'était suffisant dans un premier temps), et ce malgré l'utilisation des librairies Servo et SoftwareSerial (NewSoftSerial à l'époque) et leur incompatibilité (c'est un coup de bol, j'ai pas fait exprès :mrgreen: ). Le "dialogue" était donc unidirectionnel (radiocommande vers nacelle évidemment) et codé sur un seul octet (ou "caractère") pour faire au plus rapide et au plus simple.

Je n'ai rien prévu pour envoyer une commande plus évoluée genre paramétrage de l'APC.... faut tout reprendre le code donc ;)

J'ai donc maintenant deux type de messages à transmettre:
- un message sans acquittement pour piloter les servos (pour la rapidité)
- un message avec acquittement pour des ordres plus "complexes" comme par exemple une chaine de caractère du type "WR 475000 1 9 3 0" pour changer le paramétrage de l'APC.
Il faudra donc distinguer ces deux types de messages.

A vue de nez, les chaines de caractères seront de type ASCII non étendu (0-127). Ça couvre les caractères de controle ASCII, les chiffres, les minuscules et les majuscules. (http://www.table-ascii.com/ ou http://fr.wikipedia.org/wiki/American_S ... nterchange)
Le code ASCII prévoit des caractères de controle, autant les utiliser. Pour envoyer un message de type chaine de caractère, on pourrait transmettre (par exemple) :
(SOH)(STX)blabla(ETX)(EOT)(CR)

Tous les codes ASCII non étendu sont codés sur 7 bits (0-127). Pour transmettre un "message" vers les servos, il suffirait donc de remplacer le premier caractère (SOH) par un caractère de valeur > 127 (entre 128 et 255) suivi des valeurs à donner aux servos...

C'est chi*nt à lire, hein :mrgreen:

Et c'est encore à suivre :? ....
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede Deltakap le Mer 14 Décembre 2011, 18:26

(suite....)

Une parenthèse....
En ce qui concerne l'incompatibilité des Librairies Servo et SoftwareSerial (problème d'interruptions) et sauf de les modifier, pas le choix pour l'instant que d'utiliser Serial et de tout débrancher à chaque changement de sketch (j'ai réessayé, c'est vraiment trop pénible) OU d'utiliser SoftwareSerial et une vieille librairie servo (compatible mais avec seulement 2 servo pilotables).
Pendant cette nouvelle phase de développement, c'est cette deuxième solution que je préfère.... je verrai plus tard si je reviens à la bonne librairie Servo et la librairie Serial (celle de l'UART)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede KickMe le Mer 14 Décembre 2011, 18:33

Merci Gilbert pour tous ces retours ! Tout ça me sera très utile quand je m'y mettrai vraiment.

Concernant le half-duplex, ça ne concerne que les aquittements ? Plus concrètement est-ce qu'on peut continuer à envoyer des commandes au servo (sans aquittement) pendant que la nacelle envoie des infos (altitude par capteur barométrique) ?
Avatar de l’utilisateur
KickMe
Plus de 100 messages
 
Messages: 125
Inscription: Mar 30 Juin 2009, 12:31
Localisation: Paris/Normandie

Re: Arduinos et liaison RF

Messagede Deltakap le Mer 14 Décembre 2011, 19:03

KickMe a écrit:Concernant le half-duplex, ça ne concerne que les aquittements ?

Non hélas, c'est le fonctionnement de l'APC, il est émetteur ou récepteur (il passe en émission si on fait un print (ou write) sur son port série. Dès que c'est envoyé, il repasse en réception....mais ces changements d'état ne sont pas instantanés, ça prend à peu près 200ms).

KickMe a écrit:Plus concrètement est-ce qu'on peut continuer à envoyer des commandes au servo (sans aquittement) pendant que la nacelle envoie des infos (altitude par capteur barométrique) ?

En même temps, non.... mais on va tricher ;)
En fait, on ne va envoyer les commandes aux servos que si il y a de nouvelles valeurs à envoyer (que si on touche aux manettes. Si il n'y a rien de neuf, l'APC au sol repasse en réception et est donc capable de recevoir des infos de la nacelle. Donc, sauf de s'énerver sur les manettes, on devrait pouvoir rafraichir et afficher au sol les infos qui viennent du capteur.
Dans l'autre sens, les données d'altitude (message très court) ne seront probablement envoyées que toutes les 5 ou 10 secondes, voire plus.... L'éventuel "bloquage" des commandes des sticks sera statistiquement rare (et court). On devrait s'en sortir ;)
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede Deltakap le Mer 14 Décembre 2011, 19:30

(Suite...)

Comment distinguer les deux types de messages (texte ou servos) décrits plus haut (coté nacelle donc)?

Je pense partir sur cette base:

Code: Tout sélectionner
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

String command; // String input
char inByte; // Byte input

void setup(){
  mySerial.begin(9600);
}

void loop(){

  // Input serial information:
  if (mySerial.available() > 0){
     inByte = mySerial.read();
        command+=inByte;
  }

  // Process command when CR is entered: 
  if (inByte == 13) { // CR
    inByte = 0;
       
    if (command[0]== 1){//SOH
      //C'est une chaine de caractères.... agir en fonction
    }else{
      //C'est une commande de servo
    }
    command = "";
  }
}


Mouais, il y a encore du boulot :mrgreen:
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede rdd le Jeu 15 Décembre 2011, 8:58

Je suis admiratif de ta persévérance :shock:
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede hansel le Sam 31 Décembre 2011, 16:58

Bonjour a tous,

Est ce que un de vous a fait des tests de portée?
Dan mon cas la communication commence a se dégrader a partir de 50 m. :(
J'ai 2 Arduino's avec APC220 (9600Bd) (ou APC200, pas sur).

Bonne année!
Hans.
Avatar de l’utilisateur
hansel
Plus de 400 messages
 
Messages: 420
Inscription: Ven 07 Mai 2010, 16:58
Localisation: rotterdam,nl

Re: Arduinos et liaison RF

Messagede Deltakap le Sam 31 Décembre 2011, 17:57

hansel a écrit:Est ce que un de vous a fait des tests de portée?


Bonjour Hans,

J'ai testé mes APC220 "au sol" jusqu'à 250m à 9600bds. (je ne pouvais pas aller plus loin)

D'après le site d'Appcon technologies, l'APC220 est donné pour une portée de 600m, l'APC200 pour 200m (à 9600bds)
(et c'est curieux puisqu'ils ont tous les deux la possibilité d'émettre en 20mW et le récepteur à la même sensibilité !?)

L'implantation des composants est différente (ça doit permettre de les identifier? Sur les miens, il y a une inscription APC220)
- http://www.appcon.com.cn/en/product/220_pro.html
- http://www.appcon.com.cn/en/product/APC200A43_pro.html


A noter que les brochages de l'APC200 et du 220 sont différents mais compatibles pour les broches 1 à 5:
L'APC200 ne semble pas être paramétrable via son uart (pas de broche "setting parameters", pin 7 sur l'APC220)

APC200A-43
PIN Meanings Description
1 GND 0V
2 VCC 3.3V-5.5V
3 EN >1.6V or Don’t connect
4 RXD URAT Import
5 TXD URAT Export
6 B/RX RS485- or RS232 RX (Setup by RF-Magic)
7 A/TX RS485+ or RS232 TX (Setup by RF-Magic)

APC220-43
Pin NO. Pin Name Description
1 GND Grounding of Power Supply
2 VCC Power supply DC 3.5V-5.5V
3 EN Power enable,≧1.6V or empty,≦0.5Vsleep.
4 RXD URAT input, TTL
5 TXD URAT output, TTL
6 MUX The pin is expanded for other functions
7 SET Setting parameters, setting online supportted
8 NC Not connected
9 NC Not connected
Avatar de l’utilisateur
Deltakap
Plus de 1000 messages
 
Messages: 1432
Inscription: Lun 22 Septembre 2008, 11:35
Localisation: Du coté de Granville

Re: Arduinos et liaison RF

Messagede hansel le Sam 31 Décembre 2011, 19:09

Deltakap a écrit:D'après le site d'Appcon technologies, l'APC220 est donné pour une portée de 600m, l'APC200 pour 200m (à 9600bds)
(et c'est curieux puisqu'ils ont tous les deux la possibilité d'émettre en 20mW et le récepteur à la même sensibilité !?)

Merci pour tous ces details! J'ai un APC200 :-(
Je pense que je vai commander un paire de APC-220: mon projet est trop avancé pour l’abandonner.
Mon Pacaduino avance bien: le circuit imprimé avec l'Arduino, l'APC-2xx et le sero 'pan' fait office de picavet 8)

Edit: les APC-220 sont commandés :-)
Avatar de l’utilisateur
hansel
Plus de 400 messages
 
Messages: 420
Inscription: Ven 07 Mai 2010, 16:58
Localisation: rotterdam,nl

Re: Arduinos et liaison RF

Messagede hansel le Ven 06 Janvier 2012, 12:27

Petite mis a jour: j'ai fait qqs. essais a l’extérieur (mais au sol) en terrain dégagé.
100m sans problèmes, 250 m en jouant avec l'orientation de l'antenne...

A+, Hans.
Avatar de l’utilisateur
hansel
Plus de 400 messages
 
Messages: 420
Inscription: Ven 07 Mai 2010, 16:58
Localisation: rotterdam,nl

Re: Arduinos et liaison RF

Messagede rdd le Ven 06 Janvier 2012, 14:07

Merci Hans pour cette précision ... mais ... tu as fait les essais avec l'APC220 ou l'APC200 ? :?:
Avatar de l’utilisateur
rdd
Plus de 100 messages
 
Messages: 359
Inscription: Sam 27 Août 2011, 6:33
Localisation: Mezidon

Re: Arduinos et liaison RF

Messagede hansel le Sam 07 Janvier 2012, 11:41

rdd a écrit: ... mais ... tu as fait les essais avec l'APC220 ou l'APC200 ? :?:

Essais avec APC200, les APC220 sont en commande, mais pas encore arrivés.
PS: J’espère que la portée est encore meilleure quand une de antennes est a 80m d'altitude :wink:
PS2: en attendant je vais travailler un pu plus sur le logiciel 8)
Avatar de l’utilisateur
hansel
Plus de 400 messages
 
Messages: 420
Inscription: Ven 07 Mai 2010, 16:58
Localisation: rotterdam,nl

Re: Arduinos et liaison RF

Messagede KickMe le Mer 29 Août 2012, 10:40

Deltakap a écrit:
KickMe a écrit:Plus concrètement est-ce qu'on peut continuer à envoyer des commandes au servo (sans aquittement) pendant que la nacelle envoie des infos (altitude par capteur barométrique) ?

En même temps, non.... mais on va tricher ;)
En fait, on ne va envoyer les commandes aux servos que si il y a de nouvelles valeurs à envoyer (que si on touche aux manettes. Si il n'y a rien de neuf, l'APC au sol repasse en réception et est donc capable de recevoir des infos de la nacelle. Donc, sauf de s'énerver sur les manettes, on devrait pouvoir rafraichir et afficher au sol les infos qui viennent du capteur.
Dans l'autre sens, les données d'altitude (message très court) ne seront probablement envoyées que toutes les 5 ou 10 secondes, voire plus.... L'éventuel "bloquage" des commandes des sticks sera statistiquement rare (et court). On devrait s'en sortir ;)


Je déterre ce sujet parce que je coince un peu sur ce point. J'essaie de faire communiquer 2 arduino par APC220 : le premier au sol avec LCD, joystick (nunchuk de wii) ; le deuxième en l'air avec servos, capteur barométrique, peut-être gyro pour stabiliser.

Est-ce que vous avez des exemples de ce genre de code ? Comment faites-vous vos tests APC220, directement sur les 2 arduino ou avec un seul + un adaptateur USB ?
Avatar de l’utilisateur
KickMe
Plus de 100 messages
 
Messages: 125
Inscription: Mar 30 Juin 2009, 12:31
Localisation: Paris/Normandie

Re: Arduinos et liaison RF

Messagede hansel le Mer 29 Août 2012, 12:03

J'ai a peu près la même configuration (Arduino au sol avec lcd). La plus part du temps je teste avec les 2 systèmes, de temps en temps j'utilise un 3eme APC en mode écoute connecté au PC (ca permet d’écouter les dialogues entre les systèmes en cours de développement)

J'utilise (en gros) le protocole suivant:
- messages lisibles (faciles pour tester)
- quand on a rien a dire, on se tait,
- quand il y a du silence on envoie un messages de temps en temps avec son status actuel

C'est pas vraiment bien documenté, mais mon code est la:

http://www.fotovlieger.nl/websvn/listing.php?repname=KAPduino

- KAP: air et gound, en développement
- PAP: pole et poleground, c’est un système opérationnel

Exemple 'bidirectionnel': la nacelle de PAP envoie périodiquement un message avec la tension de la LiPo tout en recevant les commandes tilt.
Avatar de l’utilisateur
hansel
Plus de 400 messages
 
Messages: 420
Inscription: Ven 07 Mai 2010, 16:58
Localisation: rotterdam,nl

Re: Arduinos et liaison RF

Messagede alpaph le Mer 29 Août 2012, 12:42

J'ai aussi une configuration semblable au détail près que j'utilise des transmetteurs de type xBee. Et le protocole que j'utilise
    est lisible (les commandes sont des caractères ASCII);
    envoie des messages émis périodiquement pour vérifier la liaison.

Si cela peut t'aider, tu trouveras des détails sur ce lien : http://alpaph.free.fr/index.php?tag/kapduino

Comme tu le suggères, tu peux faire tes premiers essais de protocole entre ton interface PC (terminal série) et ton arduino. Histoire de mettre au point ton code. Tu entres tes caractères de commande avec ton clavier et quand tu cliques sur Send, ça balance le tout vers ton Arduino. Tu vois ainsi comment il réagit et tu testes ton code.

La deuxième étape pourrait être de relier les deux Arduino par deux fils. Ca permet de voir comment le tout fonctionne en s'affranchissant d'éventuels problèmatiques de transmetteurs.


Dernière étape, faire les essais avec la liaison radio.


Amuse toi bien :D
A+

Philippe

Site perso : http://alpaph.free.fr - Galerie Flickr : http://www.flickr.com/photos/41085895@N08/
Avatar de l’utilisateur
alpaph
Plus de 100 messages
 
Messages: 312
Inscription: Dim 22 Mars 2009, 19:24
Localisation: Seine-saint-denis


Retourner vers L'électronique embarquée et au sol

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 38 invités