{"id":822,"date":"2019-12-25T22:53:24","date_gmt":"2019-12-25T22:53:24","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=822"},"modified":"2020-11-04T15:17:13","modified_gmt":"2020-11-04T15:17:13","slug":"arduino-comunicacion-inalambrica-con-nrf24l01","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/arduino-comunicacion-inalambrica-con-nrf24l01\/","title":{"rendered":"Arduino: Comunicaci\u00f3n inal\u00e1mbrica con NRF24L01"},"content":{"rendered":"

La funci\u00f3n de este art\u00edculo es ofrecer una explicaci\u00f3n sobre c\u00f3mo establecer una comunicaci\u00f3n inal\u00e1mbrica entre dos placas Arduino usando el m\u00f3dulo transceptor NRF24L01<\/strong>.<\/p>\n

\"\"<\/a><\/p>\n

La primera comunicaci\u00f3n inal\u00e1mbrica que explicar\u00e9 ser\u00e1 b\u00e1sica: enviar un simple mensaje de texto, tipo \u00abHola Mundo\u00bb<\/em><\/strong>, de un Arduino a otro.<\/p>\n

A continuaci\u00f3n podremos extender este ejemplo de comunicaci\u00f3n al env\u00edo de comandos de texto \u2014usando el mismo circuito y estructura de programa\u2014 para controlar un sistema cualquiera ubicado en el extremo receptor.<\/p>\n

M\u00e1s adelante ofrecer\u00e9 un art\u00edculo con un ejemplo de comunicaci\u00f3n bidireccional entre placas Arduino. Un Arduino tiene conectado un potenci\u00f3metro con el que se controla un servo en el segundo Arduino. Y en el otro sentido, unos interruptores en el segundo Arduino servir\u00e1n para controlar LEDs en el primero.<\/strong><\/p><\/blockquote>\n

M\u00f3dulo transceptor NRF24L01<\/strong><\/p>\n

En la imagen se observa el m\u00f3dulo transceptor NRF24L01<\/strong><\/a>. Utiliza la banda de 2,4 GHz<\/strong> y puede operar con velocidades de transmisi\u00f3n de 250 kbps<\/strong> hasta 2 Mbps<\/strong>. Si se usa en espacios abiertos y, con menor velocidad de transmisi\u00f3n, su alcance puede llegar hasta los 100 metros. Para mayores distancias, hasta 1000 metros, existen m\u00f3dulos provistos con una antena externa en lugar de una antena trazada sobre la misma placa, como se observa en la imagen.<\/p>\n

\"\"<\/a><\/p>\n

El m\u00f3dulo puede usar 125 canales diferentes, lo que da la posibilidad de tener una red de 125 m\u00f3dems que funcionen con independencia uno de otro en un solo lugar. Cada canal puede tener hasta 6 direcciones, es decir, cada unidad puede comunicarse con hasta otras 6 unidades al mismo tiempo.<\/p>\n

\"\"<\/a><\/p>\n

El consumo de este m\u00f3dulo es de alrededor de 12 mA durante la transmisi\u00f3n, un valor menor al de un LED encendido. El voltaje de operaci\u00f3n del m\u00f3dulo es de 1,9 a 3,6V, pero lo bueno es que los dem\u00e1s pines toleran la l\u00f3gica de 5V, por lo que podemos conectarlo sin problemas a un Arduino sin necesidad de un convertidor de niveles l\u00f3gicos.<\/p>\n

\"\"<\/a><\/p>\n

Tres de estos pines son para la comunicaci\u00f3n SPI<\/strong>: MOSI<\/strong>, MISO<\/strong> y SCK<\/strong>, que deben conectarse a los pines de la interfaz SPI del Arduino. Se debe tener en cuenta que diferentes placas Arduino pueden tener los pines del interfaz SPI<\/strong> en diferentes posiciones. Los pines CSN<\/strong> y CE<\/strong> se pueden conectar a cualquier pin digital de la placa Arduino, y su funci\u00f3n es configurar el m\u00f3dulo en modo de espera o activo, as\u00ed como para alternar entre modo de transmisi\u00f3n o de comando. El \u00faltimo pin, IRQ<\/strong>, es un pin de interrupci\u00f3n que no es necesario utilizar.<\/p>\n

Una vez conectados los m\u00f3dulos NRF24L01<\/strong> a las placas Arduino, llegar\u00e1 el momento de escribir los programas para el transmisor, y para el receptor.<\/p>\n

Conexionado para utilizar Arduinos Uno R3 en ambos lados de la comunicaci\u00f3n:<\/strong><\/p>\n

\"\"<\/a><\/p>\n

C\u00f3digo para los Arduino<\/strong><\/p>\n

Primero debemos descargar e instalar la librer\u00eda RF24<\/strong><\/a><\/strong>.<\/p>\n

Aqu\u00ed est\u00e1n los dos c\u00f3digos para la comunicaci\u00f3n inal\u00e1mbrica y abajo, en los archivos, hay amplias explicaciones. He puesto la mayor parte de las explicaciones dentro del programa, como comentarios.<\/p>\n

C\u00f3digo del Transmisor<\/strong><\/p>\n

\/* Comunicacion inalambrica con NRF24L01 Arduino \r\nEjemplo 1 \u2013 Programa para el Transmisor\r\nLibreria: \r\nTMRh20\/RF24 https:\/\/github.com\/tmrh20\/RF24\/ *\/\r\n\r\n\/* Debemos incluir la libreria SPI basica y la \r\nlibreria RF24  que ya hemos instalado *\/\r\n#include \r\n#include \r\n\r\n\/* Crear un objeto RF24 al que llamaremos \u201cradio\u201d. \r\nLos dos argumentos que se utilizan en la funcion \r\nson los numeros de pin que vamos a usar para CS y CE. *\/\r\n  RF24 radio(7, 8); \/\/ CE, CSN\r\n\r\n\/* Creamos una matriz de bytes que represente la \r\ndireccion con la que se reconoceran entre si los \r\ndos modulos. Podemos cambiar el valor de esta \r\ndireccion a cualquier conjunto de 5 letras y\/o \r\nnumeros. Esta direccion permite elegir con que \r\nreceptor vamos a comunicarnos. En nuestro caso, \r\nusaremos la misma direccion tanto en el receptor \r\ncomo en el transmisor. *\/\r\n  const byte identificacion[6] = \"00001\";\r\n\r\nvoid setup() {\r\n\/* En la seccion de configuracion debemos inicializar \r\nel objeto \u201cradio\u201d *\/\r\n  radio.begin();\r\n\r\n\/* Mediante la funcion radio.openWritingPipe(), \r\nestablecer la direccion del receptor al que \r\nenviaremos los datos. En este ejemplo, la cadena \r\nde 5 caracteres que hemos configurado. *\/\r\n  radio.openWritingPipe(identificacion);\r\n\r\n\/* Configuramos el nivel del amplificador de potencia,\r\nusando la funcion radio.setPALevel(). Mientras \r\nestemos a este nivel de prueba, es decir prototipos \r\nsobre la mesa de trabajo, lo establecemos al minimo, \r\nya que los modulos estaran cerca el uno del otro. \r\nSi se utiliza un nivel mas alto, se recomienda \r\nutilizar capacitores de filtro entre las entradas \r\nGND y 3,3 V de los mdulos para que su voltaje se \r\nmantenga m\u00e1s estable durante el funcionamiento. *\/\r\n  radio.setPALevel(RF24_PA_MIN);\r\n\r\n\/* La funci\u00f3n radio.stopListening() cumple la de establecer al m\u00f3dulo como transmisor. *\/\r\n  radio.stopListening();\r\n}\r\n\r\nvoid loop() {\r\n\/* Creamos una matriz de caracteres a la que \r\nasignamos el mensaje \"Hola mundo\" o cualquiera \r\nque usted desee enviar. *\/\r\n  const char texto[] = \"Hola Mundo\"; \r\n\r\n\/* Usando la funcion radio.write() se env\u00eda el \r\nmensaje al receptor. El primer argumento es la \r\nvariable que deseamos enviar. *\/\r\n  radio.write(&texto, sizeof(texto));\r\n\/* El simbolo \u201c&\u201d delante del nombre de la variable \r\nestablece un indicador que apunta a la variable \r\nque contiene los datos que queremos enviar y, con \r\nel segundo argumento, establecemos la cantidad \r\nde bytes que se van a usar de esa variable. En \r\neste caso, la funcion sizeof() nos devuelve la \r\ncantidad total de los bytes de la cadena \"texto\". *\/\r\n\r\n  delay(1000); \/\/ Un segundo (1000 milisegundos) de espera entre env\u00edo y env\u00edo\r\n}\r\n<\/pre>\n

C\u00f3digo del receptor<\/strong><\/p>\n

\/* Comunicacion inalambrica con NRF24L01 Arduino \r\nEjemplo 1 \u2013 Programa para el Receptor\r\nLibreria: \r\nTMRh20\/RF24 https:\/\/github.com\/tmrh20\/RF24\/ *\/\r\n\r\n\/* Debemos incluir la libreria SPI basica y \r\nla libreria RF24 que ya hemos instalado *\/\r\n#include \r\n#include \r\n\r\n\/* Crear un objeto RF24 al que llamaremos \r\n\u201cradio\u201d. Los dos argumentos que se utilizan \r\nen la funcion son los numeros de pin que \r\nvamos a usar para CS y CE. *\/\r\nRF24 radio(7, 8); \/\/ CE, CSN\r\n\r\n\/* Creamos una matriz de bytes que represente la \r\ndireccion con la que se reconoceran entre si los \r\ndos modulos. Podemos cambiar el valor de esta \r\ndireccion a cualquier conjunto de 5 letras y\/o \r\nnumeros. Esta direccion permite elegir con que \r\nreceptor vamos a comunicarnos. En nuestro caso, \r\nusaremos la misma direccion tanto en el receptor \r\ncomo en el transmisor. *\/\r\nconst byte identificacion[6] = \"00001\";\r\n\r\nvoid setup() {\r\n  Serial.begin(9600); \/\/ Iniciamos la comunicacion serie hacia el Monitor Serie en la PC\r\n\r\n\/* En la secci\u00f3n de configuracion debemos \r\ninicializar el objeto \u201cradio\u201d *\/\r\n  radio.begin();\r\n\r\n\/* En el receptor establecemos la misma direccion \r\nque en el transmisor usando la funcion \r\nradio.setReadingPipe() y asi queda habilitada \r\nla comunicacion entre los dos modulos. *\/\r\n  radio.openReadingPipe(0, identificacion);\r\n\r\n\/* Configuramos el nivel del amplificador de potencia,\r\nusando la funcion radio.setPALevel(). Mientras \r\nestemos a este nivel de prueba, es decir prototipos \r\nsobre la mesa de trabajo, lo establecemos al minimo, \r\nya que los modulos estaran cerca el uno del otro. \r\nSi se utiliza un nivel mas alto, se recomienda \r\nutilizar capacitores de filtro entre las entradas \r\nGND y 3,3 V de los mdulos para que su voltaje se \r\nmantenga mas estable durante el funcionamiento. *\/\r\n  radio.setPALevel(RF24_PA_MIN);\r\n\r\n\/* La funcion radio.startListening() establece al \r\nmodulo como receptor. *\/\r\n  radio.startListening();\r\n}\r\n\r\nvoid loop() {\r\n  if (radio.available()) {\r\n  char texto[32] = \"\"; \r\n\/* Creamos una matriz de caracteres donde recibir el \r\nmensaje *\/\r\n\r\n  radio.read(&texto, sizeof(texto)); \/\/ Esperamos que llegue algo por RF desde el m\u00f3dulo\r\n\/* El s\u00edmbolo \u201c&\u201d delante del nombre de la variable \r\nestablece un indicador que se\u00f1ala a la variable que \r\ncontiene los datos que queremos enviar y, con el \r\nsegundo argumento, establecemos la cantidad de bytes \r\nque se van a usar de esa variable. En este caso, la \r\nfuncion sizeof() nos devolvera la cantidad total de \r\nlos bytes de la cadena \"texto\". *\/\r\n\r\n  Serial.println(texto);\r\n\/* Enviamos lo que hemos recibido al Monitor \r\nSerie en la PC *\/\r\n }\r\n}\r\n<\/pre>\n

Una vez cargados ambos programas, podemos abrir el monitor serie en el Arduino receptor y observaremos la aparici\u00f3n del mensaje \u00abHola Mundo\u00bb cada 1 segundo.<\/p>\n


\n
\n

CONTROL INAL\u00c1MBRICO A DISTANCIA<\/strong><\/p>\n

Esta prueba consiste en tener un Arduino (con el programa TRANSMISOR<\/strong> listado m\u00e1s abajo) conectado a la PC a trav\u00e9s de USB \/ Conexi\u00f3n Serie, con el Monitor Serie del IDE de Arduino abierto (Herramientas > Monitor Serie<\/strong>) y asignado en el COM que corresponde, y transmitiendo en forma inal\u00e1mbrica los caracteres que son tipeados dentro de este Monitor.
\n