2012-09-16 20 views
5

Estoy trabajando en algunos animatronics para una instalación de arte que utilizará varios motores paso a paso y algunos LED de alta potencia. En el pasado, cuando hice este tipo de cosas, utilicé una computadora atada para manejar la lógica y el tiempo. Para este proyecto, me gustaría tratar de hacerlo autocontenido (por ejemplo, solo la placa Arduino). Para hardware Arduino, tengo un Arduino Mega y podría expandirlo con un SD cardshield para más almacenamiento, si es necesario.Sugerencias para la estructura de programación y almacenamiento de secuencias animatrónicas

Realmente agradecería cualquier idea o sugerencia sobre cómo abordar esto (y no estoy pidiendo el código).

Para los datos, esencialmente estaría almacenando señales para cada paso a paso y cada LED. Y, por supuesto, necesitaría algún tipo de reloj o marca de tiempo para hacer un seguimiento de las cosas.

Una señal de pasos sería algo así como:

  • hora de inicio señal
  • ID paso a paso
  • dirección paso a paso
  • velocidad de paso a paso
  • número de pasos

Un LED cue sería algo así como:

  • hora de inicio señal
  • LED ID
  • inicio brillo
  • brillo final
  • duración

Así que lo que estoy preguntando acerca de:

  • las ideas acerca de un dato formato lo suficientemente compacto como para almacenar lotes de las indicaciones
  • sugerencias para un reloj o marca de tiempo. (Un contador simple es la elección obvia).

En cuanto a la cantidad de datos/cantidad de datos, dado que estoy comenzando esto, trabajaré dentro de los límites que me tope.

+0

El formato MIDI es a menudo (ab) que se utiliza para este tipo de datos que no son de la música. (iluminación teatral, etc.) Tal vez también podrías usarlo para tu robot-ballet. El tamaño de almacenamiento MIDI es extremadamente liviano y relativamente fácil de analizar. – wildplasser

+0

@wildplasser - interesante, gracias. He visto MIDI ab/usado para esto también, pero eso no se me había ocurrido completamente. –

+0

Tiene toda la funcionalidad básica incorporada: temporización, localización/sincronización, múltiples voces/canales. (Los bucles/repeticiones IIRC se agregaron más adelante). – wildplasser

Respuesta

0

Así que, por ahora, he decidido lanzar mi propio formato de datos simple para mantener el proyecto en movimiento. También me preocupaba almacenar datos de cue de una manera que no consuma RAM.

Dado que estoy usando un Ardunio Mega con 128 KB de memoria Flash, quiero usarlo antes de recurrir a una tarjeta SD. Con el excelente Flash Library, acceder a PROGMEM es muy fácil y pude escanear un boceto de prueba en minutos.

Para el control del motor Estoy utilizando placas de controlador del motor dedicadas mediante comunicación serie. Cada placa controla dos motores. Para probar el tamaño máximo de datos que necesitaba enviar fueron cuatro valores: tasa, pendiente, x objetivo, y objetivo con el fin de hacer un movimiento para que determine mi formato de datos para motores. Esto cambiará cuando agregue una marca de tiempo y valores de ID de placa.

Con Flash lib, puede definir un FLASH_TABLE, almacenarlo en PROGMEM y luego acceder a él usando el acceso simple al conjunto de matrices. Las pruebas con un par de miles de entradas no muestran problemas.

Por lo tanto, se convierte en una tarea sencilla extraer los datos y enviarlos a las placas independientes o usarlas internamente.

// ejemplo sencillo:

#include <Flash.h> 

FLASH_TABLE(int, command_table, 4 /* width of table */, 
    {111, 222, 333, 444}, 
    {1001, 900,, -4567}, 
    {1002, 1000,, -4567}, 
    {1003, 1100,, -4567}, 
    {666, 777, 888, 999} 
    ); 

void setup() { 
    Serial.begin(9600); 
    Serial.print("Mem: "); Serial.println(availableMemory()); 

    // Determine the size of the array 
    Serial.print("Rows: "); Serial.println(command_table.rows()); 
    Serial.print("Cols: "); Serial.println(command_table.cols()); 
    Serial.print("RAM: "); Serial.println(sizeof(command_table)); 

    Serial.print(command_table[8][0]); 
    Serial.print("s"); 
    Serial.print(command_table[8][1]); 
    Serial.print("r"); 
    Serial.print(command_table[8][2]); 
    Serial.print("x"); 
    Serial.print(command_table[8][3]); 
    Serial.print("y"); 
    Serial.println("gi"); 
} 

void loop() { 


} 

int availableMemory() 
{ 
    int size = 1024; 
    byte *buf; 
    while ((buf = (byte *) malloc(--size)) == NULL); 
    free(buf); 
    return size; 
} 
Cuestiones relacionadas