質問編集履歴

5 新たな現象。

morleyrobertson

morleyrobertson score 12

2018/10/18 20:12  投稿

ESP32でボタンの同時押しが検知できない件
### 前提・実現したいこと
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
![![イメージ説明](6d6a7a47b6ddfa2e97d7e1805e8b198f.jpeg)](e048eeedad126a19a23cebaadaf30b98.jpeg)
### 発生している問題・エラーメッセージ
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAを押しているにも関わらず離された時の処理が走ってしまい、Bの押下も検知されません。
### 該当のソースコード
```C++
//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);}
 //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。
 //押されている間は100msごとに出力し続けます。
 //離される(res1が1に戻る)と画面への出力がストップします。
 if(loop_0_7==7) loop_0_7=0;
 else loop_0_7++;
}
```
この原因がお分かりになる方いらっしゃいますでしょうか。
【2018年10月17日追記】
2つのボタンを同時に押したときの不具合は、キーの組み合わせによって異なることが分かりました。
以下、キーの組み合わせと不具合の対応を記載します。
回路図中の8個のボタンを左から0番、1番、2番、3番、4番、5番、6番、7番ボタンとしますと、
■ 0番ボタンを押しながら
1番~7番ボタンを押しても、画面に0を出力し続ける(他のボタンの入力を受け付けない)。
■ 1番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(1番ボタンは離されたと判断されてしまう)。
2番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 2番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(2番ボタンは離されたと判断されてしまう)。
1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
4番、6番、7番ボタンを押しても、画面に2を出力し続ける(他のボタンの入力を受け付けない)。
■ 3番ボタンを押しながら
0番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 4番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(4番ボタンは離されたと判断されてしまう)。
1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
2番ボタンを押すと、画面に2を出力し続ける(4番ボタンは離されたと判断されてしまう)。
6番ボタン、7番ボタンを押しても、画面に4を出力し続ける(他のボタンの入力を受け付けない)。
■ 5番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(5番ボタンは離されたと判断されてしまう)。
1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 6番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(6番ボタンは離されたと判断されてしまう)。
1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 7番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(7番ボタンは離されたと判断されてしまう)。
1番~6番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
といった具合です。
ちなみに、下の画像のように、もう1列足して、左から8番~15番ボタンとし、
上の列のボタン1個を押しながら、下の列のボタン1個を押すと期待した通りの出力をしてくれます。
例えば、上の列の0番ボタンと下の列の8番ボタンを同時に押すと、
0
8
0
8
0
8
と交互に出力してくれます。
![イメージ説明](4e19aa9b1d29af8b2846b006b9edcecc.jpeg)
本当は同じ列の2個のボタンでも同じように交互に出力して欲しかったのですが、
上記のとおり、予期しない出力をしてしまっています。
上記のとおり、予期しない出力をしてしまっています。
【2018年10月18日追記】
同時押しが出来ない問題の前に、
もともとボタンの入力とボタン番号の画面出力が異なる謎の現象が起きていました。
0番ボタンを押すと「4」を画面に出力、4番ボタンを押すと「0」を画面に出力。
この現象がどうにも解消されないため、苦肉の策で配線を入れ替えることにしました。
0番ボタンと74HC138のY4ピンを、4番ボタンを74HC138のY0ピンに接続。
最初の回路図の配線がごちゃごちゃとしているのはそのためです。
このようにすると、左のボタンから0 1 2 3 4 5 6 7と期待通りの値を出力してくれるため、
謎は残るものの、まぁ良いかと思って、同時押しができない問題に取り掛かりました。
そして、以前同じようにArduinoと74HC138とボタンとダイオードを使って同様の回路を組んだときは
期待通りの動きをしてくれていたため、昨夜もう一度それらを組んで、当時のコードを実行しました。
そこで思い出したのは、ボタンの入力とボタン番号の画面出力が異なる現象はArduinoでも
発生していたこと。この現象はプリスケーラの設定を変えることで正常にできたこと。
あと、同時押しを可能にするダイオードの繋ぎ方でした(下図)。
左はダメ。右はおk。
![同時押しを可能にするダイオードの繋ぎ方](3a84f1beef709745bd5260f4d378280d.jpeg)
そして、ESP32に戻って、ダイオードを正確に繋いで試してみようとしたところ、
1つのボタンの入力さえブレブレになってしまいました。
0番ボタンを押すと、0、5、6を出力。
1番ボタンを押すと、1、2を出力。
2番ボタンを押すと、2、3、4を出力。
3番ボタンを押すと、3、4を出力。
4番ボタンを押すと、1、2、4を出力。
5番ボタンを押すと、5、6を出力。
6番ボタンを押すと、0、6、7を出力。
7番ボタンを押すと、0、7を出力。
ちょっと僕の手に負える感じじゃないなと感じています。
別のICを使うなど、ほかの方法を考え始めています。
  • C++

    8247 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8734 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    1298 questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

4 追記

morleyrobertson

morleyrobertson score 12

2018/10/17 20:57  投稿

ESP32でボタンの同時押しが検知できない件
### 前提・実現したいこと
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
![![イメージ説明](6d6a7a47b6ddfa2e97d7e1805e8b198f.jpeg)](e048eeedad126a19a23cebaadaf30b98.jpeg)
### 発生している問題・エラーメッセージ
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAを押しているにも関わらず離された時の処理が走ってしまい、Bの押下も検知されません。
### 該当のソースコード
```C++
//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);}
 //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。
 //押されている間は100msごとに出力し続けます。
 //離される(res1が1に戻る)と画面への出力がストップします。
 if(loop_0_7==7) loop_0_7=0;
 else loop_0_7++;
}
```
この原因がお分かりになる方いらっしゃいますでしょうか。
【2018年10月17日追記】
2つのボタンを同時に押したときの不具合は、キーの組み合わせによって異なることが分かりました。
以下、キーの組み合わせと不具合の対応を記載します。
回路図中の8個のボタンを左から0番、1番、2番、3番、4番、5番、6番、7番ボタンとしますと、
■ 0番ボタンを押しながら
1番~7番ボタンを押しても、画面に0を出力し続ける(他のボタンの入力を受け付けない)。
■ 1番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(1番ボタンは離されたと判断されてしまう)。
2番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 2番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(2番ボタンは離されたと判断されてしまう)。
1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
4番、6番、7番ボタンを押しても、画面に2を出力し続ける(他のボタンの入力を受け付けない)。
■ 3番ボタンを押しながら
0番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 4番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(4番ボタンは離されたと判断されてしまう)。
1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
2番ボタンを押すと、画面に2を出力し続ける(4番ボタンは離されたと判断されてしまう)。
6番ボタン、7番ボタンを押しても、画面に4を出力し続ける(他のボタンの入力を受け付けない)。
■ 5番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(5番ボタンは離されたと判断されてしまう)。
1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 6番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(6番ボタンは離されたと判断されてしまう)。
1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 7番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(7番ボタンは離されたと判断されてしまう)。
1番~6番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
といった具合です。
ちなみに、下の画像のように、もう1列足して、左から8番~15番ボタンとし、
上の列のボタン1個を押しながら、下の列のボタン1個を押すと期待した通りの出力をしてくれます。
例えば、上の列の0番ボタンと下の列の8番ボタンを同時に押すと、
0
8
0
8
0
8
と交互に出力してくれます。
![イメージ説明](4e19aa9b1d29af8b2846b006b9edcecc.jpeg)  
本当は同じ列の2個のボタンでも同じように交互に出力して欲しかったのですが、
上記のとおり、予期しない出力をしてしまっています。
  • C++

    8247 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8734 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    1298 questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

3 追記

morleyrobertson

morleyrobertson score 12

2018/10/17 20:53  投稿

ESP32でボタンの同時押しが検知できない件
### 前提・実現したいこと
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
![![イメージ説明](6d6a7a47b6ddfa2e97d7e1805e8b198f.jpeg)](e048eeedad126a19a23cebaadaf30b98.jpeg)
### 発生している問題・エラーメッセージ
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAを押しているにも関わらず離された時の処理が走ってしまい、Bの押下も検知されません。
### 該当のソースコード
```C++
//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);}
 //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。
 //押されている間は100msごとに出力し続けます。
 //離される(res1が1に戻る)と画面への出力がストップします。
 if(loop_0_7==7) loop_0_7=0;
 else loop_0_7++;
}
```
この原因がお分かりになる方いらっしゃいますでしょうか。
この原因がお分かりになる方いらっしゃいますでしょうか。
【2018年10月17日追記】
2つのボタンを同時に押したときの不具合は、キーの組み合わせによって異なることが分かりました。
以下、キーの組み合わせと不具合の対応を記載します。
回路図中の8個のボタンを左から0番、1番、2番、3番、4番、5番、6番、7番ボタンとしますと、
■ 0番ボタンを押しながら
1番~7番ボタンを押しても、画面に0を出力し続ける(他のボタンの入力を受け付けない)。
■ 1番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(1番ボタンは離されたと判断されてしまう)。
2番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 2番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(2番ボタンは離されたと判断されてしまう)。
1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
4番、6番、7番ボタンを押しても、画面に2を出力し続ける(他のボタンの入力を受け付けない)。
■ 3番ボタンを押しながら
0番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 4番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(4番ボタンは離されたと判断されてしまう)。
1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
2番ボタンを押すと、画面に2を出力し続ける(4番ボタンは離されたと判断されてしまう)。
6番ボタン、7番ボタンを押しても、画面に4を出力し続ける(他のボタンの入力を受け付けない)。
■ 5番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(5番ボタンは離されたと判断されてしまう)。
1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 6番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(6番ボタンは離されたと判断されてしまう)。
1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
■ 7番ボタンを押しながら
0番ボタンを押すと、画面に0を出力し続ける(7番ボタンは離されたと判断されてしまう)。
1番~6番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
といった具合です。
ちなみに、下の画像のように、もう1列足して、左から8番~15番ボタンとし、
上の列のボタン1個を押しながら、下の列のボタン1個を押すと期待した通りの出力をしてくれます。
例えば、上の列の0番ボタンと下の列の8番ボタンを同時に押すと、
0
8
0
8
0
8
と交互に出力してくれます。
本当は同じ列の2個のボタンでも同じように交互に出力して欲しかったのですが、
上記のとおり、予期しない出力をしてしまっています。
  • C++

    8247 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8734 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    1298 questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

2 コード内のコメントの間違いを訂正。

morleyrobertson

morleyrobertson score 12

2018/10/15 21:29  投稿

ESP32でボタンの同時押しが検知できない件
### 前提・実現したいこと
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
![![イメージ説明](6d6a7a47b6ddfa2e97d7e1805e8b198f.jpeg)](e048eeedad126a19a23cebaadaf30b98.jpeg)
### 発生している問題・エラーメッセージ
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAを押しているにも関わらず離された時の処理が走ってしまい、Bの押下も検知されません。
### 該当のソースコード
```C++
//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)、
 byte res1 = (GPIO.in >> 27) & 0x1;
 //ボタンが押された時は、その時のloop_0_7の値を読み取ります。
 //これがボタン番号となります。
 if(!res1){Serial.println(loop_0_7);delay(100);}
 //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。
 //押されている間は100msごとに出力し続けます。
 if(loop_0_7==7) loop_0_7=0;
 else loop_0_7++;
}
```
この原因がお分かりになる方いらっしゃいますでしょうか。
  • C++

    8247 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8734 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    1298 questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

1 押されたと判断する部分と、離されたと判断する部分の追加

morleyrobertson

morleyrobertson score 12

2018/10/15 18:05  投稿

ESP32でボタンの同時押しが検知できない件
### 前提・実現したいこと
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
![![イメージ説明](6d6a7a47b6ddfa2e97d7e1805e8b198f.jpeg)](e048eeedad126a19a23cebaadaf30b98.jpeg)
### 発生している問題・エラーメッセージ
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAを押しているにも関わらず離された時の処理が走ってしまい、Bの押下も検知されません。
### 該当のソースコード
```C++
//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);}
 //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。  
 //押されている間は100msごとに出力し続けます。  
 //離される(res1が1に戻る)と画面の出力がストップします。  
 if(loop_0_7==7) loop_0_7=0;
 else loop_0_7++;
}
```
この原因がお分かりになる方いらっしゃいますでしょうか。
  • C++

    8247 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8734 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    1298 questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る