1

設定

数百個の Sparkfun LED ピクセル ( https://www.sparkfun.com/products/11020に類似) が Arduino Uno に接続されており、組み込みの Serial-over-USB 接続を使用して PC からピクセルを制御したいArduinoの。

ピクセルは個別にアドレス指定可能で、それぞれが色 (RGB) 用に 24 ビットを持っています。各ピクセルの色を非常に迅速に変更できるようにしたいので、PC から Arduino へのデータの送信は非常に効率的でなければなりません (Arduino からピクセルへのデータのさらなる送信はすでに非常に高速です)。

問題

目的の RGB 値をそのまま Arduino に直接送信しようとしましたが、たとえばすべての LED を同時にオンにしたい場合、目に見える遅延が発生します。データの量を最小限に抑えるための私の簡単なアイデアは、使用可能な色を 24 ビットから 8 ビットに減らすことです。これは、私のアプリケーションには十分すぎるほどです。

これを行う場合、PC の 8 ビット値を Arduino の 24 ビット値に拡張して、ピクセルに実際の色を設定する必要があります。ここでの明らかな解決策は、利用可能なすべての 8 ビット値と対応する 24 ビット色を保持するパレットです。ただし、主にメモリスペースの理由から、パレットのないソリューションが必要です。

質問

8ビットカラーを24ビットカラーに拡張する効率的な方法は何ですか?カラー情報を正確に保持する方法が望ましいですか? このタスクの標準アルゴリズムはありますか?

考えられる解決策

R と B ごとに 2 ビット、G に 3 ビットのフォーマットを検討していました。これらの値は、Arduino に送信される 1 バイトにパックされ、ビットシフトを使用してアンパックされ、map() を使用して補間されます。関数 (http://arduino.cc/en/Reference/Map)。

その解決策について何か考えはありますか?これを行うためのより良い方法は何でしょうか?

4

4 に答える 4

1

R2B2G3 では、非常に少ない色しか得られません (実際にはあと 1 ビット残っています)。それがあなたのアプリケーションにとって十分かどうかはわかりません。ディザリング技術を使用して、8 ビット イメージの見栄えを少し良くすることができます。

または、好みの色のセットがある場合は、既知のパレットをデバイスに保存し、ネットワーク経由で送信しないようにすることもできます。さまざまな状況に合わせて複数のパレットを保存し、小さい整数インデックスで使用するパレットを指定することもできます。

さらに、 RLELZWなどの単純な圧縮アルゴリズムを実装して、受信後に解凍することもできます。

また、使用できるフットプリントが小さい非常に高速な圧縮ライブラリがいくつかあります: SnappyminiLZO

于 2012-10-12T15:57:51.567 に答える
1

「これを行うためのより良い方法は何ですか?」という質問に関して、(まだ行っていない場合) 最初に行うことの 1 つは、シリアル データ レートを上げることです。Arduino フォーラムでは、標準レートとして 115200 bps を使用し、230400 bps を試すことを提案しています。これらのレートでは、小さな受信バッファーからデータを処理しようとするのではなく、比較的小さな受信バッファーから大きなバッファーにデータをすばやく転送するように、受信ソフトウェアを作成する必要があります。

2 番目の可能性は、アクティベーション時間をデータ パケットに入れることです。F1、F2、F3... が、LED アレイに表示する一連のフレームであるとします。これらのフレームを事前に、またはアイドル時間または待機時間中に PC から送信し、表示がスケジュールされるまで Arduino にバッファさせます。特定のフレームのアクティベーション時間になったら、Arduino をオンにします。フレームは事前にわかっているがアクティブ化の時間がわかっていない場合は、フレームを送信してバッファリングし、適切な時間にアクティブ化コードだけを送信します。

第 3 に、オンザフライで変化する複数のパレットとダイナミック パレットを持つことができ、ピクセル アドレスやピクセル リスト、およびピクセル マップを使用できます。つまり、異なる時間に異なるプロトコルを使用する可能性があります。プロトコル 3 はパレット全体をダウンロードし、4 はパレットの要素を変更し、5 は 24 ビット値 v、時間 t、カウント n、および時間 t に v に設定される n ピクセルのリストを送信する可能性があります。 6 は、ピクセル設定のビット マップなどを送信する場合があります。ビット マップは、オンまたはオフを示す単純なピクセルあたり 1 ビットのマップにすることも、ピクセルあたり k ビットのマップにすることもできます。この場合、k ビットのエントリは、ピクセルのパレット番号またはフレーム番号を指定できます。非常に多くの可能性があるため、これは少しあいまいです。要するに、何を表示していてもうまく機能するプロトコルを定義します。

第 4 に、ATmega328P の小さな (2KB) RAM とより大きな (32KB) フラッシュ メモリを考慮して、いくつかのパレット、フレーム、およびマクロをプログラムにハードコーディングすることを検討してください。マクロとは、弧、線、開いた長方形、または塗りつぶされた長方形などのグラフィック要素を生成するルーチンを意味します。事前にわかっている表示要素は、RAM ストレージではなくフラッシュの候補です。

于 2012-10-12T17:49:48.313 に答える
0

どのように見ても、実際に行っているのは画像圧縮です。そのため、PNG や JPG 圧縮などを調べて、それらがアプリケーションにとって十分に高速かどうかを確認することをお勧めします。

そうでない場合は、自分でロールすることを検討してください。ピクセルごとの圧縮でできることは限られています。サイズに関しては、あなたの (2,3,2) アイデアは、期待できるほど良いものです。代わりに四分木タイプのフォーマットを試すことができます: 4 ピクセル ブロックの平均を取り、差の圧縮 (非可逆) 表現を送信し、同じ操作を平均の半分の解像度の画像に適用します...

他の人が指摘しているように、ディザリングは (2,3,2) での画像の見栄えを良くします。おそらく、アプリケーションでディザ処理を行う最も簡単な方法は、各ピクセルの色ごとに異なる (ランダムまたは準ランダム) 固定量子化しきい値オフセットを選択することです。PC と Arduino の両方に、このしきい値テーブルのコピーがあります。しきい値の分布はポスタリゼーションを防ぎ、Arduino サイド テーブルは精度の維持に役立ちます。

于 2012-10-12T18:44:41.190 に答える
0

あなたの (2, 3, 2) ビットのアイデアは、「実際に」使用されています。試すのは非常に簡単です。品質はかなり低くなりますが、試してみて、ニーズに合っているかどうかを確認してください。

ルックアップ テーブルが時間の経過とともに一定のままである場合、256 色のルックアップ テーブルと比較して、他のソリューションが多くのメモリを節約できる可能性は低いと思われます。成功するためには、ピクセルに送信する画像の種類のパターンを利用する必要があると思います。

于 2012-10-12T15:54:16.623 に答える