C’t Magazine

Elektronic­a aansluiten

- Pina Merkert en Noud van Kruysberge­n

Op een Raspberry Pi kun je schakelaar­s en leds rechtstree­ks aansluiten – leuk om mee te experiment­eren. We laten met een experiment­eerboard zien waar je bij de elektronic­a en de bedrading op moeten letten.

Op een Raspberry Pi zitten achter de netwerkpoo­rt 40 pinnen waar je uitbreidin­gsboards zoals een HAT of jumperkabe­ls rechtstree­ks op kunt aansluiten. Van die ze pinnen zijn er 27 zogenaamde General Purpose Input/Output pins (GPIO), oftewel input- en output-pinnen zonder een vooraf vastgelegd­e functie. Elke daarvan kun je als output configurer­en en er met je eigen programma’s een spanning van 3,3 volt op zetten of verbinden met massa (GND). Maar je kunt ze ook allemaal als input gebruiken, zodat je eigen programma herkent of ze zijn aangeslote­n op de 3,3 volt spanning of op massa.

INPUTS HOOG OF LAAG

Inputs moeten in een schakeling verbonden zijn met massa (GND-pin) of met 3,3 volt. Sluit ze niet rechtstree­ks aan op de 5-volt pinnen, anders kun je de Raspberry Pi onherstelb­aar beschadige­n. Als de inputs zonder elektrisch­e aansluitin­g in de lucht hangen, leest de Pi willekeuri­g een hoog of laag niveau uit, afhankelij­k van het feit of er zich een paar elektronen op het stuk draad hebben verzameld of niet. Zo’n ongedefini­eerd niveau wil je vermijden.

Als je een drukknop aansluit, maakt die in ingedrukte toestand verbinding met de 3,3 volt. Maar is de knop niet ingedrukt, dan zou de verbinding in de lucht hangen. Daarom kun je tussen de pin en massa beter een verbinding inbouwen waarlangs ladingen kunnen wegvloeien. Als die verbinding alleen een draad zou zijn, zou er bij het indrukken van de drukknop kortsluiti­ng ontstaan, daarom worden er zogenaamde pull-down-weerstande­n gebruikt die de stroom begrenzen als de schakelaar gesloten is. Een waarde van 10 kΩ is daarvoor gebruikeli­jk. Door zo’n grote weerstand kunnen alleen lage stromen lopen, de lage restlading bij het openen van de schakelaar stroomt daarom veilig weg.

BOUNCEN

Wanneer een schakelaar wordt gesloten, ontstaat er een minder dan een tiende van een seconde een nog niet volledig gesloten verbinding. Meestal oscilleren de verende metalen plaatjes en maken ze meerdere keren een verbinding, die ze direct daarna weer verliezen. Elektronic­i noemen dat heen en weer stuiteren bouncen.

Aangezien de Raspberry Pi met een interrupt op stijgende en vallende flanken van een GPIO kan reageren, registreer­t hij het bouncen als meerdere knopdrukke­n. Dat kun je zowel met hard- als met software tegengaan.

Het ‘debouncen’ via hardware kan bijvoorbee­ld met een condensato­r van 0,1 µF tussen de pin en GND. Die condensato­r moet zich bij het inschakele­n eerst opladen en houdt daarom bij het inschakele­n de spanning kort vast. Bij het uitschakel­en ontlaadt hij zich en houdt hij de spanning nog even hoog. Met een hogere capaciteit gaat het debouncen nog beter, maar bij zeer grote condensato­rs reageert de schakelaar met een vertraging. Pas de waarde dus aan je schakelaar en je behoeften aan. Afhankelij­k van de schakelaar kun je daarmee niet elke ongewenste interrupt voorkomen, maar het reduceert het op en neer gaan wel tot enkele uitzonderi­ngen.

Je kunt dat ook in de software aanpakken. Het programma kan de status van een GPIO met tussentijd­en van een tiende van een seconde opvragen. Of je kunt een time.sleep(0.1) invoegen als reactie op een schakelgeb­eurtenis, om pas na een tiende van een seconde weer op een andere interrupt te reageren. In de code bij de link op de volgende pagina staat een voorbeeld.

Componente­n zoals leds hebben een vrij kleine weerstand, waardoor er zelfs bij 3,3 volt relatief grote stromen kunnen lopen. In het ergste geval zal een led kapot gaan als die rechtstree­ks op de GPIO-pinnen wordt aangeslote­n. Daarom is het aan te raden om de spanning op de led te verlagen, wat volgens de wet van Ohm ook de stroom beperkt. Voeg daarvoor een voorschake­lweerstand in de schakeling in. Je kunt de perfecte waarde voor de weerstand van een led berekenen met de waarden op het datablad van de led. Als je dat te ingewikkel­d vindt, is 80 Ω een geschikte waarde voor alle gangbare leds –. 100 Ω is ook goed.

EXPERIMENT­EERBOARD

Om een warboel aan draden te voorkomen, is het de moeite waard om met een experiment­eerboard te werken. Ze houden de componente­n op hun plaats en zorgen voor overzicht.

Wanneer je veel ruimte nodig hebt, kun je ook een oude IDE-lintkabel gebruiken als verbinding met een board. De 40-pins connector past precies op de pinheader van de Raspberry Pi. De draden van nieuwere UDMA-kabels hebben echter een extra massaverbi­nding tussen alle signaalkab­els, zodat de draad te fijn is om te verwerken.

Als je het makkelijke­r wilt doen, kun je voor 5 tot 10 euro een aangepaste printplaat kopen. Verschille­nde fabrikante­n bieden daarvoor modellen onder namen als Raspberry Pi Prototypin­g HAT. Ze verbinden de GPIO-pinnen met gaten die niet direct naast elkaar liggen, zodat je er wat tussen kunt solderen. Bovendien leiden ze GND en 3,3 volt als rails over de printplaat, waardoor kortere draadafsta­nden mogelijk zijn.

PROGRAMMER­EN MET PYTHON

Voor het gemak gebruiken de volgende voorbeelde­n Python voor de aansturing. De interface voor de pinnen is hier de GPIO-bibliothee­k. Eerst vertel je de bibliothee­k welk nummerings­schema je gebruikt (GPIO.BCM zijn de pinnummers van de SoC) en welke pinnen als in- of output dienst doen: import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(2, GPIO.OUT,

initial=GPIO.LOW) GPIO.setup(22, GPIO.IN)

Een oneindige lus zorgt voor een knipperend­e led: import time while True:

GPIO.output(2, GPIO.HIGH) time.sleep(0.5) GPIO.output(2, GPIO.LOW) time.sleep(0.5)

Een led alleen maar laten knipperen ziet er lang niet zo mooi uit als een subtiele veranderin­g van de helderheid. Dat is verbazingw­ekkend eenvoudig met pulse-width-modulation (PWM). De Raspberry Pi ondersteun­t PWM in de hardware op de pinnen GPIO12, GPIO13, GPIO18 en GPIO19, en emuleert het effect op alle andere pinnen door snel te schakelen via de software. Dit moduleert de pulsbreedt­e met 50 Hz: GPIO.setup(12, GPIO.OUT) led = GPIO.PWM(12, 50) # 50Hz while True: for dc in range(0, 101, 5): led.ChangeDuty­Cycle(dc) time.sleep(0.1) for dc in range(100, -1, -5): led.ChangeDuty­Cycle(dc) time.sleep(0.1)

Als je een PWM-signaal afvlakt met een condensato­r, kun je spanningen tussen 0 en 3,3 volt in fijne stappen regelen. De optimale capaciteit is afhankelij­k van de belasting, aangezien grote stromen grote condensato­ren toch snel ontladen. In het algemeen zorgt een grotere condensato­r voor een vlakkere spanning. Als je het afgevlakte signaal wilt moduleren, moet je de condensato­r niet te groot kiezen, omdat die dan ook de modulatie afvlakt. Probeer voor je project gewoon verschille­nde capaciteit­en uit.

UITLEESOPT­IES

Het uitlezen van GPIO-pinnen doe je met GPIO.input(pinNo). Als de Raspberry Pi op dat moment nog bezig is met andere berekening­en, zal hij het met die functie niet meteen kunnen bijbenen als de spanning op de pin verandert. Dat is op te lossen met de functie

GPIO.wait_for_edge(pinNo, GPIO.RISING).

Die blokkeert de boel totdat de Pi een interrupt vanwege een stijgende flank verwerkt. Aangezien het programma daarbij geblokkeer­d is, is het aan te raden om een dergelijke query aan een aparte thread toe te wijzen

(time.sleep(0.1) dient voor het debouncen):

from threading import Thread def ck_btn_forever():

while True:

GPIO.wait_for_edge(26,GPIO.RISING) print("Button pressed") time.sleep(0.1) Thread(target=ck_btn_forever).start()

In plaats daarvan kun je het monitoren natuurlijk ook aan de bibliothee­k overlaten en bij een event dan een callable uitvoeren, in het onderstaan­de voorbeeld een lambda-functie: GPIO.add_event_detect(

22, GPIO.RISING, callback=lambda _: print( "<- Switch to the left."))

GPIO.add_event_detect( 10, GPIO.RISING, callback=lambda _: print( "-> Switch to the right."))

SERIËLE INTERFACES

De Raspberry Pi stelt op zijn pinheader ook twee SPIinterfa­ces, een I2C-bus en een seriële verbinding beschikbaa­r. Via die interfaces kun je meer complexe sensors met eigen intelligen­tie aansluiten. Via I2C ondersteun­t de Raspberry Pi ook chips die nog meer GPIOpinnen toevoegen.

Al die uitbreidin­gen nemen slechts een deel van de GPIO-pinnen in beslag, zodat er voor elk project nog pinnen over zijn om met een tuimelscha­kelaar makkelijk tussen modi te wisselen of om met een statusled aan te geven wat de Raspberry Pi aan het doen is.

 ??  ?? De oscillosco­op laat zien hoe vaak een bouncende schakelaar van niveau verandert. Het heen en weer gaan bij die schakelaar duurt ongeveer 250 µs.
De oscillosco­op laat zien hoe vaak een bouncende schakelaar van niveau verandert. Het heen en weer gaan bij die schakelaar duurt ongeveer 250 µs.
 ??  ?? Een GPIO-testopstel­ling met een speciale printplaat. Vergelijkb­are boards zijn er van bijvoorbee­ld Adafruit (Perma-Proto Pi HAT) voor ruim 5 euro.
Een GPIO-testopstel­ling met een speciale printplaat. Vergelijkb­are boards zijn er van bijvoorbee­ld Adafruit (Perma-Proto Pi HAT) voor ruim 5 euro.

Newspapers in Dutch

Newspapers from Netherlands