0

Arduinoについて学び始めたばかりです。RadioShackの1メートルのLEDストリップを試してみました。

ストリップにはサンプルプログラムが付属していたので、それを見て基本的な部分に絞り込みましたが、何が起こっているのかわかりません。何が起こっているのか、関数型コードがどのように機能するのかを説明してくれる人を探しています。

コードは次のとおりです。

#include <avr/pgmspace.h>

#define DATA_1 (PORTC |=  0X01)
#define DATA_0 (PORTC &=  0XFE)
#define STRIP_PINOUT (DDRC=0xFF)

/*
green 0xff0000
cyan 0xff7f00
truquoise 0xffff00
dark blue 0x00ff00
red 0x0000ff
dark yellow 0x6f00ff
yellow 0x8f00ff
white 0xffffff
off white 0x444444
dim white 0x111111
off 0x000000
*/

PROGMEM long test[10][10]={
  {0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000},
};

void setup() {

  STRIP_PINOUT;

  reset_strip();

}


void loop() 
{
  while (1)
  {
    send_pattern(test, 10, 50);
    reset_strip();
  }
}


void send_pattern(long data[][10], int length, int rate)
{
  int i=0;
  int j=0;

  for (i=0; i<length; i++)
  {
    noInterrupts();
    for (j=0; j<10; j++)
    {
      send_strip(pgm_read_dword_near(&data[i][j]));
    }
    interrupts();

    delay(rate);

  }




}


void send_strip(uint32_t data)
{
  int i;
  unsigned long j=0x800000;

  for (i=0;i<24;i++)
  {
    if (data & j)
    {
      DATA_1;
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");    
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      DATA_0;
    }
    else
    {
      DATA_1;
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");    
      DATA_0;
    }

    j>>=1;
  }
}


void reset_strip()
{
  DATA_0;
  delayMicroseconds(20);
}
4

2 に答える 2

1

Cを知らない場合や、以前にArduinoを使用したことがない場合は、このコードを開始するのは適切ではありません。

Arduinoプログラミング言語(Wiringと呼ばれる)は、Cコードの多くの生の詳細をより単純化された形式(および/または言語)に抽象化するため、初心者はアイデアを進歩させ、「プログラマーになる」ことにとらわれることはありません。 「」Wiringコードは、コンパイル前にCコードに解釈されます。これにより、ユーザーは1つのスケッチでC(およびC ++)とWiringを混在させることができます。

上記のコードはC構文とWiring構文を組み合わせているため、Arduinoのドキュメントで構文に関するすべての情報を見つけることはできませんが、理解できないキーワードや用語を検索する価値があります。別の方法で行われる大きなことは、シリアルポートの設定と使用です。Serialそこでどのように行われるか(そして理解するのがどれほど簡単か)については、Arduinoのドキュメントを参照してください。

機能について説明するのは大雑把です(退屈する前に)...


この行は、数値の10 x 10配列( )として名前が付けられた変数(PROGMEM-EEPROMメモリ内)を定義します。たとえば、10個の配列があり、それぞれに10個の数値が含まれます(16進表記)testlongs

PROGMEM long test[10][10]={

このブロックは、関数(コードの上部にある#defined)を呼び出してポートを設定し、関数(コードの下部にある)を呼び出してストリップをリセットします。

void setup() 
  STRIP_PINOUT;
  reset_strip();
}

void loop() 
{
  while (1) // i.e. do this forever
  {
    // send the test var, its length and the delay amount between each pattern
    send_pattern(test, 10, 50); 
    reset_strip();
  }
}

この関数は渡されたvar data(この場合はvar'test')を反復処理し、呼び出されたAVR関数を使用して位置[i] [j]の配列の値を読み取り、pgm_read_dword_nearその値を送信する関数send_stripに送信します。シリアルポート。各配列が送信された後、でdelay()定義されたミリ秒数だけ待機するように呼び出しますrate

void send_pattern(long data[][10], int length, int rate)
{
  int i=0;
  int j=0;

  for (i=0; i<length; i++)
  {
    noInterrupts();
    for (j=0; j<10; j++)
    {
      send_strip(pgm_read_dword_near(&data[i][j]));
    }
    interrupts();

    delay(rate);

  }
}
于 2013-02-19T10:50:51.640 に答える
0

メートル長のLEDストリップには10個のセグメントがあり、各セグメントには3個のLEDがあるため、合計30個のLEDがある場合でも、10個のセグメントしか制御できません。

LEDストリップには、赤(電源)、黒(アース)、緑(信号)の3本のワイヤーがあります。

各セグメントは、LEDの色を決定するために24ビットの16進数を取ります。セグメントが24ビットを取得すると、その色を設定し、残りの信号を次のセグメントに送信します。

信号はHighまたはLowのいずれかですが、信号を受信するチップの場合、信号がHighの次にLowである時間の長さによって、信号が1か0かを判断します。ストリップに付属のマニュアルは、これを写真でよりよく説明しています。

高値と安値のタイミングは、void send_strip(uint32_t data)メソッドで制御されます。は__asm__("nop\n\t")マイクロコントローラーに基本的に1サイクルを浪費するように指示するので、基本的に非常に短い遅延です(16MHz Arduinoでは62.5ns)。タイミングを正しくするためにsend_strip()メソッドを試してみる必要がありました。そうしないと、すべてのLEDが真っ白になりました。

void send_pattern(long data [] [10]、int length、int rate)は、LEDストリップの10セグメントに10色を送信します。1Mストリップの場合、これはすべてのLEDである必要があります。

PROGMEM long test [10] [10]の各行は、ストリップの色のセットです。この場合、ストリップには10のバリエーションがあります。

私は現在このストリップで遊んでいるので、さらに例や説明が必要な場合は私に知らせてください。

于 2014-01-29T22:38:17.927 に答える