Paso 14: Reunir todo el código
Este es un resumen del código que se ha discutido en los pasos anteriores. Se adjunta mi archivo final para su uso.
El código consta de estas clases
- lápiz óptico
- SVGHandler
- paso a paso
- lightPlotter
- cmdInterface
Clase de lápiz óptico
Esta clase encarga de comunicación con ESP8266 el LED RGB controlado por wifi a través de un interfaz HTML. Tiene tres funciones
setColourRGBTuple() Esta función se utiliza para definir el color actual a un valor RGB proporcionado en la forma de una tupla (R, G, B), donde los valores R, G y B son entre 0 y 255 (base 10 - decimal)
setColourHexString() Esta función se utiliza para definir el color actual a un valor RGB proporcionado en la forma de una cadena hexadecimal '#rrggbb', donde los valores de rr, gg y bb son entre 00 y ff (base 16 - maleficio)
setColour() Esta función se llama setColourRGBTuple o setColourHexString para aplicar el color en los LEDS vía HTML. Si llamamos a esta función directamente entre pasos motor podría retrasar un e interferir con la suavidad de nuestro caminar. Para evitar esto se llama en un hilo, para que se ejecute simultáneamente con el código paso a paso.
Clase SVGHandler
Operación de esta clase se explicó en el paso "Coordenadas XY de un SVG" en definitiva se lee en un SVG (que se supone que tienen objetos de trazado único y lineal de coordenadas absolutas solamente) y los almacena como una lista de coordenadas de inicio y final de líneas, junto con el color de la línea. Los segmentos forman una lista de listas, cada segmento tiene la forma [x 0 y0 x1 y1 RGB]. x e y son coordenadas normalizados flotadores (escalados para que el mínimo es 0 y el máximo es 1).
Clase paso a paso
Esta clase se describe en el paso "Código Python para conducir los steppers". Se encarga de la comunicación I2C con los motores paso a paso y proporciona una función step() simple que mueve el paso hacia delante o hacia atrás un paso a paso.
Clase LightPlotter
La clase de LightPlotter todas estas otras clases reúne en un sistema que puede dibujar con la luz. Durante la inicialización hay unas cuantas variables clave que se configuran
- los dos motores se definen como motor1 (motor izquierdo) y el motor2 (motor derecho), son instancias de la clase paso a paso
- Se define el número de pasos horizontales entre motor1 y motor2 (xRes). Esto debe ser determinado experimentalmente y depende del diámetro de sus poleas y la distancia entre los motores.
- Se define el tiempo de defectos entre pasos (stepTime). un valor de 10 ms (0,01) funcionó bien para mí, pero usted tendrá que determinar qué tan rápido puede caminar sin falta pasos.
- También se define el tiempo de paso máximo (stepTimeMax), pero esto es realmente sólo una seguridad para los cálculos, no tiene una relevancia de hardware, opté por 1 segundo, que nunca fue alcanzado en la práctica.
- usableArea. Como se describe en el el paso de "Comprender la geometría de una cadena Plotter", las extremidades justo debajo de los motores y directamente entre los motores (en la parte superior) debe evitarse, por lo que definir una variable "usableArea" que es un porcentaje del área teórico. 70% (o 0.7) es un buen punto de partida.
- A veces puede que desee cambiar su imagen hacia abajo (por ejemplo, a los pies de un personaje en el piso), la variable "yOffset" se encarga de esto
Son funciones de la clase lightPlotter
- setOrigin
- goTo
- runSteppers
- stepMotors
setOrigin() se utiliza para indicar el luz plotter que está actualmente en (0,0) que se utiliza en la calibración.
runSteppers() es una función de conveniencia que se lleva en una serie de pasos que debe girar cada motor, así como el intervalo entre pasos para cada motor. Con hilos los dos motores son capaces de ser caminado al mismo tiempo.
goTo() toma un (X, Y) coordinar y calcula el número de pasos que cada motor tiene que mover para conseguir el LED a esa ubicación. Además determina el retraso entre las medidas para velar por que ambos motores al mismo tiempo para llegar a su destino. Una vez que estos datos se calculan, goTo() hace uso de la función runSteppers() para obtener los motores móviles.
cmdInterface clase
Esta clase hace uso de Python muy cool módulo "cmd" lo que nos permite construir fácilmente una interfaz de línea de comandos para nuestro plotter de luz.
Funciones que llevan el prefijo "do_" se pueden llamar desde la línea de comandos cuando se ejecuta el script. Puedes ver que todos ellos se corresponden casi directamente a las funciones de las distintas clases, en la mayoría de los casos incluyen un bit de comprobación de errores para asegurarse de que las discusiones son sanas. El paso de "Cómo usar el sistema" describe cómo utilizar estos.
- do_plotsvg
- do_movesteps
- do_invertMotor
- do_disableMotor
- do_enableMotor
- do_setrgb
- do_goxy
- do_goxyrgb
- do_setusable
- do_setorigin
- do_setyoffset
- do_exit