WS2812 RGBLEDアレイアニメーション用のExcel
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
このプロジェクトについて
オンラインサポートがあることを確認した後、WS2812 8x8 RGB LEDマトリックスを注文しました。これは、8列8列にラップされた64個のLEDのデイジーチェーン(テープ)ではなく、XY座標構造としてアドレス指定されることを期待しています。
「WS2812LEDアニメーション」検索では、すぐに理解できるものはほとんどありませんでした。 Kevin Darrahが制作したYouTubeビデオを見つけたとき、彼は16 x 16マトリックス(デイジーチェーン接続された256LED)をXY座標系であるかのようにアドレス指定していました。
彼のExcelユーティリティは、スケッチにコピー/貼り付けするためのテキストコードをコンパイルしました。その中には、すべての必要な機能が含まれていました。ライブラリをインポートする必要はありません。
彼がユーティリティ内でセルを選択し、RGB値が追加されたとき、それらは区別されることなくそれらの選択されたセルに適用されました。私が望んでいたものではなかったので、私はそれを再設計して再構築しました。それはまた、8x8の互換性のために彼のスケッチを変更しなければならなかったことを意味しました。
<図>WS2812についてもっと尋ねると、ExcelアプリケーションLED_Utility.xlsmを継続的に変更する必要がありました。
Excelワークブックは次の機能を提供します:
- 個別に対処するLEDRGBプロパティ。
- プログラミングを通じてこれらのプロパティを動的に変更します。
- モーションをシミュレートするためのこれらのプロパティのXY再配置。
- アドレス指定するRGB値と、XY位置の変更。
- 8x8と16x16の両方のLEDアドレス指定。
- クイックリファレンス用のRGB値の小さなコレクション。
具体的には、次のことを目的としています。
- 赤い中空の正方形を作成し、オンとオフを切り替えます。
- 別の正方形を異なる色のレイヤーでオーバーレイし、それらを交互に表示します。
- 赤の広場を成長させて遊んでください。
- 表示要素を保持するための関数の使用についての考えを検討してください。フェージングスパイラルを作成します。
- 色がフェードインおよびフェードアウトするデザインを作成します。
- 動きをデザインに取り入れます。
- 16x16アレイに対応します。
私はプログラミングの知識が問題を引き起こすことを認識しています。私はいくつかのガイダンスを提供しましたが、調査を提案するか、個人的にアドバイスするかもしれない誰かに尋ねてください。
TO BEGIN
ハードウェアを組み立てる
マトリックスにヘッダーピンがない場合は、ヘッダーピンのバンクをマトリックスの背面の下部(DIN、+ 5V、GND)にはんだ付けします。 DINピンをArduinoの右側のピン8に接続し、他の2つをボードの反対側の一致する場所に接続します。
<図>このボードとユーティリティの場合、XY(0、0)が左上です。
Excelユーティリティ
LED_Utility.xlsmファイルを開きます。「Eight」、「Sixteen」、「ColMap」の3つのシートが表示されます。
最後は、参照用に提供されているRGBコードの小さなサンプルです。
LED_Utility.xlsmを読み取り専用に設定して、上書きを防ぐだけでなく、「名前を付けて保存」を使用してファイルを保持し、再利用できるようにしました。他のいくつかの「エラートラップ」も組み込まれています。
「8」ワークシートを選択します。
<図>右側のグリッドがゼロで埋められていることに注意してください。スケッチは「null」値を受け入れないため、これは重要です。
上記のように4つのボタンがあります(「16」では、おそらく画面の右側に上下に表示されますが、以下に説明するように機能します)。
テキストコードを作成するには:
「表示」は、左側のグリッドに値のRGBを表示します。 0〜255の値のみを処理します。 255を超える値または任意の変数を警告します。
「varMap」は数値と変数を受け入れますが、表示は提供しません。
「ラップマップ」は2層構造です。 「表示」表示用に通常入力されるRGB値を受け入れます。次に、スケッチコーディングのモジュラス関数を追加して、マトリックスのオーバーランを可能にします。次に、変数を追加できますが、後でスケッチでプログラムする必要があります。ここでは取り上げません。
それぞれが、それを受け入れるように設計されたスケッチと互換性のあるグリッドの下に(両方のワークシートで)「赤」のテキストを生成します。
「クリア」は明らかに両方のグリッドを無効にします。
これらはすべて後で説明します。
作業しているとき Excelユーティリティ、ファイル/名前を付けて保存...を使用することをお勧めします 一部でデザインを再作成する必要がないようにコードを生成しました 他のポイント、特にデザインがかなり複雑な場合。また、あなたの 元のLED_Utility.xlsmは、読み取り専用に設定されており、保護されています。 上書きされます。
スケッチ
コードが提供されます 以下 with 注意事項 読み取り専用プロパティで保存します。
Arduino IDEを開き、「LED_Arduino.ino」スケッチをロードします。
次のことがわかります:
- 3行目は、使用中のArduinoピンを定義しています。これはピン8として設定されています。
- 4行目は、ボード上のLEDユニットを定義しています。これらは64です。
- ただし、5行目では、RBGカウント、つまり192を考慮して、その数値に3を掛けています。
- 8、10、25行目は、使用中の関数を定義しています。
3行目と19行目の間で元のテキストが変更されていますが、16x16マトリックスをアドレス指定するように編集できます。そうは言っても、私はソフトウェアでLED_Ardino16.inoを提供しており、LED_Utility.xlsmがそれに対応します。
多くの場合、「LED_Arduino.ino」を開いてから、名前を付けて「名前を付けて保存」を開くことをお勧めします。これにより、適切なプロパティを「読み取り専用」に設定していない場合でも、「LED_Arduino.ino」は変更されません。 [新しく作成したファイルにはまだ読み取り専用プロパティが設定されていることがわかりました。将来の編集と保存を確実にするためにそれをリリースします]。
同時に、新しく作成されたスケッチでは、ポートとボードのいずれかまたは両方を再定義する必要があります。エラーメッセージが表示されますが、すぐには明確にならない場合があります。
プロジェクト1
LED_Arduino.inoをArduinoIDEにロードし、Red_Squareとして保存します(inoは自動的に追加されます)。
当初、私は 3x3の赤い正方形を作成することを提案しています。 そのコードをスケッチの40行目に配置します。 CellsN8、O8、P8、N11、P11、N14、O14、およびP14は255の値を保持します。
LED_Utilityの赤いテキストの場合
mapLEDXY(2,2,255,0,0); mapLEDXY(2,3,255,0,0); mapLEDXY(2,4,255,0,0); mapLEDXY(3,2,255,0,0); mapLEDXY(3,4,255,0,0); mapLEDXY(4,2,255,0,0); mapLEDXY(4,3,255,0,0); mapLEDXY(4,4,255,0,0);
行40にコピーされると、その下のテキストは自然に下に移動します。
<図>スケッチをArduinoにアップロードすると、マトリックスによってその正方形のオンとオフが切り替わります。
先に進む前に、次のことを検討してください。
- 両方のグリッドをクリアします。
- その正方形内のいくつかの色を変更します。
- オリジナルの周りに別の色の正方形を追加します。
Project2
Red_Square.inoが上書きされないように、スケッチRed_Square.inoを開き、Colour_Sqとして保存することをお勧めします(「.ino」は自動的に追加されます)。
Colour_Sq.inoがIDEにロードされた状態で、ユーティリティのRed_Squareに移動し、中央の正方形を変更します。 MakeO8、O10、O14、およびO16「255」。 N11とP11は「0」ですが、N12とP12は「255」です。 「表示」を押します。
<図>で新しいコードを追加した後、IDEの47行目が予想されるので、次のコードブロックを続ける必要があります。
RGB_update(-1、0、0、0); delay(1000); clearLEDs(); RGB_update(-1、0、0、0); delay(1000);
自分に合わせて遅延値を変更できることに注意してください。 1000は1秒に相当します。
Project3
Red_Square.inoをリロードし、Growとして保存します。
ユーティリティで赤い四角を再作成します。その正方形の周りに、境界線を作成するために選択した値を追加します。これらの値は0〜255の範囲で指定できますが、32未満の値は非常に暗い場合があります。これは「LED_Utility.xlsm」での私の作成です:
<図>次に、その内側の赤い四角の値を削除して、「表示」を押します。生成されたコードをIDEの47行目にコピーし、その後42行目から46行目をコピーして貼り付けます。 Arduinoにアップロードして、内側の赤い正方形と、さまざまな色で囲まれた正方形を交互に表示します。
必要に応じて、別の境界線に拡大してみてください。
Project4
「ループ」にコードを追加すると、コードが長くなり、後で編集するのが困難になる可能性があることに気付いたかもしれません。
ここでスパイラルを構築しています。
画像はワークブック「spir5.xlsm」からのものです。これは、以前の4つのワークブックの集大成です。
「spir1.xlsm」は明るい(255)ブロックの中心で、「spir2.xlsm」は内側の4x4の正方形の値を使用し、「spir3.xlsm」は27の正方形のブロックなどです。各段階でコードをコピーしました私のスケッチには適用されますが、「ループ」には適用されません。
代わりに、「loop」の下に5つのvoid関数を作成し、「loop」内でそれらを参照しました:
Void loop(){Sp1(); Sp2(); Sp3(); Sp4(); Sp5(); clearLEDs(); delay(1000);}
<図> 私の最初の関数voidSp1()は、次のとおりです。
void Sp1(){mapLEDXY(3,3,255,0,0); mapLEDXY(3,4,255,0,0); mapLEDXY(4,3,255,0,0); mapLEDXY(4,4,255、 0,0); RGB_update(-1、0、0、0); delay(100); clearLEDs(); RGB_update(-1、0、0、0); delay(10);}
連続する各関数は、「mapLEDXY…」の2行を除いて同じになります。
この例から、「ループ」内で編集するのではなく、「spir4.xlsm」を開いて外側のヒントの色を編集し、専用の関数を編集することを提案するのは簡単に思えるかもしれません。
ばかげていることに隣接して、「MISSISSIPPI」という単語の文字を一度に1つずつ連続して表示したいとします。 11文字あるため、「voidloop()」が処理するコードは77行になります。 「S」を変更する場合は、4回編集する必要があります。単語で使用されているのは4文字だけです。したがって、それぞれに関数を作成し、「ループ」から適切に呼び出すことは理にかなっています。
Project5
このプロジェクトは、LED_Utilityの別の機能である「VarMap」を考慮に入れています。ここでは変数が導入されるため、プログラミングの基本的な知識が必要になります。
「Forループ」構文と「If」条件が使用されます。
「for」は、次のようなRGB値を増減するために使用されます。
for(int r =0; r <=256; r ++){} orfor(int r =255; r> =0; r-){}
「if」は必要に応じて手続きを変更します。
簡単に始めましょう、私は簡単に意味します。
LED_utilityと「Show」の中央に2x2の赤い正方形を作成します。コードは、次のとおりです。
mapLEDXY(3,3,255,0,0); mapLEDXY(3,4,255,0,0); mapLEDXY(4,3,255,0,0); mapLEDXY(4,4,255,0,0);
次に、255個の値をすべて「r」に変更します。 「表示」を押します…。うーん!それは好きではありません。それは大丈夫です、それは私が追加した保護です。 「VarMap」を押して、生成されたコードを確認します:
mapLEDXY(3,3、r、0,0); mapLEDXY(3,4、r、0,0); mapLEDXY(4,3、r、0,0); mapLEDXY(4,4 、r、0,0);
255は「r」に置き換えられました。
IDEで、アーカイブされたLED_Arduino.inoを開き、「変更」として保存します。
40行目に次のように入力します:
for(int r =0; r <256; r ++){} ///に続いて:for(int r =255; r> =0; r-){}
各「for」ステートメントの後に空白行があることに注意してください。
41行目にExcelコードを貼り付けます:
mapLEDXY(3,3、r、0,0); mapLEDXY(3,4、r、0,0); mapLEDXY(4,3、r、0,0); mapLEDXY(4,4 、r、0,0); follow that with:RGB_update(-1、0、0、0); delay(50);
次に、同じ4行のコードブロックをコピーして、2番目の「for」ブロックに貼り付けます。
その「for」ブロックの後に、「}」の下に「delay(200);」を追加します。 2番目のブロックが閉じたことを目で知る必要があることがわかりました!
アップロードすると、赤いブロックが最大の明るさまで増加してから減少し、オフになってから繰り返されます。
Project6
ここで、「If」条件を利用しましょう。
LED_utilityで前の赤い正方形を再作成しますが、G値とB値の両方に255を使用して、「スカイブルー」のブロックで囲みます。 「表示」を使用します。
Red 255はそのままにしておきますが、すべてのG 255を「g」に変更し、B255を「b」に変更します。
次に「VarMap」を押します。
<図>「LED_Arduino.ino」をIDEにリロードし、「FadeBorder」として保存します。
今、私たちはいくつかの問題を抱えています。 'g'と 'b'の2つの変数があり、それぞれに値を指定する必要があります。また、プログラムで宣言する必要があります。 「for」ステートメントで「g」を宣言するつもりですが、スケッチの前半で「b」を宣言する必要があります。 5行目のスケッチには、BYTE RGB [192]の宣言があります。その下に「intb =0;」と入力します。
説明のポイントとして、後で必要になるように2つの「for」ループを使用することはできません。ここで、すべての「b」値は、「for」ループによって生成された「g」値と同じである必要があります。
私の「ループ」は次のように構成されていますが、マップコードはありません:
void loop(){delay(50); for(int g =0; g <256; g ++){b =g; [ここにマップコードを追加] RGB_update(-1、0、0、0 ); delay(50);} for(int g =255; g> =0; g-){b =g; [ここにマップコードを追加] RGB_update(-1、0、0、0); delay(50);}}
B値は、ステートメント「b =g;」でG値にリンクされていることに注意してください。境界線の明るさが上下にフェードする間、R値は255で静的なままです。
Project7
「if」ステートメントを使用するときが来ました。
変数が右側のグリッドに表示される255を使用して、以下を作成して「表示」します。赤血球に隣接するセルに小さな「L」が表示されていることに注意してください。これにより、プログラムは適切なときにこれらのセルを制御できるようになります。
<図>今回は、値64に達するまで、LEDが緑と赤にフェードアップします。その後、これらの中間境界セルが黄色に変わり、ボードの輝度が上がり続けます。その後、プロセスが逆になります。
ここでも、「ループ」の基本構造を提供します。このスケッチを「FadeColourChange.ino」と呼びました。
void loop(){delay(50); for(int r =0; r <256; r ++){g =r; if(g> 64){g =65; l =r;} [ここにマップコードを追加] RGB_update(-1、0、0、0); delay(50);} for(int r =255; r> =0; r-){if(r <65){g =r; l =0;} [ここにMapCodeを追加] RGB_update(-1、0、0、0); delay(50);}}
Project8
この最後のプロジェクトでは、色を変更するのではなく、動きを紹介します。ボードを横切って移動する矢印がありますが、左から再表示されます。
<図>ここでは、「表示」を使用してコードを生成するだけです。
矢印を現在の位置から次の各位置に移動させたいので、「x」の値を変更する必要があります。
これはG29:G33で生成されたコードです:
mapLEDXY(0,3,0,255,255); mapLEDXY(1,1,255,128,128); mapLEDXY(1,3,0,255,255); mapLEDXY(1,5,255,128,128); mapLEDXY(2,2,255,128,128); mapLEDXY(2,3 、0,255,255); mapLEDXY(2,4,255,128,128); mapLEDXY(3,3,255,128,128);
「1」はX座標の最小値であるため、これを「x」と呼び、他のすべての値を1ずつ減らします。
mapLEDXY(x + 0,3,0,255,255); mapLEDXY(x + 1,255,128,128); mapLEDXY(x + 1,3,0,255,255); mapLEDXY(x + 1,5,255,128,128); mapLEDXY(x + 2、 2,255,128,128); mapLEDXY(x + 2,3,0,255,255); mapLEDXY(x + 2,4,255,128,128); mapLEDXY(x + 3,3,255,128,128);
私の「for(intx…loop」はうまくいきますが、ループの数回のパスで矢印が下の行にオーバーフローします!
解決策! 値が「8」を超える場合は、そのモジュラス値が必要です。そのため、「マップをラップ」ボタンを作成する必要がありました。 1つのLEDのコードは次のようになります:
mapLEDXY((x +1)%8、(y +1)%8、255、128、128);
XYレイアウトに対処するには、1つを使用しない場合でも、2つの「for」ループをネストするのが最善だと思います(はい、厄介な代替手段を見つけました)。
for(int x =0; x <8; x ++){for(int y =0; y <8; y ++){[mapcode]}}
2番目のループで「y <1」を作成すると、「y」は無視されます。逆に、「y」を8に、「x」を0に変更すると効果が異なります。
最後に、「ラップマップ」はRGB変数を受け入れます。私が参照した上記を参照してください。基本的なプログラミングをしている人はそれに対処できるはずです。マイナーデモとして、鏃頭の正面の明るさが変化するINOスケッチArrowVar.inoを追加しました。
16x16マトリックスの使用。
上記のすべては、16x16WS2812マトリックスに適用できます。ただし、「LED_Arduino16.ino」スケッチを使用する必要があります。
提供されているスケッチは、「Spiral16.ino」を除いて8x8マトリックス用に設計されています。 「Spiral.ino」よりも大きなディスプレイを提供します。
<図>このスパイラル、16x16マトリックスには、光拡散板として2枚のプリンター用紙がありました。妥当な画像をキャプチャするために、表示を約10秒間一時停止しました。
コードを開発するには、LED_Utility.xlsmを開き、ページの下部にある[Sixteen]タブを選択します。
私のように、ディスプレイが大きすぎてスクロールする必要がある場合は、ズームアウトオプションを使用してください。それでも、コードをコピーするにはスクロールが必要になります。
拡張機能?
他のサイズのマトリックスに対処することは可能ですか?
私の「LED_Arduino.ino」と「LED_Arduino16.ino」のオープニングラインがなぜそんなに違うのか疑問に思います。私は最初に特定の行をコメントアウトしました。どちらのスケッチも私が望むように機能します。
ボードを購入したばかりですが、「8x32」のワークシートを作成するつもりはありません。 「スケッチ」にご案内します " その上。対処する必要のあるパラメータがあります。 15行目と18行目にも注意してください。
注意:UNOタイプのボードよりも小さいオプションも検討しています。
コード
- LED_Arduino
LED_Arduino C / C ++
このスケッチは、プロジェクトの基盤を形成します。保存するときは、読み取り専用に設定し、さらに使用する場合は、アーカイブ用に「名前を付けて保存」に設定して、上書きを防ぎ、簡単に再編集できるようにする必要があります。 //現在はデジタルピン8のみが機能します#definenumberOfLEDs 64 // RGBLEDの総数[256] byte RGB [192]; // LEDの数を取得して3を掛けます[768] //ここでの機能voidRGB_update(int LED、バイトRED、バイトGREEN、バイトBLUE); // LEDを駆動する関数voidmapLEDXY(int x、int y、byte RED、byte GREEN、byte BLUE){int RGBlocation =0; // if(y%2 ==0){//偶数列[コメント解除] RGBlocation =x + y * 8; // [16] //} else {//奇数列[コメント解除] // RGBlocation =7-x + y * 8; // [15]および[16] //} [コメント解除] RGB [RGBlocation * 3] =BLUE; RGB [RGBlocation * 3 + 1] =RED; RGB [RGBlocation * 3 + 2] =GREEN;} void clearLEDs(){memset(RGB、0、sizeof(RGB));} void setup(){pinMode(WS2812_pin、OUTPUT); clearLEDs(); RGB_update(-1、0、0、0);} // setup0void loop(){// mapLEDXY行をRGB_updateのすぐ上に貼り付けます。RGB_update(-1、0、0、0); delay(1000); clearLEDs(); RGB_update(-1、0、0、0); delay(1000);} // loop // WS2812ドライバーFunctionvoidRGB_update(int LED、byte RED、byte GREEN、byte BLUE){// LEDは0で始まるLED番号// RED、GREEN、BLUEは明るさ0 ..255そのLEDバイトの設定値ExistingPort、WS2812pinHIGH; //ここでローカル変数を使用してpinWritesを高速化if(LED> =0){// REG GREENBLUE値をRGB []配列にマップRGB [LED * 3] =緑; RGB [LED * 3 + 1] =赤; RGB [LED * 3 + 2] =青; } noInterrupts(); //ビットストリームを送信している間に割り込みを強制終了します... ExistingPort =PORTB; //ポートB全体のステータスを保存します-そのポートの他のピンを台無しにすることなく、ポート全体に書き込みましょうWS2812pinHIGH =PORTB | 1; //これにより、ポートB全体をWS2812ピンで設定するために使用できるバイトが得られますHIGH int bitStream =numberOfLEDs * 3; // LED文字列の合計バイト数//このforループはすべてのビットを実行します(時間)WS2812ピンのオン/オフ時間を設定するには(int i =bitStream-1; i> =0; i-){PORTB =WS2812pinHIGH; //ビット7最初に、ピンをHIGHに設定します-関係なく常にハイになります0/1の//これがトリッキーな部分です。バイトのビットがハイ/ローかどうかを確認してから、そのステータスをピンに右//(RGB [i]&B10000000)はRGB [iの他のビットを取り除きます]なので、ここではB10000000またはB00000000が残ります。//ビットマスク "" &&B10000000) ""を使用して、ビットがハイかローかを簡単に確認できます。これにより、1または0 //が得られます。 1の場合は、既存のポートとORを取り、ピンをHIGHに保ち、0の場合、ピンはLOW PORTB =((RGB [i]&B10000000)&&B10000000)|と書き込まれます。既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); //これらはNOPSです-これらはクロックを遅らせますより正確なタイミングのためのサイクルPORTB =ExistingPort; //わかりました。ここでは、0/1ビットの状態に関係なくLOWにする必要があることがわかります__asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "" nop \ n \ t "" nop \ n \ t "" nop \ n \ t "" nop \ n \ t "); // 0/1ビットの状態に関係なくピンの最小LOW時間//次に実行次のビットについても同様です...わずかな変更については最後のビットを参照してくださいPORTB =WS2812pinHIGH; //ビット6PORTB =((RGB [i]&B01000000)&&B01000000)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; //ビット5PORTB =((RGB [i]&B00100000)&&B00100000)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; //ビット4PORTB =((RGB [i]&B00010000)&&B00010000)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; //ビット3PORTB =((RGB [i]&B00001000)&&B00001000)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; //ビット2PORTB =((RGB [i]&B00000100)&&B00000100)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; //ビット1PORTB =((RGB [i]&B00000010)&&B00000010)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t "); PORTB =WS2812pinHIGH; //ビット0__asm __( "nop \ n \ t"); //この最後のビットでは、チェックがはるかに高速であるため、ここにNOPを追加する必要がありましたPORTB =((RGB [i]&B00000001) &&B00000001)|既存のポート; __asm __( "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t" "nop \ n \ t"); PORTB =ExistingPort; //ピンをLOWに書き込んだ後、NOPがないことに注意してください。これは、FORループがNOPSの代わりに使用できるクロックサイクルを使用するためです} // forループinterrupts(); //割り込みを有効にする//すべて完了しました!} // void RGB_updateLed_Utility.xlsm
このアプリケーションは、スケッチにコピー/貼り付けするためのさまざまなテキストを生成します。https://github.com/CobraCat/LED_UtilitySketches.zip
これらは、開発中に使用されるスケッチの一部または複数です。これらは「サポート」として利用できます。https://github.com/CobraCat/LED_Utility製造プロセス