Pages: 1 2 [3]   Go Down
Author Topic: [Résolu] besoin d'aide avec des transceiver NRF24L01  (Read 3490 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

69100 (France)
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

*** Micol *** Des milliers de Français seraient capable de créer une entreprise, mais les mêmes sont aussi capables de calculer qu'il ont in

Pages: 1 2 [3]   Go Up
Jump to: