タッチセンサーを使う

TTP226タッチセンサー


前回
、TTP224チップを使った4-Channel Digital Touch Sensor Moduleを紹介しました。
今回はTTP226-809SNチップを使った8-Channel Digital Touch Sensor Moduleを紹介します。
ピンは下の写真のようにOUT1からOUT8とGND、VCC、DVの11ピンです。
TTP226
TTP226

このモジュールのSchematic Diagramがこ ちらに公開されています。
8ピンのピンヘッダーがP1、10ピンのピンヘッダーがP2です。
このモジュールに使われているのは28ピン仕様のTTP226-809SNですが、このチップのデータシートが見つかりません。
こ ちらに48ピン仕様のTTP226のデータシートが公開されています。
TTP226のデータシートによるとDVピンには「Data valid output signal」が出力されるみたいなので、
この値をトリガーにすればいいかなと考えたのですが、どのボタンを触ってもこのピンの値は変化しませんでした。

ArduinoのSample Sketchを見ても、直接D1からD8の値を読んでいます。
このためだけに8本もGPIOを使うのはもったいないので、8chマルチプレクサーのCD4051を使うこ とにします。
CD4051


8cHマルチプレクサーとはA、B、Cの3本のピンでチャネルを指定すると、そのチャネルだけが有効になる回路です。
I/Oエクスパンダーとの違いは、I/Oエクスパンダーは指定した複数のチャネルが同時に有効になるのに対して、
マルチプレクサーは指定した1つのチャネルだけが有効になります。
同じ動作をするチップはいくつかあります。
結線は以下の通りです。
タッチセンサー CD4051 Raspberry
OUT5
1(CH4 IN/OUT)
OUT7 2(CH6 IN/OUT)

3(Common IN/OUT) 16(GPIO 4)
OUT8 4(CH7 IN/OUT)
OUT6 5(CH5 IN/OUT)

6(INH) 15(GPIO 3)

7(Vee) GND

8(Vss) GND

9(C) 13(GPIO 2)

10(B) 12(GPIO 1)

11(A) 11(GPIO 0)
OUT4 12(CH3 IN/OUT)
OUT1 13(CH0 IN/OUT)
OUT2 14(CH1 IN/OUT)
OUT3 15(CH2 IN/OUT)

16(Vdd) 3.3V

全体はこの様になります。
TTP226


ソースは以下の通りです。
子プロセスを起動し、子プロセスの中で、CH0からCH7の入力値を判定し、ONになっているとき、
つまりボタンが押されているときは、そのチャネル番号を終了コードとします。
/*

 cd4051.c

 Raspberry Pi driving the CD4051 multiplexer

 to compile : cc cd4051.c -o cd4051 -lwiringPi

*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <wiringPi.h>

// Define Pin
#define BCD     0   // GPIO 0
#define INH      3   // GPIO 3
#define COM    4   // GPIO 4

int CD4051Read(int ch)
{
    unsigned int mask;
    int i;
    int ret;

    digitalWrite(INH,1);
    for(i=0;i<3;i++) {
      mask=(1 << i);
      digitalWrite(BCD+i,0);
      if (ch & mask) digitalWrite(BCD+i,1);
    }
    digitalWrite(INH,0);
    usleep(1);
    ret=digitalRead(COM);
    return(ret);
}

int main(int argc, char **argv) {
    int endFlag=1;
    pid_t result_pid;
    int status;
    int ret;
    int ch;

    if (wiringPiSetup() == -1){
        printf("wiringPiSetup init error\n");
        exit(1);
    }
    pinMode(BCD, OUTPUT);
    pinMode(BCD+1, OUTPUT);
    pinMode(BCD+2, OUTPUT);
    pinMode(INH, OUTPUT);
    pinMode(COM, INPUT);

    while(endFlag){
        result_pid = fork();
        if (result_pid == 0) { // 子プロセス開始
          while(1){
            for(ch=0;ch<8;ch++){
              ret=CD4051Read(ch);
              if (ret == 1) break;
              usleep(5000);
            }
            if (ret == 1) break;
          }
          exit(ch);
        }
        wait(&status);
        if (WIFEXITED(status)) {
          printf("Push Button is %d\n",WEXITSTATUS(status));
//何か処理をここに
          sleep(1);
          if (WEXITSTATUS(status) == 7) endFlag=0;
        }
    }

    exit(0);
}

実行結果は以下の様になります。
$ sudo ./cd4051
Push Button is 0
Push Button is 3
Push Button is 2
Push Button is 4
Push Button is 1
Push Button is 4
Push Button is 5
Push Button is 6
Push Button is 7

複数のCD4051を使うと、16チャネルや32チャネルの入力が可能になります。
例えば16チャネルの場合は、2つのCD4051を使います。
A=B=C=0で、INH1(1番目のCD4051)=1、INH2(2番目のCD4051)=0なら、2番目のCD4051のチャネル0だけが 有効 になります。

4チャネルマルチプレクサーのCD4556を 同時に使うと、
A,B,C,D,Eの5本のピンで32チャンネルまで制御することができます。