SSブログ

MBR3 をホストから使ってみた (2) [PSoC]このエントリーを含むはてなブックマーク#

MBR3110 の実験セット

前回は、 SOIC8 パッケージの MBR3102 を使用した静電容量ボタンを使ってホストから制御してみました。 今回は、 SOIC16 パッケージの MBR3110 を使用して、 LED とブザーを制御します。

回路図は、これだ

MBR3110 の実験回路

作成したハードウェアは、このような構成になっています。

静電容量ボタンが CS2 と CS3 に配置してあります。 そして、それぞれに対応した LED が GPO2 と GPO3 に配置してあります。 MBR3 では、静電容量センサと GPO 出力を1対1で対応させて、プログラムをしなくても、静電容量ボタンをタッチすると LED が点灯する、あるいは論理信号を出力するという使い方が出来るようになっています。 通常の使い方では、 CS2 にタッチすると GPO2 に出力が現れます。

さらに、圧電ブザーが接続されています。 静電容量ボタンにタッチすると圧電ブザーに矩形波を与えて、音を鳴らす仕組みです。

MBR3 の設定

CapSense Sensor Configuration

次に MBR3 の設定を見ていきます。

静電容量センサの設定は、 CS2, CS3 をボタンとして設定しただけで、他の部分はデフォルトのままです。


Global Configuration

その他の設定で、かなりクセのある使い方をしています。

まず、このデバイスは、アドレス 0x60 に設定されています。 前回のデバイスとは異なるアドレスですので、ふたつのデバイスを同一のバスに接続する事が出来ます。

"Enable GPIO host control" にチェックが入っています。 ここにチェックを入れない使い方では、静電容量センサ CS2/CS3 の状態が出力 GPO2/GPO3 に自動的に伝達されます。 ところが、チェックを入れるとボタンの状態が出力に伝達されなくなります。 そのかわりに、ホストが I2C から通信を行う事で GPO2/GPO3 の制御を行う事が出来るようになります。 GPO の出力論理は、デフォルトのままで「負論理のオープンドレイン出力」となっています。

さらに、 "Buzzer" の項目群が設定されています。 圧電ブザーは、ボタンと連動して鳴動するようになっており、ホストが制御する訳ではありません。 ボタンにタッチすると、 4000Hz の周波数で 100ms の期間、ブザーが鳴ります。

ホスト側のソフトウェア

ホスト側には、以下のようなファームウェアを書き込みました。

#include "mbed.h"

// Two LEDs are assigned as button status indicators
DigitalOut led3(LED3);
DigitalOut led4(LED4);

// 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 uint8_t MBR_GPO_OUTPUT_STATE = 0x80; // GPO STATE
const uint8_t MBR_BUTTON_STAT = 0xaa; // BUTTON_STAT

// Node "Katze"
// Device: MBR3110
// Function: Two button CapSense with Buz
const uint16_t katzeAddr = 0x60 << 1; // 8bit I2C address
const uint8_t katzeGreenButton = 0x04; // CS2
const uint8_t katzeRedButton = 0x08; // CS3
const uint8_t katzeGreenLed = 0x04; // GPO2
const uint8_t katzeRedLed = 0x08; // GPO3

int main(void) {
    uint8_t cmd[8];
    uint16_t katzeStat[1];
    uint8_t katzeLed;
    
    for (;;) {
        // Get status from Katze
        cmd[0] = MBR_BUTTON_STAT;  // 
        i2c.write(katzeAddr, (char *)cmd, 1);
        i2c.write(katzeAddr, (char *)cmd, 1);
        i2c.write(katzeAddr, (char *)cmd, 1, true);
        i2c.read( katzeAddr, (char *)katzeStat, 2);

        // Copy button status
        katzeLed =
            ((katzeStat[0] & katzeRedButton)?(katzeGreenLed):(0x00)) |
            ((katzeStat[0] & katzeGreenButton)?(katzeRedLed):(0x00));
        cmd[1] = ~katzeLed;
        cmd[0] = MBR_GPO_OUTPUT_STATE;
        i2c.write(katzeAddr, (char *)cmd, 1);
        i2c.write(katzeAddr, (char *)cmd, 1);
        i2c.write(katzeAddr, (char *)cmd, 2);
        
        // Show button indicator LEDs
        led3 = (katzeStat[0] & katzeRedButton)?(1):(0);
        led4 = (katzeStat[0] & katzeGreenButton)?(1):(0);
        
        wait(0.05);
    }
}

"BUTTON_STAT" レジスタから静電容量ボタンの状態を読み込んで、 mbed LPC1768 の LED3/LED4 に表示するという動作は、前回と同じです。 今回は、それに加えて、 MBR3110 の GPO2/GPO3 に接続された LED もホストから制御しています。 "GPO_OUTPUT_STATE" レジスタに値を書き込むと、 LED の点灯を制御することができます。 レジスタへ書き込みを行うときにも際には MBR3 をスタンバイ状態から起こすために "write" メソッドを三回発行しています。

CS2/CS3 の状態を GPO2/GPO3 にそれぞれ伝達すると、自動的に伝達されたものと見分けがつきませんので、このソフトウェアでは、あえて「赤色のボタンにタッチすると緑色の LED が点灯する」「緑色のボタンにタッチすると赤色の LED が点灯する」ようにしてみました。

参考文献

CY8CMBR3102, CY8CMBR3106S, CY8CMBR3108, CY8CMBR3110, CY8CMBR3116 CapSense® Express™ Controllers Registers TRM

I2C でアクセス可能なレジスタが解説されています。 MBR3 では、ここで記述されているレジスタに対するアクセスによって、すべての動作を規定しています。

CY8CMBR3xxx CapSense® Design Guide

この記事では、被覆導線を利用して実験を行うための簡易ボタンを作成しました。 本格的に静電容量ボタンを使いたい場合には、この文書を参照して作成します。

関連商品

mbed NXP LPC1768

mbed NXP LPC1768

  • 出版社/メーカー: スイッチサイエンス
  • メディア: おもちゃ&ホビー

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。