2012-09-16 7 views
5

Pracuję nad niektórymi animatronics dla instalacji artystycznej, która będzie używać kilku silników krokowych i niektórych diod LED dużej mocy. W przeszłości, kiedy robiłem tego rodzaju rzeczy, użyłem komputera na uwięzi, aby poradzić sobie z logiką i czasem. W przypadku tego projektu chciałbym spróbować uczynić go samodzielnym (na przykład po prostu tablica Arduino). W przypadku sprzętu Arduino mam Arduino Mega i mogę go rozszerzyć o SD cardshield, aby uzyskać więcej miejsca na dane, jeśli zajdzie taka potrzeba.Sugestie dotyczące struktury programowania i przechowywania sekwencji animatronicznych

Naprawdę chciałbym powitać wszelkie pomysły i sugestie, jak się do tego podejść (i nie proszę o kod).

Dla danych, w zasadzie chciałbym przechowywać pamięci dla każdego krokowca i każdej diody LED. I oczywiście potrzebowałbym jakiegoś zegara lub znacznika czasu, aby śledzić rzeczy.

stepper cue byłoby coś takiego:

  • czasu startu cue
  • krokowy ID
  • kierunku krokowy
  • prędkość krokowy
  • liczba kroków

diodę LED cue byłoby coś w stylu:

  • czas rozpoczęcia cue
  • ID LED
  • start jasność
  • jasność Koniec
  • trwania

Więc co mam zastanawiać:

  • pomysłów o danych Format wystarczająco kompaktowy do przechowywania partii podpowiedzi
  • wszelkie sugestie dotyczące zegara lub sygnatury czasowej. (Prosty licznik jest oczywistym wyborem.)

Co do tego, jak wiele sygnałów/ile danych, ponieważ właśnie zaczynam to, będę pracował w granicach, z którymi się zetknę.

+0

format MIDI jest często (ab), stosowane do tego rodzaju danych nie-muzycznych. (oświetlenie teatralne, itp.) Może mógłbyś też użyć go do swojego robota-baletu. MIDI to wyjątkowo lekki rozmiar pamięci i stosunkowo łatwy w analizie. – wildplasser

+0

@wildplasser - interesujące, dzięki. Widziałem MIDI ab/używane do tego również, ale to zupełnie nie przyszło mi do głowy. –

+0

Ma wbudowaną podstawową funkcjonalność: synchronizację, cueing/synchronizację, wiele głosów/kanałów. (Pętle IIRC/powtórzenia zostały dodane później). – wildplasser

Odpowiedz

0

Do tej pory zdecydowałem się na przetasowanie własnego, prostego formatu danych, aby projekt był w ruchu. Byłem także zaniepokojony przechowywaniem danych cue w sposób, który nie zżera pamięci RAM.

Ponieważ używam Ardunio Mega z pamięcią Flash o pojemności 128 KB, chcę użyć tego przed skorzystaniem z karty SD. Z doskonałym Flash Library dostęp do PROGMEM jest bardzo łatwy i udało mi się zgrubić szkic testowy w kilka minut.

Do sterowania silnikiem stosuję dedykowane tablice sterowników silników wykorzystujące komunikację szeregową. Każda płyta steruje dwoma silnikami. Do przetestowania maksymalnego rozmiaru danych, który musiałem wysłać, były cztery wartości: , nachylenie, x cel, y target w celu wykonania przesunięcia, które określi mój format danych dla silników. Zmieni się to po dodaniu znacznika czasu i wartości ID karty.

W bibliotece Flash można zdefiniować FLASH_TABLE, zapisać w PROGMEM, a następnie uzyskać do niego dostęp za pomocą prostego dostępu do tablicy. Testowanie z kilkoma tysiącami wpisów nie wykazuje żadnych problemów.

Staje się więc prostym zadaniem wyciągania danych i wysyłania ich do samodzielnych tablic lub używania ich wewnętrznie.

// Prosty przykład:

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