lunes, 23 de febrero de 2015

MSP430: nRF24L01+

En este capítulo, vamos a trabajar con el dispositivo externo nRF24L01+ de la empresa Nordic Semiconductor. Dicho dispositivo es un trasnciver, es decir, un dispositivo que puede actuar tanto de receptor como de transmisor de paquetes/datos de forma inalámbrica y cuya comunicación con un microcontrolador es mediante el bus SPI.

La ventaja de este dispositivo, es principalmente su precio (bastante reducido para las prestaciones que ofrece) y que no requiere de muchos componentes externos para funcionar. En el mercado, se pueden encontrar bastantes placas de desarrollo con las que trabajar con el nRF24L01+, en nuestro caso, se ha escogido la que se muestra a continuación:


DISPOSITIVO nRF24L01+



Las principales características del dispositivo nRF24L01+ son las que se muestran a continuación:

CARACTERÍSTICAS nRF24L01+
· Banda 2.4GHz ISM.
· 6 data pipe MultiCeiver.
· Hasta 2Mbps de transmisión de datos.
· 11.3mA TX a 0dBm output power.
· Modos de bajo consumo disponibles.
· 12.3mA RX a 2Mbps air data rate.

Como ya se ha comentado, la manera de comunicarse con el nRF24L01+ es mediante el bus SPI, pero dicho dispositivo incluye un pin más llamado #IRQ que es bastante útil en vistas al ahorro de energía, ya que dicho pin se activará entre otras señales disponibles, cuando se haya transmitido un paquete o cuando se reciba un paquete, de esta manera, podremos disponer nuestro microcontrolador en estado de bajo consumo.

Otras funciones interesantes y a destacar del nRF24L01+ son:

  • ACK Automático: Dicho de otra forma, si se activa dicha función, cada vez que enviemos un paquete y se ha transmitido correctamente y recibido por el receptor, éste le enviará al transmisor un ACK, que podremos leer desde el registro STATUS del dispositivo. En otras palabras, es una herramienta de garantía de que nuestro paquete enviado ha sido recibido por el receptor.

  • Reenvío de paquetes: Si por cualquier motivo, el paquete que queremos enviar no ha sido posible su envío, podemos configurar el dispositivo nRF24L01+ de manera que pueda intentar su reenvío hasta en 15 ocasiones.

Para ver toda la documentación disponible sobre éste dispositivo, el siguiente enlace es el apartado que la empresa Nordic tiene sobre su producto: nRF24L01+.


Y bien, después de una breve introducción del dispositivo nF24L01+, vamos a ponernos a trabajar. Para ello, necesitaremos dos MSP430 Launchpad y en este caso, usaremos el microcontrolador MSP430G2553. Dicho microcontrolador dispone del periférico interno USCI SPI Mode encargado de controlar el bus SPI de manera automática mediante hardware.

El programa que vamos a emplear para tal propósito, consistirá en obtener una lectura del sensor interno de temperatura del microcontrolador cada tres segundos, y una vez obtenida la temperatura, enviarla de forma inalámbrica por medio del dispositivo nRF24L01+.

Como vamos a tener dos placas Launchpad funcionando, uno será el transmisor (leerá la temperatura interna y la enviará por el dispositivo nRF24L01+) y la otra será el receptor (recogerá el paquete recibido por el dispositivo nRF24L01+ y dicho paquete lo mandará al PC mediante la UART).

Tanto el transmisor como el receptor estarán en modo bajo consumo, en este caso, el transmisor estará en el modo LPM3 y el receptor LPM4.


Para el receptor, el envío de paquetes se usará el conversor USB <---> RS-232 que vamos a usar, es uno externo, concretamente el CP2102 (enlace del fabricante).

El material que vamos a necesitar y su función, es la que se muestra a continuación:

· MSP430 Launchpad: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430G2553 (dos placas, una será el transmisor y otra el receptor).

· Módulo B75937: Conversor USB <---> RS-232 externo basado en el dispositivo CP2102.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con sistema operativo Windows con al menos, la versión.NET Framework 4.0. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware.

· nRF24L01+: Dispositivo externo capaz de establecer comunicación inalámbrica. Necesitaremos dos de ellos.


En este caso, habrá dos códigos fuentes, uno para el transmisor y otro para el receptor, os pondré aquí el código del receptor y más abajo, en el área de las descargas, podréis obtener ambos firmwares como las librerías necesarias para controlar el dispositivo nRF24L01+:


/**
* @file     main.c
* @author   Manuel Caballero
* @date     17/2/2015
* @brief    Archivo principal.
* \copyright
*
*         AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*  http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/

#include < msp430.h >
#include < stdint.h >
#include "variables.h"
#include "funciones.h"
#include "interrupciones.h"
#include "NRF24L01.h"



/**
 *  \brief     void main( void )
 *  \details   Este programa consiste en leer datos de forma inalámbrica usando el dispositivo
 *          nRF24L01+.
 *
 *          Una vez lea dichos datos, se mandarán por la UART activándo el LED1 ( LED Rojo de
 *          la Launchpad ).
 *
 *          El microcontrolador estará en modo bajo consumo ( LPM4 ) y no despertará hasta que el
 *          dispositivo nRF24L01+ indique que ha recibido datos para leer.
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      17/2/2015
 *  \pre       El código presente es SOLO para el RECEPTOR.
 *  \pre       El dispositivo nRF24L01+ se conecta al periférico USCI_B0 en modo SPI del microcontrolador.
 *  \pre       Asegurarse de que el LED1 ( LED Rojo ) está conectado al pin P1.0.
 *  \pre       Asegurarse de que que concuerden las siguientes señales:
 *
 *       - CE   ( nRF24L01+ ): P2.0
 *       - CSN  ( nRF24L01+ ): P2.1
 *       - #IRQ ( nRF24L01+ ): P2.2
 *
 *  \pre       Code Composer Studio, Version: 6.0.1.00040.
 *  \pre       C Compiler, MSP430 GCC GNU v4.9.1.
 */
void main( void )
{
  conf_WDT      ();         // Configura WDT del sistema
  conf_CLK      ();         // Configura CLK del sistema
  conf_IO       ();         // Configura Entradas/Salidas
  conf_SPI_B0   ();         // Configura USCI_B0 --> SPI
  conf_UART     ();         // Configura Uart

  nRF24L01_init ();     // Configura nRF24L01+


  __enable_interrupt();     // Interrupciones ON.


  while(1)
  {
     LPM4;

     P1OUT   |= BIT0;      // LED1 ON

     pBuff   =  nRF24L01_WriteRead (R_REGISTER, R_RX_PAYLOAD, 0, 2); // Lectura del nRF24L01+ ( 2-Bytes )
     nRF24L01_reset ();               // Reset a flags ( registro STATUS )

     TX_Buff  = 1;
     IE2     |=  UCA0TXIE;  // Interrupción Tx ON ( empieza a enviar paquetes por la UART )
  }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430: nRF24L01+ & UART
Compilador IARCompilador MSPGCC
CC
MSP430: nRF24L01+ 
MSP430: nRF24L01+
MSP430: nRF24L01+
MSP430: nRF24L01+

· NOTA 1: En caso de que en el Software empleado  no reconozca ningún puerto COM, es síntoma de que no se tiene los drivers necesarios del dispositivo CP2102, por lo que se deberán instalar para un uso correcto, ya que el ordenador no lo reconoce.

· NOTA 2: En este capítulo se han usado imágenes de terceros recogidas de Internet.

· NOTA 3Ahora, en el archivo a descargar, a parte del programa con todas las librerías necesarias empleadas para este programa, se han añadido toda la documentación en formato doxygen.

8 comentarios:

Anónimo dijo...

Muy buena información sobre estos módulos!! La verdad es que tienen muchas funcionalidades. Yo estoy empezando a utilizarlos ahora con IAR. ¿podrías subir los códigos fuente correspondientes? No funcionan los enlaces. Me serían de gran ayuda! Muchas gracias de antemano ;)

Unknown dijo...

Buenas:

Es cierto que éstos módulos nRF24L01+ son bastante útiles y baratos.

Respecto a los enlaces, solo están disponibles los del compilador MSPGCC con el Code Composer Studio, pero se pueden usar perfectamente con IAR ya que el código respeta el ANSI C.

Solo tendrías que adaptar la declaración de las subrutinas de interrupción.


Un saludo.

Anónimo dijo...

Muchas gracias, pensaba que habría que modificar muchas más cosas. Gran trabajo el que haces!
Un saludo

Unknown dijo...

hola que hizo un gran trabajo. Será de gran ayuda para mí, ya que soy principiante con el lenguaje C para micontroladores. si no se abusa de usted podría ofrecer el esquema de conexión con nRF24L01 + msp430g2553, hacer fasso idea de cómo proceder, mi correo electrónico es ail_tons@hotmail.com
Gracias

Unknown dijo...

Buenas Ailton:

La conexión están en el código:

- CE ( nRF24L01+ ): P2.0
- CSN ( nRF24L01+ ): P2.1
- #IRQ ( nRF24L01+ ): P2.2


Un saludo.

Ferro dijo...

Estimado, excelente trabajo!
La verdad que estoy probando y no logro realizar la comunicación del ejemplo.
El receptor nunca sale de LPM4, aparentemente el transmisor transmite correctamente, pero el receptor no genera la interrupción para salir del modo LPM4.

Seria mucho pedir si me envia en un Zip el proyecto completo del code composer studio?

Unknown dijo...

Buenas Ferro:

Comprueba bien tus conexiones, seguramente el problema venga de ahí. Lamentablemente no puedo enviarle el proyecto completo ya que hace bastante tiempo que lo hice. A ver si tengo algo de tiempo y reviso las librerías para este dispositivo para rehacerlas desde cero.

Un saludo.

Sr. Gold dijo...

Disculpe las molestias pero tengo problemas para descargar el codigo, espero no abusar y pedirle si pudiera otorgarme un link directo?
Por su atencion, gracias.