TTP226+CD4051(マルチプレクサー)を使ってみる


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

TTP226
TTP226

デー タシートによるとDVピンには「Data valid output signal」が出力されるみたいなので、
この値をトリガーにすればいいかなと考えたのですが、どのボタンを触ってもこのピンの値はほとんど変化しませんでした。
そこで、8chマルチプレクサーのCD4051を使うこ とにします。

CD4051


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

CD4051ピン番号 タッチセンサーへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(CH4 IN/OUT) OUT5

2(CH6 IN/OUT) OUT7
3(Common IN/OUT)
16(GPIO 4)
4(CH7 IN/OUT) OUT8
5(CH5 IN/OUT) OUT6
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)
12(CH3 IN/OUT) OUT4

13(CH0 IN/OUT) OUT1

14(CH1 IN/OUT) OUT2

15(CH2 IN/OUT) OUT3

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チャンネルまで制御することができます。