domingo, 26 de julio de 2015

módulo NRF24L01

En esta ocación voy a demostrar como se usan los módulos NRF24L01.




Se alimenta con 3,3V (es algo a destacar) pero tolera los 5V de un arduino como señal. Utiliza la interfaz "SPI" para comunicarse y tienen un bajo consumo (se consiguen los NRF24L01+ que tienen significativamente más potencia) que para trabajos de domótica son ideales, además de las librerías (que vienen con algunos ejemplos) les voy a dejar un programa mio que sirva para "chatear" entre 2 computadoras inalámbricamente a través del puerto serie que ofrece el ide de arduino. 

La librería que uso es la MIRF.

El chat es un programa simple, está pensado para comunicar un arduino nano y un mega

También les dejo unos programas para mandar y recibir datos fijos, además del chat en un archivo comprimido.

La idea es que descomenten las partes del código necesarios para el arduino mega o el nano

/*
  Este programa sirve para transmitir y recibir mensajes entre
  2 arduinos, el ejemplo este sirve para un arduino mega a un
  arduino nano. Descomentar según sea el caso.
  V2.5
*/

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

int incomingByte;
byte mensaje[33];

void setup(){
  Serial.begin(9600);

/*
  Mirf.cePin = 48;                          //para arduino mega
  Mirf.csnPin = 49;
*/

/*
  Mirf.cePin = 10;                          //para arduino nano
  Mirf.csnPin = 9;
*/

  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  
/*
  Mirf.setRADDR((byte *)"mega");            //para arduino mega
  Mirf.setTADDR((byte *)"nano");
*/

/*
  Mirf.setRADDR((byte *)"nano");            //para arduino nano
  Mirf.setTADDR((byte *)"mega");
*/

  Mirf.payload = 1;
  Mirf.config();
}

void loop(){
  
  if (Serial.available() > 0)               //emisor 
  {
    Serial.print("yo -> ");
    char mensaje_letra;
    while (Serial.available())
    {
      incomingByte = Serial.read();
      mensaje_letra = incomingByte;
      Serial.print(mensaje_letra);
      Mirf.send((byte *)&incomingByte);
      while(Mirf.isSending());
      delay(3);
    }
    Serial.println(" ");
  }
  
  if(Mirf.dataReady())                      //receptor
  {
    Serial.print("el -> ");
    char mensaje_letra;
    int i = 0;
    byte c;
    while (Mirf.dataReady())
    {
      Mirf.getData(&c);
      mensaje[i] = c;
      mensaje_letra = mensaje[i];
      Serial.print(mensaje_letra);
      i++;
      delay(4);
    }
    i = 0;
    Serial.println(" ");
  }
}





Descargas:


Mirf:




Ejemplos:

4 comentarios:

  1. Hola amigo buenos dias y disculpa que te moleste soy nuevo en esto de arduinoy estoy probando con unos modulos nrf amplificados,quiero probar el codigo que dejas uno para el emisor con el mega y el otro con un uno como receptor,pero el codigo del emisor me sale este error:

    'data' was not declared in this scope

    este es el codigo ayudame no se como solucionarlo aqui te dejo el codigo completo:

    mandar un archivo entre 2 arduinos, en este caso el emisor
    es un arduino mega. Los pines ce y csn son 48 y 49
    respectivamente.
    */

    #include
    #include
    #include
    #include


    void setup(){
    Serial.begin(9600);

    Mirf.cePin = 48;
    Mirf.csnPin = 49;
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();
    Mirf.setRADDR((byte *)"serv1");
    Mirf.payload = 1;
    Mirf.config();
    }

    void loop(){

    data = data + 1;
    Mirf.setTADDR((byte *)"clie1");
    Mirf.send((byte *)&data);
    while( Mirf.isSending() ) ;
    delay(1000);

    }


    le agradesco me pueda ayudar aver si pongo a funcionar estos modulos para un proyecto..

    ResponderBorrar
    Respuestas
    1. Buenas, lo que te está diciendo el error es que no declaraste la variable data. Por lo que parece que querés hacer yo la declararía fuera de todas las funciones (loop y setup) para que quede como variable global. Si ese es tu código, entonces vas a tener que incluir las librerías necesarias (los #include no tinen ningua librería) y si querés incrementar una variable en uno yo usaría la forma "data++;" en lugar de "data = data + 1;".

      Saludos

      Borrar
  2. Buenas,¿este código que has puesto también se puede usar si utilizo una placa mega y otra uno?. Gracias por su ayuda

    ResponderBorrar
  3. si, de echo fue probado de esa forma porque no tenía dos placas iguales. Saludos

    ResponderBorrar