对电子序列的编程结构和存储的建议

时间:2012-09-16 15:14:04

标签: arduino

我正在研究一些animatronics的艺术装置,它将使用几个步进电机和一些高功率LED。在过去,当我做了这种事情时,我使用了系留计算机来处理逻辑和时序。对于这个项目,我想尝试使它自成一体(例如,只是Arduino板)。对于Arduino硬件,我有Arduino Mega,如果需要,可以使用SD card shield扩展它以获得更多存储空间。

我真的很欢迎任何有关如何处理此问题的想法或建议(并且我不会要求代码)。

对于数据,基本上我会为每个步进器和每个LED存储提示。当然,我需要某种时钟或时间戳来跟踪事物。

步进提示将类似于:

  • 提示开始时间
  • 步进ID
  • 步进方向
  • 步进速度
  • 步数

LED提示将类似于:

  • 提示开始时间
  • LED ID
  • 启动亮度
  • 结束亮度
  • 持续时间

所以我想知道:

  • 关于数据格式足够紧凑以存储大量线索的想法
  • 对时钟或时间戳的任何建议。 (一个简单的计数器是显而易见的选择。)

至于有多少提示/多少数据,因为我刚刚开始这个,我会在我遇到的任何限制范围内工作。

1 个答案:

答案 0 :(得分:0)

所以现在我决定推出自己的简单数据格式,以保持项目的顺利进行。我还担心以不占用RAM的方式存储提示数据。

由于我使用的是带有128 KB闪存的Ardunio Mega,我想在使用SD卡之前使用它。通过优秀的Flash Library访问PROGMEM非常简单,我能够在几分钟内完成测试草图。

对于电机控制,我使用串行通讯专用电机控制器板。每块板控制两个电机。为了测试我需要发送的最大数据大小是四个值: rate,slope,x target,y target 以便进行移动以确定我的电机数据格式。当我添加时间戳和电路板ID值时,这将改变。

使用Flash lib,您可以定义FLASH_TABLE,将其存储在PROGMEM中,然后使用简单的数组括号访问来访问它。使用几千个条目进行测试表明没有问题。

因此,将数据拉出并将其发送到独立板或在内部使用它是一项简单的任务。

//简单示例:

#include <Flash.h>

FLASH_TABLE(int, command_table, 4 /* width of table */, 
    {111, 222, 333, 444},
    {1001, 900, 3210, -4567},
    {1002, 1000, 3210, -4567},
    {1003, 1100, 3210, -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;
}