abonneren

Bouw je eigen Sommentelefoon met een Raspberry Pi

sommentelefoon

Inhoudsopgave

  1. Inleiding
  2. Lees verder op de volgende pagina
  3. Lees verder op de volgende pagina

Tijdens het programmeren laten we de Raspberry Pi eerst nog naast de telefoon staan; dat is voor even gemakkelijker in verband met het aansluiten van kabels. Pas als alles werkt, gaan we hem inbouwen.

Het complete Python-programma voor de tafeltelefoon is te lang om hier volledig te bespreken. We staan alleen stil bij het de code die de aardknop, het haakcontact, de schijf en het geluid regelt. Voor elk van deze vier functies demonstreren we een klein Python-script, dat we toelichten. Het volledige script van de tafeltelefoon, waarin ook de code is opgenomen die het afvragen van de sommen regelt, is te downloaden van Github.

Programmeren

De programmacode die bij de aardknop hoort, is de meest eenvoudige van de drie inputs. Sla het volgende programma op de Raspberry Pi op onder de naam aardknop.py. Open daarna een terminalvenster, navigeer naar de map waar het bestand is opgeslagen en voer het uit met

python aardknop.py

Op regels 1 en 2 worden de gpio- en time-bibliotheken geïmporteerd, zodat we van deze functies in ons Python-script gebruik kunnen maken. Regels 4, 5 en 6 initialiseren gpio-pin 23, waarop we de aardknop op hebben aangesloten, waardoor deze als inputpin werkt.

Het programma telt hoe vaak de aardknop wordt ingedrukt. Deze hoeveelheid wordt bijgehouden door de variabele count. Regels 9 tot en met 14 worden continu herhaald: met de variabele aardContact wordt bijgehouden of de aardknop contact maakt. Deze is False wanneer er contact wordt gemaakt en True wanneer dat niet zo is. Wanneer aardContact de waarde False heeft (zie regel 11), wordt count met 1 opgehoogd, deze nieuwe waarde op het scherm gezet en een kort moment gepauzeerd.

sommentelefoon

Het tellen van het aantal pulsen van de draaischijf is iets ingewikkelder. We weten immers van te voren niet precies hoeveel pulsen we kunnen verwachten.

De variabele waarmee we het aantal pulsen – het gekozen nummer dus – bijhouden, is nPulsen. Met klaar houden we bij of we nog moeten wachten op een eventuele volgende puls, of dat er dusdanig veel tijd verstreken is sinds de laatste puls, dat kan worden geconcludeerd dat de schijf klaar is met draaien. De variabele schijfContact heeft de waarde True wanneer er door het kogeltje in de schijf contact wordt gemaakt (en er dus een puls wordt gedetecteerd) en False wanneer dat niet zo is.

Ten eerste wordt er op de regel 13 en 14 gewacht totdat er aan de schijf wordt gedraaid. Vervolgens worden regels 17 tot en met 25 herhaald zolang er nog pulsen worden gedetecteerd. In dat geval wordt op regel 14 allereerst de waarde van nPulsen met 1 opgehoogd. Daarna starten we met meten van de tijd. Als de schijf nog niet gestopt is met draaien, verwachten we namelijk dat er na ongeveer 1/10 seconde weer een puls binnen komt. Vandaar dat we 0,1 seconde wachten op regel 19 en direct daarna opnieuw bepalen wat de waarde van schijfContact is.

Regels 22 en 23: zolang er nog geen signaal van de schijf is binnenkomt, blijven we de tijd sinds de meest recente puls bepalen. Zodra deze tijd de 0,2 seconden overschrijdt, kunnen we er van uit gaan dat de schijf stil staat en is het totale aantal pulsen bekend. Op dat moment krijgt klaar de waarde True; we willen dan immers stoppen met het herhalen van regels 17 t/m 25.

Omdat bij tien pulsen de 0 op de draaischijf is gekozen, corrigeren we deze waarde op regel 27 en regel 28.

sommentelefoon

Er is een wezenlijk verschil tussen het gebruik van de hoornknoppen en de twee inputs die we zojuist bekeken hebben. De aardknop en de draaischijf worden namelijk gebruikt op voorspelbare momenten in het programma: op vaste tijdstippen waarop we input ervan verwachten. Bij het haakcontact ligt dat anders: de hoorn kan namelijk op elk willekeurig moment worden opgenomen en neergelegd. Het maakt niet uit waar het programma op dat moment dan ook mee bezig is: er moet direct worden gereageerd.

Het is erg onhandig om het script zo te programmeren dat we op elk moment rekening houden met de mogelijkheid dat de hoorn wordt gebruikt. Gelukkig is er een manier om dit op te lossen: interrupts.

Op regel 5 wordt de functie hoornCallback gedefinieerd. De programmacode daarvan (het herstarten van het hele script) moet worden uitgevoerd zodra er een ‘event’ op pin 24 plaatsvindt. Het koppelen van dit event aan de callback-functie vindt plaats op regel 14.

Het script toont allereerst de tekst “Wacht op hoorn…”, waarna het in een oneindige lus terechtkomt. In die lus (regel 17 en 18) gebeurt helemaal niets, maar wordt toch onderbroken wanneer de hoorn van de haak wordt genomen.

sommentelefoon

Om mp3-bestanden af te kunnen spelen met Python, maken we gebruik van de PyGame library. De code hiervan is een stuk eenvoudiger.

Vanaf regel 3 wordt de audiomixer geïnitialiseerd, het mp3-bestand geopend, het geluid afgespeeld en tot slot gewacht totdat het afspelen klaar is.

Voor de PTT-tafeltelefoon zijn er 48 verschillende mp3 bestanden opgenomen. Daarbij horen de 42 verschillende uitkomsten van de tafels van 1 tot 10 en de tekst “welke tafel wil je oefenen?”, “keer”, “is”, “goed zo!”, “dat is fout, het juiste antwoord was” en “dat was de laatste som, goed gedaan!”.

sommentelefoon

Op de volgende pagina bouwen we tot slot de Raspberry Pi in.

Geschreven door: Ralph Crützen op

Category: Workshop, Programmeren

Tags: Raspberry Pi, Programmeren, DIY, python

Laatste Vacatures