Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoyer données sur Arduino par Moniteur Série

24 août 2021 à 18:35:16

Bonjour,

Pour un projet, j'ai besoin d'envoyer un message d'une Arduino à une autre, sans fil, en utilisant des modules NRF24L01. J'arrive à envoyer un message prédéfini à travers les modules. Cependant, j'ai besoin d'envoyer un message qui aura été préalablement défini par un algorithme puis stocké dans un fichier. D'après mes recherches (notamment via d'autres forums), il me faut utiliser le module Python pySerial pour envoyer des données à l'Arduino. De ce que j'ai compris, cela correspond à rentrer un message dans le moniteur série et à l'envoyer sur l'Arduino. 

C'est justement ce que je ne parviens pas à faire. Ni en Python, ni directement avec le moniteur série. Aucun message ne s'affiche à la réception.Auriez-vous une idée d'où vient l'erreur ? Voici les codes :

Récepteur (téléversé) :

#include <SPI.h>
#include <RF24.h>

#define pinCE   7             // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN  8             // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel  "PIPE1"       // On définit le "nom de tunnel" (5 caractères) à travers lequel on va recevoir les données de l'émetteur

RF24 radio(pinCE, pinCSN);    // Instanciation du NRF24L01

const byte adresse[6] = tunnel;       // Mise au format "byte array" du nom du tunnel  
char message[32];

void setup() {
  // Initialisation du port série (pour afficher les infos reçues, sur le "Moniteur Série" de l'IDE Arduino)
  Serial.begin(9600);
  Serial.println("Récepteur NRF24L01");
  Serial.println("");

  // Partie NRF24
  radio.begin();                      // Initialisation du module NRF24
  radio.openReadingPipe(0, adresse);  // Ouverture du tunnel en LECTURE, avec le "nom" qu'on lui a donné
  radio.setPALevel(RF24_PA_MIN);      // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
  radio.startListening();             // Démarrage de l'écoute du NRF24 (signifiant qu'on va recevoir, et non émettre quoi que ce soit, ici)
}

void loop() {
  // On vérifie à chaque boucle si un message est arrivé
  if (radio.available()) {
    radio.read(message, sizeof(message));                        // Si un message vient d'arriver, on le charge dans la variable "message"
    Serial.print("Message reçu : "); 
    Serial.println(message);     // … et on l'affiche sur le port série !
  }

Emetteur (Téléversé) :

#include <SPI.h>
#include <RF24.h>

#define pinCE   7             // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN  8             // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel  "PIPE1"       // On définit un "nom de tunnel" (5 caractères), pour pouvoir communiquer d'un NRF24 à l'autre

RF24 radio(pinCE, pinCSN);    // Instanciation du NRF24L01

const byte adresse[6] = tunnel;               // Mise au format "byte array" du nom du tunnel
                                              // Message à transmettre à l'autre NRF24 (32 caractères maxi, avec cette librairie)

void setup() {
  radio.begin();                      // Initialisation du module NRF24
  radio.openWritingPipe(adresse);     // Ouverture du tunnel en ÉCRITURE, avec le "nom" qu'on lui a donné
  radio.setPALevel(RF24_PA_MIN);      // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
  radio.stopListening();              // Arrêt de l'écoute du NRF24 (signifiant qu'on va émettre, et non recevoir, ici)
}

void loop() {
  if (Serial.available()){
    char message = Serial.read();
    radio.write(&message, sizeof(message));     // Envoi de notre message
    delay(1000);   
  }
}

Emetteur (Python) :

import serial
import time

serialPort = serial.Serial(port="COM3", baudrate=9600, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE)

serialString = "Hello World !"  # Used to hold data coming over UART

while True:
        # Read data out of the buffer until a carraige return / new line is found
        serialPort.write(bytes(serialString, 'utf-8'))
        time.sleep(1)

        





  • Partager sur Facebook
  • Partager sur Twitter
24 août 2021 à 23:27:52

Dans le code de l'émetteur, il manque un appel à Serial.begin pour initialiser la laison série avec l'ordinateur, donc ça ne peut pas marcher.

Je ne comprends pas trop non plus pourquoi tu fais un delay(1000) après avoir transmis un caractère, ça va ralentir considérablement ta durée de transmission du message complet.

  • Partager sur Facebook
  • Partager sur Twitter