I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / 動作確認

pp.614ff.

テキストはI2C接続のリアルタイムクロックを試しているが、この組み合わせはAVR Programming: Learning to Write Software for Hardware カテゴリーの記事一覧 -のときにさんざんやったので、ここではAdafruit MPR121 静電容量センサ(12ch) - スイッチサイエンスを使ってみる。ブレークアウトボードにレギュレーターとレベルシフターとが実装されているので電源電圧(IOも)は3.3 V~5 Vでいける。IRQ端子はオープンドレイン。

f:id:ti-nspire:20200819204829p:plain:h315

f:id:ti-nspire:20200819103119p:plain:w500
Wがwrite、aがACK、Sがrepeated start、Rがread、~aがNACK。
5Aがスレーブアドレス。
00がスレーブのレジスタアドレス。
5Aがスレーブアドレス。
E0が電極7:0の状態。
01が電極11:8の状態。

Atmel Studioプロジェクト一式: https://github.com/ti-nspire/AVR/tree/master/MPR121_touch_sensor_0/test_C
I2C関連のみ: I2C library for ATmega328P · GitHub

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
//#include <util/delay.h>
#include "I2CClass.h"

// 電極の状態が変化したら、電極11:0の状態をPD7:4とPB7:0とへ出力して確かめる。
ISR(INT1_vect){
    uint8_t buff[2];
    i2c.read(0x5A, 0x00, 2, buff); // (どのスレーブの, どこから, 何バイトを, どこへ)読み出す。
    PORTB = buff[0];               // 電極7:0
    PORTD = (buff[1] & 0x0F) << 4; // 電極11:8
}

int main(){
    EIMSK |= (1 << INT1);  // INT1 (外部割り込み要求1)を有効化する。
    EICRA |= (1 << ISC11); // falling edgeで割り込む。
    sei();
    
    DDRB = 0xFF;
    DDRD = 0xF0;

    i2c.init();

    // ソフトリセットをかける。
    i2c.write(0x5A, 0x80, 0x63); // (どのスレーブの, どこへ, 1バイトを)書き込む。

    // 12本の電極を全部タッチセンサーにする。
    i2c.write(0x5A, 0x5E, 12); // (どのスレーブの, どこへ, 1バイトを)書き込む。

    while(1);
    return 0;
}

f:id:ti-nspire:20200818033623p:plain