2016-10-21 7 views
0

私は本当にこの特定の質問に対する答えを見つけることができませんでした。Arduino(C?Based)Programming for Energy Efficiency

私は最近、赤色から黄色、黄色から緑色、 青色、青緑色、青色からマゼンタ、赤色からマゼンタにスペクトルを移行するためにArduino Boardを設定するプロジェクトを開始しました。 ポインターを使用して、フルスペクトルの各RGB値をマップします。 255個のインデックス付き配列を基にしています。

私の質問は、エネルギー効率の高いコードを書くことです。私のプロジェクトは4つの充電式単3形電池(それぞれ1.5Vの単3形)で動作するので、できるだけ効率的にする必要があります。

エネルギー効率の良いコードを書くにはどうすればよいですか?あるいは、これは無益の問題ですか?

私はセットアップが完了した後、ループ処理中に消費されるエネルギーが少なくなると仮定しています(非常に不正確かもしれません)。

問題のコードは以下の通りです:

int const RED = 3 /* Pin 3 */, BLUE = 5 /* Pin 5 */, GREEN = 6 /* Pin 6 */; 
int* _RED[1536]; 
int* _GREEN[1536]; 
int* _BLUE[1536]; 
int RGB[256]; 


void setup() { 
    for (int i = 0; i<256;++i){ 
     RGB[i] = i; 
    } 
//RED TO YELLOW 
    for (int i = 0 ; i<256;++i){ 
     _RED[i] = &RGB[255]; 
     _GREEN[i] = &RGB[i]; 
     _BLUE[i] = &RGB[0]; 
    } 
//YELLOW TO GREEN 
    for (int i = 256;i < 512; ++i){ 
     _RED[i] = &RGB[511-i]; 
     _GREEN[i] = &RGB[255]; 
     _BLUE[i] = &RGB[0]; 
    } 
//GREEN TO TEAL 
    for (int i = 512; i <768;++i){ 
     _RED[i] = &RGB[0]; 
     _GREEN[i] = &RGB[255]; 
     _BLUE[i] = &RGB[255+(i-767)]; 
    } 
//TEAL TO BLUE 
    for (int i = 768; i < 1024; ++i){ 
     _RED[i] = &RGB[0]; 
     _GREEN[i] = &RGB[1023-i]; 
     _BLUE[i] = &RGB[255]; 
    } 
//BLUE TO MAGENTA 
    for (int i = 1024; i < 1280; ++i){ 
     _RED[i] = &RGB[(255+(i-1279))]; 
     _GREEN[i] = &RGB[0]; 
     _BLUE[i] = &RGB[255]; 
    } 
//MAGENTA TO RED 
    for (int i = 1280; i < 1536; ++i){ 
     _RED[i] = &RGB[255]; 
     _GREEN[i] = &RGB[0]; 
     _BLUE[i] = &RGB[1535-i]; 
    } 
//COMPLETES FULL SPECTRUM EXCLUDING WHITE AND BLACK 
} 

void loop(){ 
for(int i = 0; i <1536; ++i){ 
    analogWrite(RED,*_RED[i]); 
    analogWrite(GREEN,*_GREEN[i]); 
    analogWrite(BLUE,*_BLUE[i]); 
    delay(100); 
} 

} 

または次のようにコードを使用する方がよいでしょう。これらのプログラムの

int const Red = 3, /* Pin 3 */ Blue = 5, /* Pin 5 */ Green = 6; /* Pin 6 */ 
void RGB(int R, int G, int B) { 
analogWrite(Red,R); analogWrite(Green,G); analogWrite(Blue,B); delay(25);} 
void setup() {} 
void loop() { 
int r=0,g=0,b=0; 
r = 255;g = 0;b = 0; for (int i = 0; i < 256; ++i){RGB(r,i,b);} 
r = 255; g = 255;b = 0; for (int i = 255; i >= 0; --i){RGB(i,g,b); } 
r = 0;g = 255;b = 0; for (int i = 0; i < 256; ++i){RGB(r,g,i);} 
r = 0;g = 255;b = 255; for (int i = 255; i >= 0; --i){RGB(r,i,b);} 
r = 0;g = 0;b = 255; for (int i = 0; i < 256; ++i){RGB(i,g,b);} 
r = 255;g = 0;b = 255; for (int i = 255; i >= 0; --i){RGB(r,g,i);} 
delay(1000); 
    } 

おかげで、 ブレット

+0

間違いなく、間接費(無駄なCPUサイクル=無駄な電力)を消費するポインタの配列があり、格納しようとしているデータはポインタよりも小さいです。 –

+0

私はあなたのボードの詳細に完全に依存していると確信しています。例えば。 Arduinoゼロ電源管理に関する興味深い情報は次のとおりです。https://www.arduino.cc/en/Tutorial/ArduinoZeroPowerConsumption – Gene

+0

ありがとう@Gene私が得ることができるすべての情報は役に立ちます。ベン私は、3つの整数の代わりにポインタと1つの整数を使用すると、スペースが少なくなるという仮定の下にあった –

答えて

3

両ましますArduinoのdelay()関数は、プロセッサをスリープ状態にしないので、エネルギー使用量はほぼ同等(しかもかなり高い)になります。消費電力が重要な場合は、プロセッサを自分でスリープモードにする必要があります。残念ながら、Arduinoフレームワークはこれを行う方法を公開していません。これを行うには、適切なAVRレジスタと組み込み関数にドロップダウンする必要があります。

もう1つの問題は、最初のプログラムが4つのアレイに約10 KBのRAMを必要とすることです。これはほとんどのAVRマイクロコントローラーで使用可能なものよりもはるかに多くなります。一般に、このプラットフォームでは大きなルックアップテーブルは避けるべきです。

+0

私は 'analogWrite'関数がどれほど非効率的であるかわかりませんが、実際には両方を等しくするかもしれません。しかし、オペレーションループのオペレーションコード(セットアップをカウントしていない)のオペレーション数は、最初のバージョンではるかに高いです。 –

+0

このコードはarduino 101またはzeroで実行され、どちらも28〜32KBのRAMを持ちます。つまり、私は、コードが使用されているボードに比べて影響が少ないと考え始めています。 –

+0

@BenVoigt操作の数はここでは無関係です。 'delay()'はスピンループであるため、プロセッサはRUNモードの100%時間です。 – duskwuff