2.control

La idea original fue controlar la maquinaria mediante lógica cableada y relés como el de la imagen lateral. En cuanto empecé a profundizar (apenas estuve 2 años pensando en ello a ratos) me di cuenta de que iba a ser muy complicado y se me iba a multiplicar el coste en tiempo, esfuerzo y dinero.

A propuesta de un amigo, lo siguiente fue pensar en usar microcontroladores o PIC. A grandes rasgos un PIC es un ordenador con un programa que lee datos de unas entradas y genera resultados por unas salidas. Las entradas son terminales donde conectar sensores de cualquier tipo, y las salidas también son terminales donde conectar actuadores (luces, zumbadores, motores controlados directa o indirectamente, y más cosas que no vienen a cuento). Dan mucho juego... pero me parecieron demasiado sofisticados para mi. Descarté la idea al no encontrar ninguno barato con las entradas suficientes como para programar el cogecajas.

Luego se me ocurrió utilizar un PC de esos que se retiran por anticuados: al fin y al cabo no necesito eficacia ni en tarjeta gráfica ni en acceso a disco, así que cualquier patata de hace 10 años me tiene que servir. Estudié conceptos de electrónica digital para comprender qué necesitaba y cómo conseguirlo, sin usar nada más que uno o dos puertos paralelos de PC.

Me atasqué con un problema: para medir la velocidad de los motores necesitaba que fueran dando señales al girar, y medir el tiempo entre señales. Los interruptores que estoy usando tienen una vida útil de unos 100.000 ciclos de trabajo. Según mis cálculos, algunos interruptores tendría que cambiarlos cada 2 o 3 años de uso moderado de la maquinaria, y eso no es admisible. No sólo eso: un sistema de que me diera 2 pulsos por giro del motor estaría bien para bajas velocidades, pero a altas velocidades eso supondría un pulso cada 10 o 15 milisegundos, y los interruptores normales no aguantan ese ritmo.

Arduino Leonardo, algo mejor que el Arduino UNO

Necesitaba células fotoeléctricas cuya vida útil es mucho mayor. Preguntando aquí y allá, un amigo apasionado de los robots luchadores me dijo "quillo, tú necesitas un arduino". El Arduino es un circuito integrado programable (PIC) de código abierto para el que hay montones de complementos en el mercado. El propio PIC es barato, sus complementos también, y la cantidad de documentación disponible en la red es inmensa.

Llevo años dedicando ratos a este asunto, y debo destacar me he visto obligado a pensar procedimientos con auténtica tacañería. Quería usar puertos paralelo, que ofrecen 5 pines de estado (entradas), 4 de control (salidas) y 8 de datos (salida pero también entrada). Había que ahorrar sensores como fuera, a cualquier precio, complicando la programación si fuera necesario. El arduino da más posibilidades, es más flexible, y como además es barato me voy a dar el gustazo de usar 2: uno en el cogecajas y otro en el carro.

Sensor infrarrojo de reflexión

Medidor de distancia por ultrasonidos

LED infrarrojo

Receptor de infrarrojos

Módulo de 2 relés

Módulo bluetooth

Uno de los problemas que más quebraderos de cabeza me ha dado es conectar la maquinaria con el sistema de control: llevar un cable a un carro que va y viene recorriendo unos 7m me ha quitado muchas horas de sueño hasta que se me ocurrió usar un cable festoneado, colgando de una guía superior. Pero hay que recordar que un cable USB no puede tener más de 5m.

Otro gran problema para mi ha sido el transporte de señales de alimentación y control al cogecajas, que sube y baja unos 3,5m. En este caso no hay festón que valga. Una manguera helicoidal puede ser la solución, pero se corre el riesgo de que se desordene al subir desde el punto más bajo y se enganche con algo.

Cómo afrontar el problema

Recordatorio:

  • hay un carro que circula por carriles entre una posición origen (sobre el agujero de paso al desván) y las diversas posiciones de caja.

  • el carro lleva colgado un cogecajas, que sube y baja.

  • el cogecajas se encarga de agarrar y soltar las cajas de mercancía.

El sistema va a contar con dos microcontroladores que se comunicarán por infrarrojos: uno maestro en el carro, y un esclavo en el cogecajas. La alimentación eléctrica llega al carro por un cable colgado de una guía superior, y al cogecajas a través de dos de las cuatro sirgas de las que cuelga. Supone un peligro, pero hay soluciones para evitarlo:

  • puedo llevar por dos sirgas corriente continua de 9V para el microcontrolador, y por las otras dos la de 220V sólo en el momento de alimentar el motor de la garra, avisando con luces, sonidos, o incluso dejando que sea el usuario el que pulsa un botón vistoso para conectar la fase al cable.

  • usar cable de acero plastificado. Para entregarle la corriente puedo conectarlo a una lámina de cobre que rodee el torno sobre el que se enrolla el cable, y a esa lámina le transmito la corriente con un par de escobillas de carbón. Dos mejor que una, para evitar fluctuaciones debidas a mal contacto.

El programa que controle el sistema tiene que ser capaz de:

  • recibir órdenes: se le enviarán desde abajo, con un viejo mando a distancia de infrarrojos de cualquier televisor o similar. No es necesario que el receptor tenga visibilidad desde el mando, pero llegado el caso se puede poner un espejo para que donde quiera que esté el carro pueda recibir órdenes. De esto se encargará en controlador maestro. El uso de infrarrojos se describe más adelante en esta página)

  • llevar el carro hasta una posición de caja: uno de los carriles tendrá plaquitas opacas que serán "vistas" por un sensor fotoeléctrico que llevará el carro con forma de U con un diodo a un lado y un receptor al otro para. Para ir a la posición n sólo hay que contar n-1 interrupciones de la luz para empezar a frenar; cuando llegue a la n-ésima estará a punto de llegar y habrá que ir lo más lento que se pueda: cuando lo abandone hay que parar inmediatamente. Esto es función del controlador maestro.

  • bajar el cogecajas hasta que apoye bien: el cogecajas cuelga de 4 sirgas que se enganchan a soportes móviles que accionan sendos interruptores que pueden detectar apoyo o cuelgue. Los 4 interruptores están conectados en paralelo, y pueden presentar 3 estados una vez estabilizados (ver más adelante disquisiciones sobre los rebotes):

    • se detecta apoyo, y no cuelgue: el cogecajas no está colgando de ninguna esquina.

    • se detecta cuelgue, y no apoyo: el cogecajas está colgado de las 4 esquinas.

    • se detecta cuelgue y apoyo: una o más esquinas cuelga, y una o más no.

El controlador esclavo es el que detecta la calidad del apoyo, y si hay problemas lo comunica al maestro por infrarrojos. Cuando se trate de coger cajas arriba lo puede hacer directamente, y si es abajo es preferible que espere una orden manual o del maestro.

  • pedir al cogecajas que agarre una caja o suelte la que lleve: agarrar una caja puede dar errores debidos a un error de alineación. El cogecajas tiene que ser capaz de saber si una caja está bien cogida o no. Es de vital importancia que bajo ninguna circunstancia se trate de soltar la garra si no hay un apoyo completo. La operación es controlada por el esclavo, que comunicará al maestro el resultado.

  • subir el cogecajas y mantenerlo arriba: subir es casi lo más fácil: sólo requiere comprobar que si la garra está abierta lo esté del todo, si está cerrada lo esté del todo, y que llega hasta donde debe. Otro problema es mantener la caja arriba: una caja quiere bajar, y la vibración puede ser su aliada. Durante el viaje, puede ir cediendo y descolgarse poco a poco, Esto debe ser detectado y resuelto sobre la marcha. Esto es labor del controlador maestro.

  • devolver el carro a la posición origen desde cualquier sitio: el regreso a la posición origen puede hacerse tras haber ido a una posición de caja conocida, pero también cuando se enciende el sistema: el carro puede estar en cualquier lugar, y no sabe cuántas marcas tiene que ver pasar hasta llegar al origen. Con 2 sensores infrarrojos en lugar de uno se puede resolver, pero el algoritmo es complicado y... ¿para qué complicarlo si un medidor de distancias de ultrasonidos cuesta casi igual que uno de infrarrojos? El regreso a la posición de origen se hará a máxima velocidad hasta que el sensor de distancia vea que se acerca.

El ajuste final lo haré con el mismo sensor infrarrojo que busca los marcadores de posición de caja porque no me fío de la precisión del medidor de distancias, que estará a más de medio metro del plano de referencia. La parada se hará en cuanto el sensor "vea" marca de origen, que será de 10 o 15mm. Si el carro está a una distancia compatible con la posición de origen, y se detecta que estamos en una marca de posición significa que está inequívocamente en el origen. Cuando se enciende el sistema hay que llevarlo a una situación conocida, que describo más abajo, en el apartado de inicialización.

  • abortar lo que esté haciendo si detecta un fallo o se le solicita: abortar me supone un problema, porque debe responder a la petición lo antes posible, y eso supone que hay que estar atentos al infrarrojo constantemente, y no sólo cuando no esté haciendo otra cosa. Tengo que madurar la idea, pero una opción es que el botón de abortar sea el propio interruptor de encendido de la maquinaria. O sea: si hay problemas, con apagar es suficiente.

  • informar de lo que vaya ocurriendo para facilitar la depuración del programa: aunque la mayor parte de lo que programe lo probaré sobre una mesa, no me cabe duda de que muchas cosas tendrán que ser probadas sobre la máquina. Más que nada porque el carro no se puede sacar entero de su emplazamiento: sólo sale desmontado. Para depurar, tendré un PC viejo arriba sin teclado ni monitor al que conectaré a través de VNC Viewer (es lento y malo, pero es que Terminal Server no sirve cuando hay USB involucradas). Un cable USB de hasta 5m permitirá que el maestro transmita un registro de actividades que podré ver en el PC. Otra opción es que la transmisión sea por bluetooth, y entonces no debería haber problemas para entrar con Terminal Server.

Esto son ideas. Ya veremos hasta qué punto soy capaz de llevarlas a cabo, porque luego las cosas no son como dice la publicidad. La información más concreta y pormenorizada la voy colocando en los apartados correspondientes (ver índice).

Hay una serie de cuestiones que necesito anotar para que no se me olviden así que las dejo aqui:

Interacción

El sistema debería funcionar en "modo automático" en la medida de lo posible, y aceptar órdenes de alto nivel:

  • inicializa

  • subir caja a posición n

  • bajar caja de posición n

  • para (sólo mientras el cogecajas sube de vacío en la posición de origen)

  • pasa a manual

Por supuesto, hay que verificar siempre que la operación ordenada es compatible con la situación actual. En caso de error o a petición del operador, el programa pasará a "modo manual", admitiendo entonces órdenes como:

  • sube todo

  • baja todo

  • ve al origen

  • ve a la posición n

  • dame hueco (moverse hasta el tope próximo al origen para dejarme pasar)

  • abre

  • cierra

  • para

  • pasa a automático

Posiblemente no haga falta distinguir entre manual y automático en la fase de desarrollo del programa. Después será conveniente implementarlo como protección anti-manazas.

Rebotes en los interruptores

Tendemos a creer que un conmutador está en una posición u otra sin intermedios. Pero cuando lo miramos en intervalos de milisegundos la cosa cambia, porque es posible detectar un instante en el que no da conexión ni a un lado ni a otro. Y lo que es peor: cuando la parte móvil llega al contacto de destino no se queda, sino que rebota varias veces.

Las siguientes gráficas representan lo que ocurre al accionar un interruptor de fin de carrera: el color rojo corresponde a lo que ocurre en el contacto normalmente conectado, y el negro el normalmente abierto. Arriba está el resultado de pulsar, y abajo el de soltar. Los números son milisegundos.

Los altibajos es lo que se conoce como "rebote de contactos". Si mirásemos con un osciloscopio seguramente se vería una línea más suave, pero el PIC tiene que traducir lo que lee a unos y ceros. La conclusión es que no podemos dar por válida una lectura de un interruptor, salvo que se mantenga invariable durante 3 o 4 milisegundos seguidos, o bien haciendo varias lecturas con el mismo resultado a intervalos regulares.

Comunicación por infrarrojos

Si miramos el LED de un mando a distancia por infrarrojos a través de una cámara digital seguramente podremos ver el parpadeo que produce cuando pulsamos un botón, y que no podemos ver a simple vista. Lo que hace un sensor de infrarrojos es ver esa intermitencia y transformarla en señales eléctricas. Cada pulsación de botón provoca una ráfaga de encendidos y apagados. Hay unos cuantos protocolos que no viene a cuenta describir. Unos consisten en emitir pulsos más o menos largos, y otros los emiten más o menos separados. Adicionalmente, pueden enviar un pulso más largo que marca el inicio de la ráfaga.

Para estudiar el tema he mirado lo que pasa con algunos mandos a distancia que tengo por casa. El sensor es una cápsula con 3 patas, una de alimentación, otra de masa y una tercera de señal. En ausencia de actividad, el pin de señal nos da un 1, y al recibir pulsos pasa a 0. Esto es lo que pasa al apretar algún botón en los mandos que tengo:

Los mandos del TIVO y el Media Center siguen un patrón similar: pulso largo, hueco menos largo, y luego pulsos cortos y muy cortos separados por huecos muy cortos. El primer ciclo es el inicio de ráfaga, y a continuación vienen 32 ciclos, en los que los pulsos cortos representan 0 y los largos 1. Esto es el protocolo NEC, y es el más utilizado. La especificación del protocolo habla del tamaño exacto de pulsos y huecos, así como otras convenciones que no vienen al caso.

El mando de TV hace un pulso inicial y hueco más cortos. A mitad de ráfaga hay un pulso y hueco grandes que deben tener algún significado que no he investigado. Las ráfagas son de 18 ciclos, y se repiten 3 veces (en la gráfica sólo pongo una). El mando del aire acondicionado produce ráfagas de 72 ciclos, aunque en la gráfica sólo he dejado la mitad. Imagino que con cada ráfaga envía todos los parámetros: modo del ventilador, temperatura y otros.

Conclusión: no me parece lógico hacer una rutina universal de lectura de mandos a distancia. Cogeré uno cualquiera y adaptaré la rutina de lectura a sus rangos de tiempo. Para la comunicación entre el carro y el cogecajas no se usa un mando, pero adaptaré la rutina de emisión para que sea compatible con el mando que escoja.

Control de velocidad de motores I: conocer su velocidad

Medir la actividad del motor debería ser tan simple como acoplarle un disco opaco con agujeros o decoder, y mediante un diodo y un detector que "se ven" a través de esos agujeros, ir midiendo el tiempo transcurrido entre ellos. Sabiendo cuántos agujeros pasan en cada revolución del motor es fácil conocer su velocidad, pero en el fondo no me interesa: basta con buscar un ritmo óptimo de paso de agujeros del decoder. Si decido que para un motor dado estarán bien 10ms por agujero, el programa ya sabrá que para tiempos menores deberá reducir la corriente, y para los mayores deberá aumentarla para aproximarse al tiempo deseable.

Control de velocidad de motores II: administración de la corriente

La corriente alterna se suele representar mediante una curva sinusoidal, alternando semiperiodos positivos y negativos que en Europa son de 10ms cada uno. El ciclo completo dura 20ms, así que se repite 50 veces por segundo (50Hz).

Una forma de regular la corriente que le damos a un motor es evitando que esa onda sinusoidal le llegue entera. Para eso utilizamos un componente llamado "TRIAC" que en principio no transmite corriente, pero cuando le damos algo de voltaje a una de sus patitas (llamada "puerta") durante un instante, entregará al motor toda la corriente disponible... hasta el final del semiciclo en el que se encuentre. Por ejemplo, si queremos que al motor le llegue la mitad de la corriente tendremos que activar la puerta 5ms después del inicio de cada semiciclo.

El tiempo de retardo necesario para lograr el objetivo de velocidad se calcula en función de la diferencia entre la velocidad deseable y la obtenida. En un principio pensé que bastaría con establecer un número finito de escalones o niveles de potencia y escoger uno que se aproxime, pero creo que es más fácil programar la búsqueda de una velocidad exacta.

Hay una cuestión importante para administrar la corriente con un TRIAC, y es que hay que sincronizar el microcontrolador con los ciclos de corriente alterna. Para conseguirlo se usa la propia corriente de 220V limitada y acondicionada con algo de electrónica para llegar a encender un LED en cada semiciclo, que a su vez activará un detector. El conjunto se llama "optocoplador" y sirve para manejar una corriente mediante otra, pero manteniéndolas aisladas. En este caso, con los pulsos de corriente alterna de 220V que pretendo darle al motor manejaré otra continua de 5V con la que funciona el microcontrolador.

En la práctica, el optocoplador administra el puenteo a masa de una patilla del microcontrolador establecida a 5V: mientras la corriente de la red de 220V mantiene encendido enciende el LED, la citada patilla estará a 0V. Pero cuando el LED se vaya apagando el voltaje subirá. Con ese montaje, sólo falta programar el "micro" para que se ejecute una rutina determinada cuando el voltaje sube en la patilla de control, y filtrar de alguna forma las elevaciones de tensión falsas que pueden deberse a interferencias y molestan sobremanera.

La siguiente gráfica muestra el resultado de unas pruebas que he hecho para medir la evolución del voltaje en la patilla de control con 2 tipos de optocopladores: uno con foto-transistor (4N25) y otro con foto-darlington (4N33) y decididamente me quedo con el primero:

Programación

En el fondo, programar un microcontrolador es administrar pulsos de corriente en función de una serie de estímulos que se perciben repartidos en el tiempo, y esa es la clave del asunto. Es fundamental controlar los tiempos entre acontecimientos: entre pulsos de infrarrojos, entre envío y recepción de ultrasonidos, o entre destellos sobre un fotodetector.

Controlar un sólo aparato es simple, porque el programa espera midiendo el tiempo entre sucesos. La máquina que quiero hacer no pude perder el tiempo esperando porque debe atender simultáneamente varios sensores, y al mismo tiempo tendrá que ir administrando señales para control de velocidad de los motores y/o comunicándose.

La solución pasa por hacer un programa que se dedique a gestionar tiempos. Una rutina que compruebe el estado de un sensor o que decida si tiene que actuar sobre un motor puede tardar del orden de 20 microsegundos en ejecutarse, así que el programa puede hacer 5 cosas a la vez vigilándolas 10 veces por milisegundo: para lo que pretendo es suficiente, pero es un estilo de programación que no tiene nada que ver con lo que he hecho hasta ahora, y se me hace áspero.

Inicialización

El algoritmo de inicialización tiene por objetivo llevar la máquina a una situación estable y conocida partiendo de una situación cualquiera. A falta de repasar todas las posibilidades, podría quedar más o menos así:

  • verificar la comunicación con el cogecajas

  • si el carro no está en el origen

    • si el cogecajas está apoyado

      • mientras el cogecajas no esté abierto

        • abrir cogecajas

    • llevar el carro al origen

  • si el cogecajas está cerrado

    • mientras el cogecajas no esté apoyado

      • bajar cogecajas

    • abrir cogecajas

  • mientras no esté arriba el cogecajas

    • subir el cogecajas

No he contemplado una situación tal que el cogecajas detecte estar cerrado y forzado en cierre, pero sin caja cogida. Puede ser por haber cerrado en modo manual y luego desconectar. O porque haya cogido una caja notándola bien cogida, que se mueva ligeramente durante el viaje como para que se deje de percibir la presencia de caja y se vaya la luz. O porque un gremlin se haya comido parte de la caja y que la otra parte haya caído. Sea como sea, si el portacajas parece cerrado hay que abrirlo cuanto antes, pero sobre todo garantizando un buen apoyo.

Puesto que cualquier acción (vertical, horizontal o de agarre) es capaz de fallar, tiene que haber escapatorias a una gestión de errores que avise de alguna manera y permita tomar el control manual de la máquina.

Resistencias pull-up

En un circuito electrónico encargado de "leer" entradas lógicas hay que asegurarse de que mientras esté desconectado tenga un valor previsible, porque de lo contrario puede estar sujeto a fluctuaciones que generan confusión. Se suele resolver poniendo una resistencia de 10K o más de manera que cuando no hay entrada haya una señal débil conocida, sea a 1 o a 0. Yo las usaré en modo pull-up, así que cuando haya conexión veré un 0 y cuando no un 1. Es porque me da reparo meter una señal de 5V directamente a un pin. Prefiero darle masa, que siempre es menos comprometido.

Puesto que arduino ofrece la posibilidad de implementar por software tanto pull-up como pull-down, usaré ese sistema y me ahorraré poner resistencias. En caso de error... sólo estoy derivando un pin a masa.