ESP32でボタンの同時押しが検知できない件
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAが離された時の処理が走ってしまい、Bの押下も検知されません。
コードも念のため載せておきます。
//Mux control pins
int s0 = 12;
int s1 = 13;
int s2 = 14;
int controlPin[] = {s0, s1, s2};
int muxChannel[8][3] = {
{0, 0, 0}, //channel 0
{1, 0, 0}, //channel 1
{0, 1, 0}, //channel 2
{1, 1, 0}, //channel 3
{0, 0, 1}, //channel 4
{1, 0, 1}, //channel 5
{0, 1, 1}, //channel 6
{1, 1, 1}, //channel 7
};
int loop_0_7 = 0;
void setup() {
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
pinMode(27, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
//74HC138の0ピン~7ピンに順次Lowを出力していきます。
for (int i = 0; i < 3; i ++) {
if(muxChannel[loop_0_7][i]) {
if(i==0) GPIO.out_w1ts = ((uint32_t)1 << 12);
else if(i==1) GPIO.out_w1ts = ((uint32_t)1 << 13);
else if(i==2) GPIO.out_w1ts = ((uint32_t)1 << 14);
}else{
if(i==0) GPIO.out_w1tc = ((uint32_t)1 << 12);
else if(i==1) GPIO.out_w1tc = ((uint32_t)1 << 13);
else if(i==2) GPIO.out_w1tc = ((uint32_t)1 << 14);
}
}
//ボタンが押されたかどうかをESP32の27ピンで検知しています。
//内部抵抗でプルアップしているため、ボタンが押されていないときはHIGH(1)、
//押されていないときはLOW(0)となります。
byte res1 = (GPIO.in >> 27) & 0x1;
//ボタンが押された時は、その時のloop_0_7の値を読み取ります。
//これがボタン番号となります。
if(!res1){Serial.println(loop_0_7);delay(100);}
if(loop_0_7==7) loop_0_7=0;
else loop_0_7++;
}
この原因がお分かりになる方いらっしゃいますでしょうか。