そのため、今のところ、プロジェクトを動かし続けるために、独自の単純なデータ形式をロールすることにしました。また、RAMを消費しない方法でキューデータを保存することも心配していました。
128KBのフラッシュメモリを搭載したArdunioMegaを使用しているので、SDカードを使用する前にそれを使用したいと思います。優れたフラッシュライブラリを使用すると、PROGMEMにアクセスするのは非常に簡単で、テストスケッチを数分で大まかにまとめることができました。
モーター制御には、シリアル通信を使用した専用のモーターコントローラーボードを使用しています。各ボードは2つのモーターを制御します。送信する必要のある最大データサイズをテストするために、モーターのデータ形式を決定するために、レート、スロープ、xターゲット、yターゲットの4つの値を送信しました。これは、タイムスタンプとボード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;
}