Skyduino:~#
Articles
arduino, programmation, projet

[Arduino] Transmission valeur analogique par nRF24L01+

Bonjour tout le monde !

Suite à mon article sur les modules nRF24L01+ ont ma demandé de publier le code d’un projet que j’avais réalisé il ya peu.

Le principe de mon code est simple, une première carte arduino "lit" ses broches analogique (A0 ~ A5), stocke les différentes valeurs dans un tableau de byte, et envoi le tout via le nRF24L01+. Une seconde carte arduino récupère alors ces données, les décompactes, et les renvoies sur le port série au format CSV.

A l’origine j’ai réalisé ce code pour afficher en temps réel les valeurs de 6 potentiomètres sur mon ordinateur avec une visualisation sous forme de graphique avec serialChart.
Je voulais juste faire un zip et envoyer mon code à la personne concerné par mail mais je me suis dis que ce serait beaucoup plus intéréssant si tout le monde pouvez en profiter ;)

Libre à vous de le modifier, hacker, réutiliser, …

(Le taux de rafraichissement est de 50Hz environ)

La partie émetteur :

/**
 * Pins:
 * Hardware SPI:
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 * CE -> 8
 * CSN -> 7
 */

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

byte report[12];
unsigned int tmp;

void setup(){
  Serial.begin(9600);
  Mirf.cePin = 8;
  Mirf.csnPin = 7; 
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.payload = 12;   
  Mirf.config();
  Mirf.setTADDR((byte*)"cbase"); 
  Serial.println("Start ...");
}

void loop(){
  while(Mirf.isSending()) {
    delay(5); 
  }
  
  tmp = analogRead(A0);
  report[0] = tmp & 0xFF;
  report[1] = (tmp & 0xFF00) >> 8;
  
  tmp = analogRead(A1);
  report[2] = tmp & 0xFF;
  report[3] = (tmp & 0xFF00) >> 8;
  
  tmp = analogRead(A2);
  report[4] = tmp & 0xFF;
  report[5] = (tmp & 0xFF00) >> 8;
  
  tmp = analogRead(A3);
  report[6] = tmp & 0xFF;
  report[7] = (tmp & 0xFF00) >> 8;
  
  tmp = analogRead(A4);
  report[8] = tmp & 0xFF;
  report[9] = (tmp & 0xFF00) >> 8;
  
  tmp = analogRead(A5);
  report[10] = tmp & 0xFF;
  report[11] = (tmp & 0xFF00) >> 8;
  
  Mirf.send(report);
  
  delay(20); // 50Hz
}

La partie récepteur :

/**
 * Pins:
 * Hardware SPI:
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 * CE -> 8
 * CSN -> 7
 */

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

byte report[12];

void setup(){
  Serial.begin(9600);
  Mirf.cePin = 8;
  Mirf.csnPin = 7; 
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte*)"cbase");
  Mirf.payload = 12;   
  Mirf.config();
  Serial.println("Start ..."); 
}

void loop(){
  while(!Mirf.dataReady()) {
    delay(5); 
  }
  Mirf.getData(report);

  Serial.print(report[0] + (report[1] << 8), DEC);
  Serial.print(',');
  Serial.print(report[2] + (report[3] << 8), DEC);
  Serial.print(',');
  Serial.print(report[4] + (report[5] << 8), DEC);
  Serial.print(',');
  Serial.print(report[6] + (report[7] << 8), DEC);
  Serial.print(',');
  Serial.print(report[8] + (report[9] << 8), DEC);
  Serial.print(',');
  Serial.print(report[10] + (report[11] << 8), DEC);
  Serial.println();

  delay(20); // 50Hz
} 

SerialChart : http://code.google.com/p/serialchart/

Enjoy !

About these ads

Discussion

12 réflexions sur “[Arduino] Transmission valeur analogique par nRF24L01+

  1. Sympa cet article :)

    Sinon t’aurais une idée de comment faire du multi-serial sur un Arduino Uno/Duemillanove ?

    Publié par TiBounise | 1 février 2012, 23 h 20 min
  2. Hmmm, je suis embêté… Le code que je t’ai envoyé précédemment variait à cause de la réception, mea culpa. Donc mauvais exemple X-)

    Cela dit, je remarque que tu occulte complètement les fonctionnalités ACK, retransmission, etc… du NRF24L01+ en ne définissant pas l’adresse RX dans le module qui envoie et l’adresse TX dans le module qui recoit. Mais bon… ça fonctionne donc pas de soucis.

    Je ne vois pas de différence entre ton code et celui que j’utilise pour mon montage donc je ne comprends pas pourquoi ça ne fonctionne pas. A une exception près, mes deux modules envoient et recoivent des données.

    Jette un coup d’oeil à mes sketch (si ça te dit) et donne moi un diagnostique…
    Platine 1
    Platine 2

    Publié par Tibrol | 1 février 2012, 23 h 29 min
    • Quand j’avais fait ce code j’avais uniquement en tête de lire 6 tensions analogique en sortie d’une série de potentiomètre sans me prendre la tête, le but était de pouvoir contrôler une animation sur mon ordi.

      L’ack, la retransmission tout ça, c’est vrai qu’il m’aurait suffit de définir l’adresse TADDR pour que le protocole ShockBurst des nRF24L01+ soit effectif, mais bon pour 6 potars j’avais tout simplement la flemme ;)

      Je vais regarder tes codes peut être que …

      EDIT: Je pense que ton probléme vient de ce que tu transmet, à savoir des string, et pas qu’un peu !
      Il y a beaucoup trop de String dans ton code !
      Idée d’amélioration :
      - coté compteur edf tu lit via le port série et tu interprète avec String (ou mieux avec les fonctions standard de c, sscanf, strcmp, …) les données du compteur, ensuite tu les "compactent" en un type natif (int, long, byte, …) prédéfinit (une structure par exemple) puis tu envoi les données binaires selon un schéma bien définit :
      Comme ça coté pc tu peut décompacter facilement les données et les nRF aurons pas à transmettre une quantité hallucinante de donnée textuelle.

      Publié par skywodd | 1 février 2012, 23 h 35 min
      • Non je transmets juste des tableaux de caractères (convertis en (byte *). Je me sers juste des objets de type String pour fabriquer plus simplement mes tableaux. Donc question envoi et réception, ce n’est pas sensé bloquer quoi que ce soit. De toutes façons le contenu des tableaux est converti en (byte *), comme dans la majorité des exemple qu’on peut trouver.

        Après, il est vrai qu’il est possible "d’alléger" le code en utilisant un autre algo pour construire mes chaines de caractères. Mais bon, je doute que le problème vienne de là (ou pas).

        Publié par Tibrol | 2 février 2012, 8 h 34 min
  3. @Skywood : Je pensais que ce petit tuto m’étais destiné car je t avais posé cette question dans le 1er tuto, mais je vois que tu fais 2 heureux ! Merci à toi. (je n ai pas eu le temps de tester la config du registre du NRF pour la portée)

    @Tibrol : Je crois que nous cherchons à faire la meme chose ! A savoir que je récupère les téléinfos Edf sur le compteur. (En ce qui me concerne, ces infos me permettrons, entre autrechose, de gérer au mieux mes chauffages electriques)
    Si tel est le cas on peut peut etre échanger nos mails et nos code !

    @+
    FLY

    Publié par fly | 6 février 2012, 19 h 47 min
  4. Bonjour,

    Question bête : tu envois 12 bytes dans ton sketch, combien peut on en envoyer au maximum à la fois? 32 c’est ca?

    @+
    Fly

    Publié par Fly | 9 février 2012, 0 h 30 min
  5. J’utilise votre code pour les modules NRF24l01 depuis ce printemps pour mesurer des températures et intensités chez moi. Cela fonctionne très bien.
    Il y a une semaine, j’ai découvert ce code lié à une librairie RF24 http://www.bajdi.com/rf24-library-revisited/.
    Non seulement, ce code n’a pas fonctionné, mais maintenant, le retour au code d’origine ne fonctionne plus. Je cherche depuis une semaine sans succès. (j’ai fait un software reset, comme expliqué par vous sur le forum français d’Arduino), j’ai utilisé d’autre carte Arduino, que j’ai bloqué les une après les autres. Avez-vous une idée ?
    J’en profite pour vous souhaiter une excellente année 2013.

    Publié par Bodinier | 2 janvier 2013, 11 h 49 min
    • >> Non seulement, ce code n’a pas fonctionné, mais maintenant, le retour au code d’origine ne fonctionne plus. Je cherche depuis une semaine sans succès.

      La librairie "à problèmes" RF24 est elle toujours installé ?
      SI oui il suffit de la désinstaller complétement et "au cas où" de réinstaller la librairie Mirf d’origine.
      Il n’y a pas de raison qu’un code qui marchait ne marche plus du jour au lendemain.

      >> J’en profite pour vous souhaiter une excellente année 2013.

      De même :)

      Publié par skywodd | 2 janvier 2013, 12 h 12 min

Rétroliens/Pings

  1. Ping : [Tutorial] Le Nrf24L01, l’Arduino et le MSP 430. | B@ttoMicro - Microcontrôleurs et compagnie ! - 27 mars 2013

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Archives

Wow. Dogecoin. Amaze.

Laissez un tip en Dogecoin

DMMNFk6WBVTpx2Wu1Z35GL61QXSd6r6WQx

Suivre

Recevez les nouvelles publications par mail.

Joignez-vous à 678 followers