5

我正在为一个艺术装置制作一些电子动画,它将使用几个步进电机和一些大功率 LED。过去,当我做这类事情时,我会使用系留计算机来处理逻辑和时序。对于这个项目,我想尝试使其独立(例如,只是 Arduino 板)。对于 Arduino 硬件,我有一个Arduino Mega,如果需要,可以使用SD 卡扩展 扩展它以获得更多存储空间。

我真的很欢迎任何关于如何解决这个问题的想法或建议(而不是要求代码)。

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

步进提示将类似于:

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

LED 提示将类似于:

  • 提示开始时间
  • LED 标识
  • 启动亮度
  • 结束亮度
  • 期间

所以我想知道的是:

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

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

4

1 回答 1

0

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

由于我使用的是带有 128 KB 闪存的 Ardunio Mega,因此我想在使用 SD 卡之前先使用它。借助出色的Flash 库,访问 PROGMEM 非常容易,我能够在几分钟内粗略地绘制出测试草图。

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

使用 Flash 库,您可以定义一个 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;
}
于 2012-09-20T14:44:51.383 回答