Reloj de cuco basado en tormentas mentales de Lego

Hace dos años y medio compré el kit Lego Mindstorms EV3 para dar mis primeros pasos en robótica. Después de enrollar el conjunto ev3dev en el controlador y jugar lo suficiente con el motor SSH y el control del sensor, me enfríé para comprarlo durante dos años. La razón era que no tenía suficiente imaginación para hacerlo posible: después de varios modelos ensamblados de Lego Technics (tanto en caja como caseros), ya estaba acostumbrado a los milagros como juguetes controlados a distancia y robots simples como Los modelos de Lego presentados en la exposición de Cracovia, como una persona que solía trabajar en un sistema de telemecánica, ya no inspiraban suficiente inspiración. Realmente no quería repetir la experiencia de otro.

Al final, me di cuenta: un reloj de cuco podría convertirse en un modelo bastante complejo, interesante, práctico y no demasiado trillado. Inspirado por esta idea, me puse manos a la obra.

Según mi idea, el modelo se convertiría no solo en un juguete, sino en un dispositivo totalmente funcional. Esto era completamente posible: el reloj se cuelga en mi pared y muestra la hora actual en modo 24/7. No me propuse la tarea de reproducir el mecanismo del original en todos los detalles; por ejemplo, las flechas son independientes, el sonido se reproduce a través del altavoz del controlador y los pesos y el péndulo se usan exclusivamente para el entorno. Tras haber transferido, por lo tanto, todo el trabajo principal a la parte del software, ensamblé el mecanismo en la versión más simple posible. No documenté todo el proceso de ensamblaje, por lo que no puedo ensamblar el modelo nuevamente de la misma forma; Sin embargo, los principios básicos del software y la mecánica de emparejamiento son tales que el programa debería funcionar con modificaciones mínimas en otros modelos ensamblados de acuerdo con un principio similar.

Los relojes en varias formas se presentan en el video que publiqué en Youtube:


La información básica sobre el modelo se presenta en el video. A continuación, le contaré con un poco más de detalle sobre la mecánica, el software y los problemas que surgieron durante el ensamblaje y la operación de este diseño.

La mecanica


El montaje de la parte mecánica tomó 6 días. Después de colocar las cajas de Lego sobre la mesa, durante las vacaciones de Año Nuevo, armé un mecanismo que difiere de la versión final solo en las puertas detrás de las cuales vive el cuco (más sobre esto a continuación). No tengo habilidades especiales de diseño, por lo que el reloj es una caja rectangular con dos manos y una esfera marcada con puntos en la parte frontal. En la parte superior del reloj hay un compartimento cerrado por dos puertas, en el que se ha asentado el cuco, y en la parte inferior hay un péndulo esquemático y dos pesas. Se tomaron piezas de varios juegos de Lego: un Lego Mindstorms EV3 (31313) , dos motoniveladoras Volvo (42030) , un camión Mercedes con pluma neumática (42043) y una grúa (42009) . A pesar de la abundancia de juegos, apenas había suficientes detalles para un modelo de este tamaño: la cubierta del reloj está ensamblada a partir de tiras de diferentes colores, lo que, sin embargo, no llama la atención, ya que con una instalación montada en la pared está por encima del nivel del ojo.

Como minutero, se usa la barra estándar de Lego Technics para 15 unidades. Se coloca en el eje, conectándolo firmemente al motor. Por lo tanto, la precisión de configurar la manecilla de minutos resultó ser suficiente para que pudiera usarse para determinar el tiempo exacto en minutos. La manecilla de la hora es más corta y está montada en un mecanismo giratorio. Está conectado al motor a través de varios engranajes, por lo que hay una reacción bastante notable, sin embargo, no es tan grande como para causar problemas para determinar el tiempo.

Las manecillas son accionadas por dos motores grandes (LM). Además, emparejado con cada una de las manecillas externas, otra funciona, la interna: para la manecilla de minutos, se fija en el mismo eje que la primera, y para el reloj, el mecanismo giratorio se duplica en el interior del reloj. El propósito de las flechas internas es presionar el botón (sensor táctil) mientras se pasan las flechas externas por la posición superior. Por lo tanto, el controlador tiene la capacidad de determinar la posición de las flechas inmediatamente después de encender, y establecer su posición correcta en función de la hora del sistema, evitando que el usuario tenga que ingresar manualmente las flechas.

Las pesas tienen una función puramente decorativa. Inicialmente, pensé en hacer un peso, que bajaría lentamente (como en un reloj normal), y luego subiría rápidamente a la posición superior (análogo al devanado manual de un reloj de péndulo). Posteriormente rechacé esta opción por varias razones. En primer lugar, el mecanismo de cambio de la relación de transmisión entre el motor y el peso agregó una complejidad adicional al modelo (y el accionamiento del péndulo desde el mismo motor solo lo aumentó). En segundo lugar, un delineador rápido, sea lo que sea que se diga, será una operación ruidosa, pero quería que el reloj funcionara lo más silenciosamente posible. En tercer lugar, en un reloj de cuco convencional, generalmente hay dos pesos (uno proporciona el reloj, el segundo, el cuco), y colocar en la parte inferior del reloj inmediatamente dos ruedas giratorias para la cadena conduciría a un aumento aún mayor en el tamaño del modelo.

Partiendo de esto, tomé un camino más simple: en realidad instalé dos pesas en el reloj, pero las coloqué en un circuito común lanzado sobre una sola rueda motriz. En esta versión, los pesos siempre se mueven en direcciones contra el clima, descendiendo a su vez. Este comportamiento tiene poco que ver con los relojes de péndulo reales, pero parece bastante interesante.

La cadena está hecha de adornos ordinarios de tres unidades que usan una combinación de ejes y pistones: un pistón deslizante es una pieza bastante rara, y utilicé los ejes para duplicar la longitud de la cadena resultante. No fue tan fácil hacer una rueda que mueva dicha cadena sin deslizamiento y averías, pero al final, fue posible.

En cuanto a cambiar la dirección de movimiento de las pesas, mi primera idea fue hacerlo puramente mecánico: cuando se levanta a la pared inferior de la caja del reloj, el eje ancho montado directamente sobre el peso presiona la placa a través de la cual pasa la cadena y hace que la rueda gire. Iba a utilizar el elemento de conmutación de la misma manera que, por ejemplo, la grúa 42009 : la rueda motriz, que cambia, entra en el embrague con el vecino derecho o izquierdo. Sin embargo, esta idea no funcionó: la placa de presión llevó la parte deslizante a la posición central cuando no estaba enganchada con el vecino derecho o izquierdo, el par de torsión dejó de llegar a la rueda y el interruptor se congeló en la posición central.

Para corregir esta situación, decidí agregar un triángulo móvil a este circuito, cuyos dos lados tendrían una longitud fija, y el tercero estaría representado por una parte deslizante con resorte utilizada en la suspensión de la misma grúa. El significado de este diseño era que el triángulo siempre está en el lado del panel de presión que corresponde al peso de elevación: cuando el peso alcanza la parte superior, el panel presiona el triángulo, el resorte se comprime, el triángulo pasa a través de la posición de equilibrio y luego "tira" al otro lado, liberando energía almacenada por un resorte. Se suponía que esta energía, según mi plan, desplazaría el interruptor de velocidad a la posición de equilibrio, traduciéndolo inmediatamente a la posición opuesta.

Sin embargo, no pude estabilizar este sistema. Por el tamaño del reloj, puedes entender que los mecanismos en miniatura no son lo mío, pero con un aumento en el tamaño del nudo, las distorsiones que surgen en él conducen a la fricción, que consume la mayor parte de la energía de conmutación. Después de haber sido atormentado con este mecanismo, finalmente decidí trasladar todo el trabajo sucio al microcontrolador instalando un botón sobre los paneles de presión (sensor táctil) en lugar de la mecánica compleja.

Un poco de aritmética simple. El EV3 tiene cuatro entradas y cuatro salidas. Dos entradas y dos salidas ya estaban ocupadas por botones y motores de flecha, respectivamente. Agregar a este circuito un motor que gira la rueda de la cadena y dos botones significaba que, en primer lugar, no tenía puertos libres para conectar el sensor de posición del cuco (pensé usar un medidor de distancia óptico para este propósito), y en segundo lugar, que Los nodos restantes (cuco y péndulo) tienen un solo motor. Pensé en la opción en la que ambos paneles de presión sobre los pesos se conectarían a un botón común, pero lo rechacé, porque si al momento de encender el reloj uno de los pesos estaría en la posición superior, manteniendo presionado el botón, el reloj no tendría suficiente información para seleccionar Dirección de movimiento de la cadena.

Como el péndulo era más fácil de asociar con el mecanismo de movimiento de la cadena que con el cuco (tanto en términos de su naturaleza de movimiento como de ubicación), coloqué otro motor grande en la parte inferior del cuerpo, que, en primer lugar, impulsa el péndulo hacia adelante y hacia atrás (1 revolución del motor se traduce en un giro completo del péndulo), y en segundo lugar, a través de un engranaje de reducción, gira la rueda, que impulsa la cadena. Tal sistema tiene la desventaja de que al invertir la dirección del movimiento de la cadena y, en consecuencia, la rotación del motor, el péndulo también cambia la dirección del movimiento, incluso si está en una posición intermedia, que puede parecer fea. Sin embargo, cambiar la dirección del movimiento de las pesas es una operación bastante rara, por lo que descuidé este problema. Otro inconveniente de mi ensamblaje es el juego bastante reemplazable en la unidad de péndulo, por lo que cuando se mueve lentamente, el péndulo se detiene en un punto inferior durante una fracción de segundo para un ojo notable. Fui demasiado vago para solucionar este problema.

Hablando de la velocidad del péndulo. Después de experimentar con él, elegí un valor de 30 grados del motor por segundo. Esto significa que el péndulo oscila completamente en 12 segundos. Sin embargo, esto es mucho, a medida que aumenta la velocidad, el motor comenzó a aullar y la posibilidad de escuchar continuamente su canción no me sonríe en absoluto. Era demasiado flojo pasar por el mecanismo e introducir una sobremarcha, así que me decidí por un formato tan "lunar". Las relaciones de transmisión entre el motor y la rueda de transmisión de la cadena son tales que el peso pasa de la posición inferior a la superior en 40-50 minutos.

Permaneciendo libre después de todas las manipulaciones anteriores, el puerto EV3 ocupó el motor central (motor medio), que impulsa al cuco. El cuco en sí está ensamblado a partir de partes de la misma técnica de Lego. En altura, el ave alcanza las 11 unidades y se coloca en una barra retráctil (en estos en la grúa de camión mencionada anteriormente, se colocaron paradas remotas). Un mecanismo en miniatura introduce una transmisión entre las alas del pájaro y su cola, a través de la cual lancé un cable fijo dentro del reloj. La longitud del cable se elige de modo que el cuco se vaya completamente con las alas hacia abajo y solo al final del movimiento se separó ligeramente. Resultó atmosférico, justo al nivel de la mecanización de los modelos de relojes simples. La ausencia de un sensor de posición se compensa con el hecho de que el accionamiento del cuco se enciende a través del engranaje deslizante; ayuda a no dañar el motor, incluso si intenta mover el cuco más allá de los puntos límite. Las puertas están firmemente conectadas al tablón en el que se fija el pájaro, y se abren simultáneamente con la salida del cuco.

Inicialmente, utilicé 11 por 5 para paneles de 1 unidad como puertas, pero resultó ser una mala idea: sus bordes no estaban redondeados, y las puertas, que se aferraban a partes adyacentes, a menudo se bloqueaban, dejando el cuco adentro. El video muestra la segunda versión del ensamblaje de la puerta: los adornos comunes con bordes redondeados no causan tal problema. Además, la versión de "tablón" de la puerta se abre y cierra mucho más silenciosamente.

El reloj está montado en una correa atornillada a la pared. Toda la estructura pesa más de un kilogramo.

Sobre esto, la descripción de la parte mecánica, en principio, termina. Solo queda mencionar que el modelo está 100% ensamblado de Lego Mindstorms y Lego Technics, y la única parte que no se aplica a estos kits es el cable de alimentación, que solde a mi EV3, para no tener que cambiar las baterías todo el tiempo. Este cable va a la fuente de alimentación conectada a la toma de corriente.

El programa


El ensamblado ev3dev proporciona carpetas para muchos lenguajes de programación. Para no tener dificultades con el ensamblaje, decidí limitarme a un script de Python. Este script está disponible en el repositorio de GitLab . A continuación, explicaré brevemente su funcionalidad.

El código que mueve las flechas es relativamente simple: recalcula los minutos y las horas en los grados de rotación de los motores utilizando datos sobre el número de grados del motor por revolución de la flecha y el desplazamiento inicial de la flecha desde la posición vertical. Toda la diversión comienza cuando el programa intenta obtener estos datos.

Como ya dije, se decidió abandonar la conexión manual del tirador. En cambio, al inicio, el reloj realiza la calibración determinando los parámetros de geometría. La calibración se realiza para ambas manos independientemente una de la otra.

El algoritmo de calibración es el siguiente. Primero, el motor comienza a girar a una velocidad relativamente alta (uso un valor empírico de 180 grados por segundo) hasta que llega una señal de confirmación desde el botón que fija la posición superior de la flecha. Después de eso, el motor restablece la velocidad a 30 grados por segundo y continúa girando la flecha en el sentido de las agujas del reloj (la dirección de rotación del motor se cose en el programa) hasta que se separa del punto de la última apertura del botón en 70 grados. Después de eso, la flecha pasa a través de la posición superior en la dirección opuesta, fijando el primer cierre y la última apertura de los contactos (el botón puede traquetear en las posiciones de los bordes). Alejándose de la última abertura en los mismos 70 grados, la flecha cambia nuevamente la dirección del movimiento a la línea recta, y se repite el procedimiento para registrar el primer circuito y el último circuito.

Se cree que la posición superior de la flecha corresponde a la media aritmética entre los cuatro valores así obtenidos. La práctica muestra que esta aproximación es bastante buena: la desviación de la posición objetivo de la manecilla de minutos con respecto a la real rara vez es más de 1 paso y casi nunca excede los dos pasos. (El video muestra desviaciones más significativas debido al hecho de que con el propósito de disparar traduje la hora del sistema, y ​​las manecillas se movieron más rápido que durante la operación normal, aumentando el error de corrección en cada revolución, ver más abajo). Para el juego en el sentido de las agujas del reloj, el contragolpe consume precisión, pero el algoritmo, por supuesto, usa el mismo.

Después de calcular la posición superior de la flecha y la diferencia entre el primer encendido del sensor y en realidad la posición superior de la flecha (este valor será necesario para la corrección, ver más abajo), el algoritmo de calibración aumenta nuevamente la velocidad del motor a 180 grados por segundo y repite la búsqueda de la posición superior. La diferencia entre dos posiciones superiores consecutivas determina la longitud de un giro completo de la flecha en unidades de rotación del motor. El procedimiento de búsqueda de la posición superior se repite cinco veces, lo que nos permite promediar los valores obtenidos y aumentar ligeramente la precisión.

Una vez completada la calibración, las manecillas pasan al modo de visualización de la hora actual. Además, en cada círculo de la flecha, el algoritmo fija la posición en la que el interruptor automático se cerró por primera vez. La diferencia entre los ángulos de rotación real y esperado del motor en este momento es la cantidad de corrección; Por lo tanto, incluso si la longitud del círculo completo no se calculó correctamente en la etapa de calibración (la salida de depuración muestra que la desviación rara vez excede 1 grado), la corrección en cada círculo no permite que la flecha se mueva debido a la acumulación de errores.

Tenga en cuenta que la única información sobre la relación del motor y la flecha, que se cose explícitamente en el programa, es la dirección de rotación del motor (hacia adelante o hacia atrás) correspondiente al movimiento hacia adelante de la flecha. Gracias a los sensores de posición, desaparece la necesidad de datos sobre la relación de transmisión y la posición inicial de la flecha. Por lo tanto, si recolecta un reloj para el cual, además de la hora y los minutos, también se presentará una manecilla de segundos, el algoritmo le permitirá usarlo agregando solo unas pocas líneas, sin perder tiempo contando los dientes.

Lo que falta en el programa de movimiento de flecha es protección contra desbordamiento o pérdida de precisión. No investigué la cuestión de lo que sucederá antes: la profundidad de bits del ángulo de rotación del motor se desbordará, o las flechas comenzarán a moverse bruscamente debido a la salida de precisión en los dígitos más altos del número de punto flotante. Sin embargo, la práctica muestra que en momentos del orden de varias semanas, no sucede nada como esto. Si alguna vez encuentro este problema, lo más probable es que solo agregue un comando de reinicio del motor en cada vuelta, con la corrección correspondiente de los ángulos en el programa.

Si la clase Hand en mi programa es responsable del movimiento de las flechas, entonces la clase LedIndication se ilumina y luego apaga los LED del panel frontal del EV3. Sé que se puede lograr el mismo efecto con un equipo, pero inicialmente esta característica fue diseñada para rastrear bloqueos de programas, y luego se mantuvo. No hay nada más interesante en esta clase.

La clase Pendulum es responsable del movimiento de pesas y un péndulo.El algoritmo simplemente arranca el motor en una dirección y lo gira a una velocidad constante hasta que se aprieta el botón correspondiente a la elevación completa de este peso; después de eso, se invierte la dirección del movimiento del motor.

En esta clase, por cierto, se presenta protección contra bloqueos del programa, que consiste en el hecho de que el motor se enciende durante solo 2 segundos con un período de actualización de comando de 1 segundo. Si encendí el motor en modo de rotación constante, cuando el programa se bloqueó, descansar sobre el botón continuaría moviéndose hacia arriba, lo que podría conducir a una sobrecarga del motor, a un engranaje deslizante o incluso a dañar el mecanismo. La protección le permite evitar este problema.

Finalmente, la clase Cuckoo ejecuta el cuco cada vez que un valor de 59 minutos se reemplaza por un valor de 0 minutos. Primero, se empuja el cuco hasta el fondo, luego el cuco una vez, reproduce el sonido a través del altavoz EV3 y luego se esconde nuevamente en la caja del reloj. El movimiento se repite de acuerdo con la hora actual, de 1 a 12 veces. El sonido fue tomado de la biblioteca gratuita de FreeSound y editado para que suene mejor en EV3. (No puedo decir que estaba satisfecho con el resultado, porque el bajo es casi inaudible cuando se golpea el martillo en la primavera).

La demora entre el comando de eliminación de cuco y el comando de reproducción de sonido se selecciona experimentalmente para que el sonido se escuche aproximadamente en el momento en que el cuco alcanza su posición extrema. Sin embargo, ev3dev tiene un pequeño problema con esto: debido a la carga del sistema, el sonido se retrasa periódicamente, especialmente si hay una conexión SSH con el reloj en ese momento. El retraso puede ser de hasta varios segundos. No estoy seguro de si esto es un problema con mi controlador, la compilación en sí misma o las actualizaciones recibidas de la red (después de instalar ev3dev, por costumbre utilicé el comando apt get upgrade, aunque probablemente no debería haberlo hecho), pero en promedio el cuco suena normal, así que No voy a depurar esta pregunta.

Por cierto, se conectó un error con el retraso del sonido en una de las primeras versiones del programa, cuando aún no había agregado la expectativa del final de la reproducción: si el cuco logró esconderse y reaparecer durante el tiempo de retraso, el siguiente sonido fue "tragado", y el número de "cucos" no coincidió cantidad de horas Más tarde, modifiqué el programa para que el cuco esperara que el sonido terminara en la posición extrema y solo luego se fue para el próximo ciclo.

Los intervalos de media hora son expresados ​​por una sola señal obtenida del mismo sonido original. El cuco no aparece.

La velocidad de rotación del motor que impulsa al cuco y el ángulo de rotación están cosidos en el programa. Al comienzo del programa, el cuco se mete en la caja, teniendo en cuenta el engranaje deslizante instalado en el eje del motor, esta operación es segura, pero tiene efecto si el cuco estaba fuera de la caja en el momento en que comenzó el reloj.

Para no interferir con el sueño, el cuco cuco solo durante el día. Su día de trabajo comienza a las diez de la mañana, y la última vez que dice es a medianoche. También apagué el cuco en un momento en que tengo llamadas semanales de trabajo en Skype, para no interferir.

El programa se instala como un servicio y se inicia cuando se inicia Debian. Por lo tanto, es suficiente para encender el reloj, y ellos mismos lo hacen todo más lejos. Se toma tiempo de Internet: en mi EV3 hay un dongle WiFi. Después de que el reloj ha comenzado, generalmente desconecto la red, para no crear una carga adicional en el procesador.

El programa está disponible bajo la licencia BSD. Si desea construir un modelo similar y utilizar mi software, me alegraré.

Source: https://habr.com/ru/post/es417255/


All Articles