MSP430上のスレーブ1ワイヤーデバイスのエミュレーション



IRリモコン付きのLEDストリップ用にeBay調光器を購入したことがあります。 数時間使用した後、出力MOSFETが故障し、変更する必要があるという事実に加えて、次の問題が時間の経過とともに発見されました。



  1. PWM周波数が低すぎます。 低輝度では、瞬きが肉眼で見えました。 これはおそらく出力トランジスタの動作パラメータによるものです。たとえば、オン/オフ時間が長すぎる場合、PWM周波数を上げることはできません。
  2. IRリモートコントロールを除く、通信オプションの欠如。 ボードにはさまざまな追加コネクタが多数ありましたが(+ 5V電力、PWM出力など)、他の制御インターフェイスはありませんでした。 ただし、これは論理的です。



ファームウェアをファイナライズすることでこのような欠点を解消できる場合もありますが、マイクロコントローラーのマーキングは消去され、Digikey / Mouserでこのような場合に類似したものは見つかりませんでした。 これらの欠点のない同様のスキームを実装することが決定されました。 制御インターフェースのうち、1線が近くにあることが判明しました。 そのため、1-wireと互換性のあるスレーブデバイスをエミュレートするためのライブラリがありました。



作業プロトコル



1-wire-双方向通信バス。 デバイスは、オープンコレクター出力を使用して、+ 5Vにプルアップされたデータラインの状態を変更します。 情報のコーディングは、デバイスがデータラインを0に描画する時間を使用して実行されます 。バスの詳細については、こちらを参照してください



マイクロコントローラーMSP430G2553に基づく実装



主な問題は、マイクロコントローラに最大3.3Vの電圧が供給され、GPIOポートが同じ電圧用に設計されていることです。 データラインに接続するには、2つのピンを使用できます。1つは入力として(抵抗分割器を介した接続で)、もう1つは出力として(トランジスタを使用してラインをグランドに接続します)。 下の図に、指示図を示します。







1線式ラインからMKに電力を供給する場合は、線形安定装置が必要です。



コード



作成されたライブラリは、2つの部分で構成されます。

  1. 個々のビット(タイムスロット)、バイト、リセット信号の送信を処理し、SEARCHおよびMATCHコマンドで動作するコード
  2. 特定のデバイスを担当するコード。 この部分は、レジスタ空間へのアクセスを処理します。




なぜこれが行われるのですか? まず、あるデバイスから別のデバイスに簡単に切り替えられるようにします。 次に、ライブラリには、同じマイクロコントローラー上で異なるアドレスを持つ複数のデバイスをエミュレートする機能があります。 これは、バス上のデバイス検索アルゴリズムのおかげで可能です。マイクロコントローラーは一度に複数のアドレスを担当します。 このような各仮想デバイスは、マイクロコントローラー周辺の独自の部分を担当します。



結果として生じるデバイスが既存のソリューションと互換性を持つようにするために、DS2408と部分的に互換性のあるチップをエミュレートするコードが作成されました。 これにより、owserverおよびowhttpdでデバイスを使用できます。 調光器の場合、マイクロ回路の出力の状態を担当するバイトがPWM出力のデューティサイクルを設定します。



ライブラリは非常に簡単に初期化できます。



#include <msp430.h> #include <stdint.h> #include "one-slave.h" #include "one-2408.h" //     static one_device devices[] = { { // (ROM-) | (Family code) .rom = 0x0011223344556600 | ONE_2408_FC, //      .init = &one_2408_init, //  :       , //   PORT1   .device = &(one_2408) { .port_base = &P1IN } }, { .rom = 0x00AA000000000100 | ONE_2408_PWM_FC, .init = &one_2408_pwm_init, // PWM-: P2.1 .device = &(one_2408_pwm) { .out_bit = BIT1, .port_base = &P2IN } } }; void main(void) { WDTCTL = WDTPW | WDTHOLD; one_init( (one_device *) &devices, ARRAY_SIZE(devices) ); _EINT(); while (1) { one_process_state(); } }
      
      









既存のボードの代わりに、別のボードが作成されました。







実際には、修正する必要のあるいくつかの欠陥があったため、ボードはより悪く見えます。 残念ながら、手動調整に可変抵抗器を使用しても機能しませんでした。タイマーが十分ではなく、2つのうち2つがビジーでした。 この場合、ハードウェアタイマーに基づいて多くの「ソフトウェア」を作成することはできません。すべてがライン上で非常に高速に発生し(MKの場合)、タイマー割り込み処理コードが30μsの長さのタイムスロットを台無しにする可能性があるためです



新しいボードでは、PWM周波数は15 kHzであり、目とカメラでちらつきを見ることができませんでした。



Openhabに接続する



Openhabへの接続は非常に簡単です-HTTPバインディングを使用します。 明るさを変更するには、次の形式の要求をowhttpdに送信します。



 http://owhttpd:2121/29.0100000000AA/PIO.BYTE/?PIO.BYTE=VALUE
      
      







VALUE-0〜255の値。



電話では、次のようになります。







コントロールパネルも動作を停止せず、LIRCを介して動作し、Openhabにキーコードを転送します。 Openhabのおかげで、リモコンのボタンを押すと、電話機のコントロールの状態がすぐに変わります。



おわりに



結論として、ライブラリの主な機能をもう一度リストします。





ソースはここで見つけることができます: github.com/resetnow/one-slave



All Articles