Paso 3: Software de Robot
Elijo hacer el esbozo de la robusteza en un solo archivo, que es un poco larga, pero pone todo en un solo lugar. En lugar de caminar a través de la línea por línea SW, sólo comentaré cómo está organizado, y lo que cada sección está enfocada.
El dibujo comienza con el encabezado del comentario estándar y biblioteca de archivos de inclusión. Documento del uso de pin de escudo en el comentario de cabecera para ayudar a mantenerme recto por la utilización de SW de los pernos. Define una estructura de datos que es utilizada por la función PID, con la idea de que esto sería más fácil agregar una segunda cascada velocidad PID más adelante.
A continuación están que las declaraciones de #define para constantes y comúnmente utilizan valores que pueden cambiarse convenientemente. Por ejemplo, una vez que determina lo que el óptimo P, I y D valores para tu robot, puede estar permanentemente recodificadas aquí. Luego vienen las definiciones de variables, que he tratado de agrupar de manera lógica - puede ser el juez de lo bien que hacía.
La sección siguiente contiene las funciones que se utilizan más adelante en el bosquejo. La primera función implementa el equilibrio PID. Este es el SW apalancado pesadamente de tutorial de Brett Beauregard. Dentro de la función PID es una sección para registrar la información de PID a la tarjeta SD si está habilitados el registro de datos. Mientras afina los valores PID, encontré instructivo y entretenido, para ver el comportamiento individual de término PID. Este guarda los datos en un archivo en formato CSV, que yo después importados a Excel y genera gráficas de visualización. Este todos obviamente funciona solo si tienes una SD tarjeta en el tablero de Galileo.
Esto es seguida por algunas funciones de control del motor que información de control del motor a los controles de dirección, velocidad y freno para el escudo del motor
El siguiente es una función para recuperar los datos de posición desde el módulo del MPU-6050. Robó esto con orgullo desde el código de referencia de Jeff Rowberg. Estoy usando un método de extracción de datos del intervalo de regular para transferencia de datos, más bien que usando interrupciones como Jeff, como tuve alguna dificultad el conseguir de las interrupciones para trabajar. El intervalo de tiempo se implementa en el bucle principal del programa, y que encontré un 3ms intervalo fue adecuado en asegurando que no había ningún desbordamiento de datos.
Luego pasamos a un conjunto de funciones para manejar la comunicación Bluetooth. Estos comienzan con unas cuantas funciones para enviar los comandos más complejos - se explotado en funciones principalmente para la legibilidad del código. Luego viene el analizador de comando principal de Bluetooth, que implementa el protocolo de comunicación de recibir con la aplicación para Android. Esta función acumula personajes del puerto serial Bluetooth hasta que se detecta el carácter fin de comando, y luego descifra el comando. Como era de esperar, el decode termina siendo sólo una gran declaración de caso.
La función final es la máquina de estado de control de alto nivel robot. He implementado el estilo de la finito--máquina de Estados (FSM) - probablemente overkill, pero prevé ampliar a esto se añaden funcionalidades al robot.
El siguiente es la función de configuración requerida por todos los bocetos de Arduino. Los comentarios en el código deben hacer esta sección bastante explica por sí mismo. Hay una sección que intenta inicializar el archivo de la SD para el registro de datos y si saca error si una tarjeta SD no está presente, pero no pasé mucho tiempo validar esto.
Finalmente, es el bucle principal del bosquejo. La primera sección implementa un temporizador de recuperación de datos desde la MPU-6050. Si se recuperan los datos, hay algunos cálculos para detectar si el robot está vertical o fuera de balance.
A continuación se comprueba el puerto serie conectado al módulo Bluetooth carácter recibido, y si uno está esperando, la función Bluetooth se llama.
Esto es seguido por el PID y el temporizador de control de motor. La instrucción "if" asegura que el control PID/motor sólo sucede cuando el robot está activamente tratando de equilibrar. Esto es donde los datos MPU_6050 se alimentación en el PID y la salida del PID se pasa sobre el control del motor. También es donde se implementa la dirección, añadiendo a la entrada de la dirección Bluetooth derivado a un motor y restando del otro. Porque estamos haciendo matemáticas adicional en la salida del PID, tenemos a otra vez restricción que limita el PID Máx/Min para mantener dentro de los valores PWM motor.
Finalmente se llama la máquina de estado de control de robot, y un temporizador se utiliza para implementar la función de golpe de corazón de robot. Empecé con un corazón separado beat Bluetooth comando y comando de voltaje de la batería, pero luego los combinó en una sola función, con la tensión que se envía como una indicación del latido del corazón.
Y es que - un poco largo aliento, pero nada demasiado complejo.