ESP32のタッチセンサ3つを使って8個の状態を表してみた
ESP32でタッチセンサを使ってピアノを作ってみたでは3本のタッチセンサを使って3つのドレミを出力する回路を組んでみました。
でもよく考えてみてください。それぞれのタッチセンサのオンオフを1bitとすれば、合計3bitの演算ができるはずです。つまり2^3 = 8個の状態をタッチセンサ3つだけで表現できるだろうということです。
これを使えばドレミファソラシまで再生できそうですね。
今回はその下準備の状態判定関数を作ってみたので簡単にメモを残しておきます。
ソースコード
float default_values[] = {0.0,0.0,0.0};
uint8_t pins[] = {T7,T6,T5};
float value_ratio = 1;
int i = 0;
//タッチセンサの状況を出力
int getTouchState(){
int state = 0;
int base = 1;
for(i=0;i<3;i++){
value_ratio = touchRead(pins[i])/default_values[i];
if(value_ratio < 0.7){
//stateにiの状態を記入(2がonの時はbase << 2 = 0b100になる)
state = state + (base << i);
}
}
return state;
}
void setup() {
Serial.begin(115200);
delay(1000);
//タッチセンサの設定
int i = 0;
for(i=0;i<3;i++){
default_values[i] = touchRead(pins[i]);
Serial.println(default_values[i]);
}
}
void loop() {
int state = getTouchState();
Serial.println("state:");
Serial.println(state);
delay(100);
}
肝となる関数はここ
//タッチセンサの状況を出力
int getTouchState(){
int state = 0;
int base = 1;
for(i=0;i<3;i++){
value_ratio = touchRead(pins[i])/default_values[i];
if(value_ratio < 0.7){
//stateにiの状態を記入(2がonの時はbase << 2 = 0b100になる)
state = state + (base << i);
}
}
return state;
}
それぞれのピンの比をvalue_ratioに入れ込むのは前述の記事と変わりません。触られた、つまり0.7以下ぐらいになった時に、そのピンの情報をstateという変数に格納します。
この時にbitシフト演算を使います。例えば1という数字を左にシフトするときには
shifted = 1 << 1
Serial.println(shifted)
とすることで
2
が出力されます。これは内部で2進数の1,つまり0b01のbitが1つずつ左に移動して0b10になったため、10進数表記では2となるわけです。
ここで
base = 0b01;
としてベースの値を設定し、
base << i;
とすればi分だけ左にずれます。
今回は3つのピンを使っていて、i = 0,1,2があります。例えばi = 0と2のピンが押されているときにstateとして0b101と表現出来れば扱いやすいですね。
stateの1bit目が1つめのセンサの状態。2bit目が2つめの状態…ibit目がiつめの状態、といった具合です。
こうするには例えばiが2の時にはstateに0b100が足されればいいわけなので、
state = state + (base << 2);
とすればOKです。なぜなら、base << 2はbaseの0b001のbitが2つ左に行くわけなので、0b100になるからです。これを使えば各桁が独立の状態を表すことができます。
T5 | T6 | T7 | state(2進数) | state(10進数) |
---|---|---|---|---|
0 | 0 | 0 | 0b000 | 0 |
0 | 0 | 1 | 0b001 | 1 |
0 | 1 | 0 | 0b010 | 2 |
0 | 1 | 1 | 0b011 | 3 |
1 | 0 | 0 | 0b100 | 4 |
1 | 0 | 1 | 0b101 | 5 |
1 | 1 | 0 | 0b110 | 6 |
1 | 1 | 1 | 0b111 | 7 |
これで現実のデバイスから2進数的に値を入力することができます。
動かしている様子
回路はESP32でタッチセンサを使ってピアノを作ってみたと全く同じです。
ESP32のタッチセンサ3つを使って3bit=8個の状態を表現してみた。
これ使えば少ないタッチセンサでドレミファソラシまでは演奏できるのでは???????????????? bit直入力型ピアノ#esp32 #ワクテク pic.twitter.com/yzwEoFmCVJ— ????????????-???????????????? (@wak_tech) December 28, 2018
ピンバック: ESP32のタッチセンサ3つでドレミファソラシまで鳴らせるピアノを作ってみた | Wak-tech
ピンバック: ESP32の使い方入門【20個のチュートリアル】 | Wak-tech