Bouw je eigen Sommentelefoon met een Raspberry Pi

In dit artikel beschrijven we hoe je een telefoon met draaischijf ‘hackt’ en aansluit op een Raspberry Pi. In ons geval zetten we hem in als ludieke manier om tafelsommen te oefenen. Oftewel: zo bouw je je eigen sommentelefoon.

Het oorspronkelijke idee om een T65 in combinatie met een Raspberry Pi te gebruiken voor een leuk en leerzaam project komt van Tammo Jan Dijkema (@tammojan), bij wie we via Twitter de Sommentelefoon ontdekten. Op de bijbehorende Github-pagina schrijft hij: “De telefoon geeft (door de hoorn) een sommetje, en je moet het antwoord geven door het te draaien met de draaischijf. De telefoon zegt ‘goed’ of ‘fout’, en geeft de volgende som.”

Ons plan is om de Raspberry Pi in de telefoon in te bouwen, een kind (zoals het zoontje van de auteur) alle audio te laten inspreken en uiteindelijk de functionaliteit te programmeren die je in het volgende kader kunt lezen.

Dit project is voor kinderen een leuke manier om te leren rekenen, vooral wanneer ze van hun eigen stem een complimentje te horen krijgen. Daarnaast is het voor de maker ook erg interessant en leerzaam om de techniek van zo’n oud apparaat nader te bekijken.

Benodigdheden

- T65-telefoon met kiesschijf en aardtoets - € 7,50 tot een paar tientjes

Deze is via Marktplaats nog makkelijk te krijgen; zoek op ‘T65 telefoon’. De prijs is afhankelijk van de kleur; standaard beige is meestal goedkoper;

- Raspberry Pi 3 inclusief voeding (€ 50,– via webshops als Hubbit.nl, Floris.cc, Kiwi-electronics.nl of Conrad.nl);

- Jumperkabels, female/female of female/male (€ 5,– via dezelfde elektronica webshops);

- Audiokabel met 3,5 mm stereo-jackplug (€ 2,– via bijvoorbeeld onlinekabelshop.nl of kabeldirect.nl). Je kunt ook de kabel van een setje oordopjes of hoofdtelefoon die je niet meer gebruikt doormidden knippen.

Totale kosten ca. € 65,–

Openschroeven

Het principe van het aansluiten van het telefoontoestel op de Raspberry Pi is simpel: door de telefoon te bedienen via de draaischijf, de aardknop en de knoppen waar de hoorn op ligt, worden er in de binnenkant contacten geopend en gesloten.

Door met een multimeter uit te zoeken welke contacten dit zijn en deze vervolgens met de juiste gpio-pinnen van de Raspberry Pi te verbinden, kunnen we de Pi laten reageren op het indrukken van de knoppen en het draaien van de draaischijf. Daarvoor schrijven we een programma in de programmeertaal Python.

We beginnen met het openen van de telefoon. Aan de onderkant zitten drie schroeven. Met de achterste schroef open je het klepje dat toegang geeft tot de aansluitkamer. Hierin vind je 12 contactpunten, waarvan twee viertallen een overzichtelijke kleurcode hebben gekregen. Contactpunten 1 tot en met 4 zijn bedoeld voor de kabels naar de stekker voor de wandcontactdoos, maar aangezien we die niet meer nodig hebben, kun je deze losmaken. De kabels aan de punten 9 t/m 12 die met de luidspreker en microfoon in de hoorn verbonden zijn, laten we gewoon zitten, want die gebruiken we natuurlijk wel.

Door de twee voorste schroeven los te draaien, maken we de behuizing los van de grondplaat. Je merkt aan het losdraaien van de schroefjes dat er is nagedacht over de degelijkheid van dit apparaat: de schroefjes kunnen namelijk niet uit de gaten vallen, waardoor je ze ook niet kwijt kunt raken. Wanneer alle schroeven los zijn, kun je de telefoon weer rechtop zetten en de behuizing van het toestel tillen.

sommentelefoon

© PXimport

De draaischijf

Misschien heb je je ook altijd al afgevraagd hoe de draaibeweging van de schijf wordt omgezet in de pulsen die het signaal vormen van het getal dat wordt gekozen. Wanneer je de draaischijf los klikt van de drie pootjes waar hij op rust en de transparante onderkant goed bekijkt, wordt de werking van dit vernuftig stukje techniek al snel duidelijk.

Door een nummer te kiezen en aan de schijf te draaien, draait een kleinere schijf met inkepingen mee. Wanneer deze terug draait, zorgen deze inkepingen ervoor dat twee kogeltjes herhaaldelijk tegen twee contactpunten gedrukt worden. Hoe hoger het nummer, hoe vaker er contact wordt gemaakt. Elk contactmoment is een ‘puls’.

Door het aantal pulsen door de Raspberry Pi te laten tellen, weten we dus welk nummer er is gekozen. De schijf met inkepingen is zo ontworpen, dat de kogels alleen contact maken tijdens het terugdraaien van de schijf, zodat de tijd tussen twee pulsen altijd even groot is. Hiervan kunnen we in de software handig gebruik maken.

Uit de draaischijf komen drie kabels: blauw, geel en rood. Deze zijn met respectievelijk de contactpunten Bl, Gl en Rd verbonden. De vraag is nu: welke kabels ‘detecteren’ dat het kogeltje tegen een contactpunt drukt? Om daar achter te komen, gebruiken we een multimeter, waarmee we telkens de weerstand tussen alle zes mogelijke combinaties van twee kabels meten. Met de multimeter ontdekken we dat het om de rode en blauwe kabel gaat: wanneer de kogel de contactpunten raakt, meten we geen weerstand; wanneer de kogel de contacten niet raakt, is die er wel.

Voor mensen met ervaring in het lezen van elektronische schema’s is het ook interessant om het oorspronkelijke schema van de PTT te bekijken op het blog van Dutchtelecom.

sommentelefoon

© PXimport

Het haakcontact

Door weer met de multimeter op onderzoek uit te gaan, ontdek je dat het indrukken van het haakcontact via aansluiting 1 en 3 in de aansluitkamer kan worden gedetecteerd. Hier zorgt het indrukken van de knop juist voor een open stroomkring en het opnemen van de hoorn voor een gesloten kring.

Echter: het haakcontact en de contacten in de draaischijf zijn met elkaar verbonden. Wanneer je veel gevoel voor timing hebt, is het zelfs mogelijk om een telefoonnummer te ‘draaien’ door snel achter elkaar knoppen van de haak in te drukken. Voor het programmeren met de Raspberry Pi is dit een nadeel, want hoe detecteer je of de hoorn wordt opgepakt of dat er aan de schijf wordt gedraaid? De oplossing is dat je rode en blauwe draad van de draaischijf loskoppelt van de bodemplaat en direct met de Raspberry Pi verbindt. De gele draad van de draaischijf verbind je vervolgens met het Rd- en Bl-contact op de bodemplaat. Hiervoor moet je een extra stukje draad gebruiken.

sommentelefoon

© PXimport

De aardknop

Het is handig dat de telefoon over een aardknop beschikt, want zo kun je nog andere leuke functies toevoegen. Oorspronkelijk werd deze knop gebruikt bij een huistelefooncentrale. Je kon er gesprekken mee in de wacht zetten en doorverbinden. Wij gebruiken hem om alle tien de tafels door elkaar te oefenen en daarnaast om een som nog eens te herhalen, voor het geval je deze niet goed hebt verstaan. Met de multimeter zien we dat ook hier het indrukken van de knop de stroomkring onderbreekt.

sommentelefoon

© PXimport

De luidspreker

De luidspreker is verbonden met de aansluitingen 11 en 12 in de aansluitkamer. Knip een stereo-audiokabel open. Je vindt daarin drie draden: meestal rood en wit voor het rechter- en linker-geluidskanaal en een kabel zonder mantel voor aansluiting op de aarde. De 3,5mm-jackplug komt uiteindelijk in de analoge audio uitgang van de Raspberry Pi te zitten, maar om de luidspreker te testen is het ook leuk om deze eens met een audio uitgang van een andere computer te verbinden.

sommentelefoon

© PXimport

Op de volgende pagina gaan we verder met het programmeren van de telefoon.

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

© PXimport

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

© PXimport

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

© PXimport

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

© PXimport

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

Om de Pi in de behuizing van de telefoon te krijgen, moeten een aantal onderdelen helaas het veld ruimen, anders past het niet. De bellen, inclusief de spoel, het volumewieltje en de koperkleurige grondplaat waarop deze bevestigd zijn, worden uit de T65 verwijderd. Ook de twee metalen strips die in de printplaat op de bodem vast zitten, worden doorgeknipt. De voedingskabel van de Raspberry Pi leiden we naar buiten door het gat waar voorheen het volumewieltje zat.

Er is helaas geen doorgang van de aansluitkamer naar de grote ruimte waar de rest van de elektronica zit. Wanneer je de Raspberry Pi wilt inbouwen, moeten de vijf kabels van de draaischijf, aardknop en haakcontact dus niet meer in de aansluitkamer worden vastgemaakt, maar aan dezelfde schroeven in de binnenkant van de telefoon. Hiervoor moet je wel eerst de doorzichtige kap boven op het haakcontact losmaken. Dit gaat eenvoudig met de twee schroeven aan weerszijden van de kap.

De drie jumperkabeltjes die met aansluiting 1, 2 en 3 van de aardknop en het hoorncontact zijn verbonden, kunnen via een opening rechts onder aan de doorzichtige kap richting Raspberry Pi worden geleid. Aan de linkerkant, bij de audiokabel, is er jammer genoeg geen opening; daar zit de kap helemaal tegen de grondplaat. Omdat de audiokabel wat dikker is, is het weer aandraaien van de schroef een beetje tricky, maar uiteindelijk lukt het wel.

sommentelefoon

© PXimport

Verder is het nog even opletten hoe je de audio- en voedingskabel naar de Raspberry Pi toe leidt. Het gemakkelijkste is om deze om te leiden via het middelste opstaande pootje waar de draaischijf op rust. Gebruik ook nog wat tape om de kabeltjes op sommige plaatsen op hun plek te houden. Het is ook verstandig om de metalen delen waar de Raspberry Pi op ligt met tape af te plakken, om ongewenst contact tussen de Raspberry Pi en de telefoon te voorkomen.

Voor het geval je programmeren te lastig vindt of, net als wij, je van mening bent dat er niets leukers te bedenken is dan de PTT-tafeltelefoon, gebruik je gewoon het kant-en-klare script dat hier te vinden is. En anders kun je bovenstaande scripts naar eigen inzicht combineren voor het programmeren van een verbeterde versie. Of misschien gaat er wel een belletje rinkelen en bedenk je juist een verrassende andere toepassing. We zijn erg benieuwd naar originele ideeën waarmee de lezers van PCM aan de slag gaan!

Deel dit artikel
Voeg toe aan favorieten