teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

新たな現象。

2018/10/18 11:12

投稿

morleyrobertson
morleyrobertson

スコア12

title CHANGED
File without changes
body CHANGED
@@ -121,4 +121,34 @@
121
121
  と交互に出力してくれます。
122
122
  ![イメージ説明](4e19aa9b1d29af8b2846b006b9edcecc.jpeg)
123
123
  本当は同じ列の2個のボタンでも同じように交互に出力して欲しかったのですが、
124
- 上記のとおり、予期しない出力をしてしまっています。
124
+ 上記のとおり、予期しない出力をしてしまっています。
125
+
126
+ 【2018年10月18日追記】
127
+
128
+ 同時押しが出来ない問題の前に、
129
+ もともとボタンの入力とボタン番号の画面出力が異なる謎の現象が起きていました。
130
+ 0番ボタンを押すと「4」を画面に出力、4番ボタンを押すと「0」を画面に出力。
131
+ この現象がどうにも解消されないため、苦肉の策で配線を入れ替えることにしました。
132
+ 0番ボタンと74HC138のY4ピンを、4番ボタンを74HC138のY0ピンに接続。
133
+ 最初の回路図の配線がごちゃごちゃとしているのはそのためです。
134
+ このようにすると、左のボタンから0 1 2 3 4 5 6 7と期待通りの値を出力してくれるため、
135
+ 謎は残るものの、まぁ良いかと思って、同時押しができない問題に取り掛かりました。
136
+ そして、以前同じようにArduinoと74HC138とボタンとダイオードを使って同様の回路を組んだときは
137
+ 期待通りの動きをしてくれていたため、昨夜もう一度それらを組んで、当時のコードを実行しました。
138
+ そこで思い出したのは、ボタンの入力とボタン番号の画面出力が異なる現象はArduinoでも
139
+ 発生していたこと。この現象はプリスケーラの設定を変えることで正常にできたこと。
140
+ あと、同時押しを可能にするダイオードの繋ぎ方でした(下図)。
141
+ 左はダメ。右はおk。
142
+ ![同時押しを可能にするダイオードの繋ぎ方](3a84f1beef709745bd5260f4d378280d.jpeg)
143
+ そして、ESP32に戻って、ダイオードを正確に繋いで試してみようとしたところ、
144
+ 1つのボタンの入力さえブレブレになってしまいました。
145
+ 0番ボタンを押すと、0、5、6を出力。
146
+ 1番ボタンを押すと、1、2を出力。
147
+ 2番ボタンを押すと、2、3、4を出力。
148
+ 3番ボタンを押すと、3、4を出力。
149
+ 4番ボタンを押すと、1、2、4を出力。
150
+ 5番ボタンを押すと、5、6を出力。
151
+ 6番ボタンを押すと、0、6、7を出力。
152
+ 7番ボタンを押すと、0、7を出力。
153
+ ちょっと僕の手に負える感じじゃないなと感じています。
154
+ 別のICを使うなど、ほかの方法を考え始めています。

4

追記

2018/10/18 11:12

投稿

morleyrobertson
morleyrobertson

スコア12

title CHANGED
File without changes
body CHANGED
@@ -119,5 +119,6 @@
119
119
  0
120
120
  8
121
121
  と交互に出力してくれます。
122
+ ![イメージ説明](4e19aa9b1d29af8b2846b006b9edcecc.jpeg)
122
123
  本当は同じ列の2個のボタンでも同じように交互に出力して欲しかったのですが、
123
124
  上記のとおり、予期しない出力をしてしまっています。

3

追記

2018/10/17 11:57

投稿

morleyrobertson
morleyrobertson

スコア12

title CHANGED
File without changes
body CHANGED
@@ -75,4 +75,49 @@
75
75
 
76
76
  }
77
77
  ```
78
- この原因がお分かりになる方いらっしゃいますでしょうか。
78
+ この原因がお分かりになる方いらっしゃいますでしょうか。
79
+
80
+ 【2018年10月17日追記】
81
+ 2つのボタンを同時に押したときの不具合は、キーの組み合わせによって異なることが分かりました。
82
+ 以下、キーの組み合わせと不具合の対応を記載します。
83
+ 回路図中の8個のボタンを左から0番、1番、2番、3番、4番、5番、6番、7番ボタンとしますと、
84
+ ■ 0番ボタンを押しながら
85
+ 1番~7番ボタンを押しても、画面に0を出力し続ける(他のボタンの入力を受け付けない)。
86
+ ■ 1番ボタンを押しながら
87
+ 0番ボタンを押すと、画面に0を出力し続ける(1番ボタンは離されたと判断されてしまう)。
88
+ 2番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
89
+ ■ 2番ボタンを押しながら
90
+ 0番ボタンを押すと、画面に0を出力し続ける(2番ボタンは離されたと判断されてしまう)。
91
+ 1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
92
+ 4番、6番、7番ボタンを押しても、画面に2を出力し続ける(他のボタンの入力を受け付けない)。
93
+ ■ 3番ボタンを押しながら
94
+ 0番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
95
+ ■ 4番ボタンを押しながら
96
+ 0番ボタンを押すと、画面に0を出力し続ける(4番ボタンは離されたと判断されてしまう)。
97
+ 1番、3番、5番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
98
+ 2番ボタンを押すと、画面に2を出力し続ける(4番ボタンは離されたと判断されてしまう)。
99
+ 6番ボタン、7番ボタンを押しても、画面に4を出力し続ける(他のボタンの入力を受け付けない)。
100
+ ■ 5番ボタンを押しながら
101
+ 0番ボタンを押すと、画面に0を出力し続ける(5番ボタンは離されたと判断されてしまう)。
102
+ 1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
103
+ ■ 6番ボタンを押しながら
104
+ 0番ボタンを押すと、画面に0を出力し続ける(6番ボタンは離されたと判断されてしまう)。
105
+ 1番~7番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
106
+ ■ 7番ボタンを押しながら
107
+ 0番ボタンを押すと、画面に0を出力し続ける(7番ボタンは離されたと判断されてしまう)。
108
+ 1番~6番ボタンを押すと、画面に何も出力されなくなる(すべてのボタンが押されてないと判断されてしまう)。
109
+
110
+ といった具合です。
111
+
112
+ ちなみに、下の画像のように、もう1列足して、左から8番~15番ボタンとし、
113
+ 上の列のボタン1個を押しながら、下の列のボタン1個を押すと期待した通りの出力をしてくれます。
114
+ 例えば、上の列の0番ボタンと下の列の8番ボタンを同時に押すと、
115
+ 0
116
+ 8
117
+ 0
118
+ 8
119
+ 0
120
+ 8
121
+ と交互に出力してくれます。
122
+ 本当は同じ列の2個のボタンでも同じように交互に出力して欲しかったのですが、
123
+ 上記のとおり、予期しない出力をしてしまっています。

2

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

2018/10/17 11:53

投稿

morleyrobertson
morleyrobertson

スコア12

title CHANGED
File without changes
body CHANGED
@@ -61,14 +61,14 @@
61
61
  }
62
62
  //ボタンが押されたかどうかをESP32の27ピンで検知しています。
63
63
   //内部抵抗でプルアップしているため、ボタンが押されていないときはHIGH(1)、
64
-  //押されていないときはLOW(0)となります。
64
+  //押されときはLOW(0)となります。
65
65
   byte res1 = (GPIO.in >> 27) & 0x1;
66
66
  //ボタンが押された時は、その時のloop_0_7の値を読み取ります。
67
67
   //これがボタン番号となります。
68
68
  if(!res1){Serial.println(loop_0_7);delay(100);}
69
69
   //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。
70
70
   //押されている間は100msごとに出力し続けます。
71
-  //離される(res1が1に戻る)と画面の出力がストップします。
71
+  //離される(res1が1に戻る)と画面の出力がストップします。
72
72
 
73
73
  if(loop_0_7==7) loop_0_7=0;
74
74
  else loop_0_7++;

1

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

2018/10/15 12:29

投稿

morleyrobertson
morleyrobertson

スコア12

title CHANGED
File without changes
body CHANGED
@@ -66,6 +66,9 @@
66
66
  //ボタンが押された時は、その時のloop_0_7の値を読み取ります。
67
67
   //これがボタン番号となります。
68
68
  if(!res1){Serial.println(loop_0_7);delay(100);}
69
+  //↑ボタンが押されたときは、res1が0となり、その時のloop_0_7の値を画面出力します。
70
+  //押されている間は100msごとに出力し続けます。
71
+  //離される(res1が1に戻る)と画面の出力がストップします。
69
72
 
70
73
  if(loop_0_7==7) loop_0_7=0;
71
74
  else loop_0_7++;