charlieplexing を使用してボタンが押されたかどうかを確認したい。テストでは、19 個のボタンを使用しました。この画像とまったく同じように接続しましたが、各セグメントに 4 つのボタンがあり、5 つのセグメント (5 つのダイオード) があります。
私はこのコードを作成しました:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
pins = [5, 6, 13, 19, 26]
GPIO.setup(pins, GPIO.IN, pull_up_down=GPIO.PUD_UP)
outputs = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
while True:
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
segment = pins.index(pin)
pinsTemp = list(pins)
pinsTemp.remove(pin)
for pinTemp in pinsTemp:
button = pinsTemp.index(pinTemp)
if GPIO.input(pinTemp) == GPIO.LOW:
outputs[segment][button] = 1;
else:
outputs[segment][button] = 0;
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print outputs;
time.sleep(0.1);
ボタンを1つだけ押しているときは問題なく動作しますが、2つ押すと、4つのボタンが押されたという応答が得られます。例:
押しS1
てS2
。
出力: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1]]
.
押しS1
てS3
。
出力:[[0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 1]]
私はすでに検出に HIGH と LOW を使用してみました (どちらの場合も逆ダイオードを試しました)。同じ結果です。ダイオードは1N4148を使用しています。それは私の接続に関係しているのでしょうか、それとも私のコードが悪いのでしょうか? または、より良い解決策はありますか?