前提・実現したいこと
ESP32-DevKitCと74HC138(デコーダ、デマルチプレクサ)と8個のボタンを使い、
次のような回路を組みました。
発生している問題・エラーメッセージ
Arduinoで同様の回路を組んだ時は、正常にボタンの同時押しが検知できたと思うのですが、
ESP32ではうまく検知できていません。
8本の信号線がバッティングしないようダイオードを噛ませております。
任意のボタンAを押したままにしておいて、別のボタンBを押すと、
ボタンAを押しているにも関わらず離された時の処理が走ってしまい、Bの押下も検知されません。
該当のソースコード
C++
1//Mux control pins 2int s0 = 12; 3int s1 = 13; 4int s2 = 14; 5int controlPin[] = {s0, s1, s2}; 6 7int muxChannel[8][3] = { 8 {0, 0, 0}, //channel 0 9 {1, 0, 0}, //channel 1 10 {0, 1, 0}, //channel 2 11 {1, 1, 0}, //channel 3 12 {0, 0, 1}, //channel 4 13 {1, 0, 1}, //channel 5 14 {0, 1, 1}, //channel 6 15 {1, 1, 1}, //channel 7 16}; 17 18int loop_0_7 = 0; 19 20void setup() { 21 22 pinMode(s0, OUTPUT); 23 pinMode(s1, OUTPUT); 24 pinMode(s2, OUTPUT); 25 26 digitalWrite(s0, LOW); 27 digitalWrite(s1, LOW); 28 digitalWrite(s2, LOW); 29 30 pinMode(27, INPUT_PULLUP); 31 32 Serial.begin(115200); 33 34} 35 36void loop() { 37 //74HC138の0ピン~7ピンに順次Lowを出力していきます。 38 for (int i = 0; i < 3; i ++) { 39 if(muxChannel[loop_0_7][i]) { 40 if(i==0) GPIO.out_w1ts = ((uint32_t)1 << 12); 41 else if(i==1) GPIO.out_w1ts = ((uint32_t)1 << 13); 42 else if(i==2) GPIO.out_w1ts = ((uint32_t)1 << 14); 43 }else{ 44 if(i==0) GPIO.out_w1tc = ((uint32_t)1 << 12); 45 else if(i==1) GPIO.out_w1tc = ((uint32_t)1 << 13); 46 else if(i==2) GPIO.out_w1tc = ((uint32_t)1 << 14); 47 } 48 } 49 //ボタンが押されたかどうかをESP32の27ピンで検知しています。 50 //内部抵抗でプルアップしているため、ボタンが押されていないときはHIGH(1)、 51 //押されたときはLOW(0)となります。 52 byte res1 = (GPIO.in >> 27) & 0x1; 53 //ボタンが押された時は、その時のloop_0_7の値を読み取ります。 54 //これがボタン番号となります。 55 if(!res1){Serial.println(loop_0_7);delay(100);} 56 //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。 57 //押されている間は100msごとに出力し続けます。 58 //離される(res1が1に戻る)と画面への出力がストップします。 59 60 if(loop_0_7==7) loop_0_7=0; 61 else loop_0_7++; 62 63}
この原因がお分かりになる方いらっしゃいますでしょうか。
【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個のボタンでも同じように交互に出力して欲しかったのですが、
上記のとおり、予期しない出力をしてしまっています。
【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。
そして、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を使うなど、ほかの方法を考え始めています。

回答2件
あなたの回答
tips
プレビュー