Arduinoのランニングライト。 WS2812 と Arduino テープで方向指示器を実行する

Arduinoのランニングライト。 WS2812 と Arduino テープで方向指示器を実行する

22.08.2023

Arduinoを使用してLEDからランニングライトを作成します。 この場合、Arduino Mega 2560 が使用されており、54 個の LED のトレッドミルを制御できる可能性があります。 ただし、このタイプの Arduino プラットフォームの他のコントローラー (UNO、Leonardo など) を使用しても、回路とプログラムは変わりません。

LEDをArduino Mega 2560に接続するための図。

これは、標準の Arduino プログラミング アプリケーションのウィンドウでスケッチがどのように見えるかです。

Arduino プラットフォームにランニング ライトを実装するためのプログラムのテキスト。

int first_out = 11; //最初の離散出力

int last_out = 13; //最後の離散出力

//入出力およびその他の初期データを初期化するためのブロック

last_out = last_out + 1; //ループ内で正しく使用できるようにユニットを追加します

//Arduino ボードの 11 番目、12 番目、および 13 番目の個別ピンを出力として定義します

for (i = first_out; i< last_out; i++) { pinMode(i, OUTPUT); }

for (t = first_out; t< last_out; t++) { //перебираем номера дискретных выходов 11,12,13 поочереди

デジタル書き込み(t, HIGH); //次のLEDを点灯

遅延(500); // 500ms遅延

for (i = first_out; i< last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

ガーランド内の制御可能な LED の数を増やすには、プログラム内で first_out と の値を置き換えるだけで済みます。 last_out。 最初の変数はコントローラーの最初の離散出力を格納し、2 番目の変数は連続する出力グループの最後の変数です。 たとえば、10 個の LED をガーランドに接続する場合は、次の値を入力します。 first_out = 4、last_out = 13。そして 4 番目から 13 番目のピンに順番に LED が取り付けられます。 ディスクリート入出力の 1 番目と 2 番目のピンは、コンピュータに接続されている USB ポートによって干渉されるため、触れないことをお勧めします。

このチュートリアルでは引き続き LED を使用しますが、LED の数を 5 に増やします。そして、走る火のエフェクトを作成します。 LED を制御するには、Arduino ポートを使用した操作を使用します。 Arduino ポートにデータを直接書き込みます。 これは、特定のコントローラーの入力/出力を操作するよりも優れています。 これにより、1 回の操作で LED の値を設定できるようになります。

Arduino UNO には 3 つのポートがあります。
B (デジタル入出力 8 ~ 13)
C (アナログ入力)
D (デジタル入出力 0 ~ 7)

各ポートは 3 つのレジスタによって制御されます。 DDRレジスタレッグ (ピン) が入力になるか出力になるかを決定します。 PORTレジスタを使用して、ピンを状態に設定できます 高いまたは 低い。 PIN レジスタを使用すると、Arduino ピンが入力として動作しているときにそのピンの状態を読み取ることができます。

ポート B を使用します。まず、ポート B のすべてのピンをデジタル出力として設定する必要があります。 ポート B には 6 つの脚しかありません。 DDRB B ポートのレジスタ ビットは、レッグを出力として使用する場合は 1 に設定し、レッグを入力として使用する場合は 0 に設定する必要があります。 ポート ビットには 0 ~ 7 の番号が付けられますが、常に 8 ビットすべてが含まれるわけではありません。
例:
DDRB = B00111110; // ポート B のピン 1 ~ 5 を出力として、0 を入力として設定します。

Microchip マイクロコントローラではその逆が当てはまることに注意してください。 0 ビット - レッグは出力として機能し、1 - 入力として機能します。

ランニングファイアプロジェクトでは、5 つの出力を使用します。
DDRB = B00011111; // ポート B のレッグを 0 から 4 までの出力として設定します

ポート B に値を書き込むには、PORTB レジスタを使用する必要があります。
次のコマンドを使用して最初の LED を点灯できます。
ポートB = B00000001;
1 番目と 4 番目:
ポートB = B00001001;

LED をいかに簡単にオン/オフできるかがわかります。 次にシフト演算子について説明しましょう

2 つのバイナリ シフト演算子があります: 左シフト演算子<< и оператор сдвига вправо >>。 左シフト演算子<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> ビットを右にシフトします。

例:
varA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

次に、以下に示すプログラムに戻りましょう。
2 つの変数を入力する必要があります。最初の upDown には移動先 (上または下) の値が含まれ、2 番目の cyclon にはどの LED を点灯するかが含まれます。

機能中 設定()どのレッグが出力として機能するかを決定します。

メインプログラムループ内 ループ()、変数を増やすと LED が順番に点灯します。 サイロン、そして一番上になると、変数 上下には 0 が割り当てられ、LED が順番に点灯します。

/* 発射中。 5 LED */ unsigned char upDown=1; // 上向きの動きから開始 unsigned char cylon=0; // LED の順序を決定します void setup() ( DDRB = B00011111; // ポート B を出力として 0 から 4 に設定します ) void loop() ( if(upDown==1)( // 上がったら cylon++; if( cylon>=4) upDown=0; // 最高の LED 番号に達すると、次のサイクルで下に進みます ) else ( cylon--; if(cylon==0) upDown=1; // when最小の LED 番号に達すると、次のサイクルで上がります) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

このチュートリアルでは引き続き LED を使用しますが、LED の数を 5 に増やします。そして、走る火のエフェクトを作成します。 LED を制御するには、Arduino ポートを使用した操作を使用します。 Arduino ポートにデータを直接書き込みます。 これは、特定のコントローラーの入力/出力を操作するよりも優れています。 これにより、1 回の操作で LED の値を設定できるようになります。

Arduino UNO には 3 つのポートがあります。

  • B (デジタル入出力 8 ~ 13)
  • C (アナログ入力)
  • D (デジタル入出力 0 ~ 7)

各ポートは 3 つのレジスタによって制御されます。 DDR レジスタは、ピンが入力になるか出力になるかを決定します。 PORT レジスタを使用して、ピンを HIGH または LOW に設定できます。 PIN レジスタを使用すると、Arduino ピンが入力として動作しているときにそのピンの状態を読み取ることができます。

ポート B を使用します。まず、ポート B のすべてのピンをデジタル出力として設定する必要があります。 ポート B には 6 つの脚しかありません。 DDRB B ポートのレジスタ ビットは、レッグを出力として使用する場合は 1 に設定し、レッグを入力として使用する場合は 0 に設定する必要があります。 ポート ビットには 0 ~ 7 の番号が付けられますが、常に 8 ビットすべてが含まれるわけではありません。

:

DDRB = B00111110; // ポート B のピン 1 ~ 5 を出力として、0 を入力として設定します。

Microchip マイクロコントローラではその逆が当てはまることに注意してください。 0 ビット - レッグは出力として機能し、1 - 入力として機能します。

ランニングファイアプロジェクトでは、5 つの出力を使用します。

DDRB = B00011111; // ポート B のレッグを 0 から 4 までの出力として設定します

ポート B に値を書き込むには、PORTB レジスタを使用する必要があります。 次のコマンドを使用して最初の LED を点灯できます。

ポートB = B00000001;
1 番目と 4 番目:
ポートB = B00001001;

LED をいかに簡単にオン/オフできるかがわかります。 次にシフト演算子について説明しましょう

2 つのバイナリ シフト演算子があります: 左シフト演算子<< и оператор сдвига вправо >>。 左シフト演算子<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> ビットを右にシフトします。

例:

VarA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

次に、以下に示すプログラムに戻りましょう。 2 つの変数を入力する必要があります。最初の変数 上下移動先の値 (上または下) と 2 番目の値が含まれます。 サイロンどの LED を点灯させるか。

機能中 設定()どのレッグが出力として機能するかを決定します。

メインプログラムループ内 ループ()、変数を増やすと LED が順番に点灯します。 サイロン、そして一番上になると、変数 上下には 0 が割り当てられ、LED が順番に点灯します。

初心者のためのArduino

このレッスンでは引き続き LED を使用しますが、LED の数を 5 に増やします。 ランニングファイアエフェクト。 LED を制御するには、Arduino ポートを使用した操作を使用します。 Arduino ポートにデータを直接書き込みます。 これは、特定のコントローラーの入力/出力を操作するよりも優れています。 これにより、1 回の操作で LED の値を設定できるようになります。

Arduino UNO には 3 つのポートがあります。

  • B (デジタル入出力 8 ~ 13)
  • C (アナログ入力)
  • D (デジタル入出力 0 ~ 7)

各ポートは 3 つのレジスタによって制御されます。 DDR レジスタは、ピンが入力になるか出力になるかを決定します。 PORT レジスタを使用して、ピンを HIGH または LOW に設定できます。 PIN レジスタを使用すると、Arduino ピンが入力として動作しているときにそのピンの状態を読み取ることができます。

ポート B を使用します。まず、ポート B のすべてのピンをデジタル出力として設定する必要があります。 ポート B には 6 つの脚しかありません。 DDRB B ポートのレジスタ ビットは、レッグを出力として使用する場合は 1 に設定し、レッグを入力として使用する場合は 0 に設定する必要があります。 ポート ビットには 0 ~ 7 の番号が付けられますが、常に 8 ビットすべてが含まれるわけではありません。

例:

DDRB = B00111110; // ポート B のピン 1 ~ 5 を出力として、0 を入力として設定します。

Microchip マイクロコントローラではその逆が当てはまることに注意してください。 0 ビット - レッグは出力として機能し、1 - 入力として機能します。

ランニングファイアプロジェクトでは、5 つの出力を使用します。

DDRB = B00011111; // ポート B のレッグを 0 から 4 までの出力として設定します

ポート B に値を書き込むには、PORTB レジスタを使用する必要があります。 次のコマンドを使用して最初の LED を点灯できます。

ポートB = B00000001;
1 番目と 4 番目:
ポートB = B00001001;

LED をいかに簡単にオン/オフできるかがわかります。 次にシフト演算子について説明しましょう

2 つのバイナリ シフト演算子があります: 左シフト演算子<< и оператор сдвига вправо >>。 左シフト演算子<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> ビットを右にシフトします。

例:

varA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

次に、以下に示すプログラムに戻りましょう。 2 つの変数を入力する必要があります。最初の変数 上下移動先の値 (上または下) と 2 番目の値が含まれます。 サイロンどの LED を点灯させるか。

機能中 設定()どのレッグが出力として機能するかを決定します。

メインプログラムループ内 ループ()、変数を増やすと LED が順番に点灯します。 サイロン、そして一番上になると、変数 上下には 0 が割り当てられ、LED が順番に点灯します。

コード: /* 発砲中。 5 LED */ unsigned char upDown=1; // 上向きの動きから開始 unsigned char cylon=0; // LED の順序を決定します void setup() ( DDRB = B00011111; // ポート B を出力として 0 から 4 に設定します ) void loop() ( if(upDown==1)( // 上がったら cylon++; if( cylon>=4) upDown=0; // 最高の LED 番号に達すると、次のサイクルで下に進みます ) else ( cylon--; if(cylon==0) upDown=1; // when最小の LED 番号に達すると、次のサイクルで上がります) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс

この実験では、LED スケールに沿って光を走らせます。

実験用部品リスト

- Arduino Uno ボード 1 枚;

- はんだなしブレッドボード 1 枚;

- LEDスケール1個。

- 公称値 220 オームの抵抗器 10 個;

- 11本のオス-オスワイヤー。

回路図

ブレッドボード上の図

スケッチ

Arduino IDE用のスケッチをダウンロード
// LED スケールは、 // 連続して配置されたピンのグループに接続されています。 最初と最後のピンに明確な名前を付けます #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() ( // スケールには 10 個の LED があります。各ピンに対して pinMode 10 // 回を書くこともできますが、これはコードが肥大化し、 // 変更がより困難になります。 // したがって、ループを使用する方が良いです。 // 各ピン (ピン変数) に対して pinMode を // 最初 (= FIRST_LED_PIN) から最後のものまで実行します // (<= LAST_LED_PIN), всякий раз продвигаясь к следующему // (++pin увеличивает значение pin на единицу) // Так все пины от 2-го по 11-й друг за другом станут выходами for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT); } void loop() { // получаем время в миллисекундах, прошедшее с момента // включения микроконтроллера unsigned int ms = millis(); // нехитрой арифметикой вычисляем, какой светодиод // должен гореть именно сейчас. Смена будет происходить // каждые 120 миллисекунд. Y % X — это остаток от // деления Y на X; плюс, минус, скобки — как в алгебре. int pin = FIRST_LED_PIN + (ms / 120) % 10; // включаем нужный светодиод на 10 миллисекунд, затем — // выключаем. На следующем проходе цикла он снова включится, // если гореть его черёд, и мы вообще не заметим отключения digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); }

コードの説明

  • 表現の使用 のために私たちは組織します カウンター付きループ 。 この場合、出力ポートを設定します。 このようなループを作成するには、次のものが必要です。
    • カウンタ変数に初期値を割り当てて初期化します。 私たちの場合には: int ピン = FIRST_LED_ ピン ;
    • ループを繰り返す条件を指定します。 私たちの場合には: ピン<= LAST_LED_ ピン ;
    • カウンタが変更されるルールを決定します。 私たちの場合には ++ピン(オペレーターについては以下を参照してください) ++ ).
  • たとえば、ループを作成できます for (int i = 10; i > 0; i = i - 1)。 この場合:
    • 変数 i には値が代入されます 10 ;
    • この値は条件を満たします 私 > 0 ;
    • したがって、ループ内に配置されたコードのブロックは初めて実行されます。
    • 意味 指定されたルールに従って 1 ずつ減算され、その値が取得されます。 9 ;
    • コード ブロックは 2 回目に実行されます。
    • すべては意味がわかるまで何度も繰り返される 等しい 0 ;
    • いつ 平等になるだろう 0 、 状態 私 > 0失敗してループが終了します。
    • コントローラーはループに続くコードにジャンプします のために ;
  • ループするコードを中括弧の間に配置します。 {} 複数の命令が含まれている場合。
  • ステートメントで宣言されたカウンタ変数 のために、ループ内で使用できます。 たとえば、この実験では ピン 2 から 11 までの値を順番に受け取り、に渡されると、 ピンモード、ループ内に配置された 1 つの回線で 10 個のポートを設定できます。
  • カウンタ変数はループ内でのみ表示されます。 それらの。 振り向いたら ピンループの前後で、コンパイラは宣言されていない変数に関するエラーを生成します。
  • デザイン i = i - 1上の説明の は方程式ではありません。 代入演算子 = を使用して変数に代入します 現在の値と同じ値を設定します , によって減少 1 ;
  • 表現 ++ピン- これはいわゆる オペレーター インクリメント 、変数に適用される ピン。 この命令は pin = pin + 1 と同じ結果を生成します。
  • 演算子はインクリメントと同様に機能します。 デクリメント - - 、値が 1 ずつ減ります。 これについては、算術演算に関する記事を参照してください。
  • データ・タイプ 符号なし整数符号なし整数を保存するために使用されます。 のみ 非負 。 符号の保存には使用されなくなった余分なビットにより、最大で次の値を保存できます。 65 535 ;
  • 関数 ミリマイクロコントローラーの電源がオンまたは再起動されてから経過したミリ秒数を返します。 ここでは、LED スイッチ間の時間をカウントするために使用します。
  • 表現の使用 (ミリ秒 / 120) % 10 10 個の LED のうちどれを点灯するかを決定します。 言い換えると、どの 120 ミリ秒セグメントが現在実行されているか、および現在の 10 個の中でその番号が何であるかを判断します。 セグメントのシーケンス番号を、現在のセットで最初に現れるポートの番号に追加します。
  • LEDを消すのは デジタル書き込み(ピン、LOW)スイッチを入れてからわずか 10 ミリ秒では、目には見えません。 間もなく、どの LED をオンにするか再計算され、直前にオフになった LED または次の LED がオンになります。

自分自身をテストするための質問

  1. なぜこの実験ではトランジスタを使わずにLEDスケールを接続するのでしょうか?
  2. ポート 5、6、7、8、9 の LED のみを点灯させる場合、プログラムの何を変更する必要があるでしょうか?
  3. 以下と同等のアクションを実行するために使用できる他の命令は何ですか? ++ピン ?
  4. 型変数の違いは何ですか 整数そして 符号なし整数 ?
  5. 関数は何を返しますか? ミリス() ?
  6. この実験では、LED を点灯するポート番号をどのように計算しますか?

独立したソリューションのタスク

  1. LED が 1 秒に 1 回切り替わるようにコードを変更します。
  2. ポートをオフにせずに、ライトがスケールの中央の 4 つの区画に沿ってのみ点灯することを確認します。
  3. プログラムを作り直して、代わりに int ピン = FIRST_LED_ ピン + (ミリ秒 / 120) % 10光の動きは周期によって制御された のために .
  4. ワイヤーを交換せずに、光が逆方向に流れるようにプログラムを変更します。



© 2023 globusks.ru - 初心者のための車の修理とメンテナンス