点滅LEDリバースエンジニアリング

安い電子「キャンドル」は最近どこにでもあるようです。 彼らが実際に特別なLEDを使用していることに気づくまで、私は彼らにあまり注意を払いませんでした-統合された「点滅」コントローラを持ちます。 今ではまったく別の問題です。神秘的なLEDが嫌いな人はいますか? 半時間後、私はすでにちらつきのある中国製のLEDを集めました。





もちろん、最も興味深い質問は、どのように機能するかです。 文字通り数セントかかることを考えると、内部に高価な電子機器は一切ありません。 これに関して、別の疑問が生じます。これらのLEDは、インターネット上で回路がいっぱいになっているマイクロコントローラの多数の「キャンドル」よりも本当に悪いのでしょうか?





デバイスは比較的単純です。 標準的な5 mmのケースでは、LEDクリスタルと、最初のサイズよりわずかに大きいマイクロ回路があります。 コントローラ回路は、正と負の両方の出力に接続されています。 それに接続された3番目のジャンパーはLEDのアノードであり、カソードはマイナス端子に「座っています」。



Evil Mad Scientistブログには、最近、同様のLEDに関する話がありました。 明るさの変化を音に変換すると、どのように「歌う」かが示されました。 また、より強力なダイオードを制御するためにそれらを使用する方法。 このようなトリックは、コントローラーがより明るく点灯したときにLEDがより多くの電流を消費するという事実に基づいています。 点滅と直列に接続された通常のLEDは、非常によく似た明るさの変化を示します。 つまり、追加の抵抗器での電圧降下は、輝度に比例して変化します。





これは、コントローラーの制御信号を抽出してロジックアナライザーに送信するために使用したものです(上の図を参照)。 可変抵抗器を調整することで、アナライザーが電流サージを「ゼロ」と「1」として認識し、LEDが正常に機能することを確認しました。





上の図は、1 MHzのサンプリングレートで記録された約1分間のダイオード輝度の変化を示しています。 LEDが連続的にオンになっているときは目立つ間隔があり、明るさが何らかの形で変調されているときは期間があります。 LEDが長時間オフになることはありません。 本物のろうそくもほとんどの時間明るく輝いているため、これは合理的です。ちらつきの短い期間の明るさを減らします。





よく見ると、信号にパルス幅変調があることがわかります。 これは、アナログトリックのないデジタル回路があることを意味します。



信号周波数は、標準の音叉( 最初のオクターブのLa音符- およそTransl。 )のように、約440 Hzです。 偶然? または、開発者は単にジェネレーターをある種の音楽回路から取り出しましたか? したがって、これらのLEDの「音楽性」についての話にはいくつかの真実があります。 一定の明るさの各「フレーム」は正確に32サイクルで、約72ミリ秒続きます。 これは、1秒あたり13〜14フレームに相当します。



PWM信号のデューティサイクルによって各フレームの輝度を決定する小さなプログラムを作成しました。 プログラムは、ロジックアナライザからサンプルのストリームを読み取り、一連の実数を表示します(各フレームに1つ)。





時間に依存する明るさのグラフは、いくつかの考えを示唆しています。明るさの変化はランダムで、離散的で、不均一な分布を持っています。 明るさのレベルは16段階あるように見えますが、最も低いレベルはほとんど使用されません。 3600カウントのうち13のみがそれらに対応します。





ヒストグラムを作成すると、全体像が開きます。実際には、12レベルの輝度しか使用されていません。 正確に半分のフレームが最大輝度を持ち、残りの値はほぼ均等に分布します。



これをハードウェアレベルでどのように実装できますか? 均等に分布した乱数のジェネレーターが使用される可能性が高く、単純なジェネレーター関数を介して渡されます。 観察する分布では、少なくとも12x2 = 24の離散レベルが必要です。 それらの半分は1つに表示されます。 ジェネレータはおそらく2進数を生成するため、これは非常に興味深いものです。 最も論理的なのは5ビット数のビット容量で、これは32状態です。 分布を変更せずに32レベルの離散確率変数を24レベルで表示するのは、見た目ほど簡単ではありません。 これは重要なスキームではないことを忘れないでください。開発者はおそらく、美しい解決策のために多くの時間を持っていなかったでしょう。 したがって、彼は最も単純な一種のハックを適用しました。



頭に浮かぶ唯一の簡単な方法は、不適切な値を単純に破棄し、次の乱数を取得することです。 不要な値はビットマスクで簡単に分離できます。 回路は同期しているため、次のフレームが始まるまでの試行回数は有限です。 コントローラーが指定された試行回数を満たしていない場合、「間違った」値でスタックします。 輝度グラフのまれな外れ値を覚えていますか?



ANSI-C実装は次のようになります。

char attempts=0; char out; while(attempts++<MAX_ATTEMPTS) { out=RAND()&0x1f; if ((out&0x0c)!=0) break; //  ,   2-  3-   } if (out>15) out=15; //      
      
      







何回試行されているかを知ることができますか? 統計によるとすべての数値の小数部a = 0.25を破棄して再生成する必要があります。 「正しい」数がn回の試行で選択されない確率は、 a nに等しくなります。

  n=1 0,25 n=2 0,0625 n=3 0,015625 n=4 0,003906
      
      







異常に低い輝度レベルの割合は13/3600 = 0.0036であり、これはオプションn = 4とよく一致します。 したがって、 MAX_ATTEMPTS == 4



簡単な解決策は、無効な番号が検出された場合に前のフレームの値を使用することです。 このオプションは、自己相関に基づいて除外できます(以下を参照)。 おそらく最も簡単なソリューション-PWMスキームの変更-はここでは使用されませんでした。



パズルの最後のピースは、乱数ジェネレータ自体です。 デジタル回路でランダムシーケンスを生成する典型的な方法は、線形フィードバック付きシフトフィードバックレジスタを使用することです。 このようなレジスタは、 2 x -1クロックサイクル後までに繰り返される擬似ランダムビットシーケンスを生成します。xはレジスタのビット深度です。 このようなシーケンス(および一般的な擬似ランダムシーケンス)の特徴の1つは、それらの自己相関関数が点0およびシーケンスの長さの倍数の座標でのみ1に等しいことです。 他のすべての間隔では、ゼロです。





値のシーケンス全体の自己相関を計算しました。 3500フレームまで自己相似性は見つかりませんでした(上記のグラフには1200のみが表示されています)。つまり、フリッカーは少なくとも4分間ユニークです。 シーケンスのさらなる繰り返しが観察されたかどうか、または著者のロジックアナライザーが単に長時間の記録を許可しなかったかどうかは不明です。 perev。 フレームごとに少なくとも5ビットのランダムデータが必要なので(さらに、不要な数字を破棄するメカニズムを考えると、さらに多く)、疑似ランダムシーケンスの長さは少なくとも17500ビットです。 これを行うには、少なくとも17のビットレジスタ、または実際のハードウェア乱数ジェネレーターが必要です。 いずれにせよ、ちらつきパターンが繰り返されないように、開発にどれだけ注意が払われたかは興味深いです。



結論として、記事の冒頭にある質問に答えます。 ちらつきのLEDは、予想よりもはるかに複雑であることがわかりました(また、4時間かかるとは思いませんでした)。 マイクロコントローラのローソク足の実装の多くは、擬似乱数ジェネレータからPWM出力にビットを供給するだけです。 購入したLEDは、輝度を変更するために、より巧妙なアルゴリズムを使用しています。 もちろん、アルゴリズムの開発にはある程度の注意が払われましたが、同時に、可能な限り最小の面積の水晶が使用されました。 セントシェアは無駄に費やされていませんでした。



最高のフリッカーアルゴリズムは何ですか? これは改善できますか?



追加:最終的にエミュレーターを作成する時間を見つけました。 このLEDの動作をエミュレートするANSI-Cベースのプログラムはこちらです。 コードはAVRで記述されていますが、他のコントローラーに簡単に移植できます。 Githubリポジトリには、LEDリバースエンジニアリングプロセスで使用されるすべてのデータとソースコードが含まれています。



All Articles