De vuurwerkbom

Door Gtoniser op dinsdag 04 december 2012 14:18 - Reacties (16)
Categorie: Raspberri Pi, Views: 4.465

Rond sinterklaas is het altijd weer tijd voor sinterklaas surprises. Het idee kwam me dit jaar eigenlijk een beetje aanwaaien: mijn broertje vroeg namelijk een vuurwerkbon als kado.
Door expres de laatste letter verkeerd te lezen was mijn idee van een surprise al ontstaan.
Het uiteindelijke doel: een soort van 'countdown' tijdbom (uiteraard nep) die onschadelijk te maken is met behulp van een code/wachtwoord.

Ik wilde eigenlijk al een tijdje iets meer met mijn Raspberry Pi gaan doen dan alleen maar XBMC draaien, en iets met de GPIO poorten knutselen leek me ook wel wat hebben.

De onderdelen

Na wat rondgezocht te hebben ging ik met de volgende onderdelen van start:
- Raspberry Pi
- RPi Starter Kit van SK Pang met LEDs, weerstanden en wat jumper wires
- Extra jumper wires
- Adafruit 'Cobbler' om de pins makkelijk op het breadboard aan te sluiten
- Het display

Later kwamen hier nog bij:
- Transistors
- Platte kabels
- Printplaat voor solderen

Van start: Het display

Het display van de klok is een redelijk standaard uitziend segmenten display. Door het typenummer op de achterkant was het schema ervan snel gevonden via Google.
Toen begon de pret. Als je het schema een beetje uitgebreid bekijkt, zie je dat er zo'n 15 ingangen zijn voor de verschillende segmenten, en 2 uitgangen.
Iedere ingang (anode) geeft stroom aan 2 LEDs, deze 2 LEDs hebben beiden een verschillende uitgang (kathode). Omdat je niet bij ieder cijfer altijd 2 LEDs aan moet hebben, zul je dus moeten schakelen tussen de 2 kathodes (op pin 29 en 26)

Het schema

Mijn kennis van circuits was nogal beperkt tot hetgene wat op de middelbare school is geleerd bij natuurkunde, wat ondertussen al weer een aantal jaar geleden is. Ik moest dus ergens wat informatie vinden over waarom je bijvoorbeeld een weerstand in serie met een LED moet zetten. Een zeer informatieve site vond ik hier (is geschreven voor Arduino, maar het idee is hetzelfde), met uitleg over wet van Ohm, Kirchhoff's Voltage Law, LEDs en weerstanden.

Voor het schakelen van de segmenten zelf kwam ik uit bij transistors (tutorial) voor de kathodes, en de anodes gewoon op de 3.3v GPIO outputs van de RPi. Ik had hier ook kunnen kiezen om de anodes op de 5V ingang van de RPi te zetten en ze aan/uit te doen met transistors, maar dan had ik zo'n 15 extra transistors nodig gehad en 15 extra weerstanden.

Het schema van deze opstelling:
http://static.trabot.net/external/tweakers/rpi-countdown.png
T1 en T2 zijn de transistors die worden gebruikt om de kathodes te schakelen en zo te kiezen welke segmenten er aan staan. De anodes zijn aangesloten op de RPi GPIO poorten.

Uitvoering

De eerste opzet:
http://static.trabot.net/external/tweakers/rpi-countdown_01_thumb.png(klik)

De eerste opzet had de weerstanden nog allemaal aan de kathode kant (dus achter de LEDs ipv voor de LEDs zoals in het schema). Dit had echter als nadeel dat als je 1 van de 2 segmenten uitzette, de andere niet helderder werd. Met wat gereken kwam ik erachter dat dit kwam doordat de LEDs parallel stonden en de weerstand in serie daarachter, waardoor de weerstand niet schaalde met het aantal LEDs.

De tweede opzet was dus om aan de anode kant van de LEDs de weerstanden te doen. Omdat mijn breadboard hier wat te klein voor was, besloot ik om toch maar te gaan solderen. Het resultaat:
http://static.trabot.net/external/tweakers/rpi-countdown_02_thumb.png(klik)
Tevens heb ik er toen direct maar 2 rode en groene LEDs bijgedaan om feedback te kunnen geven over goede en foute antwoorden (deze staan niet in het schema maar hebben een zelfde simpele uitwerking als in de RPi + LED tutorial hierboven).

De software

Om het geheel aan te sturen heb ik gebruik gemaakt van de standaard Python GPIO library voor de RPi.
Het meeste werk zat hem in het linken van de juiste segmenten met de juiste poorten. Hiervoor heb ik gebruik gemaakt van een "pinmap", die de display pins (uit het schema van het display) vertaalt naar GPIO poort nummers van de Pi.
Vervolgens heb ik voor iedere digit een map gemaakt welk nummer welke segmenten nodig heeft. Dit bestaat uit een tuple met 2 sets, 1 set voor de pins die "hoog" moeten zijn als transistor T1 open staat en 1 set voor transistor T2.
Wegens een gebrek aan aansluitingen heb ik het meest linkse digit overgeslagen (vandaar dat alleen digits 2, 3 en 4 voorkomen in de code)
Broncode mapping module (natuurlijk werkt dit alleen met mijn specifieke opstelling)

Om een getal weer te geven, gebruiken we 2 "cycles".
Python:
1
2
3
4
5
def displayOne(d2,d3,d4):
    docycle(d2,d3,d4,0)
    time.sleep(0.015)
    docycle(d2,d3,d4,1)
    time.sleep(0.015)

Er zit dus een 0.015 seconden sleep tussen de 2 display cycles, wat neerkomt op een frequentie van ~66 Hz, waardoor het lijkt dat alle segmenten tegelijk aanstaan.

De functie om daadwerkelijk de output weer te geven
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def docycle(d2,d3,d4,outnum):
    global prevdisplay, nextdisplay
    #Gather all pins we need to turn on next
    nextdisplay = dmap.dig2[d2][outnum] | dmap.dig3[d3][outnum] | dmap.dig4[d4][outnum]
    #Find out which ones are currently on that don't need to be on next
    dooff = prevdisplay - nextdisplay
    #Find out which ones aren't on and should be
    doon = nextdisplay - prevdisplay
    for i in dooff:
        GPIO.output(dmap.pinmap[i],False)
    for i in doon:
        GPIO.output(dmap.pinmap[i],True)
    #Set this with the correct transistor pin on
    if outnum is 1:
        GPIO.output(dmap.pinmap[switchpins[0]],False)
    else:
        GPIO.output(dmap.pinmap[switchpins[1]],False)
    GPIO.output(dmap.pinmap[switchpins[outnum]],True)
    prevdisplay = nextdisplay

(sorry, Tweakblogs heeft blijkbaar geen syntax highlighting voor Python)

Verder maakt de code gebruik van 3 threads:
- De 'countdown' thread om af te tellen naar 0
- De 'display' thread om het huidige getal weer te geven
- De 'main' thread welke wacht op input van de gebruiker (het 'wachtwoord' om de teller te stoppen)

Volledige code (inclusief enkele ongebruikte testfuncties)

Het resultaat

En ja hoor: alles werkt
http://static.trabot.net/external/tweakers/rpi-countdown_03_thumb.png(klik)

Nu nog van die draden troep af, wat gepruts met platte kabels later:
http://static.trabot.net/external/tweakers/rpi-countdown_04_thumb.png(klik)
Achterkant:
http://static.trabot.net/external/tweakers/rpi-countdown_05_thumb.png(klik)

Het script start automatisch op met de Pi, dus stekker erin is voldoende om de teller te laten lopen.

Met een gedicht erbij plus een simpele quiz om het wachtwoord te raden was de surprise compleet.
Het uiteindelijke resultaat (met USB keyboard voor input):
http://static.trabot.net/external/tweakers/rpi-countdown_06_thumb.png(klik)

Ik vond het een leuk hobby projectje, mijn broertje vond het een leuke surprise, missie geslaagd lijkt me zo :)

Volgende: Unbricking your router with a Raspberry Pi 02-'13 Unbricking your router with a Raspberry Pi
Volgende: Joomla op IIS 10-'12 Joomla op IIS

Reacties


Door Tweakers user MittaM, dinsdag 04 december 2012 14:28

Nice. Altijd leuk als de suprises daadwerkelijk creatief bedacht/ontwikkeld zijn.

Door Tweakers user chimera2, dinsdag 04 december 2012 14:31

Mooi project Dirk.

Door Tweakers user masauri, dinsdag 04 december 2012 14:34

Geweldig cadeau!
Waren er maar meer creatieve mensen zoals jij.
Helaas zal je nu wel op de watchlist komen voor het maken van een "bom" :-p
Google hits ftw? :+

Door Tweakers user Dj-sannieboy, dinsdag 04 december 2012 14:39

Zeer leuk project Dirk! Wel echt een hele vette surprise om te krijgen zeg :D


Door Tweakers user onok, dinsdag 04 december 2012 14:56

Haha wat geniaal! Nog nooit zo'n vette surprise gezien :P

Door Tweakers user kipusoep, dinsdag 04 december 2012 15:08

Erg gaaf bedacht en gemaakt! :)

Door Tweakers user sypie, dinsdag 04 december 2012 17:07

Dus... Binnenkort nog meer van deze dingen op allerlei stations. Allemaal van handige harries die weten met een RPi om te gaan en wat in elkaar kunnen zetten. De opbrengsten van een YouTube filmpje waarin je dit opneemt zullen vast hoger zijn dan de kosten van een RPi en wat klein spul er bij.

Totdat er wl iemand op het idee komt om er een explosief goedje aan te hangen.

Door Tweakers user Patriot, dinsdag 04 december 2012 18:39

sypie schreef op dinsdag 04 december 2012 @ 17:07:
Dus... Binnenkort nog meer van deze dingen op allerlei stations. Allemaal van handige harries die weten met een RPi om te gaan en wat in elkaar kunnen zetten. De opbrengsten van een YouTube filmpje waarin je dit opneemt zullen vast hoger zijn dan de kosten van een RPi en wat klein spul er bij.

Totdat er wl iemand op het idee komt om er een explosief goedje aan te hangen.
Zucht. Gewoon, zucht.

Door Tweakers user Battle Bunny, dinsdag 04 december 2012 20:18

Geweldig! Strak stukje werk, ook erg knap dat je alles zelf uitgezocht hebt en zo ver bent gegaan voor een surprise.

Nu maar hopen dat je niet een WC-Rol met Sinterklaas papier terug krijgt :P

Door Tweakers user chime, woensdag 05 december 2012 08:31

sypie schreef op dinsdag 04 december 2012 @ 17:07:
Dus... Binnenkort nog meer van deze dingen op allerlei stations. Allemaal van handige harries die weten met een RPi om te gaan en wat in elkaar kunnen zetten. De opbrengsten van een YouTube filmpje waarin je dit opneemt zullen vast hoger zijn dan de kosten van een RPi en wat klein spul er bij.

Totdat er wl iemand op het idee komt om er een explosief goedje aan te hangen.
Dat gaat wel vrij snel ophouden ... de eerste betaalt gewoon de rekening voor de hulpdiensten en de rest zal wel zo slim zijn om het dan niet meer te doen.

En voor degene die het echt wil doen ... die zou het ook wel doen zonder deze blogpost.

Met andere woorden ... bekijk het allemaal es niet zo zwartgallig.

't Is een leuke verrassing ... had de TS het op een publieke plaats gedaan dan was het gewoon heel stom/idioot geweest.

Door Tweakers user -RetroX-, woensdag 05 december 2012 09:53

Geniaal project!


Een eierwekker, 2 stukjes draad en een batterij en je hebt je eigen aftellende ontsteker voor minder dan een euro bij de xenos.... alleen in Bond films gebruiken bommenleggers aftelklokjes.

Door Tweakers user qlum, donderdag 06 december 2012 01:09

Well een stuk origineler dan wat ik voor surprise heb gemaakt zeg. Ik heb het moeten doen met een woordpuzzel verdeeld over 32 pakjes elke letter op een chocolade munt.

Door Tweakers user lj_tree, donderdag 06 december 2012 08:41

sypie schreef op dinsdag 04 december 2012 @ 17:07:
Dus... Binnenkort nog meer van deze dingen op allerlei stations. Allemaal van handige harries die weten met een RPi om te gaan en wat in elkaar kunnen zetten. De opbrengsten van een YouTube filmpje waarin je dit opneemt zullen vast hoger zijn dan de kosten van een RPi en wat klein spul er bij.

Totdat er wl iemand op het idee komt om er een explosief goedje aan te hangen.
Dikke vette ZUCHT voor bovenstaande reactie!

Ik vind het een mooie actie! Zelden iemand gezien die zoveel werk steekt in een originele suprise!!!! Goed bezig!

Door Tweakers user sys64738, donderdag 06 december 2012 16:11

Ja dit is leuk. Gewoon simpel idee, lekker knutselen en een mooi eindresultaat. Precies waar de Raspberry eigenlijk voor bedoeld is (tis bijna jammer dat ie t ook zo geweldig goed doet als media center :P ).

Ben zelf ook bezig met een RaspPi projectje. Als het wat wordt, dan post ik zekers een stukje op mijn blog hier.

Door Tweakers user BLN, donderdag 13 december 2012 09:41

Haha, wat een verschil met FOK! Hier wordt het een vette surprise, op FOK! was het gewoon.. en bom. Als iemand dit volgend jaar na doet kan het worden uitgebreid met een display die ook een reactie geeft ofzo, waardoor je een soort puzzel op kan lossen. Dit is eigenlijk veel meer dan een surprise, je kan het in allerlei spellen toepassen.

Reageren is niet meer mogelijk