MBR3 をホストから使ってみた (1) [PSoC]
静電容量ボタンを使いたい時、部品点数を少なくしたいと思ったら、 PSoC に制御プログラムまで組み込んでワンチップで実現するのが便利です。 しかしながら、従来のアプリケーションに静電容量ボタンを追加したいだけという用途では、アプリケーション側のコントローラをホストとして外付けの静電容量ボタンコントローラを追加した方が簡単になります。 本シリーズでは、 MBR3 を外付け静電容量ボタンコントローラとして使う方法について考えます。
静電容量センサ
静電容量センサには、 MBR3 で、静電容量センサの実験 (1) で使用した2ボタン基板を使用します。 使用した設定は、以下の通りです。
ふたつのセンサ端子をボタンとして割り当てます。 他のパラメータは、デフォルトのままです。
このデバイスは、アドレス 0x63 の I2C のデバイスとして動作させます。 端子に余裕がないので、 LED 出力もシールドも追加できません。 ボタンの情報は、 I2C を介して受信するしかありません。
ホスト側のコントローラ
ホスト側は、 I2C のマスター側インターフェイスが付いていれば、何でも使えますが、ここでは mbed LPC1768 を使用しました。 オンラインでアプリケーション開発が出来るので、便利です。
mbed LPC1768 の P9, P10 端子を I2C インターフェイスの SDA, SCL として使っています。 これらの端子には、 4.7kΩ のプルアップ抵抗をそれぞれ接続しています。 MBR3 とは VOUT, GND を加えた全部で4本の配線で接続されました。
ホスト側のソフトウェア
ホスト側には、以下のようなファームウェアを書き込みました。
#include "mbed.h" // Two LEDs are assigned as button status indicators DigitalOut led1(LED1); DigitalOut led2(LED2); // One I2C port is used to connect to MBR3. // DIP9 and DIP10 are used for I2C but ports. I2C i2c(p9, p10); // MBR3 device register map const char MBR_BUTTON_STAT = 0xaa; // BUTTON_STAT // Node "Kitten" // Device: MBR3102 // Function: Two button CapSense const uint8_t kittenAddr = 0x63 << 1; // 8bit I2C address const char kittenYellowButton = 0x01; const char kittenBlueButton = 0x02; int main(void) { uint8_t cmd[8]; uint16_t kittenStat[2]; for (;;) { // Get status from Kitten cmd[0] = MBR_BUTTON_STAT; // i2c.write(kittenAddr, (char *)cmd, 1); i2c.write(kittenAddr, (char *)cmd, 1); i2c.write(kittenAddr, (char *)cmd, 1, true); i2c.read( kittenAddr, (char *)kittenStat, 2); // Show button indicator LEDs led1 = (kittenStat[0] & kittenYellowButton)?(1):(0); led2 = (kittenStat[0] & kittenBlueButton)?(1):(0); wait(0.05); } }
アドレス MBR_BUTTON_STAT(0xAA) の2バイトレジスタから値を読み出して、ふたつのボタンの状態を検出しています。 ボタンの状態によって、 LED1, LED2 を点灯させます。
レジスタを読み出すとき、 "read" メソッドの前にレジスタのアドレスを示す "write" メソッドが三つも並んでいます。 本来、これらの "write" メソッドは、アドレスを指定するだけなら一回だけで十分なはずです。 それが三回も必要な理由は、スタンバイ状態に入ってしまった MBR3 を起こすためです。
MBR3 は、低消費電力アプリケーションでも使用する事を考慮して、ホストからの通信が無くなると、極力スタンバイ状態に入ろうとします。 スタンバイ状態から起こすためには、 I2C の通信を使用しますが、通信内容そのものは破棄されます。 このような事情から、スタンバイ状態から確実に MBR3 が起きるように、二回の通信を行います。 そして、三回目の通信で、レジスタのアドレスが確実に伝達されます。
コメント 0