5

私は、いくつかのステッピングモーターといくつかの高出力LEDを使用するアートインスタレーション用のいくつかのアニマトロニクスに取り組んでいます。以前、私がこの種のことをしたとき、私はロジックとタイミングを処理するためにテザーコンピューターを使用していました。このプロジェクトでは、自己完結型(たとえば、Arduinoボードのみ)にしてみてください。Arduinoハードウェアの場合、私はArduino Megaを持っており、必要に応じて、 SDカード シールドを使用して拡張してストレージを増やすことができます。

私はこれにアプローチする方法についてのアイデアや提案を本当に歓迎します(そしてコードを求めていません)。

データについては、基本的に、各ステッパーと各LEDのキューを保存します。そしてもちろん、物事を追跡するために、ある種の時計またはタイムスタンプが必要になります。

ステッパーキューは次のようになります。

  • キュー開始時間
  • ステッパーID
  • ステッパー方向
  • ステッパー速度
  • ステップ数

LEDキューは次のようになります。

  • キュー開始時間
  • LED ID
  • 明るさを開始
  • 終了時の明るさ
  • 間隔

だから私が疑問に思っていること:

  • たくさんの手がかりを保存するのに十分コンパクトなデータ形式に関するアイデア
  • 時計またはタイムスタンプの提案。(単純なカウンターが当然の選択です。)

キューの数/データの量については、これを始めたばかりなので、ぶつかった制限の範囲内で作業します。

4

1 に答える 1

0

そのため、今のところ、プロジェクトを動かし続けるために、独自の単純なデータ形式をロールすることにしました。また、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;
}
于 2012-09-20T14:44:51.383 に答える