Paso 22: Software de Arduino
Hubo mucho debate sobre cómo exactamente el software entre Arduino y la aplicación para iPhone de la partición. Pero primero te voy a dar algunos antecedentes sobre el esquema que estamos utilizando.El Arduino se conecta a nuestra red de casa wifi y configura un servidor inalámbrico. El iPhone se conecta al servidor y envía a algún tipo de información hasta el Arduino según entrada del usuario.
La razón por la que digo a "algún tipo de información" es porque en realidad hay dos tipos de comandos que podemos enviar, alto nivel y bajo nivel. Comandos de nivel bajo sería pulsar un botón diferente en un mando a distancia, como "encender la TV" o "encender el amplificador con el volumen del clic". Comandos de nivel alto son paquetes de estas funciones de bajo niveles, como "DVD de reloj". Este comando tiene que encender el reproductor de DVD, amplificador y TV, luego abra la unidad de disco DVD, establece el amplificador en el modo correcto, luego ajustar el TV a la configuración de entrada correcta, también debe comprobar para asegurarse de que el volumen del amplificador está en un nivel razonable, etc.. Hay un montón de información y comandos en "Watch DVD". Y por lo tanto, la pregunta es: ¿envía comandos de alto niveles para el Arduino, y entonces el software de Arduino rompe estos comandos en todos los comandos de bajo niveles separados? O por el contrario, ¿hacer todo de la ruptura en los comandos de bajo niveles en la aplicación para el iPhone y enviar los comandos de bajo niveles individuales hasta el Arduino, que sólo ejecuta?
Otra pregunta es la siguiente. Cada comando de bajo nivel tiene una lista de ~ 200 dígitos de números correspondientes a un código PWM para el LED IR que es realmente responsable de transmitir esa información a cualquier dispositivo de medios de comunicación que estamos hablando. ¿Nos guarde esta lista en el Arduino o aplicación para el iPhone? (más sobre este tipo de señal más adelante en este paso).
Sería lo más fácil y más eficiente para almacenar todo en el Arduino. Así, sólo tenemos que enviar una pequeña cantidad de información sobre wireless, ya que Arduino hace todo el proceso, sería fácil controlar todo, desde una página web al igual que el iPhone de la bobina (si el iPhone fue enviar comandos de nivel bajo sobre wireless, entonces la página tendría que hacer lo mismo y sería engorroso utilizar).
Sin embargo, el Arduino Uno sólo tiene aproximadamente 32 kb de memoria a bordo (originalmente utilizábamos un Uno antes de pasar a Mega). Hay un lector de tarjetas micro SD en la pantalla de Wi-Fi y estábamos planeando sobre el uso para almacenar algunos de los datos de desbordamiento, pero no pudimos conseguirlo trabajando.
El Arduino Mega tiene muchísima más memoria, alrededor de 128 kb, pero tratamos de usar para controlar los LEDs IR y no funcionaba. Hemos rastreado el problema al bucle en el código que genera la frecuencia de la portadora por la señal de infrarrojos. Me explico cómo la señal realmente es generada y transmitida:
Actúa mucho como una radio AM. IR LED parpadea en una cierta frecuencia de la portadora (32 kHz) y luego hay una onda cuadrada sobrepuesta sobre eso que realmente lleva la información. Las listas que estamos utilizando para almacenar la información de comando buscar algo como [300, 50, 200, 60]. Esto significa activar la frecuencia portadora de 300 milisegundos, luego apague por 50, luego encenderla para 200 y apagado por 60. Cada señal de mando es realmente cerca de 50 de estos comandos 'on-off'.
Ahora, para generar una señal como esta con Arduino, necesita una función que salidas de la frecuencia portadora y entonces otra función que llama a la función de portador en el momento correcto y por la duración correcta. Puesto que todas estas cuestiones de sincronización tienen tan alta resolución, también es necesario llamar a una función que indica el Arduino no se que hacer nada en absoluto durante este proceso, asegurando que el momento es muy preciso. De lo contrario, la señal no pudiera ser reconocida por cualquier dispositivo que usted apuntó, como un reproductor de DVD por ejemplo.
Como dije, el problema que encontramos en el cambio de Uno a Mega fue en función de la frecuencia de la portadora. Esta función tiene unos comandos de escritura digital que realmente generan la señal, pero también tiene retrasos de un par por lo que en términos generales, la función se ejecuta en la frecuencia correcta. Ahora, un comando de escritura digital en un Uno realmente toma aproximadamente 3 milisegundos para ejecutar, para esto debe factor en cuando debería ser la determinación de cómo los retrasos. Sin embargo, un comando de escritura digital en un Mega tarda un poco más, y así, cuando ponemos el código de Uno en la Mega, fuimos generando una frecuencia incorrecta! Gracias a mi papá que lo había averiguado.
Así, con este problema, hemos sido capaces de cambiar al uso de un Mega. Esto fue genial porque no sólo nos dio toda la memoria que necesitábamos (esperamos) almacenar todos lo comando de nivel bajo se descomponen y otra lógica en el Arduino, pero también nos dio más pines para trabajar con.