Arduino multitarea

Actualmente, me veo obligado a que mi arduino haga varias tareas a la vez. Concretamente mostrar una animación por una pantalla (matriz de leds) y reproducir una melodía a través de un altavoz piezoeléctrico. Esta claro que no puedo hacer dos funciones, una para la melodía y otra para la animación, ya que primero se ejecuta una, y luego otra. Mi intención es que lo hagan a la vez.

La única solución posible que veo es crear una única función y que intercale entre un trozo de melodía y un trozo de animación, y así dar el efecto de que se reproducen simultáneamente.

Mi pregunta es si existe algún método diferente, o algún tipo de función para hacer multitareas (que lo dudo). Cualquier sugerencia para facilitar lo explicado anteriormente es bien recibida.

Saludos!

Es la única forma, de hecho tu computador también hace lo mismo de una forma más elegante.

Puedes investigar más con "protothreads"

A lo mejor esto te puede ayudar:
http://www.avrfreaks.net/modules/FreaksArticles/files/14/Multitasking%20on%20an%20AVR.pdf

Salu2

Igor R.

Hola,

puede que esto te suene a chino pero la forma de hacer esto es mediante un truco que requiere cambiar la temporizacion de Arduino. Necesitaras hackear los timers para poder jugar a tener un temporizador de muy alta frecuencia generando interrupciones para tocar el sonido mientras el codigo normal actualiza la pantalla.

La otra posibilidad es utilizar la interrupcion para cambiar la pantalla mientras tocas el sonido con el codigo normal.

Una forma elegante y sencilla de empezar con esto seria mirarte el post del playground:

http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix

El segundo ejemplo controla la matriz de leds con interrupciones, es como tener un segundo thread en tu arduino controlando la pantalla. Ahi podrias añadir tu codigo para sonido.

/d

Hola, esta semana subimos DuinOS, un sistema operativo multitarea y muy simple, para facilitar cosas como la que preguntás. Es open source y gratuito, podés bajarlo de acá:

Se instala fácil en el IDE de Arduino (se probó en la versión 0017).

¡Espero que ayude!
Saludos,
Julián

Yo resolvi algo parecido al tu problema usando un contador y en funcion del valor de ese contador me metia en una funcion o en otra, algo asi:

void loop()
{
int a;
a++;
if (a>0 && a<10)
funcion_1();
if (a>10 && a<15)
funcion_2();
if (a>15 && a<17)
funcion_3();
if(a>17)
a=0;
}

Puedes ver que en la funcion_1 entra cuando 10 veces, en la funcion 2 entra 5 veces y la funcion 3 entra 3 veces, de esta forma puedes dar mas tiempo ciclo a una funcion que a otra.

Hola, les comento que el link para bajar DuinOS cambió, y ahora es:

Ahí, en la parte de Donwloads se pueden bajar la versión v0.1 y la v0.2.

¡Saludos!
Julián