開発者は欲しかった!このプロジェクトを支援するために、才能のあるReactとC ++開発者を探しています。コードをご覧ください。興味がある場合は、[email protected]にお問い合わせください。

Davepl、9/19/2021
NightDriversStripは、ESP32マイクロコントローラーにアップロードするフラッシュプログラムを構築するためのソースコードパッケージです。チップピンに接続されたWS2812BスタイルのLEDの最大8チャネルを駆動し、それらに派手な色とパターンとデザインを表示できます。マイクを装備したモジュールのオーディオ/音楽/ビート反応性エフェクトなど、LEDストリップに表示するように構成できる多くの効果が組み込まれています。また、オプションで、ポート49152でデフォルトで開くTCP/IPソケットを介して、単純なLZ圧縮(または非圧縮)形式でLEDのカラーデータを受信することもできます。ESP32は、NTPを使用してクロックを同期させます。
NightDriverは、WS2812BスタイルのストリップとHub75スタイルのマトリックスの両方を駆動できます。
最近では、Webブラウザ以外のNothingを使用して、ほとんどのNightdriverプロジェクトをサポートされているデバイスでフラッシュできるWebインストーラーがプロジェクトに追加されました。これがあなたが始めたい方法である場合は、次のセクションを参照してください。
サポートされているデバイスにNightdriverプロジェクトの大部分をインストールするために使用できるWebアプリケーションが利用可能になりました。これにより、ESP32デバイスでプロジェクトをすばやくフラッシュし、WiFiに接続して、すぐにソースコードを使用する必要なく使用を開始できます。
インストーラーには、Webシリアルをサポートするブラウザが必要であることに注意してください。執筆時点では、このようなサポートを含むブラウザは、Chrome、Edge、Operaの最近のバージョンです。
これらの手順に従ってフラッシュし、サポートされている場合は、デバイスにWiFiをセットアップしてください。
USBケーブルでデバイスをコンピューターに接続します。
ブラウザの次のURLに移動します:https://plummerssoftwarellc.github.io/nightdriverstrip。次に、次のように見える画面を表示する必要があります。 
ドロップダウンリストからデバイス(「M5Stickc Plus」など)を選択します。そのデバイスにサポートされているプロジェクトを備えた2番目のドロップダウンが表示されます。
2番目のドロップダウンでフラッシュするプロジェクトを選択します。そうすると、その下に接続ボタンが表示されます。各プロジェクトのラベルには、問題のビルドで有効になっている主要な機能の表示が含まれていることに注意してください。各機能文字の凡例は、プロジェクトのドロップダウンの下に示されています。
[接続]ボタンをクリックします。ダイアログは、シリアルポートを選択するように依頼します。システムによっては、それらの1つまたはリストのみが表示される場合があります。複数が示されている場合、一般に「USBシリアルポート(COMN)」と呼ばれるものと呼ばれます。正しいポートを選択し、[接続]をクリックします。
新しいダイアログが表示されます。それが提供するオプションの1つは、「<device> for <device>のインストール<project>」です。そのオプションをクリックします。
ダイアログでは、デバイスを消去するかどうかを尋ねるダイアログが表示されます。ナイトドライバーストリップを初めてデバイスにフラッシュする場合、またはクリーンなインストールをフラッシュする場合は、これが初めてである場合はチェックボックスを確認してください。これにより、すべての設定がデフォルトにリセットされます。消去するかどうかにかかわらず、WiFi構成がクリアされることに注意してください。 [次へ]をクリックします。
これで、デバイスをフラッシュすることを確認するように求められます。 [インストール]をクリックします。
インストールの進行状況を示すダイアログが表示されます。通常、これには約2分かかります。フラッシュが完了したら、[次へ]をクリックします。
この時点で、4つのことが起こる可能性があります。
デバイスがWiFiをサポートしていない場合は、ポイント12にスキップできます。
WiFi接続情報ダイアログで、SSIDとパスワードを選択または入力します。 [接続]をクリックします。場合によっては、接続が実際に成功した後、WiFi接続ダイアログが再び表示されます。その場合、[スキップ]をクリックします。また、WiFiが実際に正常に接続されている間にタイムアウトが報告される可能性もあります。その場合、[戻る]をクリックします。
これで、フラッシュしたプロジェクトの詳細を表示するダイアログが表示されます。また、再度フラッシュし、デバイスのログとコンソールを表示するオプションも提供します。さらに、デバイスがWiFiをサポートしている場合、オプションがデバイスのWebアプリケーションにアクセスすることができます(オンデバイスWebサーバーも有効になっている場合)またはWiFi設定を変更します。 Webサーバー/Webアプリケーションを含むデバイス画像をフラッシュした場合、WiFiネットワークへの接続が作成された後、1分ほどかかる場合があることに注意してください。
すでにフラッシュしたデバイスでWiFi構成を変更する場合は、次の手順を使用してください。
USBケーブルでデバイスをコンピューターに接続します。
ブラウザの次のURLに移動します:https://plummerssoftwarellc.github.io/nightdriverstrip。
ドロップダウンリストからデバイス(「M5Stickc Plus」など)を選択します。そのデバイスにサポートされているプロジェクトを備えた2番目のドロップダウンが表示されます。
2番目のドロップダウンで、以前にフラッシュしたプロジェクトを選択します。そうすると、その下に接続ボタンが表示されます。
[接続]ボタンをクリックします。ダイアログは、シリアルポートを選択するように依頼します。システムによっては、それらの1つまたはリストのみが表示される場合があります。複数が示されている場合、一般に「USBシリアルポート(COMN)」と呼ばれるものと呼ばれます。正しいポートを選択し、[接続]をクリックします。
新しいダイアログが表示されます。 「Wi-Fiへの接続」または「Wi-Fiの変更」オプションがまだ表示されていない場合は、「ログとコンソール」ウィンドウを開き、ログ行が表示されるまで待ちます。次に、クリックしてウィンドウを閉じます。 「Wi-Fiに接続」または「Wi-Fiを変更する」オプションが表示されたら、クリックします。
WiFi接続情報ダイアログで、SSIDとパスワードを選択または入力します。 [接続]をクリックします。場合によっては、接続が実際に成功した後、WiFi接続ダイアログが再び表示されます。その場合、[スキップ]をクリックします。また、WiFiが実際に正常に接続されている間にタイムアウトが報告される可能性もあります。その場合、[戻る]をクリックします。
インストーラーに含まれる画像は、このリポジトリのソースコードの現在の状態を使用して構築されます。使用するプロジェクトに変更したいものがある場合は、次の段階に移動する時が来ました。
次の段階では、NightDriversTripであるアプリケーションの構造に関するある程度の知識が必要になるため、これはNightdriverstripコードベースの紹介を読むのに良い時期かもしれません。
WiFiを備えたデバイスでは、NightDriversTripはプロジェクトの一部であるWeb UIをホストするWebサーバーを開始できます。実行している効果を表示および変更し、デバイスのライブパフォーマンス統計を取得するために使用できます。
WebServerが有効になっていることでデバイスが開始されると、Web UIにWebブラウザーを開き、アドレスバーでデバイスのIPアドレスを入力することでアクセスできます。ロードされると、画面の左側にあるアイコンを使用して、UIのオンとオフ内のビューを切り替えることができます。
Web UIの詳細については、独自のreadme.mdをご覧ください。
Web UIに加えて、WebServerはRESTのようなAPIも公開しています。とりわけ、さまざまな構成設定を使用して読み取り、変更できます。 APIの詳細については、REST_API.MDで入手できます。
次のことをお勧めします。
DEMO構成を構築します。これを行うために必要なことに関するいくつかの指針は、以下にあります。globals.hまたはPlatformio.iniファイルで機能の有効化を開始します。以下の機能を参照してください。wifi ssidとパスワードがinclude/secrets.hに設定されていることを確認します。これは、include/secrets.example.hのコピーを作成することで作成できます。
include/secrets.example.hではなく、include/secrets.hでそれらを設定するようにしてください!
enable_wifiをGlobals.hの1に定義することにより、WiFiを有効にします。
# define ENABLE_WIFI 1これは、以下のセクションを定義する機能で説明されているように、Platformio.iniファイルで構成することもできます。
これらは、NightDriversStripの主要な機能を有効にすることを可能にします。 platformio.iniのbuild_flagsまたはglobals.hでそれらを定義します。注:一部の定義はボード固有ですが、これは以下に記載されています。
| 機能定義 | 説明 |
|---|---|
| enable_wifi | wifiに接続します |
| incoming_wifi_enabled | 着信カラーデータとコマンドを受け入れる |
| enable_webserver | 内部Webサーバーをオンにします |
| time_before_local | ランプが出て、ローカルコンテンツを表示する前に何秒前 |
| enable_ntp | Webから時計を設定します |
| enable_ota | Air Flashの更新を受け入れます |
| ハードウェア固有 | 説明 | サポートボード |
|---|---|---|
| use_m5display | 内蔵のLCDで統計を有効にします | M5Stick-CおよびM5Stick-C Plus |
| use_oled | 組み込みのOLEDに統計を有効にします | ヘルテックwifiキット32 |
| use_lcd | 外部ILI9341 LCDで統計を有効にすることを可能にします | wrover32 |
| use_tftspi | 外部TTO LCDに統計を有効にすることを可能にします | esp32dev |
| enable_audio | マイクからオーディオを聞いて処理してください | M5Stick-CおよびM5Stick-C Plus |
| Enable_Remote | IRリモートコントロール | IRハードウェアが必要です |
platformio.iniの例( -Dのフラグの接頭辞、例えばENABLE_WIFI=1 being -DENABLE_WIFI=1 )
build_flags = - DENABLE_WIFI =1Globals.hの例:
# define ENABLE_WIFI 1 新しいエフェクトを追加するために、あなた:
LEDStripEffect (または既存のエフェクトクラス)から派生し、優れたものは唯一の重要な関数であるDraw()発生します。組み込みのエフェクトが何をするかをチェックしてくださいが、要するに、それぞれが24ビットの色のトリプレットを表すCRGBオブジェクトの配列に基本的に描画します。完了したら、CRGBアレイがLEDに送信され、すぐに次のフレームを求められます。抽選方法は、理想的には約30ミリ秒のどこかで、バランスが速い場合はバランスのために睡眠をdelay()必要があります。基本的には忙しいループで繰り返し描画できますが、必要ありません。#define追加effects.hてください。各エフェクトクラスには1つのエフェクト番号のみが必要です。選択した番号が別のエフェクトクラスでまだ使用されていないことを確認してください。効果クラスと関連する効果番号の間のリンクの詳細については、 effects.hで見つけることができます。LoadEffectFactories() effects.cppで作成された効果リストDEMOクラスを追加します。 ADD_EFFECT()マクロは、新しい効果の効果番号とタイプ名をパラメーターとして期待しています。追加のパラメーターは、作成時にエフェクトのコンストラクターに渡されます。存在する場合、SpiffのJSONファイルから最初にエフェクトテーブルを作成するグローバルEffectManagerインスタンスがあります。次に、 LoadEffectFactories()に登録されている他の効果を追加しますが、JSONファイルには含まれていません。次に、 DEFAULT_EFFECT_INTERVALで制御されたレートでこれらの効果の間で回転します。効果は、アクティブになったかどうかは通知されません。必要に応じて描画するように求められます。
LEDの各チャネルには、 LEDStripGfxインスタンスに関連付けられています。 _GFX[0]は、 LED_PIN0などに関連付けられたLEDStripGfxです。 _GFX[0]->leds()を呼び出すことにより、PIN0のLEDバッファーを取得できます。_GFX _GFX[0]->GetLEDCountピクセルが含まれます。 fill_solid 、 fill_rainbow 、 setPixel 、およびその他の描画機能を呼び出すことで、生のバイトに触れることなくバッファーに描画できます。
最もシンプルな構成であるDEMO 、144個のLEDの単一メートルストリップとESP32に接続された電源があると想定しています。起動し、 LoadEffectFactories()関数に単一のRainbowFillEffectが見つかり、LEDに送信する前にCRGBアレイを更新するためにDraw()メソッドを繰り返し呼び出します。正しく動作する場合は、LEDストリップにスクロールするレインボーパレットを描く必要があります。
ここでは単に「デモ」と呼ばれる最も単純な構成は、ボード固有のビルド環境によって提供されます。このような環境のリストは、「Python3ツール/show_envs.py」を実行することで見ることができます。これは、この記述の時点で、「デモ」のハードウェア固有のバリエーションが次のとおりであることを読者に伝えるでしょう。
これらのビルドタイプは、PIOへの「-e」引数またはPlatformio IDE/VSコード内のメニューオプションによって選択される場合があります。
エフェクトテーブルは、再起動全体で効果の状態(および実際に効果リスト全体)を保持するために、定期的に頂点にあるJSONファイルに持続します。これは、主にNightDriversStripの将来の更新に備えています。ここでは、デバイスWebアプリケーションを使用して個々の効果の効果リストの構成を変更できます。これを容易にするAPIエンドポイントは、すでに利用可能であり、使用可能です(以下のデバイスWeb UIとAPIを参照してください。)
これにより、 SerializeToJSON()のオーバーライドと、デフォルトでLEDStripEffectによってJSONから/JSONにシリアル化されているプロパティよりも(または必要な)効果を持続するために(または必要な)効果を持続するために、対応する脱派化コンストラクターを提供する必要があります。
プロジェクト全体を通して、JSONハンドリングと(DE)シリアル化に使用されるライブラリはArduinojsonです。とりわけ、これは次のことを意味します。
Arduinojsonでの条約に沿って、 SerializeToJSON()関数は、arduinojson関数( JsonObject::set()など)がfalseを返す場合を除き、 true返す必要があります。 SerializeToJSON()関数がfalseを返すと、全体的なシリアル化バッファーの増加とシリアル化プロセスの再開がトリガーされます。
個々のクラスインスタンス(DE)シリアル化操作に必要なメモリは、以下を作成することにより、事前に予約する必要があります。
StaticJsonDocument<バッファーサイズ>() 。これは、小さなバッファーサイズ(1024バイト未満)にのみ使用できます。AllocatedJsonDocument(バッファサイズ) 。実際に必要なメモリの量は、(de)シリアル化されたプロパティの数、タイプ、内容に依存し、事実上、推測ゲームです。つまり、コードベース全体に表示される値は、教育を受けた推測でもあります。シリアル化されたプロパティが最後に生成されたJSONに表示されない場合、シリアル化プロセスがバッファメモリがなくなって、バッファメモリを増やす必要があると仮定することが合理的です。
JSON(DE)シリアル化に関連する詳細をよりよく理解するには、Arduinojsonドキュメントの「最初の連絡先」セクションのそれぞれのチュートリアルを見ることを検討することができます。
たとえば、開発中に、ボード上の(JSON-Persisted)エフェクトリストはLoadEffectFactories()効果を追加する効果と同期できなくなります。これが発生した場合、ネットワークを介してボード上のエフェクトリストをデフォルトにリセットできます。これが機能するためには、ボードをWiFiに接続する必要があり、Webサーバーが実行されている必要があります。
リセットは、次のフィールドセットでhttp:// <device_ip>/リセットにhttpフォーム投稿を実行することで実行できます。EffectConfig= 1およびBoard = 1。 「通常の」カールが利用可能なシステムでは、次のコマンドがトリックを行う必要があります。
curl -d " effectsConfig=1&board=1 " -X POST http:// < device_IP > /resetこのリセットを実行する機能が、Web UIの将来の更新で追加される可能性があります。
さらに、永続的なエフェクトリストを完全に「無視」し、スタートアップで標準効果リストを常にロードすることも可能です。これを行う方法に関するドキュメントは、前述のLoadEffectFactories()関数の上部に向けて利用できます。
データをインターネットから引き込む必要がある効果を開発する場合、 g_ptrSystem->NetworkReader()グローバルリファレンスを介して利用可能なネットワークリーダー関数をNetworkReaderクラスに登録できます。インスピレーションの原因として、 PatternSubscribersまたはPatternWeather効果のいずれかを使用できます。 PatternStocksは、プライベートサーバーからライブ(15分の遅延)在庫の見積もりを引き出します。
このプロジェクトは、Platformioを使用して構築できます。 Visual Studioコードの上に構築されたPlatformio IDEがあります。コマンドラインプラットフォームコアツールが含まれています。 IDEを使用したくない場合は、独自にインストールすることもできます。
フロントエンドアプリケーションをコンパイルするには、NPMを使用したNodeJSの最近のバージョンの最近のバージョンを必要とします。 NodeJS Webサイトからダウンロードできます。 nodejsをインストールするためのサポートされている方法の手順も同様に利用できます。読んでフォローしてください。
オペレーティングシステム/Distributionのデフォルトパッケージマネージャーを使用してnodejsをインストールすると、必要以上に古いnodejsバージョンが残る可能性が高いことに注意してください。
アプリケーションは、NPMバージョン8.13.2でノードバージョン16.15.1および18.17.1でテストされています。新しいバージョンも原則として機能するはずです。
フロントエンドアプリケーションの操作の詳細については、サイト/readme.mdを参照してください。
IDEまたはCOREがインストールされている場合、NightDriversStripは、プロジェクト/リポジトリディレクトリを入力し、次のコマンドを発行することにより、コマンドシェルから構築できます。
pio run -e demo
これにより、 demo構成が構築されます。
pioが見つからないというエラーが発生した場合は、パスに追加する必要がある場合があります。
利用可能なすべての構成を構築するには、次のコマンドを使用します(これには時間がかかる場合があります):
pio run
エフェクトで使用できるファイルシステムを構築およびアップロードするには(現在はありませんが)、PlatformIoを使用してSpiffs画像をボードのフラッシュにビルドしてアップロードする必要があります。 Platformioユーザーインターフェイスを使用するか、 pioコマンドラインツールを使用してこれを行うことができます。
pio run --target buildfs --environment <project name>
pio run --target uploadfs --environment <project name>
このリポジトリには、プロジェクトの構築中または建設後にさまざまなタスクを実行するための多くのスクリップが含まれています。それらはtoolsディレクトリに含まれています。スクリプトは、プロジェクトのメインディレクトリから開始される予定であることに注意してください。だから、使用:
tools/buddybuild.shの代わりに:
cd tools
./buddybuild.sh色データをソケットに送信する簡単なものを書きます。フォーマットは非常に基本的なものです。どのチャネル、描画するLEDの数、描画するとき、カラーデータ自体です。データの前に正しいヘッダーを送信する限り、ゼロタイムスタンプで非圧縮データを送信できます。これは非常に簡単です。タイムスタンプがゼロのデータは、バッファリングなしですぐに描画されます。
| バイト | 関数 | |
|---|---|---|
| 0、1 | Commandid | (それを3に設定します。これはWIFI_COMMAND_PIXELDATA64です) |
| 2、3 | Channeid | (単一チャネルの場合は1に設定しますが、0は歴史的な理由でも機能します) |
| 4-7 | 長さ | (設定されている24ビットPIXELSの数) |
| 8-15 | 秒 | (0に設定) |
| 16-24 | マイクロス | (0に設定) |
| 25+ | RGB | (24ビットRGBカラーデータ、1つは上記の長さで指定されたPIXELごとに1つ) |
ENABLE_WIFIおよびINCOMING_WIFI_ENABLEDで構築された場合、チップがWiFi接続とDHCPアドレスを取得できる場合、ポート49152でソケットを開き、上記のように形成されるパケットを待ちます。
1秒あたりの24フレームのシリーズ(または500 LED未満の場合は30)を生成し、タイムスタンプを1秒あたり1/2に加えて1/2に設定します。 WiFiの上でチップに送信すると、各パケットが提供されたタイムスタンプが期限になると、安定したストリームで1/2秒に描かれます。
完全な開示:Amazonのアソシエイトとして、PlummersSoftWarellcは資格のある購入から手数料を獲得します。購入価格に追加されておらず、コストをまったく引き上げません。さらに、これらの販売を含むデイブのガレージチャンネルからの2021年の利益はすべて、UW自閉症センターに送られます。
複雑な一連のガイドラインを作成するのではなく、オープンソースのコラボレーションがプロジェクトにもたらすことを願っています。人々が重要な機能を追加し、コードの欠陥と欠点を修正することです。彼らが機能を追加するとき、彼らは既存のコードで物事が行われる方法と一致する方法でそれを行います。彼らは、すべてを独自のイメージに研究し、書き換えたいという衝動に抵抗し、代わりにソースコードのスラッシュと変化を減らしながら機能的な改善を最大化する努力をします。
一貫性のない命名を考えてみましょう。これは修正する必要があります。いくつかはカメルケース、一部はソースに応じてpszhungarianなどです。私はそれがすべて単一の標準TBDに更新されたことを望みます。 TBDが決定されるまで、私はWin32標準に傾いています。
関数で作業するときは、関数のスタイルで作業します。クラスで作業するときは、クラスのスタイルで作業してください。ファイルで作業するときは、ファイルのスタイルで作業します。それらが一貫していない場合は、変更を最小限に抑えてください。スタイルの変更は、グループでの議論の後にのみ導入されるべきであり、一般的にプロジェクト全体にわたってそのスタイルの変更を所有することを伴うはずです。
次に、ビルドを制御するために#define sを考えてみましょう。より良い、よりエレガントなことをする方法があるかもしれません。構成プラットフォーム全体があります。しかし、私はそれをシンプルに保つことを望んでいます。そして、「問題のコードを建設する前に、経験豊富なC ++プログラマーが学ぶ必要があることが最も少ない」と定義しています。避けることができれば、新しいクラスライブラリを学びたくありません!
コーディングの寿命は、私にシンプルさの側で誤りをすることを教えてくれたので、ソースコードを明らかに縮小しない限り、バリアードテンプレートの構成要素を導入しないでください。コードの複雑さと長さを拡大するものはすべて疑わしいはずです。
あなたが望むものを何でも追加し、/またはあなたの導かれた夢をかなえるために必要なものを追加します。私の失態を修正します。私の知識の中で明らかなギャップを記入してください。最も少ないビットで最も瞬く間にあるものは何でも私の投票を得ます。コードとプログラムのすべてのバイトに対して、追加のクールな点滅しか得られません。その返品は、linkenperbitで測定されます。コードを追加する瞬きの量の量をソース(およびバイナリ)への影響で割ったものです。
複製するには、Mesmerizerプロジェクトを構築します。次に、pio/build_cacheを削除して再度ビルドして、2番目のビルドに時間を費やします。
ASUS 7995WX [96-Core、192-Thread] - > [Davepl、02/11/2024] 20.73秒
HP Z6 G5A、7995WX、128GB [96-CORE、192-THREAD] - > [Davepl 11/29/2023] 25.270秒
3970X、128GB [32-CORE、64-THREAD] Windows11+WSL2/ubuntu02.04lts-> [davepl 11/29/2023] 34.292秒
Mac M1 Ultra Studio [10 Core、20-Thread] - > [Davepl 11/29/2023] 48.368秒
Spectrum config( pio run -e spectrum )を構築する時間。すべてがインストールされてダウンロードされた後、クリーンビルドを想定します。
AMD 3970 32コア、128GB、RAID SSD-> [Davepl 09/19/2021] 12.93秒(WSLの下で実行)
AMD 5950X 16コア、64GB、SSD-> [Davepl 09/19/2021] 16.90秒
Apple MacBook Pro M1 Max、8+2 Cores、64GB、4TB SSD-> [Davepl 12/15/2021] 20.90秒
Apple MacBook Air M2、16GB、256GB SSD-> [Vaaski 02/28/2023] 56.17秒
MacBook Pro 2020、8 Cores 2.4GHz I9、64GB、4TB SSD-> [Davepl 09/19/2021] 34.09秒
Mac Mini、4 PERFコア、16GB-> [Davepl 09/19/2021] 39.06秒
Mac Pro、6コア、3.5 GHz、64GB、1TB SSD-> [Davepl 09/19/2021] 48.42秒
Xeon Silver、20コア、2.1GHz、16GB VM-> [Davepl 10/10/2022] 53.11秒
Raspberry Pi 4、64ビットUbuntu LTS、4 Core、4GB-> [Davepl 09/23/2021] 6分25秒
Jetson Nano 2G、4 Core Arm A57-> [Davepl 10/04/2021] 2分56秒