Panel de Control (Parte 4): Electrónica

mayo 23, 2018 circuiteando 0 Comments

En esta entrada voy a explicar los componentes electrónicos que se ha utilizado durante el proyecto y los que han quedado al final, ya que se han diseñado varios prototipos en placas perforadas para tratar de utilizar los mínimos pines posibles, como leer solamente por una entrada analógica y utilizar resistencias para asignar un voltaje diferente a cada interruptor, o conectar varios chips expansores de puertos y controlarlos mediante un solo bus de datos. Pero al final el experimento no ha dado los resultados que se querían y se han descartado esas placas.

Microcontrolador


Para el celebro del panel he escogido un ARM Cortex-M3, exactamente este modelo:  NUCLEO-L152RE,

Lo he escogido principalmente porque  la gama L son de bajo consumo, tiene menor potencia que el M4, que era desproporcionado para este proyecto, aunque quizás éste también lo esté, sobre todo en memoria ram y flash. Y a que lo tenían en stock donde lo compré a buen precio y me lo mandaban de inmediato.

Debo decir, que he seguido un consejo que he leído en los foros de desarrolladores de ARM Cortex-M. Y es que es mucho más sencillo desarrollar el firmware en un micro con potencia y recursos superiores a los necesarios y después en una versión final, una vez que se sabe con certeza los recursos que consume, pasarlo a un micro de prestaciones más reducidas.

Si empezamos por un micro más ajustado en cuanto a prestaciones nos podemos encontrar con que no son suficientes, quedando sin memoria RAM y originando problemas aleatorios y añadiendo problemas a los propios del desarrollo, como darnos cuenta que no posee potencia de calculo suficiente para ciertas tareas, etc...

También hay que saber que pasar de un micro ARM Cortex-M a otro es bastante sencillo, ya que comparten la misma arquitectura e instrucciones. Están diseñados para programarse enteramente en C (incluidas las rutinas de servicio a la interrupción) y poder portar fácilmente su código a micros menos potentes o más potentes, dependiendo de los cambios que se quieran hacer durante el desarrollo o mejora del dispositivo. Pudiendo incluso elegir un micro de otro fabricante, ya que estamos hablando de una arquitectura en común, cada fabricante añade alrededor de ella sus propios periféricos. A su vez tienen que seguir unos mismos criterios en cuanto a las librerías (drivers) que acceden a ellos (APIs muy parecidas). Lo que facilita lo dicho anteriormente.


Alimentación y filtrado de encoders

Conversores 12VDC-5VDC y filtros para encoders

La placa de alimentación se ha hecho en una placa perforada. En ella se conecta en la entrada 12 VDC y mediante dos conversores DC-DC en paralelo se pasa a 5V y 2 Amperios.

La salida de 5V se utiliza para alimentar un HUB USB donde se conectan todos los componentes que utilicen ese bus.

En la otra parte de la placa hay montados unos filtros RC para limpiar la señal de los encoders.

Esquema de los filtros en el datasheet

A continuación se muestra una captura del osciloscopio con la señal de los encoders sin filtrar:


Sin filtrar

Y tras pasar la señal por los filtros:


Filtrada

HUB USB

HUB USB


La función del HUB USB es la de concentrar todos los dispositivos USB y solo utilizar un puerto para su conexión con el ordenador.

Anteriormente se vio como las dos botoneras utilizan un puerto cada una, y si le añadimos la de la placa central, necesitaría tres puertos USB. De esta manera solo se ocupa un puerto en el ordenador. Y se utiliza el puerto libre del HUB para alimentar a las placas Nucleo.


Fuente de alimentación


Alimentación

La sección de alto voltaje (240 VAC) la componen una fuente conmutada que transforma los 240VAC a 12VDC, que alimenta a la placa alimentación anteriormente descrita y la controladora de vídeo de la pantalla, un conmutador de encendido/apagado y un fusible de 1,5 A.

La fuente de alimentación es de 25W y dispone de protecciones contra sobretensión, sobrecarga y temperatura excesiva.

La fuente trabajará de forma holgada, ya que la pantalla consume un poco menos de 12W y la electrónica no llega a 5W (siendo la iluminación de las botoneras los que más consume).

Para el conector de alimentación se ha utilizado uno estándar que se utilizan en los ordenadores, monitores, impresoras, etc..., por lo que no tendremos problemas en encontrar un cable para el panel.



Controladora de vídeo y pantalla


Como se necesitaba mostrar vídeo dentro de las dos botoneras, así como exportar ciertos instrumentos del simulador, se tenía que utilizar un monitor adicional.

El problema era que tenía que caber en el panel. La solución fue recurrir a un panel LCD para portátiles de 15", ya que hay en abundancia y su precio por lo tanto es muy bajo (entre 30 y 40 euros). Y al ser solamente el panel, su grosor es muy reducido.

Una ventaja de comprar uno moderno con tecnología LED es que no utiliza alto voltaje para la retroiluminación, lo que es mucho más seguro a la hora de su montaje y consume menos energía. Y se se rompe, podemos encontrar un repuesto fácilmente. El utilizado en el proyecto me costó solamente 30 euros.

Para controlar el panel LED LCD se ha utilizado una controladora de vídeo que admite entrada en VGA, DVI y HDMI, conectándolo mediante un flex al panel. Estas placas son genéricas y se encuentran a la venta en páginas chinas, en éste caso en Ebay por otros 30 euros aproximadamente.

Lo primero que se hizo fue medir su consumo junto con el monitor y comprobar la temperatura del chip principal.
Después de 30 minutos alcanzó la temperatura de 60 ºC cosa que me pareció un poco alta y seguramente con el tiempo ese exceso de calor acortaría la vida de la placa, por lo que se instalaron un par de disipadores y se consiguió bajar la temperatura unos 10 ºC.



Temperatura excesiva para mi gusto
Montados disipadores para memoria RAM de una tarjeta gráfica vieja.

Mini joystick


Mini joystick de un kit Arduino Uno

El panel necesitaba un componente que está formado por cuatro interruptores que van montados en una sola palanca, y se activan en forma de cruz.
Al no encontrar un componente así, se ha utilizado un mini joystick de los que vienen con en los kits de Arduino.
A este se le ha alargado el eje mediante un tornillo, y se le ha colocado un capuchón de goma para ocultarlo.

Tornillo a modo de palanca
Con capuchón de goma

Para alcanzar la misma funcionalidad, se ha programado de forma que al desplazarse cada eje un cierto valor con respecto a la posición central, se manda un código diferente. Y una vez se activa, no realiza ninguna acción si se desplaza erróneamente el eje en otra dirección hasta que no se vuelve a la posición central.

Modificación de los rotatorios


Otro problema que se encontró es que los rotatorios que pude conseguir estaban conectados internamente en grupos. Por ejemplo, en el rotatorio de 12 posiciones supuse que podía conectar un terminal por un lado y girando el eje se podía conectar a 12 contactos diferentes. Pues no, internamente estaba dividido en cuatro grupos de tres contactos, de forma que un contacto común solo puede conectarse a tres posiciones y si se sigue girando empieza por el primero de nuevo. Esto se debe a su construcción, como se puede observar en la imagen inferior.

Interior de un rotatorio de 12 posiciones

Internamente hay cuatro "chapitas" metálicas que giran simultáneamente y ésto es lo que causa el problema.

La solución para conseguir seis posiciones diferentes es la siguiente:
  • Se retiran dos de las chapas de forma que al girar se pueden seleccionar 6 posiciones hasta que la otra chapa se sitúe en la primera posición de nuevo.
Detalle de la sujeción mediante cuatro clips de plástico
Cuidado con que la bola no salga disparada al desmontar
Se retiran dos de las "chapitas"
  • Se bloquea el eje a 6 posiciones mediante la arandela que lleva con una pequeña traba metálica.
  • Se sueldan dos de los terminales comunes entre sí, ya que las pistas metálicas tienen la longitud para 3 posiciones.
De esta manera se consigue tener un solo cable común que se conecta a 6 posiciones diferentes y consecutivas.
Si se quisiera disponer de las 12 posiciones o que se pueda configurar de 2 a 12 con un solo cable común, se dejaría solo una chapa, se soldarían todas las patillas comunes (4 en este caso) y se utilizaría la arandela para bloquear el eje en el nº de posiciones que se quisiera.


Intento fallido con placas expansoras


En un primer momento se pensó en utilizar expansores de puertos mediante SPI.
Tras montar las siguientes placas perforadas:

Placa para 32 entradas, expansores 5 y 6 (x2)
Placa para 48 entradas, expansores 0 a 2
Parte trasera de una placa expansora

No se consiguió hacer funcionar de forma correcta, de forma aleatoria se mandaban códigos no válidos (se corrompían los datos).

Después de muchas pruebas se descartó que fuera problema de los integrados, de hecho con solo 2 funcionaba perfectamente, pero al añadir más surgían los problemas. Puede ser a causa de que la comunicación se realiza con cables aéreos, seguramente si se montaran en una placa de circuito impreso se solucionarían los problemas, aunque consultando por internet se comenta que estos chips tienen sus peculiaridades y no encontré nadie que utilizara tantos expansores a la vez, por los que descarte esta solución.

Nota: Tiempo después de terminar el panel, leyendo el magnífico libro de The Art of Electronics (Third Edition), me dí cuenta que el problema era no utilizar una línea de transmisión para los datos (transmission line, el artículo en inglés está mejor explicado). Por ejemplo, terminales diferenciales (como el USB), utilizando un cable plano como mínimo. 
Utilizar cable sueltos es una mala idea, son básicamente antenas que recogen el ruido eléctrico e impiden la comunicación, además las señales wifi de 2.4 Ghz también meten bastante ruido si no se utilizan las técnicas correctas (cables diferenciales, cables blindados, etc...).


Intento fallido. 21 entradas con 1 pin

21 entradas mediante 1 pin

Otro intento de ahorrar pines fue utilizar un array de resistencias y un puerto analógico de forma que al pulsar cualquiera de los 21 botones, éste ocasionaría un voltaje diferente. Se le asignó una rango a cada uno y se dividió de forma equitativa.
El problema que surgió fue el ruido, no el del propio conversor ADC, si no el provocado por los rebotes al pulsar los botones, que hacían que según se pulsara se mandaba el código del botón adyacente o el suyo propio.

Por lo tanto se descarto esta placa también, aunque se vio que si se utilizaban menos entradas y se aumentaba la diferencia entre un tramo y otro, al cambiar el valor de las resistencias, el ruido no afectaba al tramo siguiente.


Un pin por rotatorio


Al final se ha utilizado lo visto anteriormente para los rotatorios, ya que los mismos tienen como mucho 6 posiciones.
Se han soldado las resistencias directamente entre los pines de los mismos.

Rotatorio terminado con las resistencias soldadas

De este modo solo un cable va al microcontrolador y dependiendo de la posición del rotatorio cambia el voltaje que va al ADC. Además se trata de mejorar la lectura mediante software, se toman varias medidas y se realiza la media, para disminuir el error y ruido en la medición.

Placas Nucleo en sustitución de las expansoras


Para sustituir a los expansores, que al final no dieron en resultado esperado, se han utilizado varias placas Nucleo del mismo modelo. De esta forma solo hay que realizar pequeños cambios en el firmware de la placa principal y reutilizarlo en las demás.

La comunicación se realizará por puerto serie y se implementará un sistema de control de errores para asegurarse que no se procesan datos corruptos a causa de la transmisión.

Placa Nucleo L152RE

En la conexión final con el ordenador se ha utilizado el chip USB de una placa Arduino Uno para pasar del puerto serie del microcontrolador maestro a USB. Esto me ha permitido solucionar un problema con los drivers de las placas Nucleo en Windows 7, que hacían que se desconectaran cada cierto tiempo del ordenador. Con los drivers de Arduino no he tenido ningún problema.

Placa Arduino Uno (Solo se utiliza el chip USB)


En la siguiente entrada continuaré con el firmware de los microcontroladores.

0 comentarios: