Arduino Forum

International => Français => Topic started by: zerr0s on Dec 03, 2012, 09:28 pm

Title: [Résolu] besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Dec 03, 2012, 09:28 pm
Bonjour,

J'ai acheté 2 modules NRF24L01 pour faire de la transmission radio. Pour le moment, je suis un tuto dont le fonctionnement est pltôt simple:
- Une arduino uno avec un pot et un module radio
- Une arduino sur breadboard, atmega uno, avec un module radio et une led

Le but est d'allumer la led en faisant varier le potentiomètre. Je suis sur l'IDE 1.0.1

Le problème n'est pas côté receveur, mais plutôt au niveau transmetteur. Voci le code utilisé:
Code: [Select]
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int rate;

void setup(){

 Serial.begin(9600);
 Mirf.cePin = 8;             //ce
 Mirf.csnPin = 7;            //csn
 Mirf.spi = &MirfHardwareSpi;
 Mirf.init();
 Mirf.setRADDR((byte *)"clie1");
 Mirf.payload = sizeof(rate);
 Mirf.config();
 
 Serial.println("Ready !");
}

void loop(){
 rate = analogRead(A0);

 Mirf.setTADDR((byte *)"serv1");

 Mirf.send((byte *) &rate);
 Serial.println(rate);
 while( Mirf.isSending() );

 delay(1000);
}


dès que je mets sous tension l'arduino transmetteur, la led orange L s'allume et reste allumée. Sur la console, une valeur est affichée, et puis plus rien, la boucle plante (A ce niveau, je n'ai que le pot de brancher, le module est débranché).
Après quelques tests, je me rends compte que le problème vient de la ligne "Mirf.send((byte *) &rate);" qui semble tout faire planter car si je la mets en commentaire, le loop fonctionne, mais bon, le module, lui, ne fonctionnera jamais sans cette ligne ...

J'ai pensé à un problème avec mon arduino. J'ai donc entrepris de mettre 2 arduino sur la breadboard et embarquer le code dans l'un des deux. Une fois fais, (toujours que le pot connecté), la led branché sur le 13 s'allume et reste allumée faiblement, signe que le code a encore planté.

Quelqu'un saurait me dire ce qui cloche svp ? J'ai beau retourner les choses dans tous les sens, je  ne vois pas ce que j'ai mal fait ?
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Dec 03, 2012, 10:45 pm
Si tu as une valeur qui s'affiche, je dirais que le problème vient plutôt de la boucle :
while( Mirf.isSending() );
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Dec 03, 2012, 10:51 pm
bah, peut-être, mais je ne vois pas pourquoi elle planterait chez moi et pas chez les autres ...
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Dec 04, 2012, 09:05 am
Question conne : tu t'es pas planté dans les branchement ? Parce que j'ai bô regardé ton code, je ne vois rien de suspect. La seule vraie différence que je vois avec le tuto de Skywood : http://skyduino.wordpress.com/2012/01/20/tutoriel-arduino-mirf-v2-nrf24l01/   c'est que lui a choisi un unsigned long, je vois pas ce que ça pourrait changer mais bon ...
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Dec 04, 2012, 09:14 am
J'ai refais 50000 fois les branchements. Mais de toute façon, même sans le module de connecté, le code fait planté la board !
Le module que j'ai acheté est plutôt celui ci : http://img3.buyincoins.com/show/nrf24l01-wireless-transceiver-module.jpg

Sinon, j'ai commandé il y a une semaine 4 de ceux là:
http://hackspark.fr/media/catalog/product/r/f/rf24013.jpg

Cette fois-ci ce sera la version nrf24l01+

J'essaierai ce soir avec le unsigned long, mais je pense comme toi, ça n'y changera pas grand chose.
Comment puis-je vérifier si le module n'a pas grillé ?

Alors une info, vendredi dernier, lors de mes premiers tests, j'avais réussi à les faire fonctionner ces petits modules. le potentiomètre arrivait bien à piloter la led sur la seconde arduino. Et j'ai un témoin: ma femme qui est venu voir et tester le potentiomètre !!

Et j'ai tout éteint pour la soirée, je reviens le lendemain, et depuis plus rien ne fonctionne.

J'attends les nrf24l01+ et je teste avec ceux là ...
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Dec 04, 2012, 07:15 pm
Ah bin la ça expliquerai pourquoi ça plante sur le  while( Mirf.isSending() );, si le module est mort il ne risque pas d'acquiescer l'envoi ... Comme je vois VCC sur les pins je suis méfiant, c'est du 3.3V de base les NRF. Certains sont dotés d'un régulateur, d'ailleurs les miens me donnent le choix : un pin 3.3V et un autre 5V
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: skywodd on Dec 04, 2012, 09:36 pm
Bonjour,

Vu les symptômes ça sent le câblage foireux et/ou le nRF24L01 cramé (ou pas super en forme).


Ah bin la ça expliquerai pourquoi ça plante sur le  while( Mirf.isSending() );, si le module est mort il ne risque pas d'acquiescer l'envoi ... Comme je vois VCC sur les pins je suis méfiant, c'est du 3.3V de base les NRF. Certains sont dotés d'un régulateur, d'ailleurs les miens me donnent le choix : un pin 3.3V et un autre 5V

C'est pour cela que dans mon code du tutoriel je fait un timeout pour gérer ce cas d'erreur ;)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Dec 05, 2012, 12:53 pm
arff oui. j'ai branché en 5v moi !! Bon premier grillage de composant depuis que j'ai commencé arduino. sur le tuto que j'ai suivi, il n'y avais pas marqué s'il fallait des résistances et s'il fallait brancher sur du 3 ou 5. Mais j'aurai du aller voir la doc technique du transceiver !

ou encore, en suivant le tuto de skywood, j'aurai du ajouter des résistances 10k entre l'arduino et le transceiver !

Du coup, pour les prochains modules que je vais recevoir, je ferai deux fois plus attention  :smiley-eek:
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: skywodd on Dec 06, 2012, 02:28 pm

arff oui. j'ai branché en 5v moi !! Bon premier grillage de composant depuis que j'ai commencé arduino. sur le tuto que j'ai suivi, il n'y avais pas marqué s'il fallait des résistances et s'il fallait brancher sur du 3 ou 5. Mais j'aurai du aller voir la doc technique du transceiver !

En regarde l'image on voit que VCC est directement relié au nRF24L01.
Sur les modules un peu plus "pro" il y a un régulateur LDO 3v3, comme ça si on envoi du 5v pas de probléme.
Avec les modules en question: 5v = cramé
Une lecture rapide du datasheet suffit à lever tout les doutes :P


ou encore, en suivant le tuto de skywood, j'aurai du ajouter des résistances 10k entre l'arduino et le transceiver !

Les résistances de 10K ne sont pas obligatoire, le nRF24L01 possède des entrées tolérantes au +5V mais c'est toujours bien de les mètres.
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 03, 2013, 07:06 pm
Bonjour,

je me permets de déterrer ce post car je m'y suis remis après avoir reçu mes nouveaux transceivers NRF24L01+.
Je suis ce tuto car ils utilisent les mêmes modules que j'ai: http://www.bajdi.com/playing-with-nrf24l01-modules/

Les modules sont neufs. Voilà mon câblage. J'ai un module sur une arduino mega 2560 ethernet, un autre sur une arduino uno.
Pour ce câblage j'ai mis:
- CE sur 8
- CSN sur 7
- SCK 13
- MISO sur 12
- MOSI sur 11

Et cette fois ci j'ai vraiment fais gaffe et j'ai bien alimenté en 3.3V :)

J'ai refais le montage décrit dans le tuto (pot sur la mega et une led sur la uno). Et impossible de faire fonctionner le tout. Je ne pige pas le problème. J'ai essayé de mettre des valeurs statiques à envoyer pour la valeur du pot, mais rien n'y fait. je ne sais pas si c'est a mega qui n'envoi pas ou si c'est la uno qui ne reçois pas.

J'ai d'abord commencé par mettre des résistances 10K, puis n'arrivant pas à faire fonctionner, je les ai viré. Sur le tuto, ils n'en utilisent pas. Dans le doute d'un module défectueux, j'ai remplacé les modules par 2 autres tout neufs également (j'en avais commandé 4).

y a t il un test tout simple pour voir où se trouve le problème ?
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: skywodd on Mar 03, 2013, 07:29 pm
Essaye l'exemple "ping" de la librairie arduino Mirf ;)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 03, 2013, 09:22 pm
j'ai essayé l'exemple ping sans succès. Malgré le fait qu'un des 2 me renvoi "Ping ..." suivi d'un temps de réponse, le second ne m'affiche jamais le "Pong".

Je ne sais absolument pas ce qui cloche !! A vouloir faire des économies en achetant le moins cher, je me galère à faire fonctionner ces modules .... zutttttttt
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Mar 03, 2013, 09:26 pm
Erreur de branchement quelque part forcement ...
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 03, 2013, 09:29 pm
bon je reprendrai à 0 demain. Sinon, est-ce que l'ethernet ne peut pas influer sur le module rf ?
C'est une arduino mega 2560 ethernet de freetronics. J'avais lu quelque part que certains modules utilisés conjointement avec de l'ethernet pouvait ne pas fonctionner ...

Allez à demain.
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: skywodd on Mar 05, 2013, 08:48 am

bon je reprendrai à 0 demain. Sinon, est-ce que l'ethernet ne peut pas influer sur le module rf ?

L'ethernet est sur la carte qui envoi ping ou pong ?

Le chipset ethernet utilise le port SPI de même que le module nRF.
Il faut que tu mettes la broche CS du chipset ethernet à HIGH pour le désactiver.
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 05, 2013, 08:53 am
bon, alors j'ai refait mes cânles hier, et j'ai testé avec 2 arduino uno et l'exemple ping_server et ping_client. Et ça a l'air de fonctionner.

Pour la carte mega 2560 ethernet (le chip est intégré sur la mega: http://cdn.shopify.com/s/files/1/0045/8932/products/EtherMega-production-sample-2_large.png?321).
Il n' y a pas de jumper hormis celui pour l'alim et le POE.*

Je referai un test ce soir avec la mega pour voir ce que ça donne.
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: skywodd on Mar 05, 2013, 09:02 am
C'est un schéma de la carte qu'il faut si tu veut savoir où est le CS du chipset ethernet, pas une image ;)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 06, 2013, 05:24 pm
Ok, j'ai trouvé un super tuto sur ce lien: http://dukextrem.blogspot.fr/2012/11/test-emetteur-recepteur-24g-nrf24l01.html

Avec le bon câblage SPI, ça fonctionne maintenant. Il me reste à trouver comment augmenter la porté car
pour le moment, les modules ne communiquent pas au delà de 4/5m sans obstacle. Je vais essayer avec le Mirf.channel
pour voir ce que ça donne.

Si vous avez des astuces à me filer, je suis preneur.
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Mar 06, 2013, 07:22 pm
Pour avoir la portée maximale il faut le passer en 250 kbps et 0db d'atténuation.

Après tu peux gérer les retransmissions et la CRC (si tu la vires tu passeras plus de paquets mais leur intégrité est discutable)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 06, 2013, 09:53 pm
euh ... ok. mais comment ça se configure tout ça ? y a t il un utilitaire pour configurer ces options ?
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Mar 07, 2013, 09:00 am
Tu trouveras vers la fin de la datasheet la liste de tous les registres. La lib est bien faite et contient déjà les mnémoniques, et il te suffit d'utiliser la commande Mirf.configRegister(addresse registre,valeur).

Par exemple :

Code: [Select]

Mirf.configRegister(RF_SETUP,0b00100110); // 0 dBm + 250 kbps (sur Nrf24l01+)


Pour la CRC, soit tu modifies comme je viens de te l'expliquer le registre CONFIG, soit tu vas éditer le mirf.h. En haut il y a un #define avec des "<<", il suffit de modifier 1 ou 0 suivant ce que tu souhaites.
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 07, 2013, 10:04 pm
Hello,

Merci pour l'explication. J'ai téléchargé la datasheet pour voir tous les codes. Mais comment es-tu arriver à la conclusion que le RF_SETUP doit être configuré sur 0b00100110 pour 0dbm / 250kbps ?

Je regarde le tableau de la datasheet à la page 58, et je ne trouve pas d'infos sur ce code ? Je te demande car je voudrai comprendre pour tester les différentes config possible, sans avoir à chercher des heures sur google. Si je comprends le fonctionnement, ça ira tout seul (enfin j'espère) :)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Mar 08, 2013, 08:35 am
Tu as bien pris la doc pour NRF24l01+ ? (a supposer que tu aies bien cette version la)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 08, 2013, 11:16 am
Oui j'ai bien des nrf24l01+ , mais version japonnaise lol

Sinon, il ne m'est plus possible d''accé der au forum depuis mon pc.
J'ai systématiquement un "disallow key characters"

Je suis sur mon mobile . Zaarrbbb
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 08, 2013, 11:20 am
Voilà les transceiver que j'utilise: http://www.nordicsemi.com/kor/Products/2.4GHz-RF/nRF24L01P

Ca y est ça refonctionne sur le pc après avoir supprimer les cookies ...
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Mar 08, 2013, 12:04 pm
Bin si tu regardes le registre RF_SETUP tout est décrit. Les n° de bit sont dans cet ordre 76543210 (bit de poids fort à gauche quoi). Chaque bit veut dire quelque chose, il suffit de lire et de le configurer comme tu le souhaites

Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 08, 2013, 01:16 pm
hum, ok, j'essaie de comprendre. Admettons queje veuille de 1Mbps 0dbm.

Si je suis le tableau, je devrai avoir: 0 0 0 00 11 0

CONT_WAVE : 0
RESERVED: 0
RF_DR_LOW: 0
PLL_LOCK: 0
RF_DR_HIGH: 00
RF_PWR: 11
Obsolete: 0

Ai-je bien compris ? Du coup, à quoi sert le 0b dans l'exemple que tu m'as donné ?
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: B@tto on Mar 08, 2013, 02:01 pm
C'est l'attenuation de la puissance (moins de puissance = moins de portée = moins de conso ).
Mirf.configRegister(RF_SETUP,0) donnera une attenuation de -18 dBm et 1 Mbps de débit
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: Grag38 on Mar 09, 2013, 10:07 am
J'utilise pas mal les NRF24L. Ca foncitonne plutôt birn ces bestioles.

Par contre j'utilise pour programmer l'arduino la librairie de maniacbug qui est très simple à utiliser et qui fonctionne très bien.

Essaye là ;o)

http://maniacbug.github.com/RF24/
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 09, 2013, 01:16 pm
Pourquoi pas. J'ai monté le câblage du pingpair_dyn, mais pour le moment les 2 modules ne communiquent pas.

Je continue de tester. J'y arriverai bien ....
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 09, 2013, 05:58 pm
Bon j'ai continué avec Mirf pour le moment. J'ai configuré la porté maximale en 250Kbps et maintenant j'arrive bien à capter l'autre module qui se trouve à l'autre bout de l'appart.

Par contre, sur l'exemple par défaut, l'envoi et la réception fonctionnait bien. J'ai ajouté mon bout de code que j'ai fait dans l'exemple sur mon sketch principal qui intègre la transmission udp en ethernet, et là, je peux toujours envoyer vers le second module, mais la réponse ne vient pas.

Voilà mon code de la mega qui envoi :
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <EEPROM.h>

/* ethernet */
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
unsigned int localPort = 8888;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
//char ReplyBuffer[] = "acknowledged"; // a string to send back
EthernetUDP Udp;

/* radio */
int cmd;
//int led = 4;

void setup() {
  Serial.begin(9600);
 
  /* ethernet */
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
 
  /* radio */
  Mirf.cePin = 8;
  Mirf.csnPin = 7;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.configRegister(RF_SETUP, 0x26); // 250kbps/0dbm
  Mirf.setRADDR((byte *)"clie1");
  Mirf.payload = sizeof(1);
  Mirf.channel = 0;
  Mirf.config();
 
  Serial.println("Server listening on : 192.168.1.177:8888");
  Serial.println("Radio ok, starting ...");
}

void loop() {
  // Vérifie la trame UDP
  int packetSize = Udp.parsePacket();
 
  // Si un contenu est détecté dans la trame
  if(packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    Serial.print(Udp.remoteIP());
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // vide le buffer
    for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer[i] = 0;
    // récupère le contenu
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
   
    // affiche le contenu
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    unsigned long time = millis();
   
    // prépare l'envoi de la donnée
    Mirf.setTADDR((byte *)"serv1");
    // converti le char en int
    int cmd = packetBuffer[0] - '0';
    Mirf.send((byte *) &cmd);
   
    Serial.println("Sending command");
   
    // envoi la donnée
    while(Mirf.isSending()){
    }
   
    Serial.println("Finished sending");
    delay(10);
   
    // On attend une réponse pendant 1000ms
    while(!Mirf.dataReady()){
      Serial.println("Waiting");
      if ( ( millis() - time ) > 1000 ) {
        Serial.println("Timeout on response from server!");
        // envoi une réponse sur la socket ouverte
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
        Udp.write("timeout");
        // ferme la socket
        Udp.endPacket();
        return;
      }
    }
   
    // récupération de la réponse
    int res;
    Mirf.getData((byte *) &res);
    // on affiche la réponse
    Serial.print("Res: ");
    Serial.println(res);

    // envoi de la réponse sur la socket ouverte
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(res);
    // ferme la socket
    Udp.endPacket();
  }
  delay(10);
}


Et celui qui reçoit:
Code: [Select]
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int rate;

void setup(){
  Serial.begin(9600);
 
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.configRegister(RF_SETUP,0x26);
 
  // affiche la config de RF_SETUP
  byte rf_setup = 0;
  Mirf.readRegister( RF_SETUP, &rf_setup, sizeof(rf_setup) );
  Serial.print( "rf_setup = " );
  Serial.println( rf_setup, BIN );
   
  Mirf.setRADDR((byte *)"serv1");
  Mirf.payload = sizeof(1);
  Mirf.channel = 0;
  Mirf.config();
 
  Serial.println("Listening...");
}

void loop(){
  // Un nouveau paquet est arrivé
  if(!Mirf.isSending() && Mirf.dataReady()){
    Serial.println("Got packet");
   
    // récupération de la donnée
    Mirf.getData((byte *) &rate);
    // on afficge la donnée
    Serial.println(rate);
     
    // on envoi une réponse
    Mirf.setTADDR((byte *)"clie1");
    int res = 1;
    Mirf.send((byte *) &res);
   
    Serial.println("Reply sent.");
  }
}


Si je ne touche pas le récepteur, et que je remet l'exemple sur l'émetteur, ça fonctionne bien dans les deux sens. J'ai essayé de passer sur 3000ms au lieu de 1000ms pour l'attente de la réponse, mais sans succès. Une idée ?
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: zerr0s on Mar 10, 2013, 11:13 am
Bon, problème résolu. J'ai juste inverser les include ethernet et mirf.
En mettant les mirf/hardware en premier et les ethernet en dernier, ça fonctionne bien mieux.

Problème résolu. merci à tous pour votre aide. Je reviendrai poster sur un nouveau topic pour les questions de programmation,
surtout les conversions de type. Je débute en C, et ce n'est pas très simple. J'apprends tout à la fois lol :)
Title: Re: besoin d'aide avec des transceiver NRF24L01
Post by: micol on Apr 28, 2013, 05:45 pm
Ok, j'ai trouvé un super tuto sur ce lien: http://dukextrem.blogspot.fr/2012/11/test-emetteur-recepteur-24g-nrf24l01.html

J'ai une MEGA et j'ai emprunté une UNO pour faire ce test.
Ça ne fonctionne pas. La UNO reçoit toutes les 3 ou 4 mn le message envoyé par la MEGA toutes les 4 secondes et la MEGA ne reçoit jamais de réponse.
Fallait-il bien une UNO ? DukeXtreM n'est pas clair à ce sujet, parlant alternativement de UNO et de NANO.

Les deux cartes et leurs NRF24L01+ sont toutes deux sur la même table. Quand l'une est reliée au PC, l'autre est reliée à une alim.

des idées ?

Merci d'avance.