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