puhelinnäppäimistön liittäminen Raspberry Pi:hin

Tällä sivulla on erilaisia tapoja liittää puhelinnäppäimistö (pieni matriisityyppinen näppäimistö) Raspberry Pi:hin.

puhelinnäppäimistön kuva ja kytkentäkaavio

esimerkki puhelin­näppäimistöstä (4×4 näppäintä ja 8-pinninen liitin)
esimerkki puhelin­näppäimistön kytkentä­kaaviosta; kukin näppäin yhdistää yhden sarake­johtimen yhteen rivi­johtimeen

oma GPIO-pinni jokaiselle näppäimistön pinnille

Tämä kytkentä on helppo rakentaa, pystyy lukemaan mielivaltaisen määrän yhtä aikaa painettuja näppäimiä eikä edellytä lisäkomponentteja. Haittapuolena tämä kytkentä vaatii kahdeksan GPIO-pinniä.

kytkennät Raspberry Pi:n ja näppäimistön välillä
Raspberry Pi suunta näppäimistö
GPIO sarake 0
GPIO sarake 1
GPIO sarake 2
GPIO sarake 3
GPIO rivi 0
GPIO rivi 1
GPIO rivi 2
GPIO rivi 3

Esimerkkiohjelma, joka tulostaa näytölle 4×4-kokoisen näppäimistön tilan (testattu Raspberry Pi 2:lla, Raspbian-käyttöjärjestelmällä ja Python 3:lla):

"""Print status of matrix keypad attached to Raspberry Pi."""

import RPi.GPIO as IO
OUTP = [3, 5, 7, 8]  # GPIO output pins to keypad columns
INP = [10, 11, 12, 13]  # GPIO input pins from keypad rows

IO.setmode(IO.BOARD)  # use Raspi board numbers
IO.setup(INP, IO.IN, pull_up_down = IO.PUD_UP) # use pull-ups for inputs

buttons = []
for column in OUTP:
    IO.setup(OUTP, IO.IN)  # deactivate all columns
    IO.setup(column, IO.OUT, initial = IO.LOW)  # set one column low
    for row in INP:
        buttons.append(IO.input(row) ^ 1)  # read from active column, invert
print(buttons)  # 1 = pressed, 0 = not

IO.cleanup()  # restore defaults

NAND-portteja käyttäen

Tälle kytkennälle riittää seitsemän GPIO-pinniä. Se ei kuitenkaan pysty lukemaan mielivaltaista määrää yhtä aikaa painettuja näppäimiä – se sekoilee, jos saman sarakkeen 2.–4. rivin näppäimistä painetaan useampaa kuin yhtä.

Näppäimistön ensimmäinen rivi luetaan suoraan omalla GPIO-pinnillään, kuten edellisessä kytkennässä. Sen sijaan muiden kolmen rivin signaalit koodataan kahdeksi kahdella kaksiottoisella NAND-portilla. Sellaisia löytyy 7400-piiristä neljä kappaletta. 7400:lle tarvitaan myös ylösvetovastukset (3×10 kΩ).

kytkennät Raspberry Pi:n ja näppäimistön välillä
Raspberry Pi suunta näppäimistö
GPIO sarake 0
GPIO sarake 1
GPIO sarake 2
GPIO sarake 3
GPIO rivi 0
kytkennät näppäimistön ja 7400:n välillä
näppäimistö suunta 7400
rivi 1 1. NAND-portin 1. sisääntulo (pinni 1)
rivi 2 1. NAND-portin 2. sisääntulo (pinni 2)
2. NAND-portin 1. sisääntulo (pinni 4)
rivi 3 2. NAND-portin 2. sisääntulo (pinni 5)
maan, käyttö­jännitteen ja ylösveto­vastusten kytkennät Raspberry Pi:n ja 7400:n välillä
Raspberry Pi vastus 7400
maa (ei) maa (pinni 7)
5 V (ei) käyttöjännite (pinni 14)
10 kΩ 1. NAND-portin 1. sisääntulo (pinni 1)
10 kΩ 1. NAND-portin 2. sisääntulo (pinni 2)
2. NAND-portin 1. sisääntulo (pinni 4)
10 kΩ 2. NAND-portin 2. sisääntulo (pinni 5)
muut kytkennät 7400:n ja Raspberry Pi:n välillä
7400 suunta Raspberry Pi
1. NAND-portin ulostulo (pinni 3) GPIO
2. NAND-portin ulostulo (pinni 6) GPIO

Esimerkkiohjelma, joka tulostaa näytölle 4×4-kokoisen näppäimistön tilan (testattu Raspberry Pi 2:lla, Raspbian-käyttöjärjestelmällä ja Python 3:lla):

"""Print status of matrix keypad attached to Raspberry Pi. Uses 7 pins and a
7400. Doesn't support multiple keypresses among last 3 rows of same column."""

import RPi.GPIO as IO

COLOUT = [3, 5, 7, 8]  # GPIO output pins to keypad columns
ROW0IN = 10  # GPIO input pin from keypad row 0
NAND12IN = 11  # GPIO input pin from (row1 NAND row2)
NAND23IN = 12  # GPIO input pin from (row2 NAND row3)

IO.setmode(IO.BOARD)  # use Raspi board numbers
IO.setup(ROW0IN, IO.IN, pull_up_down = IO.PUD_UP)
IO.setup(NAND12IN, IO.IN)
IO.setup(NAND23IN, IO.IN)

def read_column():
    nand12 = IO.input(NAND12IN)
    nand23 = IO.input(NAND23IN)
    return (
        IO.input(ROW0IN) ^ 1,  # row 0
        nand12 & (nand23 ^ 1),  # row 1
        nand12 & nand23,  # row 2
        (nand12 ^ 1) & nand23,  # row 3
    )

buttons = []
for column in COLOUT:
    IO.setup(COLOUT, IO.IN)  # deactivate all columns
    IO.setup(column, IO.OUT, initial = IO.LOW)  # set one column low
    buttons.extend(read_column())

print(buttons)  # 1 = pressed, 0 = not

IO.cleanup()  # restore defaults

siirtorekisteriä käyttäen

Tämä kytkentä pystyy lukemaan mielivaltaisen määrän yhtä aikaa painettuja näppäimiä seitsemällä GPIO-pinnillä. Apuna käytetään 7495-piiriä (4-bittinen siirtorekisteri rinnakkaislatauksella).

kytkennät Raspberry Pi:n ja näppäimistön välillä
Raspberry Pi suunta näppäimistö
GPIO sarake 0
GPIO sarake 1
GPIO sarake 2
GPIO sarake 3
kytkennät näppäimistön ja 7495:n välillä
näppäimistö suunta 7495
rivi 0 rinnakkaislataus P0 (pinni 2)
rivi 1 rinnakkaislataus P1 (pinni 3)
rivi 2 rinnakkaislataus P2 (pinni 4)
rivi 3 rinnakkaislataus P3 (pinni 5)
kytkennät Raspberry Pi:n ja 7495:n välillä
Raspberry Pi suunta 7495
maa maa (pinni 7)
5 V käyttöjännite (pinni 14)
GPIO valinta rinnakkaislataus- ja bittien vieritys -tilojen välillä (pinni 6)
GPIO kellosignaalit (pinnit 8 ja 9)
GPIO eniten merkitsevä ulostulobitti (Q3, pinni 10)

Esimerkkiohjelma, joka tulostaa näytölle 4×4-kokoisen näppäimistön tilan (testattu Raspberry Pi 2:lla, Raspbian-käyttöjärjestelmällä ja Python 3:lla):

"""Print status of matrix keypad attached to Raspberry Pi. Uses 7 pins and a
7495. Connect keypad rows to 7495 P0...P3 (2...5)."""

import RPi.GPIO as IO

COLOUT = [3, 5, 7, 8]  # GPIO output pins to keypad columns
MODEOUT = 10  # GPIO output pin to 7495 MODE pin (6)
CLKOUT = 11  # GPIO output pin to 7495 CLK pins (8&9)
DATAIN = 12  # GPIO input pin from 7495 Q3 pin (10)

def clock():
    IO.output(CLKOUT, IO.HIGH)  # send falling...
    IO.output(CLKOUT, IO.LOW)  # ...edge to CLK pins

IO.setmode(IO.BOARD)  # use Raspi board numbers
IO.setup(MODEOUT, IO.OUT)
IO.setup(CLKOUT, IO.OUT)
IO.setup(DATAIN, IO.IN)

buttons = []
for column in COLOUT:
    IO.setup(COLOUT, IO.IN)  # deactivate all columns
    IO.setup(column, IO.OUT, initial = IO.LOW)  # set one column low
    IO.output(MODEOUT, IO.HIGH)  # parallel load mode
    clock()
    IO.output(MODEOUT, IO.LOW)  # shift mode

    for row in range(4):  # read rows from last to first
        buttons.append(IO.input(DATAIN) ^ 1)
        clock()

print(buttons)  # 1 = pressed, 0 = not

IO.cleanup()  # restore defaults