Pages: [1]   Go Down
Author Topic: Problème avec NRF24L01+ / UNO / LEONARDO  (Read 852 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3193
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai pas regardé le reste mais cette ligne :
Code:
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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
« Last Edit: March 01, 2013, 10:19:15 am by Thom-x » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3193
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: March 01, 2013, 10:47:58 am by Thom-x » Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !
Logged

Pages: [1]   Go Up
Jump to: