検索
ホームページウェブフロントエンドjsチュートリアルnode.jsを使用したドットマトリックスLEDディスプレイに画像を表示する

node.jsを使用したドットマトリックスLEDディスプレイに画像を表示する

キーテイクアウト

  • Freetronics DMDライブラリは、ドットマトリックスLEDディスプレイにライン、シェイプ、テキストを描画するために使用されます。このライブラリは、Freetronics Githubリポジトリからダウンロードし、/arduino/libraries/folderにコピーできます。
  • Arduinoスケッチコードは、DOT Matrix LEDディスプレイに要素を表示する責任があります。シリアルポート上のメッセージを監視し、これらのメッセージに基づいてディスプレイを変更します。
  • node.jsコードは、シリアルポートを介してArduinoにメッセージを送信するために使用されます。 SerialPortとPNG-JSの2つのNPMモジュールが必要です。シリアルポートモジュールを使用すると、シリアルポートを介してメッセージを送信でき、PNG-JSはPNG画像で読み取ります。
  • node.jsのpng.decode()関数はpng画像ファイルを読み取り、0から255の値の配列を返し、各ピクセルの赤、緑、青、およびアルファ値を表します。次に、これらの値を使用して、各ピクセルをドットマトリックスLEDディスプレイに黒または白として表示する必要があるかどうかを判断します。
  • ドットマトリックスLEDディスプレイは、さまざまな方法で拡張およびカスタマイズできます。たとえば、APIに接続してそれを通過する画像を表示したり、時間の時間、インターネットに接続されたデバイスの状態、天気などに応じて異なる画像を表示できます。
  • ドットマトリックスLEDディスプレイは楽しいです。どの開発者が空白のライトのキャンバスを好まないでしょうか?最近、node.jsを使用してFreetronicsから32 x 16ドットマトリックスディスプレイをペアにし、白黒のPNG画像を表示するようにしました。この記事では、すべてがどのように機能するかを説明します。
  • ドットマトリックスLEDディスプレイ(DOT Matrix DisplayまたはDMDとまったく知られている)は、LEDライトのグリッドを備えたディスプレイで、テキストと形状を表示するためにオン /オフにできます。それらのいくつかは複数の色を持っていますが、他の色は単一の色です。このデモで使用するものは1色しかないため、白黒画像に限定されています。注意することが重要です - LEDディスプレイはLCDディスプレイとはまったく異なります。 LCDは派手な光クリスタルを使用し、VCR、クロック、計算機などのディスプレイに使用されます。数週間前に、node.jsを使用してArduino LCDにWeb APIを表示する記事を書きました。 2つを比較したい場合は、それを見てください。
この特定のデモでは、Freetronics DMDライブラリに依存しているため、Freetronics 32×16ドットマトリックスディスプレイが必要です。

デモコード

コードをつかみ、自分で試してみたい場合は、Githubでここで見つけることができます。

フリートロニクスDMDライブラリ

LEDドットマトリックスディスプレイへの線、形状、テキストの描画はすべて、Freetronics DMDライブラリを介して行われます。それを使用するには、次の手順を完了します

  1. githubリポジトリからDMDライブラリをダウンロードします
  2. これらのファイルを、独自のフォルダー名の下に/arduino/libraries/folderにコピーします。私のMacで私のために、私はそれを/users/username/documents/arduino/dmd-masterのフォルダー内に配置しました。
  3. Timeroneライブラリをダウンロードして、/Arduino/ライブラリ/フォルダーにも配置します。例えばMACユーザー、/users/username/documents/arduino/libraries/timerone-r11。
  4. 私たちのarduinoスケッチ

DMDに要素を表示するための機能のほとんどは、Arduinoスケッチコード内で発生します。スケッチコードは、シリアルポートを介したメッセージに目を光らせ、それらのメッセージに基づいて表示される表示を変更します。

スケッチは、含まれるものと定数から始まります。 SoftwareSerial.hを含めて、シリアルポートにアクセスし、DMDの幅と高さを定義できるようにします(当社の場合は32×16)。 Buflengthは、私たちが持っているライトの数を保存します。これは、Arduinoを送信したいメッセージの最大サイズです。私たちの場合、それは32に512の16を掛けます。

次に、Freetronics DMDに固有のインクルードがあります。これらはすべて、以前にArduinoライブラリフォルダーにコピーしたファイルから利用できるようにする必要があります。

次に、2つの定数displays_acrossとdisplays_downがあります。これらは、一緒に結合したLEDディスプレイの数を定義するために使用されます。私はあなたが私と同じ状況にあり、1つのディスプレイを持っていると仮定します。したがって、これらは両方とも1つに等しくなります。次に、それをDMDライブラリに渡して、DMD DMD()を使用して実行します。
<span><span>#include <softwareserial.h></softwareserial.h></span>
</span>  <span><span>#define SCREEN_WIDTH <span>32</span></span>
</span>  <span><span>#define SCREEN_HEIGHT <span>16</span></span>
</span>  <span><span>#define BUFLENGTH <span>512</span></span></span>

次のコードはDMDサンプルに含まれています。これは、DMDライブラリを取得して、設定されたインターバルでディスプレイを更新する関数です。その間隔をもう少し下に定義します。

<span><span>#include <spi.h></spi.h></span>
</span>  <span><span>#include <dmd.h></dmd.h></span>
</span>  <span><span>#include <timerone.h></timerone.h></span></span>

次に、最後の2つの変数を定義します。これら2つは、シリアルポートを介してメッセージを受信することに関連しています。まず、BUF [buflength]は、LEDがオンとオフにする必要があるシリアルポートメッセージのバッファーを保存します。第二に、bufcountは、このバッファ内のバイトの数を保存するために使用されます。

<span><span>#define DISPLAYS_ACROSS <span>1</span></span>
</span>  <span><span>#define DISPLAYS_DOWN <span>1</span></span>
</span>  DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
setup()関数は、定数と定義されたライブラリを使用してプロセス全体を開始します。シリアルポートメッセージのポート57600でリッスンすることから始まります。

次に、以前に含めたタイマーローンライブラリを使用してタイマーを初期化します。 4ミリ秒からカウントダウンするように指示します。 Freetronicsの例では、ディスプレイのちらつきを避けるために、これを5ミリ秒以上に設定しないことをお勧めします。
<span>void ScanDMD() { 
</span>    dmd<span>.scanDisplayBySPI();
</span>  <span>}</span>
次に、タイマーが期限切れになったときにscandmd()関数を実行するように設定します。これにより、ディスプレイが再表示されます。

最後に、setup()関数では、dmd.clearscreen()関数にtrueを渡すことにより、ディスプレイ上のすべてのピクセルをクリアします。この関数にfalseを渡すと、すべてのピクセルがオンになります!
<span>char buf[BUFLENGTH];
</span>  <span>int bufCount;</span>
<span><span>#include <softwareserial.h></softwareserial.h></span>
</span>  <span><span>#define SCREEN_WIDTH <span>32</span></span>
</span>  <span><span>#define SCREEN_HEIGHT <span>16</span></span>
</span>  <span><span>#define BUFLENGTH <span>512</span></span></span>
Arduinoのループ()関数では、シリアルポート上のメッセージに注意してください。シリアルポートから読み取りできるバイトの数を確認します。利用可能なバイトがある場合、メッセージがストリーミングされているメッセージがあり、SerialParse()関数を実行します。

serialParse()内で、bufcountを-1に設定してカウント値をリセットします。次に、serial.readbytesuntil()を使用して、その配列(buflength)の512要素を読み取ります。 N文字がある場合、配列の読み取りも停止します。ここでの主な目的は、LEDライトグリッドの長さにシリアルメッセージを保持することです。
<span><span>#include <spi.h></spi.h></span>
</span>  <span><span>#include <dmd.h></dmd.h></span>
</span>  <span><span>#include <timerone.h></timerone.h></span></span>

バッファにメッセージがある場合は、parsebuffer()に送信します。これは、画面に解析して表示されます。

parsebuffer()関数内で、画面をクリアすることから、新しい図面で明るくすることから始めます。次に、読んでいる配列のどの位置を追跡するために、iの整数を作成します。
<span><span>#define DISPLAYS_ACROSS <span>1</span></span>
</span>  <span><span>#define DISPLAYS_DOWN <span>1</span></span>
</span>  DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
次に、バッファ内の各文字を左から右へxを繰り返し、xループを介してscreen_widthまで、y yを介して上から下にscreen_heightまで下に繰り返します。これにより、DMDの2次元表示に1つの次元配列が表示されます。各文字について、「1」かどうかを確認します。もしそうなら、xとyのディスプレイにあるLEDを利用します。それは黒い私たちの画像の部分に使用されます。 「1」でない場合は、次の位置などに続きます。最終的に、画像全体を引き出します

Arduinoがどのように機能するかをカバーしています。LEDが添付された状態でArduinoでそのコードを実行すると、何も表示されません。ドットマトリックスディスプレイに何かを表示するには、シリアルポートを介してメッセージを送信するにはノードコードが必要です。

ノードコード
<span>void ScanDMD() { 
</span>    dmd<span>.scanDisplayBySPI();
</span>  <span>}</span>

JavaScriptは、2つの重要なNPMモジュールを必要とすることから始まります。 SerialPortは、シリアルポートを介してArduinoにメッセージを送信できるものとPNG-JSがPNG画像で読まれるものです。

次に、シリアルポートメッセージングを設定します。変数シリアルポート内にシリアルポートオブジェクトを設定します。これには、Arduinoが接続されているポートと、シリアルポートメッセージをリッスンするボーレートを設定します。

<span>char buf[BUFLENGTH];
</span>  <span>int bufCount;</span>
Arduinoがどのポートに接続されているのかわからない場合(たとえば、 '/dev/tty.usbmodem1431'を持っています)、それをPCに接続し、Arduino IDEを開き、[ツール]> [ポートに移動して、どちらを確認してください選択されています。

ボーレートは個人的な好みになる可能性があります。使用しているボーレートについて本当に心配していない場合は、例に既に入手したものに固執してください。 次に、SerialMessageと呼ばれる文字列変数を初期化します。これにより、シリアルポートを介して送信するゼロの完全な文字列を保存します。
<span><span>#include <softwareserial.h></softwareserial.h></span>
</span>  <span><span>#define SCREEN_WIDTH <span>32</span></span>
</span>  <span><span>#define SCREEN_HEIGHT <span>16</span></span>
</span>  <span><span>#define BUFLENGTH <span>512</span></span></span>

SerialPortオブジェクトには、「オープン」のイベントリスナーがあり、定義されたシリアルポートが開いており、JavaScriptからアクセスできるときに応答します。この場合、Console.logを実行して、すべてがシリアルポートメッセージングに適していることを確認できます。

<span><span>#include <spi.h></spi.h></span>
</span>  <span><span>#include <dmd.h></dmd.h></span>
</span>  <span><span>#include <timerone.h></timerone.h></span></span>
シリアルポートがメッセージの準備が整っていることがわかったら、PNG画像ファイルで読み取るためにpng.decode()関数を実行します。デモでは、shotepointlogo-withsmile.pngと呼ばれるノードファイルと同じフォルダー内にpng画像があるため、そのファイル名を渡します。次に、データ変数を介してPNGファイルのデータを提供するコールバック関数があります。

png.decode()関数から返されたデータは、0から255の値の配列になります。各ピクセルを繰り返し、それぞれの4つのアイテムのシリーズ(赤、緑、青、アルファ)を​​繰り返します。価値。デモでアルファ値を使用することはありません。黒と白の画像だけを扱っているため、理論的には必要に応じてできます。サンプルアレイはそうに見えます:

<span><span>#define DISPLAYS_ACROSS <span>1</span></span>
</span>  <span><span>#define DISPLAYS_DOWN <span>1</span></span>
</span>  DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>

上記の配列は、255,255,255,255の1つの白いピクセルと0,0,0,255の1つの黒いピクセルを表します。これは、画像全体を表現するまで、すべてのピクセルで何度も続きます。 コールバック関数内で、SerialMessageを空白の文字列にリセットし、4つのセットのデータ配列を介して繰り返し始めます。各ピクセルのそれぞれの値に一致するように、赤、緑、青のローカル変数を設定しました。

<span>void ScanDMD() { 
</span>    dmd<span>.scanDisplayBySPI();
</span>  <span>}</span>
完全に黒でも白でもないグレースケールの価値に対処できるようにするために、輝度チェックもあります。以下の関数は、ピクセルの色がどのように暗くまたは明るいかを決定します。

その値が150を超える場合、それはかなり明るい色であると仮定し、0(白)に設定します。それ以外の場合は、1に設定して黒くします。どちらかの値をSerialMessage文字列に追加します

すべてのピクセルを通過し、ゼロまたはそれを表現するためにゼロまたはゼロのいずれかを割り当てたら、SerialPort.write()を使用してシリアルポートにそのメッセージを送信します。画像を読み、反復するこのプロセス全体は、実際にディスプレイを受信する準備が整うまでにかかる時間よりも速いようです。 。
<span>char buf[BUFLENGTH];
</span>  <span>int bufCount;</span>

デモを実行してください
<span>void setup() {
</span>    Serial<span>.begin(57600);</span>

スケッチをアップロードする場合は、ディスプレイをArduinoに接続し、node serialdmd.jsを介してノードサーバーコードを実行します(NPMを最初にインストールすることを忘れないでください)。 >node.jsを使用したドットマトリックスLEDディスプレイに画像を表示する

結論

これを拡張できる方法はたくさんあります。これはノードサーバーなので、APIに接続して、それを通過する画像を表示できます。時間の時間、自宅のインターネット接続されたデバイスの状態、天気、またはその他のものに応じて、別の画像を表示することができます!

このアイデアを本当にきちんとしたものに拡張した場合は、コメントでお知らせするか、Twitterで私と連絡してください(@thatpatrickguy)、見たい!node.jsを使用したドットマトリックスLEDディスプレイに画像を表示することに関するよくある質問(FAQ)

ドットマトリックスLEDディスプレイに画像を表示する際のnode.jsの役割は何ですか?

node.jsは、ドットマトリックスLEDディスプレイに画像を表示する上で重要な役割を果たします。これは、ChromeのV8 JavaScriptエンジンに基づいて構築されたJavaScriptランタイムであり、サーバーサイドおよびネットワークアプリケーションの開発に使用されます。 DOT Matrix LEDディスプレイのコンテキストでは、node.jsを使用してディスプレイを制御し、表示する画像を操作します。 LEDディスプレイにデータを送信できるサーバーの作成を可能にし、画像、テキスト、またはその他のデータタイプの表示を可能にします。

ドットマトリックスLEDディスプレイをコンピューターに接続するには、通常、ArduinoやRaspberry Piなどのマイクロコントローラーを使用します。マイクロコントローラーは、コンピューターとLEDディスプレイの間の仲介者として機能します。その後、node.jsを使用してコンピューターからマイクロコントローラーにデータを送信して、LEDディスプレイにデータを送信できます。 ?

はい、他のプログラミング言語を使用して、ドットマトリックスLEDディスプレイを制御できます。この記事では、使いやすさと汎用性によりnode.jsの使用に焦点を当てていますが、Python、C、Javaなどの他の言語も使用できます。プログラミング言語の選択は、あなたの快適さレベルとプロジェクトの特定の要件に大きく依存します。

ドットマトリックスLEDディスプレイを使用することの利点は何ですか? 。それらは非常に用途が広く、テキスト、数字、画像を表示できます。また、エネルギー効率が高く、耐久性があり、長い寿命があります。さらに、広告ボードから情報ディスプレイまで、さまざまなアプリケーションに適した明るさと視認性を提供します。 DOT Matrix LEDディスプレイの画像には、画像をディスプレイが理解できる形式に変換することが含まれます。これには通常、画像をバイナリ形式に変換し、各ピクセルが0(オフ)または1(オン)で表されます。その後、node.jsを使用して、このバイナリデータをLEDディスプレイに送信できます。

大規模なアプリケーションにDOT Matrix LEDディスプレイを使用できますか?

​​

はい、DOTマトリックスLEDディスプレイは大規模アプリケーションに適しています。それらを組み合わせて、より大きなディスプレイを作成し、デジタルビルボード、パブリック情報ディスプレイ、大規模な広告などのアプリケーションに最適です。 >ドットマトリックスLEDディスプレイの寿命は、使用されるLEDの品質と表示が使用される条件によって異なります。ただし、LEDディスプレイは一般的に長寿で知られており、数万時間の使用を続けることができます。 DOT Matrix LEDディスプレイには、ディスプレイとマイクロコントローラー間の接続を確認し、正しいデータがディスプレイに送信されていることを確認し、電源をチェックすることができます。 node.jsを使用している場合は、デバッグツールを使用してコードの問題を特定するのに役立つこともできます。ディスプレイは屋外で使用できます。ただし、ディスプレイが要素から適切に保護されていることを確認することが重要です。これには、耐候性のケーシングを使用したり、シェルターの場所にディスプレイを設置したりすることができます。

ドットマトリックスLEDディスプレイの明るさを最適化するにはどうすればよいですか?

パルス幅変調(PWM)を使用して制御されます。これには、各LEDがオンになっている時間を変えることが含まれ、ディスプレイの明るさを制御します。 node.jsを使用して、LEDディスプレイに送信されたPWM信号を制御し、必要に応じて明るさを調整できるようにします。

以上がnode.jsを使用したドットマトリックスLEDディスプレイに画像を表示するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール