PWMで500個のLEDを制御


26

500個のLEDを個別にアドレス指定し、それぞれに最適なPWMをサポートするプロジェクトに取り組むことを検討しています。

Arduinoを既に使用しているので、使用する予定ですが、別のプラットフォームがより適していると考えている人がいれば、提案を受け入れます。

シフトレジスタを使用する必要があります。この状況で使用するのに適したシフトレジスタとは何ですか?PWMがこのプロジェクトのコストを大幅に引き上げるなら、それなしで大丈夫です。私は100ドル未満を費やそうとします。私はeBayから500個のLEDを一括購入します。

このような多数のLEDを制御する最良の方法について、あなたの意見はどうですか?また、どのように電力を供給しますか?助けていただければ幸いです。私は電子機器についてかなりの経験を積んでおり、このような大規模なことは一度もしていません。

回答:


14

私はShiftPWMライブラリの著者であり、ドキュメントを更新して、回路図と、通常のLED、LEDストリップ、高出力LEDのより一般的な情報を追加しました。

おそらくあなたはすでにプロジェクトを開始していますが、このページには多くの訪問者がいるので、詳細な回答を提供したいと思います。

ShiftPWMで500個のLEDを制御する場合、60 HzでLEDごとに約64個の輝度レベルを取得できます。64個のシフトレジスタを使用します。専用のハードウェアPWMドライバーはより多くの輝度レベルを提供しますが、もう少し高価になります。私のライブラリの主な利点は使いやすさだと思います。なぜなら、それにはRGBとHSV関数と多くの例が含まれているからです。

私は、通常のシフトレジスタではなく、TLC5917のTLC5916を個人的に使用します。これは、定電流LEDドライバが組み込まれているためです。これにより、抵抗器が不要になるため、はんだ付けが大幅に削減されます。

私のウェブサイト(http://www.elcojacobs.com/shiftpwm)では、LEDを接続する方法と、Arduinoを使用して高速で長い信号線を駆動する方法について詳しく説明しています。

さらに質問がある場合は、お問い合わせください。


以下の私の答えを見ましたか?ここで説明する手法は追加のハードウェアを使用しますが、おそらくライブラリの速度を大幅に向上させるために同じアプローチを使用できます。私はArduinoをプログラミングしていないので、その命令のタイミングに精通していませんが、最も単純な形式では、単純にSPIからビットを吹き飛ばすために必要なものにCPU負荷を減らすことができます(現在5サイクルの場合) 1ビットあたり、SPIは1バイトあたり16サイクルかかります。これは2.5倍の高速化です。その速度で実行しながら、さらに洗練されたことができるかもしれません。
-supercat

たとえば、フルオン、1 / 2、1 / 4、1 / 8、1 / 16、1 / 32、1 / 64、および1/128を表す8つの輝度レベルが必要だとします。Arduinoがポインターから取得した値に対して「AND」または「OR」演算を実行し、そのポインターを4サイクル未満でインクリメントできる場合、ピクセルあたり3ビットを使用して輝度情報を保存し、転送速度を達成できます。 8個のLEDにつき16サイクル。
-supercat

PWM値の計算は、ライブラリのSPI出力と重複しています。4MHzでSPIを実行すると、計算にはSPI出力よりも少し時間がかかります。バイトあたり43クロックサイクル、つまり8出力ごとにかかります。これはほとんどのセットアップで十分高速です。ビットコード変調を使用すると、8つの更新期間があり、各次の期間は前の期間の半分になります。BCMバージョンを作成しましたが、輝度設定を更新する瞬間により敏感です。位置がずれていると、ちらつきが発生する可能性があります。私はおそらくマトリックス版でそれを使用します。
-ElcoJacobs

BCMには、1 / 2、1 / 4 ...のタイミングを利用できるというアプローチの利点がありますが、LEDごとに1つのピンしか必要ありません。コンピュータサイエンスのバックグラウンドをお持ちの場合は、SPIバイトの計算方法がおもしろいかもしれません。メモリからデューティサイクル(2クロック)を受け取り、compare(1クロック)を実行します。比較結果はキャリーに格納されるため、ローテートオーバーキャリー(1クロック)でバイトにシフトできます。8回実行すると、すべての比較結果が1バイトになり、SPIに送信する準備が整います。
-ElcoJacobs

13

ちょうどコピー:-)

http://www.evilmadscientist.com/article.php/peggy2

本日、私たちは「Peggy」オープンソースLED Pegboardプロジェクトのアップデートをリリースします。Peggyバージョン2はゼロから再設計されました。そして、それは…まったく同じに見えます。しかし、内部の変更はかなりのものであり、多くの点で大きな改善だと思います。

何よりもまず、Peggy 2.0はまだ同じことを行います。LEDロケーションの25 x 25アレイに効率的な電力を提供します。Peggyは、LEDをいじるという刺し傷、複雑さ、および混乱を取り除くように設計されています。汎用性が高く強力な発光ペグボードで、単一の負荷抵抗を計算することなく、好きな構成で何百ものLEDを効率的に駆動できます。1個から625個のLEDのどこにでも設置でき、Peggyがそれらを点灯させます。


Peggy 2.0はArduinoにも対応しました。人気のArduinoソフトウェア環境を使用して、USB-TTLケーブルを介したプログラミングをサポートします。


素晴らしいリンク!ブックマーク済み。私はこのようなプロジェクトに取り組むつもりはありませんでしたが、今はそれを作らなければなりません。その小さなビデオを見ました:-)
Wouter Simons

@NicolaeSurdu壊れていません。たった今開けました。
アックスマン

3
これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう

6

LEDをどのレイアウトに配置しますか?あなたには、いくつかのLEDマトリクスを買えばあなたは、単一色の8×8のLEDマトリックス(64 LED)を取得することができ、多くの作業を保存することができ、降圧のためか、2

この多くのLEDでAVRとシフトレジスタを使用して実際のPWMを取得することはできませんが、2〜4レベルの輝度を絞ることができる場合があります。数字を実行して、何が可能かを確認する必要があります。

Allegroでは、LEDのアレイを制御するために特別に設計された便利な定電流シンクシフトレジスタを作成しているため、追加の抵抗器は必要ありません。十分な電力を供給できない場合、AVR出力から直接LEDを駆動できない可能性があるため、トランジスタを使用する必要があります。単一のIC内の配列で取得することもできます。


すべての非常に良い点!
ジェイソンS

5

LEDに必要なPWMの範囲はわかりませんが、600us〜2.4msのパルスを生成できるサーボ制御アプリケーション用の64チャンネルPWMコントローラーに取り組んでいます。これは、CD74HCT238E(3-8ラインデマルチプレクサ)を使用してATMega168の8つのI / Oピンから64チャネルを生成し、シンプルなシリアルコマンドで制御できます。このコントローラーの修正バージョンの複数のバージョンをシリアルラインで連結し、500個すべてのLEDに対処できると思います...ファームウェア要件がより単純になるため、コントローラーのATTiny2313バージョンを使用できます。

私のブログには、アセンブリソースと回路図、および設計プロセスの詳細が含まれています。


5

mouser / digikeyの「LEDドライバ」ICをご覧ください。たとえば、TIは、さまざまなインターフェイス(I2C、SPI)を備えたドライバーの束を作成し、確実にニーズを満たします。これらのドライバーのほとんどはデイジーチェーン接続されるように設計されているため、1つのシリアルアウトが別のシリアルアウトに送られます。

たとえば、TLC5940のようなものは16チャネルのPWM制御を提供します。したがって、基本的には、12ビットグレースケールPWM制御を備えた定電流16ビットシフトレジスタです。80x16ディスプレイの設計を支援した特定のICを推奨できます。


4

Mondomatrixは、いくつかのシリアル(RS-485)のアドレス可能LEDドライバボードを作り、Arduinoのプラットフォームに基づいています。http://www.displayduino.com/あなたはかなり簡単にそのハードウェアを使用して一緒にシステムを置くことができるかもしれません


4

各LEDに多すぎるPWM制御を必要とせず、PWMサイクルごとに500個のLEDでプロセッサを動かしたくない場合は、N 74HC595または同等のチップを使用して、Nビットの明るさで8つのLEDを制御できます。すべてのNチップの出力をまとめて配線し、適切なタイミングで一度に1つだけを有効にするいくつかの回路にイネーブルを配線します。最初のチップが半分の時間で有効になり、2番目のチップが残りの半分で有効になるように調整します。

エイリアシング効果を最小限に抑えるために、シフトレジスタのリロードはPWMレートと同期する必要があります(たとえば、輝度レベルが0111から1000の間で急激に切り替わる場合、スイッチが発生したPWMサイクルのポイントが見かけの輝度を瞬間的に変更する可能性があります) )。

各LEDに複数の74HC595出力を使用しなければならないのは煩わしいかもしれませんが、このアプローチはおそらく、CPUの介入を継続せずに異なる輝度レベルを維持できる最も単純なアプローチです。


3

これは質問に直接答えるものではありませんが、考慮する必要のあるもう1つの側面は、500バッチのLED間の明るさのばらつきの可能です。これらのLEDがマトリックスや7セグメントディスプレイのように互いに近くに取り付けられている場合、これは特に重要です。この問題に対処する方法の詳細については、この回答を参照してください。特に、ドット補正を使用してLED輝度の変動を補正する方法について。

この問題は、構築中の一連の大型7セグメントディスプレイに対して200個の1mm赤色LEDを取得したときに発生しました。問題を解決するための私の安価な解決策は、次のことを伴いました。

  1. ブレッドボードにLEDテスターを構築して、さまざまな明るさのカテゴリのLEDセットを分類しました
  2. 同じカテゴリのLEDを使用して各セグメントを取り付けました(私の設計では、各セグメントは直列に取り付けられた5つのLEDで構成されていました)
  3. 異なる電流制限抵抗を使用して、各セグメントの輝度の差を補正しました。たとえば、明るいLEDのあるセグメントには10​​0オームの抵抗を使用し、調光LEDのある別のセグメントには120オームの抵抗を使用します。

1
有効なポイントですが、質問には答えません。
マットヤング

1
@MattYoung同意しました。質問は、他のすべての回答によって大部分が回答されます。OPの設計に影響する可能性のある副次的な問題に対処して、これらの答えを補完したかっただけです。
リカルド


1

XMOSは、Macroblock MBI5026とLEDタイルキットを使用します。他のほとんどのプロフェッショナルシステムで使用されていると思います。

レオン


1

シリアルインターフェイスを備えた専用ドライバーチップは、おそらく最適なルートです。個々のシフトレジスタを扱うことは、おそらく非常に複雑な回路を意味します。少なくともマキシムとTIがいくつかを作ります。どちらかがそのくらいに特に適したモデルを持っているかどうかは覚えていません。

まだ多くのハードウェアが必要です。

電源、プログラミング、およびバスに関しては、おそらく各ドライバーのデータシートに必要な情報がほとんど含まれています。


1

ソフトウェアレルム内で、必要な個別の明るさ設定の数が多すぎない場合、「ビットプラナー」形式でデータを保存すると役立つ場合があります(他のハードウェアベースの回答で説明)。出力ルーチンはブール演算子を使用して、一度に8ピクセルに作用します。最大の効率を得るには、PWMサイクルのさまざまな部分に使用される複数の個別の出力ルーチンが必要です。たとえば、4ビットの輝度値を使用する場合、次の形式の8つのルーチンを使用します。

  movf bit0Comp、w; 比較対象のビット0に応じて00またはFFにする必要があります(クリアの場合はFF)
  iorwf POSTINCF、w; データのビット0。常にIORWFを使用する
  andwf POSTINCF、w; データのビット1。比較対象のビット1が設定されている場合はIORWFを使用します。ANDWF明確な場合
  andwf POSTINCF、w; データのビット2。比較対象のビット1が設定されている場合はIORWFを使用します。ANDWF明確な場合
  andwf POSTINCF、w; データのビット2。比較対象のビット1が設定されている場合はIORWFを使用します。ANDWF明確な場合
  movwf SPIREG; 結果のバイトを格納します(比較対象が> =の場合はビット)

比較対象の値に応じて、IORWFとANDWFの異なる組み合わせを使用します。示されているこのアプローチを使用すると、ディスプレイシフトルーチンへの呼び出しの間に4ビットすべてが書き込まれている場合、またはピクセル更新ルーチンに次のシフトは、ピクセルに対して「1」または「0」を出力し、ピクセルのすべてのビットを設定またはクリアします(いずれの操作でも、それが何をしようとしても実行します)。反対になります。また、ディスプレイの更新のタイミングを変えるか、PWMサイクルで複数の被比較値を使用することにより、任意の非線形の輝度スケールを実現できることに注意してください。


1

FPGAまたはCPLDは、多くのI / Oピンを提供するため、このようなタスクに適しています。最もシンプルで安価なものを探してください。足りない場合は、カップルを使用します。


これが良い選択肢である理由についてもう少し詳しく教えてもらえますか、私は今それを知っていますが、選択肢が何であり、あなたがリストする提案された技術が何であるかを知っています、Origial Poster(OP)にはおそらくないでしょう背景。
コルトゥク

それが最良の選択肢かどうかはわかりませんが、完全を期すために言及したかったのです。何らかの方法でPWMで500個のLEDを制御する場合、最終的には500個の個別に制御可能なワイヤが必要になります。出力ピンが非常に多いマイクロコントローラーを見つけるのは困難です。まだマイクロコントローラーを使用してこれを回避する方法はたくさんありますが、1つまたはいくつかの安価なCPLD / FPGAがこれらの出力ピンを簡単に提供できます。
カール

1

PSoC3またはPSoC5を使用して、ほぼ確実にこれを簡単に行うことができます。

PSoCチップは、FPGAやCPLDのような再構成可能なデジタルハードウェアを含むマイクロコントローラーです。つまり、PWMで500個のLEDを駆動するなどの異常なことを行うための複雑な回路を作成できます。さらに、おそらく再構成可能なデジタルブロックを使用してすべてを実装できます。つまり、チップのCPU部分は、必要なLED輝度をアレイに書き込むだけで済みます。

504個のLEDが21 x 24の長方形に収まります。24個のPWMチャネルと21個のGPIOがある場合、これを動作させることができます。何だと思う?PSoCにはそれ以上のものがあります。

PSoCで24個のPWMチャネルを簡単にセットアップし、他の21個のピンをシフトレジスタの一部として構成できます。次に、メモリからPWM出力にバイトを送り込むようにいくつかのDMAチャンネルを設定すると、笑っています。CPUが今やるべきことは、グラフィックを生成することだけです。PSoC3には8ビット8051コアがあり、PSoC5には32ビットARMがあります。好きなものを選んでください。必要な外部ICは、行に高い駆動電流を提供するULN2803だけです。PWM出力には、単一のLEDに十分な電流駆動が必要です。


これは、LEDを駆動するための総過剰です。このように大量にチェーンするために作られた専用の安価な事前設計のLEDドライバーがあり、常に巨大なディスプレイに使用されています。これらすべてを再発明する必要はありませんし、コストもかかりません。
-nemik

@nemik-実際、チップの総コスト(高価なFarnellから)はたったの£6.80です。
Rocketmagnet

0

規模の経済を活用します。Aliexpressのような中国のサイトでは、WS2811ベースのLEDストランドを50個のLEDにつき15ドルで販売しています。それらは個別にアドレス可能で、明るく、通常は防水性があり、明るさのPWMがあります。はんだ付けもシフトレジスタも混乱しません。このすべてを自分で行うと、費用がかかり、より多くの時間がかかり、非常にイライラします。さらに、あなたはオズにいるので、中国からの輸送はそれほど高価ではありません。

これらは巨大なLEDディスプレイを作るために作られているので、かなり安くなる傾向があります。最高のパフォーマンスを得るには、約50個のLEDごとに電源を再投入してください。

Arduinoライブラリもあり、使いやすくなっています。


1
50個のLEDあたり15ドル?500個のLEDの場合、これは150ドルになりますか?そして、あなたは私の解決策が高価だと私に言う神経があるのですか?-1
Rocketmagnet

また、これへのリンクを提供してください。WS801がGoogleでうまく動作せず、Aliexpressの
Rocketmagnet

申し訳ありませんが、私はこれらのaliexpress.com/store/product/…のようなWS2811を意味しました。または、PWM調光なしでこれらのaliexpress.com/store/product/…–
nemik

PWM調光で50個のLEDを駆動する1つのシリアル信号。おかげで、これはまさに私が望んでいることです。ただし、標準のシフトレジスタは、完全なフレームが送信された後にバッファされたデータを出力にコピーするための「ラッチ」ピンを提供します。ここにはラッチがないため、高いリフレッシュレートで顕著なノイズが発生することが予想されます。チップはピクセルあたり15ビットの400 Kbpsデータをサポートするため、フレームが更新されている間、画面は1.9ミリ秒の間ナンセンスを表示します。
nialsh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.