2012-09-16 62 views
5

我正在研究一些animatronics的藝術裝置,它將使用幾個步進電機和一些高功率LED。在過去,當我做完這類事情時,我曾使用連線計算機來處理邏輯和時序。對於這個項目,我想嘗試使它獨立(例如,只是Arduino板)。對於Arduino硬件,我有一個Arduino Mega,如果需要的話,可以使用SD cardshield來擴展它以獲得更多存儲空間。編程結構和存儲電子寵物序列的建議

我真的很歡迎任何有關如何解決這個問題的想法或建議(而不是要求代碼)。

對於數據,基本上我會爲每個步進器和每個LED存儲提示。當然,我需要某種時鐘或時間戳來記錄事情。

步進線索會是這樣的:

  • 提示開始時刻
  • 步進ID
  • 步進方向
  • 步進速度
  • 若干步驟

一個LED提示會是這樣的:

  • 線索開始時間
  • LED ID
  • 開始亮度
  • 結束亮度
  • 時間

那麼我想知道:

  • 想法有關數據格式足夠緊湊以存儲大量內容暗示
  • 對時鐘或時間戳的任何建議。 (一個簡單的計數器是明顯的選擇。)

至於多少線索/多少數據,因爲我剛剛開始這個,我會在任何限制之內工作,我碰到了什麼。

+0

MIDI格式是通常用於這類非音樂數據的(AB)。 (劇院照明等)也許你也可以將它用於你的機器人芭蕾。 MIDI是極其輕便的存儲大小,並且相對容易解析。 – wildplasser

+0

@wildplasser - 有趣,謝謝。我也看過MIDI ab /用於這個,但那完全沒有發生在我身上。 –

+0

它具有內置的核心功能:定時,提示/同步,多個聲音/通道。 (IIRC循環/重複稍後添加)。 – wildplasser

回答

0

因此,現在我決定推出我自己的簡單數據格式,以保持項目移動。我還擔心存儲提示數據的方式不會佔用內存。

因爲我使用的是128KB閃存的Ardunio Mega,我想在使用SD卡之前使用它。使用優秀的Flash Library訪問PROGMEM非常簡單,我可以在幾分鐘內完成測試草圖。

對於電機控制,我使用專用電機控制器板使用串行通信。每個電路板控制兩個電機。爲了測試我需要發送的最大數據量是四個值:速率,斜率,x目標,y目標,以便進行移動以便確定我的電機數據格式。當我添加時間戳和電路板ID值時,這將會改變。

使用Flash lib,您可以定義FLASH_TABLE,將其存儲在PROGMEM中,然後使用簡單的數組括號訪問它。用幾千個條目進行測試顯示沒有問題。

因此,它成爲一個簡單的任務,將數據拉出併發送到獨立主板或在內部使用。

//簡單的例子:

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