[Programmation] NRF2401 + et arduino
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

NRF2401 + et arduino



  1. #1
    invitebffb4cc1

    NRF2401 + et arduino


    ------

    Bonjour !
    J'ai un petit souci pour faire fonctionner un arduino uno avec nrf2401+ et un mega avec lui aussi un nrf2401+.
    J'ai testé mes connexions avec un simple envoi (hello world) en premier pour valider ce paramétre et c'est ok de se coté.
    Maintenant j’essaie d'envoyer un simple caractère pour m'en servir de commande mais c'est la que le problème arrive.
    Les deux codes émetteur comme récepteur ne me retourne aucun dysfonctionnement et les led qui indique l'émission ou réception de l'arduino clignote bien mais je n'ai aucun retour.
    Pouvez vous m'aider a savoir se qui se passe mal ?
    Merci d'avance

    Emetteur (uno)
    Code:
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    
    RF24 radio(7,8);
    
    const byte address[6] = "00001";
    
    void setup() {
      Serial.begin(9600);
      radio.begin();
      radio.openWritingPipe(address);
      radio.setPALevel(RF24_PA_MAX);
      radio.setDataRate(RF24_250KBPS);
      radio.stopListening();
    }
    
    void loop() {
      char text = Serial.read();
      radio.write(text, sizeof(text));
      delay(2000);
    }
    Recepteur (mega)
    Code:
     #include <SPI.h>
        #include <nRF24L01.h>
        #include <RF24.h>
        RF24 radio(7, 8); // CE, CSN
        const byte address[6] = "00001";
        int pwm1 = 23;
        int dir1 = 22;
        int pwm2 = 25;
        int dir2 = 24; 
        
        void setup() {
          Serial.begin(9600);
          radio.begin();
          radio.openReadingPipe(0, address);
          radio.setPALevel(RF24_PA_MIN);
          radio.startListening();
          
        pinMode(pwm1, OUTPUT);
        pinMode(dir1, OUTPUT);
        pinMode(pwm2, OUTPUT);
        pinMode(dir2, OUTPUT);
        }
        
        void loop() {
          if (radio.available()) {
            char text[32] = "";
            radio.read(&text, sizeof(text));
            Serial.print(text);
    if (text == 'A')
          digitalWrite(dir1, LOW);
          digitalWrite(dir2, LOW);  
          analogWrite(pwm1, 255);
          analogWrite(pwm2, 255);
          delay(2000);
          
    if (text == 'R')
          digitalWrite(dir2, LOW);
          digitalWrite(dir1, LOW);
          analogWrite(pwm1, 0);
          analogWrite(pwm2, 0);
          delay(2000);
    
    if (text == 'D')
          digitalWrite(dir2, LOW);
          digitalWrite(dir1, LOW);
          digitalWrite(pwm1, LOW); 
          analogWrite(pwm2, 255);
          delay(2000);
    
    if (text == 'G')
          digitalWrite(dir1, LOW);
          digitalWrite(dir2, LOW);
          digitalWrite(pwm2, LOW);
          analogWrite(pwm1, 255);
          delay(2000);   
          }
        }

    -----

  2. #2
    freepicbasic

    Re : NRF2401 + et arduino

    Code:
         if (radio.available()) {
            char text[32] = "";
            radio.read(&text, sizeof(text));
    La variable text est vide , donc sizeof( text ) = 0 !

    Lire 1 seul caractère à la fois si la commande ne contient qu'un caractère
    Code:
     radio.read(&text, 1);
    Code:
    if (text == 'A')
    ^
    |
    Ici on compare le pointeur

    Code:
    if (text[0] == 'A')  // on compare le premier char
    Dernière modification par freepicbasic ; 06/08/2018 à 09h31.
    A+, pat

  3. #3
    invitebffb4cc1

    Re : NRF2401 + et arduino

    Bonjour freepicbasic !

    Merci de ta réponse

    Donc si je comprend bien mon code de l’émetteur ne change pas et le code du récepteur devient :

    Code:
     if (radio.available()) {
            char text[32] =  radio.read(&text, 1);
    Et ensuite :
    Code:
    if (text == 'A')
    Devient :
    Code:
    if (text[0] == 'A')

  4. #4
    freepicbasic

    Re : NRF2401 + et arduino

    Si tu utilise char text[32] que pour ça , donc 1 seul char
    tu peut écrire "char text" pour juste 1 seul char.
    inutile de perdre 31 octets pour rien...
    A+, pat

  5. A voir en vidéo sur Futura
  6. #5
    Gri Pale

    Re : NRF2401 + et arduino

    Bonour !
    @tchou21

    Tout d'abord, le hello world affiché est-il juste un print("hello world") affiché par l'invité arduino directement ? Où est-ce une chaine de caractère que tu envoies à ton nrf qui transmet sur l'autre récepteur nrf+arduino connecté sur un port différent ? Peut être que tu visualises le hello world du port d'émission, alors que ça ne reçoit pas derrière.
    Car si c'est le premier cas, le bon fonctionnement de la nrf+ n'est pas validé à ce stade.

    Admettant cette hypothèse :

    As tu rajouté un p'tit condo électrolytique de 3 uF à 10 uF en parallèle de l'alim des cartes nrf ? (découplage)

    les modules Nrf2401+ disposent -t- ils d'un régulateur de tension intégré ? (typiquement les modèles chinois n'en ont pas)
    - Si oui : connecter au +5V est préférable
    - Si non : connecter au +3.3V est souhaitable

    Côté code :
    Le RF radio (7,8), le 7 et 8 sont les valeurs par défaut de la biblio (à vérifier, on ne sait jamais)
    Peut-être modifier le baud rate, essayer 115200
    Il y a 4 bibliothèques TMRh20/nrf24 à inclure il me semble,

    -A, Gri Pale

  7. #6
    invitebffb4cc1

    Re : NRF2401 + et arduino

    Oui tu as raison pour les 31 octects.
    J'utilise qu'un seul caractère pour la simple raison que cela me donne déjà 26 possibilités ce qui est suffisant pour mon projet.
    Donc le code le code émétteur:

    Code:
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    
    RF24 radio(7,8);
    
    const byte address[6] = "00001";
    
    void setup() {
      Serial.begin(9600);
      radio.begin();
      radio.openWritingPipe(address);
      radio.setPALevel(RF24_PA_MAX);
      radio.setDataRate(RF24_250KBPS);
      radio.stopListening();
    }
    
    void loop() {
      char text = Serial.read();
      radio.write(text, sizeof(text));
      delay(2000);
    }
    Et le récepteur :

    Code:
        #include <SPI.h>
        #include <nRF24L01.h>
        #include <RF24.h>
        RF24 radio(7, 8); // CE, CSN
        const byte address[6] = "00001";
        int pwm1 = 23;
        int dir1 = 22;
        int pwm2 = 25;
        int dir2 = 24; 
        
        void setup() {
          Serial.begin(9600);
          radio.begin();
          radio.openReadingPipe(0, address);
          radio.setPALevel(RF24_PA_MIN);
          radio.startListening();
          
        pinMode(pwm1, OUTPUT);
        pinMode(dir1, OUTPUT);
        pinMode(pwm2, OUTPUT);
        pinMode(dir2, OUTPUT);
        }
        
        void loop() {
          if (radio.available()) {
            char text = radio.read(&text, 1);
            Serial.print(text);
    
    if (text[0] == 'A')
          digitalWrite(dir1, LOW);
          digitalWrite(dir2, LOW);  
          analogWrite(pwm1, 255);
          analogWrite(pwm2, 255);
          delay(2000);
          
    if (text[0] == 'R')
          digitalWrite(dir2, LOW);
          digitalWrite(dir1, LOW);
          analogWrite(pwm1, 0);
          analogWrite(pwm2, 0);
          delay(2000);
    
    if (text[0] == 'D')
          digitalWrite(dir2, LOW);
          digitalWrite(dir1, LOW);
          digitalWrite(pwm1, LOW); 
          analogWrite(pwm2, 255);
          delay(2000);
    
    if (text[0] == 'G')
          digitalWrite(dir1, LOW);
          digitalWrite(dir2, LOW);
          digitalWrite(pwm2, LOW);
          analogWrite(pwm1, 255);
          delay(2000);   
          }
        }
    Mais la j'ai une erreur "Void value not ignored as it ought to be" qui me dit donc que la valeur de void n'est pas ignoré comme il faut.

  8. #7
    freepicbasic

    Re : NRF2401 + et arduino

    Il faudrait regarder le prototype de la fonction qui fait l'erreur

    Je n'ai pas cette lib... je n'ai pas compilé...
    Si tu as un lien sur la lib.

    il est possible que la fonction n'apprécie pas le char unique.

    De toute façon le Serial.print(text); ne va pas
    car il lui faut un string
    donc au minimum char text[2]
    et il faut mettre un text[1]='\0'; pour terminer la chaine sinon il risque d'afficher la valeur ASCII pas le caractère.
    A+, pat

  9. #8
    invitebffb4cc1

    Re : NRF2401 + et arduino

    Bonsoir,

    @Gri Pale J'ai testé et suivi ce tuto : https://www.youtube.com/watch?v=57pdX6b0sfw

    Concernant les régulateurs de tension j'en posséde des additionnels
    https://www.amazon.fr/gp/product/B07...?ie=UTF8&psc=1

    Ils sont connectés au 5V de l'arduino.

    Pour les connections pour le uno je suis en 7,8,11,12,13 et pour le méga en 7,8,50,51,52.

    Je vais éssayer a 115200

    Voici le lien de la librairie :https://github.com/nRF24/RF24

    Merci a vous deux pour votre aide !

  10. #9
    freepicbasic

    Re : NRF2401 + et arduino

    il s'agit d'un Buffer sur le prototype "void *buf"

    Donc remettre le buffer à 32 , je pense que 2 devrait fonctionner à essayer.
    pour le Serial.print ne pas oublier le '\0' à la fin de la chaine.
    A+, pat

Discussions similaires

  1. (Arduino) problème de téléversement de programme Arduino
    Par invite3e4197b0 dans le forum Électronique
    Réponses: 1
    Dernier message: 17/05/2016, 09h28
  2. Arduino anti rebond avec arduino
    Par invited0bffa74 dans le forum Électronique
    Réponses: 13
    Dernier message: 23/10/2014, 17h04
  3. module nRF2401
    Par invite7b497938 dans le forum Électronique
    Réponses: 7
    Dernier message: 13/01/2014, 16h32
  4. Communication arduino-arduino avec module Xbee
    Par inviteda9a8a4b dans le forum Électronique
    Réponses: 2
    Dernier message: 23/12/2013, 17h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...