Paso 9: Programar tu Arduino
Todo el código fuente de Arduino está conectado. Si no le interesa modificarlo o aprender cómo funciona, puedes descargar y desplegar. Si desea ver cómo funciona, lea este paso y luego ver el código.
A partir de evt_loop.cpp, el programa primero llama evt_loop_init. Luego, repetidamente llama event_loop_proc indefinidamente, hasta que el Arduino pierde potencia. Mirar estas dos funciones, verás que la mayoría de la Arduino de código se centra en la idea de colas de mensajes . Colas de mensajes son útiles en situaciones donde se necesita un sistema para hablar a otro de una manera asincrónica. En nuestra situación, tenemos un módem Bluetooth que puede recibir datos en cualquier momento. En general, un montón de trabajo va en asegurarse de que los datos nunca se pierde, independientemente de lo que está haciendo el dispositivo cuando el mensaje llega. Afortunadamente, el Arduino Uno tiene un búfer serial hardware integrado de 128 bytes. Puesto que cada uno de nuestros mensajes Bluetooth 1 byte, este buffer será probablemente más que suficiente para nuestra aplicación. Así que nuestra aplicación se encuentra en un bucle, a la espera de un mensaje para entrar desde Bluetooth. En un producto comercial, es típico para el microcontrolador en modo de baja potencia reposo aquí para ahorrar energía. Por simplicidad, no hicimos aquí (véase función de bt_wait_for_msgs de bt.cpp).
Cuando llega un mensaje en el Bluetooth cola (véase función de bt_check_for_msgs de bt.cpp), los datos se leen en y agrega a una cola de mensaje dedicada al manejo de datos desde el módulo de Bluetooth. Hacemos esto porque queríamos que nuestro microcontrolador a ser libres para hacer otras cosas cuando no está procesando mensajes. La cola de mensajes es como un buzón de correo. La próxima vez que el programa tiene la oportunidad, ¡ compruebe el buzón y ver si hay mensajes para él. No usar una cola de mensajes es como gritar fuerte de a través de la habitación. En ese caso, todo tendría que detener y de servicio inmediatamente el comando antes de regresar a lo que estaba haciendo. La función de msgq_push (definida en msgq.cpp) devuelve una variedad de códigos de respuesta (definida en msgq.h) que indican un número diferentes de las condiciones de la cola. Por ejemplo, si el programa nunca revisar su buzón de correo, es posible que esta cola llenar para arriba. En ese caso, el valor de la respuesta indica que la cola estaba llena. Esto permite control de errores, que es una parte esencial del desarrollo de sistemas embebidos.
En evt_loop_proc, el mensaje se lee en una variable local. Además, se pasa un puntero a un tipo de respuesta. El ampersand (&) antes de que el rsp variable significa que la dirección de rsp en memoria está siendo paseed en msgq_pop, en comparación con su valor. Si no han oído hablar de este concepto antes, IBM sabe mucho sobre él, y me encantaría divulgar esa información a usted. Este indicador dice msgq_pop un lugar en memoria donde puede poner el valor de la respuesta. Es algo así como una manera de obtener una función para devolver dos valores, el mensaje y el estado.
Después de tomar el mensaje de la cola (similar al sacar la carta en el buzón de correo), se comprueba la respuesta. Si la operación no fue exitosa, la cola de mensajes Bluetooth toda se restablece y el programa continúa. No hay realmente mucho más que el programa podría hacer en este estado.
Si el programa lo hace más allá de ése parte posteriora de error, mira el valor del mensaje. Si el mensaje fue un '1', se maneja un relé. Si es un '2', se maneja otro. Cualquier otra cosa y se ignora el mensaje.
Nuestro dispositivo no tenía un medidor de presión, por lo que no hay forma para que la aplicación de Android saber si los cartuchos son presurizados o no. Como resultado, dado el suficiente aire, es posible aún allí ser suficiente presión izquierda para disparar dos veces sin tener que volver a llenar el depósito. Para tener en cuenta esto, el Arduino cerrará automáticamente el relé de un segundo después de abrirlo. Esto impide que aire adicional se pierde cuando el barril está vacío. El código que controla los relés de conmutación está disponible en relay.cpp.
Para manejar este cierre automático, se utiliza un temporizador. La mayoría de microcontroladores tienen temporizadores de hardware de alta precisión de la sincronización, por lo que este ejemplo es una buena introducción. Mira timer.h y timer.cpp si estás interesado en aprender más sobre cómo funciona el temporizador. Una vez que ha recibido un mensaje válido de Bluetooth, el relé correspondiente es inmediatamente cerrado (función de evt_loop_proc de evt_loop.cpp), permitiendo que la corriente fluya de la batería a la válvula del aspersor. Entonces, un temporizador en un segundo (1.000.000 microsegundos en el código). Entonces, la función de devolución de llamada se establece que evt_loop_handle_timer, que el módulo de temporizador se llamará una vez transcurrido el período de tiempo determinado.
Dentro de evt_loop_handle_timer, ambos relés se abren, que detiene el flujo de aire de ambos frascos. Pensamos que este sería el enfoque más sencillo para tomar. Una vez que una orden ha sido procesada, se llama evt_loop_proc (de cannon.pde) y repite el proceso.
Una vez este programado el Arduino, automáticamente pondrá en marcha su programa al aplicar energía a través de una batería de 9V.