2012-09-16 11 views
5

Sto lavorando su alcuni animatronics per un'installazione artistica che utilizzerà diversi motori passo-passo e alcuni LED ad alta potenza. In passato, quando ho fatto questo genere di cose, ho usato un computer collegato alla console per gestire la logica e i tempi. Per questo progetto, mi piacerebbe provare a renderlo autonomo (per esempio, solo la scheda Arduino). Per l'hardware Arduino, ho un Arduino Mega e potrei espanderlo con uno shieldshield per ulteriore spazio di archiviazione, se necessario.Suggerimenti per la programmazione della struttura e la memorizzazione di sequenze animatroniche

Sarei davvero felice di eventuali idee o suggerimenti su come affrontare questo (e non sto chiedendo il codice).

Per i dati, essenzialmente memorizzerei i segnali per ogni stepper e ciascun LED. E ovviamente avrei bisogno di una sorta di orologio o timestamp per tenere traccia delle cose.

A spunto passo-passo sarebbe qualcosa di simile:

  • tempo spunto di avvio
  • stepper ID
  • direzione stepper
  • velocità passo-passo
  • numero di passi

Un LED spunto sarebbe qualcosa di simile:

  • tempo spunto di avvio
  • ID LED
  • Inizio luminosità
  • luminosità Fine
  • durata

Quindi quello che chiedo circa:

  • idee su un data formattare in modo compatto per poter archiviare lotti di spunti
  • eventuali suggerimenti per un orologio o un timestamp. (Un contatore semplice è la scelta più ovvia.)

Per quanto riguarda quanti spunti/quanti dati, dal momento che sto appena iniziando, lavorerò entro tutti i limiti che ho incontrato.

+0

Il formato MIDI è spesso (ab) usato per questo tipo di dati non-musicali. (illuminazione per il teatro, ecc.) Forse potresti usarlo anche per il tuo balletto robot. Il MIDI è estremamente leggero come memoria di archiviazione e relativamente facile da analizzare. – wildplasser

+0

@wildplasser - interessante, grazie. Ho visto MIDI ab/usato anche per questo, ma non mi era mai venuto in mente. –

+0

Ha tutte le funzionalità di base integrate: temporizzazione, cue/sincronizzazione, più voci/canali. (I loop IIRC/ripetizioni sono stati aggiunti in seguito). – wildplasser

risposta

0

Quindi per ora ho deciso di stampare il mio semplice formato di dati per mantenere il progetto in movimento. Ero anche preoccupato per la memorizzazione dei dati di cue in un modo che non consuma RAM.

Poiché utilizzo un Ardunio Mega con 128 KB di memoria Flash, desidero utilizzarlo prima di ricorrere a una scheda SD. Con l'eccellente Flash Library l'accesso a PROGMEM è molto semplice e sono riuscito a sbrogliare uno schizzo di prova in pochi minuti.

Per il controllo del motore, utilizzo schede controller motore dedicate mediante comunicazione seriale. Ogni scheda controlla due motori. Per testare la dimensione massima dei dati che dovevo inviare c'erano quattro valori: rate, slope, x target, y target per fare uno spostamento in modo da determinare il formato dei miei dati per i motori. Questo cambierà quando aggiungo un timestamp e valori di ID scheda.

Con la lib Flash, è possibile definire un FLASH_TABLE, memorizzarlo in PROGMEM e quindi accedervi utilizzando l'accesso semplice del bracket matrice. Test con un paio di migliaia di voci non presenta problemi.

Quindi diventa un semplice compito di estrarre i dati e inviarli alle schede standalone o utilizzarlo internamente.

// semplice esempio:

#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; 
} 
Problemi correlati