Transceiver de 433Mhz , ARDUINO y C#

0
276
Transceiver RF USART TTL
Transceiver RF USART TTL
GARD Pro Not Registered
Los Transceivers son dispositivos de comunicación que analizaremos en esta entrada para poder  aplicarlos a nuestros diseños en la banda de  433 MHz.

La integración de los sistemas constituyen la base fundamental para el desarrollo de proyectos actuales. Una aplicación puede constar de varios campos disciplinares de conocimiento que involucran plataformas de desarrollo de Hardware con microcontroladores , electrónica en general, técnicas y lenguajes de programación, plataformas de desarrollo de software y sistemas integrados o IDE’s , lenguajes como java, C, C++, C#, php, Html, también es necesario campos de conocimiento en redes y protocolos de internet y comunicación, sistemas de modulación y demodulación, transceptores, radio frecuencia, etc. El proyecto es una integración de varios elementos de Software y Hardware. El proyecto se trata de obtener la Temperatura, Humedad e Intensidad lumínica en un punto remoto y enviarlas por radio frecuencia a nuestra PC , quien muestra dichos parámetros en una interfaces gráfica. También es posible activar y desactivar un led del punto remoto desde la consola gráfica. Si bien la comunicación es por radio frecuencia se implementa un protocolo “Polling” entre la PC y el remoto. Un transceiver es un transceptor , es decir un dispositivo que tiene la capacidad de transmitir y recibir datos , independientemente el medio físico por el cual lo haga, sea cable, radio frecuencia, microondas, fibra óptica, etc. La idea general en esta entrada es aprender a usar esto dispositivos sumamente útiles para la adquisición remota, se irán explicando las diferentes etapas del proyecto y les dejaré el código y sus características. No realizaré un análisis profundo del código para no aburrir ni extenderme ya que el proyecto completo posibilita varias entradas. Sin mas….. manos a la obra.

Elementos

Los elementos a utilizar son los siguientes:

  • Arduino Uno
  • Shield propio construido para el montaje de sensores y módulos
  • Módulo FTDI 232 TTL
  • Módulo transceiver HC11 RF USART 433 Mhz
  • LDR , led y resistencias
  • Módulo DHT11
  • Batería de 9 v
  • Visual Studio 2010 C#
Dispositivos

Vamos a comenzar describiendo el hardware utilizado del lado PC y del lado remoto. De lado de nuestro Host o PC se utilizará el FTDI 232 TTL que es un conversor serial TTL interface 232 a USB que será visto desde el C# como un puerto COM disponible, este módulo se conectará al HC11 o transceiver de RF lo que permitirá enviar y recibir los datos a 9600 bds entre la PC y el remoto.

Transceiver RF USART TTL
Transceiver RF USART TTL
Conversor USB -232 TTL
Conversor USB -232 TTL

 

FTDI USB 232 TTL

El esquema de sus pines es el siguiente:

USB 232 TTL
USB 232 TTL

Los pines que comúnmente se utilizarán son VCC(+5V), GND o masa, TX transmisión de datos asincrónicos formato 8N1 ( 8 bits datos, No de paridad, 1 bit de Stop), RX recepción de datos. DTR y CTS son señales del protocolo 232 que no las vamos a usar. DTR: Data Terminal Ready , es una señal de control TTL de dos estados LOW o HIGH. HIGH indica al dispositivo conectado al FTDI que está listo o ready y en este estado al dispositivo conectado puede enviarle o recibir datos desde el FTDI, LOW es Not Ready. CTS o Clear To Send es una señal TTL que el dispositivo conectado al FTDI setea a HIGH al FTDI para indicarle que va a enviarle datos. En este caso CTS es señal de entrada y DTR de salida del FTDI. Se usa mucho para lo que es control de flujo entre dispositivos y que no es nuestro caso. Generalmente los dispositivos tienen Buffers para enviar y recibir datos y puede ocurrir que alguno de ellos no haya procesado sus datos y ante nuevas recepciones el buffer este lleno, en estos casos es necesario controlar el flujo de los datos mediante estas señales para indicarle al dispositivo emisor que deje de enviar. Lo importante es que no vamos a usarlas ya que estas señales se heredan del protocolo 232. El fabricante ha decidido volcar estas dos a los pines de salida, no obstante el resto de las señales de protocolo están accesibles en el mismo módulo pero habrá que soldar sus pines. Estas señales así como otras que van a encontrar dentro de este módulo forman parte de lo que se llama el HandShaking de 232. En este proyecto no son necesarias por varios motivos, el fundamental es que el control de flujo de datos, lo vamos a realizar mediante la técnica de Polling, donde el maestro envía un requerimiento de datos y espera respuesta. El FTDI 232 USB es un módulo que incluso traen los primeros Arduino Uno para utilizar el monitor clásico que utilizamos con la instrucción Serial.println() y println() clásicas, esta es la manera que tiene Arduino de enviar datos, variables, texto, etc al monitor de consola. Existen muchos otros tipos de módulos que realizan esta función de diferentes fabricantes. Lo importante es que se necesita descargar el driver de acuerdo al módulo utilizado. Para este caso los drives se pueden descargar del sitio de FTDI Lo que hay que descargar son los CDM drivers , incluso hay una guía de instalación de acuerdo al sistema operativo que se utilice teniendo en cuenta para Windows 32 / 64 bits. Les dejo una pequeña imagen para el caso del driver para Windows

GARD Pro Not Registered
Driver Transceivers USB 232 TTL
Driver Transceivers USB 232 TTL
Primera Prueba

Lo primero que haremos es verificar el funcionamiento correcto de este módulo, para lo cual, una vez instalado el Driver hay que proceder a conectarlo al puerto USB. Cuando se conecta pueden suceder dos cosas, la primera es que se instale el driver automáticamente y no revista mas complicaciones, en este caso pueden abrir el panel de control ir a la sección de Administrador de dispositivos y observar donde se indica puertos (COM y LPT) indicando el driver instalado USB Serial Port. Si hacemos click en el nos dice el fabricante FTDI Lo segundo que puede pasar, es que el driver no se instale automáticamente, en este caso habrá que hacerlo manualmente. Si ingresan nuevamente a al panel de control y siguen los pasos anteriores van a divisar que hay un dispositivo conectado y no reconocido con un símbolo amarillo de un signo de pregunta, hacen click derecho y van a update software driver y le dan la ruta manual al directorio donde descargaron el driver. Básicamente es todo.

Instalación Driver TFDI
Instalación Driver TFDI

En este caso, el dispositivo es reconocido como el COM7, pero puede ser cualquier número de COM. El paso que sigue es verificar su configuración 232, es decir velocidad, bits de start, stop, control de flujo, etc. Para esto vuelven al panel de control.

Configurar Driver FTDI
Configurar Driver FTDI

Van a la solapa de Configuración de puerto. Por default está todo a 9600, 8, No FlowControl , 1 y lo he usado de esa manera sin tocar nada, Si modifican la velocidad deberán tenerlo e cuenta para mas adelante. Los pines CTS ( Clear to Send) y DTR (Data Terminal Ready) no se usan en este caso y son señales propias del protocolo 232 . Para probarlo, hacemos un loop entre los pines RX y TX y abrimos una aplicación de terminales o consola. La idea es enviar un carácter o texto y recibir lo mismo. En mi caso utilicé un aplicativo el terminal.exe Pero pueden usar el que deseen y hacer las pruebas de loop. Otro aplicativo de terminal es el putty  . Abrimos el Terminal o el Putty o similar, seleccionamos el COM 7 en mi caso que es el COM del FTDI , configuramos 9600 y enviamos una tira de caracteres o caracteres , deberíamos ver la misma tira en la recepción.

El Transceiver de RF

El HC11 RF USART 433 Mhz es un transceiver de radio frecuencia que brinda la interface 232 TTL con lo cual se puede conectar directamente al FTDI. Este transceiver utiliza internamente un controlador MC68HC11D3 de Motorolla que se encarga por un lado de la interface con las señales 232 TTL y por otro lado con la comunicación con los dispositivos de modulación y demodulación de radio frecuencia en la banda de 433Mhz basado en el CC1101, con sistema de modulación ASK (Amplitude Shift Keying), con lo cual tenemos todo resuelto, todo lo que es sincronización, selección de canales, identificación de remotos, tramas CRC de redundancia cíclica y demás lo resuelve el chip de Motorolla. Esta banda es muy usada y está muy saturada con lo cual el ruido es alto y la discriminación de tramas válidas es una complicación adicional, que no es este caso. Este transceiver se puede configurar usando comandos AT de los módems.

GARD Pro Not Registered
  • Alimentacion: 3.6v – 5v
  • Dimensiones: 13.5×28.2mm
  • Distancia de transmicion: Hasta 200m. (con linea de vision)
  • Conector para antena externa.
  • Compatible con PL2303hx
  • Comunicacion UART

Velocidad de Puerto Serie de 4800 baudios hasta 115200. Veamos el diagrama esquemático de los pines del transceiver:

Transceiver HC11 RF 232
Transceiver HC11 RF 232

El pin SET en LOW es para colocar al transceiver en modo de configuración. Este modulo puede lograr alcances de transmisión de hasta 200m, en ambientes abiertos y con linea de vision. La ventaja mas grande de este modulo la encontramos en que con solo enviarle 4 comandos AT distintos ya lo podemos configurar, aunque en caso de comprar un par, ambos vienen con la misma configuracion de fabrica por lo que apenas los alimentamos ya se pueden comunicar (default: Baud rate: 9600 Channel : 001 Address : 001). El dispositivo acepta 126 canales distintos y 255 direcciones). Una vez configurado SET no se utiliza y se lo deja sin conectar.

Comandos AT

Los comandos AT en realidad es un lenguaje que se utilizaba para configurar módems de telefonía y que ahora sirve para este tipo de aplicaciones. Por mi parte lo he dejado todo por default a 9600 bds id=001 y canal1 . Pero si desean utilizar otros parámetros se haría de la siguiente manera y deberán utilizar una aplicación de terminal, como terminal.exe , putty , o la que prefieran .

  1.  AT

Enviando este comando respondera OK Ejemplo: El modulo transceiver AT devolvera OK

  1.  AT + V

El modulo transceiver responderá la version Ejemplo: enviando AT + V el modulo transceiver devolverá HC-11 _V0.0

  1.  AT + Bxxxx

Este comando es para setear la velocidad del puerto seriel del modulo. Se pueden seleccionar las siguientes:  9600 19200 38400 57600 2400 48000 115 200. Ejemplo 1: Enviando AT + B4800 transceiver devolverá OK-4800 Ejemplo 2: Enviando AT + B115200 transceiver devolverá OK-115200

  1.  AT + Cxxx

Este comando es para configurar el canal. Los diponibles son  desde el 001 hasta el 127. Ejemplo: enviando AT + C058 transceiver  devolverá OK-058 y quedara configurado en el canal 058.

  1.  AT + Axxx

Este comando es para configurar la direccion. Los diponibles son  desde el 000 hasta el 255. Ejemplo: enviando AT + A005 transceiver devolverá OK-A005 y quedara configurado en la direccion 005. Para mayor información pueden consultar este blog de Patagonia La banda de 433Mhz se divide en 127 sub-canales y es seteable via AT, ambos del lado PC y del lado remoto deben ser iguales. El Id o dirección es la identificación del dispositivo para radio frecuencia , y es un numero de 0 a 255, también iguales para ambos. Imaginen varios remotos conectados cada uno con una dirección diferente, solo el que posee el mismo direccionamiento que viene en la trama de RF enviada por el transceiver maestro (lado PC) demodulará la trama ya que interpreta que es una trama direccionada a este remoto. Si el maestro desearía comunicarse con otro remoto diferente, debería entrar a configuración, setear el ID deseado, salir de modo AT y enviar los datos. En la actualidad esto se resuelve colocando a todos los remotos con el mismo ID pero en la trama que envía el maestro colocar el direccionamiento y de esta manera los remotos saben para quien va dirigida la trama.

Segunda Prueba

Seguimos avanzando y lo que deseamos ahora es verificar que los transceivers funcionan. Para esto del lado de la PC o maestro conectamos de la siguiente manera:

Transceiver lado Maestro
Transceiver lado Maestro

El FTDI conectado al USB de la PC ya capta la alimentación del USB y viá pin VCC de salida alimenta al módulo de RF Transceiver. Observar que Rx y Tx van cruzadas De lado remoto solo hay que alimentar un segundo Módulo de RF que será nuestro Remoto y realizar el Loop entre RX y TX, en este caso este segundo módulo, habrá que alimentarlo con 5 volts y GND o masa, pueden usar una fuente externa o usar el VCC y GND de Arduino. Cuando hice la prueba, use dos puertos USB, uno para Arduino para alimentar el transceiver remoto y otro para el FTDI. Ambos transceivers con los mismos parámetros de configuración, velocidad, canal xxx, y Id , todo por default.

Transceiver lado Remoto
Transceiver lado Remoto

Abrimos el Terminal o el Putty o similar, seleccionamos el COM 7 en mi caso que es el COM del FTDI , configuramos 9600 y enviamos una tira de caracteres o caracteres , deberíamos ver la misma tira en la recepción. Si la prueba fue exitosa , en hora buena. Del lado de la PC o Maestro no se necesita nada mas, tan solo construirse una plaquetita para alojar al FTDI y al HC11 conectados como se vio en el maestro. Hasta aquí ya se puede empezar a jugar en serio dado que dispondrán de una forma de conexión inalámbrica entre la PC y un sitio remoto. Lo que viene es la implementación de la aplicación para lo cual ofrezco el esquemático y los códigos fuente del sketch de arduino y el C#. El tutorial se extendería demasiado al explicar las particularidades del código, igualmente para aquel que desee realizarlo, siempre pueden contactarme y podré ayudarles en lo que necesiten.

Arduino Remoto

El remoto lo armaremos con ARDUINO 1, el LDR , el DHT11, el Transceiver remoto y una batería de 9 v. El esquema es el siguiente:

Arduino Remoto con sensores DHT11, LDR y Transceiver
Arduino Remoto con sensores DHT11, LDR y Transceiver

Es de notar que en el Transceiver coloqué solo 4 pines de VCC, GNG, RX y TX , el quinto que es SET para configurar, como no lo usamos no está en el dibujo. Lo importante es tener en cuenta que vamos a usar los pines 2 y 3 de Arduino como el Serial Tx y Rx del transceiver y no los pines 0 y 1 que son para nuestro monitor de Sketches. Otra característica es que Tx y Rx van cruzadas en la definición de los pines. La tabla muestra las conexiones

Tabla de conexiones de la Aplicación
Tabla de conexiones de la Aplicación

DHT11  Es un sensor integrado de Temperatura y Humedad con un protocolo propietario. Es importante entender que hay muchos fabricantes y el pinout puede cambiar, hay modelos de 4 pines ( uno de los cuales no se usa) y hay modelos de 3 pines con lo cual la conexión dependerá del modelo usado. Debemos incluír la librería DHT.h para este dispositivo. Pines : VCC, GND y SIGNAL

DHT11
DHT11

SoftwareSerial Es una librería a incluir en Arduino paara disponer de dos pines, en este caso el 2 y el 3 para implementar una USART por pines diferentes al 0 y 1 para conectar los datos de Arduino con el transceiver remoto. SoftwareSerial.H LDR  Es un sensor del tipo resistivo sensible a la intensidad de luz recivida, su valor ohómico disminuye al aumentar la luz. Los vaalores varían entre unos cientos de Ohms con alta intensidad a Kilo-ohms en bajas intensidades.

Curva LDR
Curva LDR

En nuestro esquema la idea es mostrar la variación de intensidad lumínica y no el valor absoluto, ya que para esto hay que linealizar la curva. Cuando la luz es alta, la Rldr será baja comparada con los 1000 Ohms y el valor en A0 será próximo a los 5 v. Cuando la luz es baja, la Rldr será alta frente a los 1000 Ohms y el valor en A0 se aproximará a los 0v. A0(tensión) = 5v * (1000) / (1000+Rldr)

Software
Interface gráfica C#
Interface gráfica C#

Como les he mencionado, el software tiene algunas particularidades pero sería para plantear en otra entrada en este sitio. Dentro de estas caracteristicas C# trabaja de manera Polling, esto es, trabaja con 2 Timers principales uno de Sampling y otro de Waitt o  Time Out.  Desde C# enviamos cada T Sampling una trama de requerimiento de datos al Arduino y posee el siguiente formato: W001LxZ , donde W indica comienzo de trama y Z fin de trama, 001 aunque no lo utilizo sería el ID del remoto, pero como tengo solo uno, no hace falta verificar. L indica un sub-header del estado del led 13 Arduino que es x. L1 solicita encender led y L0 apagarlo. Una vez enviada esta trama se inicia el Timer Wait que espera la respuesta , si expira dicho timer , la interfaz indicará que no responde el remoto, si la respuesta vino y es válida se indicará respuesta OK. La trama de respuesta es del siguiente formato: TxxHxxLxx , donde T encabezado Temperatura y xx su valor, lo mismo para H Humedad e I intensidad Lumínica. Respecto del sketch de Arduino, se trabaja con el Objeto String , de manera que en la medida que recibe caracteres uno a uno los va concatenando hasta encontrar el fin de trama Z, luego valida la rama completa y analiza si debe encender o apagar el led 13, hecho esto toma los datos de los sensores y los envía. Desde el C# se utiliza el Objeto Serial.Port para manejar la comunicación vía puerto USB emulando un COM serial. El programa detecta el número de COM y lo muestra en la misma interface para seleccionar la conexión, en este sentido es muy dinámico y no requiere importar ninguna librería externa. Van los códigos y espero que les haya gustado. Al final les dejo fotos del proyecto armado y funcionando

Sketch Arduino

 FormSensores.cs

 

FormSensores.designer

Este código lo genera automáticamente el Visual C# en la medida en que se va construyendo el software, pero sirve para conocer el nombre de las variables involucradas en los controles gráficos y van como referencia. También están las declaraciones de los eventos.

 

Maestro y Esclavo juntos
Maestro y Remoto juntos
Interface C# Usuario
Interface C# Usuario
Maestro1
Maestro1
Maestro 2
Maestro 2
Maestro 3
Maestro 3
Remoto Shield + Arduino Uno
Remoto Shield + Arduino Uno
Shield Remoto para Arduino Uno
Shield Remoto para Arduino Uno