En la actualidad es mucho más sencillo y barato que antes, fabricar dispositivos electrónicos. La mayoría de los equipos que se fabrican ahora son de tecnología digital, y si requieren algún ajuste, casi siempre se realiza mediante un software… los ajustes internos han desaparecido.
La tecnología digital ha permitido también abaratar los costes de desarrollo y producción, hasta el punto que ahora cualquier aficionado a la electrónica pueda disponer de algunos equipos de medida que antes sólo estaban al alcance de los fabricantes.
Ahora es posible disponer de un analizador lógico de 8 canales por menos de 10€, aprovechando como interface gráfico un PC. El uso de un PC en los equipos de medida permite de forma muy sencilla actualizar sus prestaciones, sólo hay que actualizar el software de control en el PC.
Analizador Lógico USB LA1002 de 8 canales 24 MHz
Este analizador lógico permite grabar las secuencias digitales que transmiten los equipos en tiempo real, pudiendo analizar posteriormente los protocolos que utilizan, medir la velocidad de las comunicaciones, comparar señales, etc. Con un analizador lógico se reducen notablemente los tiempos dedicados al desarrollo, y al mismo tiempo sirve para entender mejor los protocolos utilizados en las comunicaciones digitales.
Hace unos meses monté un receptor de radio controlado por Arduino. Este receptor de radio es totalmente digital. Todos sus ajustes y control se realizan mediante el bus de comunicaciones I2C. Para comprender mejor el funcionamiento de un analizador lógico, voy a utilizar este receptor de radio como ejemplo, y voy a grabar las comunicaciones I2C entre el módulo receptor de radio y Arduino, y al mismo tiempo las señales RX/TX de la UART de Arduino.
Bus I2C
Hace unos años publiqué un video dedicado al Bus I2C. En este caso sólo voy a hacer un resumen.
El bus I2C es un protocolo de comunicaciones bidireccional compuesto por 3 hilos, Datos, Reloj y masa (GND). Al ser esta una señal síncrona, controlada por los impulsos del reloj, la velocidad es variable y sólo en casos especiales se superan los 100 KHz.
Ambas líneas permanecen conectadas a nivel alto, mediante resistencias Pull-Up, y son los dispositivos los encargados de cargar las líneas para generar los impulsos. El dispositivo que hace de máster es el encargado de generar la señal de sincronismo (Clock). El dispositivo que envíe los datos, ya sea máster o esclavo, es el encargado de generar la señal de datos.
Los cambios de nivel en el hilo de datos siempre suceden cuando el nivel del hilo del Clock está a nivel bajo. Cuando esto no se cumple, es porque se está generando el bit de Start o el de Stop. Las comunicaciones I2C siempre comienzan con un bit Start, y finalizan con un bit Stop. Cuando el hilo del Clock está en nivel alto y cambia de estado el hilo de datos: si cambia de 1 a 0, es un bit Start y si cambia de 0 a 1 es un bit Stop.
La información se transmite en formato de 8 bits, salvo la dirección que se compone de 7 bit, utilizando el octavo bit como indicación del dispositivo máster, para indicar al esclavo o receptor, si va a transmitir datos a continuación o espera recibirlos de él. En ambos casos, el dispositivo máster genera la señal de reloj y el primer Byte con la dirección.
Con el fin de mantener la comunicación activa, el dispositivo que hace de receptor carga la línea de datos cuando recibe un Byte correctamente, generando así el bit ACK a nivel bajo.
Si el dispositivo transmisor detecta un nivel bajo al finalizar el envío de cualquier Byte, puede continuar con el siguiente, y si recibe el bit ACK a nivel alto, podría reenviar de nuevo la información o finalizar la comunicación generando un bit Stop.
Software: PulseView
El software PulseView es el complemento necesario para controlar el analizador lógico USB LA1002 de 8 canales, y se puede descargar desde el siguiente link: https://sigrok.org/wiki/PulseView
UART y RS232
Las comunicaciones de una UART también es de 3 hilos y bidireccional, pero a diferencia del I2C, la comunicación de la UART es asíncrona. La UART utiliza un hilo para transmitir, otro para recibir y el tercero es el hilo de referncia o GND. Al no disponer de una señal de sincronismo (clock), en el dispositivo receptor es necesario configurar la velocidad y formato de las comunicaciones que utiliza el dispositivo transmisor.
Bit: START/STOP
Para que el dispositivo receptor pueda sincronizar el inicio de cada Byte que recibe, el dispositivo transmisor inserta un bit de inicio y otro de fin, son los bit de Start y Stop. El bit de Stop se puede considerar como un tiempo de inactividad, o pausa entre Bytes. Así el tamaño del bit de Stop puede ser del tamaño de 1 bit de datos, de 1,5 o 2… y no se puede omitir.
Este tiempo de inactividad del bit Stop, aparte de marcar el fin de cada Byte, lo utiliza el terminal receptor para convertir los datos serie de cada Byte en paralelo y almacenarlos en la memoria buffer de la UART. Lo procesadores antiguos, cuando recibían datos a una velocidad alta disponían de muy poco tiempo para realizar todo el proceso de almacenar los datos. Aumentando el intervalo de tiempo entre Bytes (bit Stop), era posible aumentar la velocidad de las comunicaciones serie.
Bit: DATOS
El número de bits de datos de una UART es variable, entre 4 y 8 bits. Lo normal es utilizar el formato estándar de 8 bit, equivalente a 1 Byte. Los formatos inferiores permitían aumentar la velocidad de las comunicaciones en los procesadores antiguos. Por ejemplo, con 7 bits se pueden codificar los primeros 127 caracteres de la tabla ASCII.
El bus I2C envía los datos en serie empezando por el bit más significativo, bit MSB. La UART lo hace al revés, enviando primero el bit menos significativo, bit LSB. Al final del último bit de cada Byte, es posible enviar un bit de paridad.
Bit: PARIDAD
El bit de paridad se puede omitir, a diferencia de los bit Start y Stop que son imprescindibles. El bit de paridad protege ligeramente la integridad de los datos que se reciben, pudiendo omitir los Bytes erróneos. El valor del bit de paridad es necesario definirlo en las comunicaciones:
- (N)one = sin bit de paridad
- (E)ven = paridad PAR … bit de complemento para que el número de unos sea par
- (O)dd = paridad IMPAR … bit de complemento para que el número de unos sea impar
- (M)ark = siempre 1*
- (S)pace = siempre 0*
(*) Permite diferenciar los Bytes de direccionamiento y datos en las comunicaciones RS485 y RS422, cuando se conectan varios dispositivos receptores en paralelo de diferente dirección.
Envío serie: RS232
En este ejemplo un PC transmite el número 5 del teclado por la UART y su interface serie RS232. Cuando el procesador no envía datos el nivel lógico a la salida de la UART es alto (inactividad) , y cuando se transmite un 0 el nivel lógico es bajo.
El interface serie RS232 convierte la señal continua pulsante en otra alterna de mayor nivel, protegiendo así las comunicaciones de posibles inducciones en los cableados. Es importante destacar que el interface serie invierte los niveles lógicos de la UART.
Esta UART está configurada para transmitir a una velocidad de 4800 bps, sin bit de paridad, 8 bit de datos y 1 bit de Stop. En total se envían 10 bits, y se necesita un tiempo ligeramente superior a 2 mSeg. para transmitir un Byte.
Gestión I2C del módulo SI4703 desde Arduino
Si abrimos las librerías del módulo receptor de radio SI4703, podemos ver que en los registros del 0x0A hasta el 0x0F se almacena el nivel de campo recibido, la frecuencia sintonizada y los 64 Bytes de datos del último grupo RDS recibido. Los datos del RDS se guardan en los 4 últimos registros, ordenados y etiquetados con la letra de cada bloque.
Observando la rutina de lectura, comprobamos que siempre envía por I2C los 32 Bytes de los 16 registros, pero empezando por el 0x0A. Así el primer valor leído será el nivel de campo, a continuación la frecuencia sintonizada y el RDS, dejando para el final los registros desde el 0x00 hasta el 0x09. En total se envían por el bus I2C 33 Bytes: 1 Byte de dirección mas los 32 Bytes de los 16 registros.
Decodificación de los datos recibidos por I2C
En la imagen anterior vemos los datos del Bus I2C que Arduino ha leído del módulo receptor de radio (SI4703). He coloreado los paquetes, cambiado el color cada 32 Bytes de datos. Como vimos antes, los primeros 2 Bytes son los del registro 0x0A. El Byte menos siginificativo de los dos es el nivel de campo recibido: 0x33 (hexadecimal) y si los convertidos a decimal serían 51dBuV.
El registro siguiente, el 0x0B, es la frecuencia sintonizada: 0x0023 = 35 decimal. Ahora le sumamos 875 (910) y luego lo dividimos entre 10 para obtener la frecuencia en MHz = 91,0.
A continuación tenemos los 8 Bytes con los datos RDS del último grupo recibido. Si copiamos los 8 Bytes del RDS y comprobamos que tipo de grupo es, podemos decodificar toda la información que contiene.
Por este grupo estamos recibiendo el bit TA, M/S, 1 bit del DI, las 2 primeras letras del PS, 2 frecuencias alternativas, y además el resto de información genérica de todos los grupos RDS: PI, TP y PTY.
Si nos fijamos con más detalle en la captura de datos recibidos por el bus I2C, vemos que cada grupo RDS se está repitiendo 20 veces. Esto es debido a la alta velocidad de lectura del bus I2C, en relación a la velocidad del RDS.
¿Necesitas fabricar un PCB?
Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos (PCB), pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.
Ahora también puedes encargar trabajos 3D, mecanizados con CNC y fabricación de cajas metálicas o de plástico inyectado.