Arduino Pro Mini et NRF24L01+

Bonjour à tous et meilleurs voeux.

J'ai un programme serveur qui fonctionne avec une Mega2560 et que j'essaye de passer sur un ProMini.
Ce programme utilise un transceiver. J'ai mis en commentaires les instructions d'affectations de pins aux sorties SPI puisque j'utilise directement les trous spécialisés de la carte .

Mon programme reçoit en permanence des données intempestives.
J'ai pris la précaution de vider le buffer de réception à la fin du setup().
J'affiche des chiffres dans le setup() pour voir où se produit le blocage.

Résultat :
le setup() s'éternise et quand il se termine, le moniteur m'affiche une foule interminables de caractères reçus alors que le client n'est pas branché.

Voici la fin du setup() :

  Serial.print(" 3 ");

  while(Mirf.dataReady() )
          Mirf.getData((byte *) NULL); 
  Serial.println("Programme _Plot1_Pro_mini du 28/12/2013."); 
  Mirf.send((byte *)&messageDemarrage); 
  Serial.println("Init Ok...");
}

J'ai "1 2 3" et j'attends très lontemps la suite.

Bonjour,

Avec le code complet se serait beaucoup plus simple de t'aider ...

micol:
Ce programme utilise un transceiver. J'ai mis en commentaires les instructions d'affectations de pins aux sorties SPI puisque j'utilise directement les trous spécialisés de la carte .

Salut,

Oui mais pour CS et CE ?

micol:
J'ai un programme serveur qui fonctionne avec une Mega2560 et que j'essaye de passer sur un ProMini.
Ce programme utilise un transceiver. J'ai mis en commentaires les instructions d'affectations de pins aux sorties SPI puisque j'utilise directement les trous spécialisés de la carte .

Je ne comprends pas ce que tu entends par là

Merci pour vos réponses.
Ça me donne une piste : je vais mettre CE et CS à Vcc et voir ce que ça donne. :slight_smile:

Le code n'est pas en cause puisqu'il fonctionnait sur la mega 2560. Le problème est d'ordre plus général : passage de la mega à la pro-mini, quelque soit le programme avec transceiver.

micol:
Merci pour vos réponses.
Ça me donne une piste : je vais mettre CE et CS à Vcc et voir ce que ça donne. :slight_smile:

Bin tu verras que plus rien de marche ...

B@tto:
Bin tu verras que plus rien de marche ...

Effectivement, c'est à la masse que je devrai relier CS.

Mais CE il vaut mieux le piloter

B@tto:
Mais CE il vaut mieux le piloter

C'est pas obligatoire si il n'y a qu'un seul périphérique sur le bus SPI.
Mais bon avec ce serait mieux, d'autant plus que la lib Mirf s'attend à pouvoir accéder à cette broche.

skywodd:

B@tto:
Mais CE il vaut mieux le piloter

C'est pas obligatoire si il n'y a qu'un seul périphérique sur le bus SPI.
Mais bon avec ce serait mieux, d'autant plus que la lib Mirf s'attend à pouvoir accéder à cette broche.

Je parle de CE, pas de CS :wink:

OK

Depuis une semaine, je n'ai pas pu dégager le temps de me replonger dans mon montage.

Salut,

Je suis sur un problème similaire en ce moment.

Normalement le nrf24l01 s'alimente en 3.3v
Je pense que ton arduino mini pro ne te sort que du 5v.
Il faudra convertir tout ça.

Bon continuation.

rahan:
Normalement le nrf24l01 s'alimente en 3.3v
Je pense que ton arduino mini pro ne te sort que du 5v.
Il faudra convertir tout ça.

Merci.
Ce montage est en stand-by car je me suis lancé dans les afficheurs ILI9340C.
Pour l'alim du transceiver, j'avais bien mis un step-down converter réglé sur 3 volts.

Bonjour,

J'ai tout branché et pourtant j'ai toujours des messages bidons. Il n'y a pas d'autre système en service, donc celui-ci ne devrait rien recevoir. Le fenêtre du moniteur série défile rapidement avec "on a reçu : xxx" dans lequel xxx représente tantôt rien tantôt des caractères comme le y avec tréma.
Je sais que ça arrive quand le transceiver est absent donc il semble ne pas être reconnu.
J'ai fait un programme d'essai juste pour tester.
Voici mon code et mon branchement.

/*       _Pro_Mini_et_NRF24L01

Ce programme envoie juste un message quand il est prêt
et affiche ce qu'il reçoit        */

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

byte messageClient[] = "..........";      // 10 caractères
byte messageDemarrage[] = "C'est moi!";

void setup(){
  Serial.begin(9600); 
  Mirf.cePin  = 5;
  Mirf.csnPin = 6;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();

  Mirf.channel = 12; 
  Mirf.payload = 10 ; 
  Mirf.setTADDR((byte *)"clie1");
  Mirf.setRADDR((byte *)"plot1");
  Mirf.config();

  //  vider buffer de réception
  while(Mirf.dataReady() )
    Mirf.getData((byte *) NULL); 

  Serial.println("Programme _Pro_mini_et_NRF24L01 du 06/02/2014."); 
  Mirf.send((byte *)&messageDemarrage); 
  Serial.println("Init Ok...");
}

void loop(){
  if (Mirf.dataReady() ) {
    Mirf.getData((byte *) &messageClient); 
    Serial.print("On a recu : ");
    for ( int i = 0 ; i<10 ; i++) {
      Serial.write(messageClient[i]);  
    } 
    Serial.println();
  }
}

Il m'est arrivé la même chose y'a pas longtemps, effectivement si CS est mal branché/configurer c'est la punition. Vérifie tes branchements / configuration de pin (je sais que ça fait très con mais perso j'avais eu beau avoir vérifier 10x mon montage, et bien je m'étais quand même viandé ...).

Vérifie en prenant le fil de CS et en le branchant physiquement, tantôt au GND tantôt au +5V, et en observant les réactions sur moniteur série

Mirf.getData((byte *) NULL);

Ça c'est le reset assuré si le buffer n'est pas vide lors du démarrage.

Remplace ça par :

Mirf.getData((byte *) &messageClient);

Remplir un buffer qui n'existe pas devrait te faire hurler :wink:

Pour les ÿ c'est surement un problème hardware. J'avais eu un truc dans le genre à cause d'une résistance de pull-up qui faisait diviseur de tension.

Bonjour,

J'ai passé l'après-midi d'hier à vérifier mes fils, à essayer de mettre CE ou CSN à la masse ou au VCC sans que ça ne change grand'chose.
J'ai fait la modif de programme préconisée par Skywodd.
J'ai aussi modifié la partie "affichage" pour encadrer les caractères reçus par des "|" et afficher le code du premier reçu.

void loop(){
  if (Mirf.dataReady() ) {
    Mirf.getData((byte *) &messageClient); 
    Serial.print("On a recu : |");
    for ( int i = 0 ; i<10 ; i++) {
      Serial.write(messageClient[i]);  
    } 
    Serial.print("|     ");
    Serial.println(messageClient[0]);
  }
}

Pour les chaines non vides, ça donne ça :
On a recu : |ÿÿÿÿÿÿÿÿÿÿ| 255
Pour les chaînes vides (copier-coller impossible), le code affiché est tantot 0 tantot 14.

EUREKA !

J'aurais dû y penser plus tôt puisque la solution se rapproche de celle du problème rencontré sur un autre montage qui a fait l'objet d'un autre fil.

Le courant fourni par la sortie VCC du ProMini est insuffisant pour faire fonctionner le transceiver.
En alimentant le régulateur par une alim indépendante, ça a l'air de marcher.
Il me restera à vérifier en faisant bavarder ce montage avec un autre. C'est différé pour cause de panne de mon autre PC ou plutôt de son chargeur dont j'ai l'intention d'ouvrir le ventre pour autopsie ou peut-être résurection.

Pour ceux qui veulent utiliser un transceiver avec une carte ProMini :