Go Down

Topic: Problème avec NRF24L01+ / UNO / LEONARDO (Read 1 time) previous topic - next topic

Thom-x

Bonjour,
J'essaie de faire communiquer une Arduino UNO et une Leonardo avec des NRF24l01+ et la librairie Mirf sous forme d'un mini chat.

Hélas je n'arrive à faire la communication que dans un sens (Leonardo => UNO).
Dans l'autre sens la Leonardo reçoit les paquets une fois sur vingt, ce qui est très étrange.
J'ai fais le même montage avec une MEGA et une Leonardo, dans ce cas les deux cartes ne reçoivent les données qu'une fois sur vingt.
J'ai inversé les deux NRF le problème reste exactement le même :

Leonardo => UNO :  OK.
UNO => Leonardo :  PAS OK.

En ce qui concerne le montage j'ai bien relié les MISO, MOSI, SCK  aux pins 13,12 et 11 pour la UNO, au header SPI pour la Leonardo, CE et CSN aux pins 8 et 9.
Les NRF sont alimentés en 3.3V et j'ai placé des résistances comme sur ce tuto :
http://skyduino.wordpress.com/2012/01/20/tutoriel-arduino-mirf-v2-nrf24l01/
J'ai également fais des testes sans les résistances (les entrées supportent jusqu'à 5.25V dans la datasheet).
Il n'y a pas de "faux" contacts.

J'utilise l'IDE 1.0.3 avec le bootloader 1.0.3 sur la Leonardo

Je pense qu'il y a un problème de compatibilité entre la librairie Mirf et les cartes Leonardo et Mega mais où ? Aucune idée.

Voici mon petit bout de code commun à chaque carte (sauf le brochage pour la Mega et les adresses respectives des NRF qui sont échangées) :
J'ai également testé l'exemple PING mais les symptômes sont les même : le ping réussit une fois sur vingt.

Code: [Select]

#include <SPI.h>
#include <Mirf.h>
#include <MirfHardwareSpiDriver.h>
#include <MirfSpiDriver.h>
#include <nRF24L01.h>
#define PAYLOAD 32

void setup()
{
  Serial.begin(9600);
  Mirf.cePin = 9;
  Mirf.csnPin = 8;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"aaaaa"); // Inversé selon la carte
  Mirf.setTADDR((byte *)"bbbbb"); // Inversé selon la carte
  Mirf.payload = PAYLOAD;
  //Mirf.configRegister(RF_SETUP, 0x0E);  //2Mbps
  Mirf.configRegister(RF_SETUP, 0x26);  //250kbps
  Mirf.config();
  Serial.println("Beginning ... ");
}

void loop()
{
  byte data[Mirf.payload];
  if(!Mirf.isSending() && Mirf.dataReady())
  {
    Serial.print("Got packet : ");
    Mirf.getData(data);
    for(int j=0;j<PAYLOAD;j++)
    {
      Serial.write(data[j]);
    }
    Serial.println("");
  }

  if (Serial.available() > 0)
  {
   
    while(Serial.available() > 0)
    {
      Serial.print("Send packet : ");
      int i=0;
      byte message[]="                                ";
      while(Serial.available() > 0 && i<PAYLOAD)
      {
        delay(2);
        message[i] = Serial.read();
        Serial.write(message[i]);
        i++;
      }
      Mirf.send((byte *)&message);
      while(Mirf.isSending())
      {
      }
      Serial.println("");
    }
  }
}


En espérant que quelqu'un est une solution à mon problème.

B@tto

J'ai pas regardé le reste mais cette ligne :
Code: [Select]
Mirf.configRegister(RF_SETUP, 0x26);

Pose problème : il touche à des bits qu'on est pas sensé modifier (il y a même les bit 7,6 et 5 qui sont à 001 alors que dans la datasheet c'est "only 000 allowed").

Vire cette ligne simplement et laisse les paramètres par défaut.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Thom-x

#2
Mar 01, 2013, 04:15 pm Last Edit: Mar 01, 2013, 04:19 pm by Thom-x Reason: 1
Selon la datasheet :
bit 0 : Don't care (0 ici)
bit 1/2 : 00 -18dBm / 01 -12dBm / 10 -6dBm / 11 0dBm (11 ici)
bit 5/3 : 00 1Mbps / 01 2Mbps / 10 250 kbps / 11 Reserved (10 ou 01 selon le débit voulu)
bit 4 : Force PLL lock signal. Only used in test (0 ici)
bit 6 : Only 0 allowed. (0 ici)
bit 7 : Enables continous carrier transmit when high. (0 ici)

On obtient donc : 0000 1110  (0E) pour 2Mbps
                       0010 0110  (26) pour 250kbps

Je ne vois pas ce qui ne colle pas ?
Avez-vous pris la bonne datasheet nrf24l01 PLUS ?
Edit : Apres vérification de la datasheet du nrf24l01 je crois que vous avez confondu les deux modèles (je me suis moi même fait avoir la première fois).

B@tto

Ah en effet autant pour moi j'étais sur la version pas "+".

La comme ça je vois rien, mais sur Mega 1280 j'ai pas eu de problème avec des Nrf24l01+. Le fait que la communication se fasse (puisque tu reçois un paquet sur 20) est quand même troublant ... Surtout que ça ne concerne que la réception ! Et leornado => Mega et Mega => leornardo ?
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Thom-x

#4
Mar 01, 2013, 04:45 pm Last Edit: Mar 01, 2013, 04:47 pm by Thom-x Reason: 1
Leonardo/Mega le problème est le même dans les deux sens : 1 fois sur beaucoup ça passe sinon rien.
PS : J'avais testé des Nrf avec deux UNO et un programme différent et tout fonctionnait. D'où mon idée de problème lié aux cartes ou à la librairie.

skywodd

Bonjour,

Sans toucher à rien, avec juste l'exemple "ping" est-ce que ça marche ?
Si oui -> problème de code
Si non -> problème de montage
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Thom-x

Avec l'exemple Ping mêmes symptômes le Ping marche une fois de temps en temps.
Si j'inverse les nrf entre les cartes le problème reste le même.

skywodd


Avec l'exemple Ping mêmes symptômes le Ping marche une fois de temps en temps.
Si j'inverse les nrf entre les cartes le problème reste le même.

Bon ben cherche pas plus loin, il y a un problème dans ton montage ...
L'exemple ping devrait fonctionner sans probléme même connecté via le port ICSP.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Thom-x

Le truc, c'est que ça marche dans un sens et une fois de temps en temps dans l'autre.
Si mon montage n'était pas bon je ne devrait jamais rien recevoir de potable, or ce n'est pas le cas.

skywodd


Le truc, c'est que ça marche dans un sens et une fois de temps en temps dans l'autre.
Si mon montage n'était pas bon je ne devrait jamais rien recevoir de potable, or ce n'est pas le cas.

Ou c'est juste un faux contact ...
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Thom-x

J'ai du mal à croire un faux contact.
J'ai vérifier des dizaines de fois, un faux contact qui ne se produit que quand je reçois des informations mais jamais quand je les envoies c'est étrange non ?
Je vais quand même revérifier mais ça m'étonnerait que se soit ça.
En tout cas merci d'essayer de m'aider !

Go Up