Inhoudsopgave Van de installatie van het besturingssysteem tot en met het eerste Python-programma Wat heeft men nodig? 1.1.1 Micro-USB-oplader voor mobiele telefoon 1.1.2 Geheugenkaart 1.1.3 Toetsenbord 1.1.4 Muis 1.1.5 Netwerkkabel 1.1.6 HDMI-kabel 1.1.7 Audiokabel 1.1.8 Gele FBAS-videokabel Raspbian-besturingssysteem installeren 1.2.1 Geheugenkaart in de PC voorbereiden 1.2.2 De software-installer NOOBS...
Pagina 4
LED via pulsduurmodulatie dimmen 6.1.1 Zo werkt het 6.1.2 Twee LED's onafhankelijk van elkaar dimmen 6.1.3 Zo werkt het Ruimteweergave van geheugenkaart met LED's 7.1.1 Zo werkt het Grafische dobbelsteen 8.1.1 Zo werkt het Analoge klok op het beeldscherm 9.1.1 Zo werkt het Grafische dialoogvelden voor de programmabesturing 10.1.1...
1 Van de installatie van het besturingssysteem tot en met het eerste Python-programma Er is amper een elektronisch apparaat in zijn prijsklasse waar de afgelopen maanden zoveel over is gepraat als de Raspberry Pi. Ook wanneer u het op het eerste gezicht niet zou zeggen, is de Raspberry Pi een volwaardige computer ter grootte van ongeveer een kredietkaart - en dat voor een lage prijs.
1.1.1 Micro-USB-oplader voor mobiele telefoon Voor de Raspberry Pi voldoet elke moderne netadapter voor mobiele telefoon. Oudere opladers uit de begintijd van de USB-oplaadtechniek zijn nog te zwak. Als men vermogensverbruikende USB-apparatuur aansluit zoals een harde schijven zonder eigen voeding, is een zwaardere netadapter noodzakelijk. De netadapter moet 5 V en minimaal 700 mA leveren, maar beter nog 1.000 mA.
1.1.7 Audiokabel Via een audiokabel met 3,5 mm jackpluggen kunnen koptelefoons of PC-luidsprekers worden gebruikt op de Raspberry Pi. Het audiosignaal is tevens via de HDMI-kabel beschikbaar. Bij HDMI-televisies of monitoren is een audiokabel niet nodig. Wanneer een PC-monitor via een HDMI-kabel met DVI-adapter wordt aangesloten, gaat meestal op deze plaats het audiosignaal verloren, zodat de analoge audiouitgang opnieuw nodig is.
Geheugenkaart wordt gewist Gebruik bij voorkeur een lege geheugenkaart voor de installatie van het besturingssysteem. Als er zich op de geheugenkaart gegevens bevinden, worden deze door de nieuwe formattering tijdens de besturings- systeeminstallatie onherroepelijk gewist. 1.2.2 De software-installer NOOBS »New Out Of Box Software« (NOOBS) is een uiterst eenvoudige installer voor Raspberry Pi- besturingssystemen.
Afb. 1.2: De status-LED's op de Raspberry Pi. 1.2.4 De eerste start op de Raspberry Pi. Na afsluiting van de installatie boot de Raspberry Pi opnieuw en start automatisch de configuratie-tool Enable Boot to Desktop Desktop Log in as user 'pi' .
Pagina 10
Afb. 1.3: De LXDE-desktop op de Raspberry Pi komt in grote mate overeen met Windows XP. Raspbian-Linux voor de Raspberry Pi gebruikt de interface LXDE (Lightweight X11 Desktop Environment), die enerzijds zeer weinig systeemressourcen nodig heeft en anderzijds met zijn startmenu en de verkenner in grote mate overeenkomt met de bekende Windows-interface.
1.3.1 Eigen gegevens opslaan op de Raspberry Pi. Het bestandsbeheer loopt onder Linux echter anders dan onder Windows, maar is echter niet moeilijker. Raspbian komt met een verkenner, die sprekend op Windows-Explorer lijkt. Een belangrijk onderscheid ten opzichte van Windows: Linux scheidt niet strikt volgens loopwerken, alle bestanden bevinden zich in een gezamenlijk bestandssysteem.
Afb. 1.5: ... of op deze manier. Hoeveel vrije ruimte heeft de geheugenkaart? Niet alleen harde schijven van PC's zijn voortdurend vol – bij de geheugenkaart van de Raspberry Pi kan dit nog veel sneller gebeuren. Des te belangrijker is het, de vrije en bezette ruimte op de geheugenkaart altijd in de gaten te houden.
Pagina 13
IDLE Python 2.7.3 wordt met het pictogram op de desktop gestart. Hier verschijnt een op het eerste gezicht eenvoudig invoerscherm met een opdrachtprompt. Afb. 1.6: Het invoerscherm van de Python-shell. In dit scherm opent u aanwezige Python-programma's, schrijft u nieuwe of kunt u ook direct Python- commando's interactief verwerken, zonder een eigenlijk programma te moeten schrijven.
Python-flashcards Python is de ideale programmeertaal, om de instap in de programmering te leren. Men moet alleen wennen aan de syntax en de layout-regels. Ter assistentie in de dagelijkse programmering worden de belangrijkste syntaxelementen van de Python-taal in de vorm van »spiekbriefjes« kort beschreven. Deze zijn gebaseerd op de Python-flashcards van David Whale.
Pagina 15
Afb. 1.8: De juiste instelling voor de weergave van dubbele punten in Python. [F5] 4. Start nu het spel met de toets , of het menupunt Run/Run Module 5. Het spel ziet omwille van de eenvoud af van elke grafische interface, alsmede op verklarende teksten of plausibiliteitsvragen voor de invoer.
Afb. 1.9: Getallen raden in Python 1.4.2 Zo werkt het Dat het spel werkt, kan eenvoudig worden uitgeprobeerd. Nu ontstaan er natuurlijk enkele vragen: Wat gebeurt er op de achtergrond? Wat betekenen de losse programmaregels? Om het willekeurige getal te genereren, wordt een externe Python-module met de naam import random geïmporteerd, dat verschillende functies voor willekeursgeneratoren bevat.
Pagina 17
Hoe ontstaan willekeurige getallen? Over het algemeen wordt gedacht dat in een programma niets toevallig kan gebeuren. Hoe kan het dan, dat een programma willekeurige getallen kan genereren? Wanneer een groot priemgetal door een willekeurige waarde wordt gedeeld, ontstaan vanaf de x-te plaats na de komma getallen, die nauwelijks nog voorspelbaar zijn.
..verschijnt een andere tekst. In elk geval – daarom niet meer ingesprongen – wordt de teller , die de pogingen telt, met 1 i += 1 verhoogd. Deze regel met de operator betekent hetzelfde als i = i + 1 print "Je hebt het getal bij de ",i,".
Voorzichtig Verbind in geen geval enigerlei GPIO-pinnen met elkaar om daarna te wachten, wat er gebeurt, maar volg absoluut de onderstaande aanwijzingen op: enkele GPIO-pinnen zijn direct met aansluitingen van de processor verbonden, kortsluiting kan de Raspberry Pi volledig kapot maken. Verbindt men twee pinnen met elkaar via een schakelaar of een LED, moet hiertussen altijd een voorweerstand worden geschakeld.
• 4x weerstand 220 kilo-ohm (rood-rood-bruin) • 12x Verbindingskabel (insteekprintplaat – Raspberry Pi) • ca. 1 m schakeldraad 2.1.1 Insteekprintplaten Voor het snel opbouwen van elektronische schakelingen, zijn twee insteekprintplaten in het pakket opgenomen. Hier kunnen elektronische onderdelen direct op standaardafstanden in het gaatjesrooster worden gestoken, zonder te moeten solderen.
Er is bovendien staaldraad meegeleverd in het leerpakket. Hiermee maakt u korte verbindingsbruggen, waarmee contactrijen op de insteekprintplaat worden verbonden. Knip het draad met een kleine zijkniptang op de passende lengtes af, zoals bij de individuele experimenten is beschreven. Om de draden beter in de insteekprintplaat te kunnen steken, wordt aanbevolen, de draden een beetje schuins af te snijden, zodat een soort wig ontstaat.
In het leerpakket zijn weerstanden in drie verschillende waarden opgenomen: Waarde 1. Ring 2. Ring 3. Ring 4. Ring Toepassing (tien) (één) (multipl.) (tolerantie 220 Ohm Rood Rood Bruin Goud Voorweerstand voor LED's 1 kilo-ohm Bruin zwart Rood Goud Beveiligingsweerstand voor GPIO-ingangen Pull-down-weerstand 10 kilo-ohm...
Pagina 23
Afb. 2.3: Opbouw insteekbord, om een LED aan te sluiten. Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x 220-ohm-weerstand 2x verbindingskabel...
Pagina 24
Afb. 2.4: De eerste LED op de Raspberry Pi In dit eerste experiment wordt de Raspberry Pi alleen gebruikt als voeding voor de LED. De LED brandt altijd, hiervoor is generlei software nodig. In het volgende experiment plaatst u een toets in de aanvoerleiding van de LED. De LED brandt nu alleen, wanneer deze toets is ingedrukt.
Pagina 25
Afb. 2.5: Opbouw insteekbord voor een LED, die met een toets wordt geschakeld. Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x 220-ohm-weerstand 1x toets 2x verbindingskabel...
Afb. 2.6: LED met toets op de Raspberry Pi. 2.3 GPIO met Python De Python-GPIO-bibliotheek moet zijn geïnstalleerd, om GPIO-poorten via Python-programma's te kunnen gebruiken. Twijfelt u, of alle noodzakelijke modules zijn geïnstalleerd, installeer een keer de actuele versies via de onderstaande console-opdrachten: sudo apt-get update sudo apt-get install python-dev sudo apt-get install python-rpi.gpio...
2.4 LED aan- en uitschakelen Sluit een LED via een 220-ohm-voorweerstand (rood-rood-bruin) aan op een GPIO-poort 25 (pin 22) en niet meer direct op een +3,3-V-aansluiting en verbind de minpool van de LED via de aardrail van de insteekprintplaat met de aardleiding van de Raspberry Pi (pin 6), zoals weergegeven in de onderstaande afbeelding.
Afb. 2.7: Een LED aan de GPIO-poort 25. 2.4.1 Zo werkt het Het voorbeeld toont de belangrijkste basisfuncties van de -bibliotheek. RPi.GPIO De bibliotheek moet in elk Python-programma worden geïmporteerd, import RPi.GPIO as GPIO RPi.GPIO waarin ze zou moeten worden gebruikt. Door deze schrijfwijze kunnen alle functies van de bibliotheek via de prefix worden aangesproken.
Pagina 29
Nummering van de GPIO-poorten De bibliotheek ondersteunt twee verschillende methoden voor het kenmerken van de poorten. RPi.GPIO In de modus worden de bekende GPIO-poortnummers gebruikt, die ook op commandoregelniveau of in shell-scripts worden gebruikt. In de alternatieve modus komen de kenmerken van de pin- BOARD nummers 1 tot en met 26 overeen met de Raspberry Pi-printplaat.
2.5 Python met GPIO-ondersteuning starten, zonder terminal Wie veel met Python en GPIO bouwt, wil niet elke keer een LXTerminal opvragen, om IDLE te starten. Het kan ook eenvoudiger. Plaats hiervoor een pictogram op de desktop, die Python-IDE met superuser-rechten opvraagt: IDLE •...
Pagina 31
Afb. 2.9: Melding bij het dupliceren van een desktopkoppeling. Leafpad Klik nu met de rechter muistoets op de kopie van het desktoppictogram en kies in het contextmenu Desktopkoppelingen zijn in Linux zuivere tekstbestanden, die met een tekstbewerkers kunnen worden be- werkt.
3 Verkeerslicht Eén LED aan- en weer uitschakelen, kan in het eerste geval heel spannend zijn, maar hiervoor heeft men eigenlijk geen computer nodig. Een verkeerslicht met kenmerkende lichtcyclus van groen via geel naar rood en daarna via een lichtcombinatie rood-geel weer naar groen, is met drie LED's eenvoudig op te bouwen en toon overige programmatechnieken in Python.
Pagina 33
Afb. 3.2: Een eenvoudig verkeerslicht. Het programma sbestuur het stoplicht: ampel01.py import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) = 0; gelb = 1; gruen Ampel=[4,18,23] GPIO.setup(Ampel[rot], GPIO.OUT, initial=False) GPIO.setup(Ampel[gelb], GPIO.OUT, initial=False) GPIO.setup(Ampel[gruen], GPIO.OUT, initial=True) print ("Strg+C beëindigt het programma") try: while True: time.sleep(2) GPIO.output(Ampel[gruen],False);...
GPIO.output(Ampel[gelb],False); GPIO.output(Ampel[rot],True) time.sleep(2) GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[rot],False); GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[gruen],True) except KeyboardInterrupt: GPIO.cleanup() 3.1.1 Zo werkt het De eerste regels zijn al bekend, zij importeren de bibliotheken voor de aansturing van de GPIO- RPi.GPIO poorten e n voor tijdsvertragingen. Hierna wordt de nummering van de GPIO-poorten zoals in het eer- time dere voorbeeld op BCM geplaatst.
Pagina 35
[Strg] –, wordt het programma afgebroken en de -aanwijzing aan het einde van het programma except wordt uitgevoerd.. except KeyboardInterrupt: GPIO.cleanup() Door deze toetscombinatie wordt een geactiveerd en de lus wordt automatisch verlaten. KeyboardInterrupt De laatste regel sluit de gebruikte GPIO-poorten en schakelt hiermee alle LED's uit. Hierna wordt het pro- gramma beëindigd.
4 Voetgangerslicht In het volgende experiment breiden we de verkeerslichtschakeling nog met een extra voetgangerslicht uit, die tijdens de roodfase van het verkeerslicht een knipperlicht voor voetgangers weergeeft, zoals het in sommige landen wordt gebruikt. Men kan natuurlijk ook het in Midden-Europa gebruikelijke voetgangerslicht met rood en groen licht in het programma inbouwen, alleen bevat dit leerpakket naast de voor het verkeerslicht gebruikte LED's, nog slechts één andere.
Pagina 37
Afb. 4.2: Verkeerslicht met voetgangerlicht. Het programma bestuurt het nieuwe verkeerslicht: Ten opzicht van de eerdere versie is het ampel01.py programma maar gering uitgebreid. import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) = 0; gelb = 1; gruen = 2; blau Ampel=[4,18,23,24] GPIO.setup(Ampel[rot], GPIO.OUT, initial=False) GPIO.setup(Ampel[gelb], GPIO.OUT, initial=False)
time.sleep(2) GPIO.output(Ampel[gruen],False); GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[gelb],False); GPIO.output(Ampel[rot],True) time.sleep(0.6) for i in range(10): GPIO.output(Ampel[blau],True); time.sleep(0.05) GPIO.output(Ampel[blau],False); time.sleep(0.05) time.sleep(0.6) GPIO.output(Ampel[gelb],True); time.sleep(0.6) GPIO.output(Ampel[rot],False) GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[gruen],True) except KeyboardInterrupt: GPIO.cleanup() 4.1.1 Zo werkt het Het programmaverloop is uitgebreid bekend. Tijdens de nu iets langere roodfase moet het blauwe voet- gangerslicht snel knipperen.
Met een vertraging van 0,6 seconden na de laatste lusdoorloop wordt de normale time.sleep(0.6) schakelcyclus van het verkeerslicht voortgezet, doordat de gele LED aanvullend op de al brandende rode wordt ingeschakeld. Tot nu toe niet veel nieuws. Het voetgangerslicht wordt pas echt interessant , wanneer ze niet automatisch loopt, maar pas door een toetsindruk wordt gestart, zoals die bij veel voetgangerslichten het geval is.
Pagina 40
Afb. 4.4: Toets met beveiligingsweerstand en pull-down-weerstand aan een GPIO-ingang. Bouw volgens de onderstaande afbeelding een toets met de beide weerstanden in. Afb. 4.5: Opbouw insteekbord voor de voetganger-»bedieningslicht«.
Pagina 41
Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x LED geel 1x LED groen 1x LED blauw 4x 220-ohm-weerstand 1x toets 1x 1-kilo-ohm-weerstand 1x 10-kilo-ohm-weerstand 7x verbindingskabel 1x korte draadbrug De in de afbeelding weergegeven onderste contactstrip van de toets is via de plus-rail van de insteekprintplaat met de +3,3-V-leiding van de Raspberry Pi (pin 1) verbonden.
Pagina 42
Afb. 4.6: Voetgangersknipperlicht met toets Het programma bestuurt de nieuwe verkeerslichtinstallatie met de toets voor het ampel03.py voetgangersknipperlicht. # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) rood = 0; geel = 1; groen = 2; blauw = 3;...
GPIO.setup(Ampel[taster], GPIO.IN) print ("Druk de toets in, om het voetgangerlicht in te schakelen, Strg+C beëindigt het programma") try: while True: if GPIO.input(Ampel[taster])==True: GPIO.output(Ampel[gruen],False) GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[rot],True) time.sleep(0.6) for i in range(10): GPIO.output(Ampel[blau],True); time.sleep(0.05) GPIO.output(Ampel[blau],False); time.sleep(0.05) time.sleep(0.6) GPIO.output(Ampel[gelb],True) time.sleep(0.6) GPIO.output(Ampel[rot],False); GPIO.output(Ampel[gelb],False) GPIO.output(Ampel[gruen],True);...
Pagina 44
Toen later parallel aan de ASCII-leestekens de ANSI-leestekens werden ingevoerd, die door oudere Windows-versies wordt gebruikt, maakte men dezelfde fout nog een keer. Om de taalverwarring perfect te maken, werden de Duitse dubbel punten en andere letters met accenten op andere plaatsen in de leestekens geplaatst dan in de ASCII-standaard.
while True: if GPIO.input(Ampel[taster])==True: Binnen de gesloten lus is nu een vraag ingebouwd. De onderstaande aanwijzingen worden pas uitgevoerd, als de GPIO-poort 25 de waarde aanneemt, de gebruiker dus een toets indrukt. Tot aan dit moment True blijft het verkeerslicht in haar groenfase staan. Het verdere verloop van de lus komt in wezen overeen met die van het laatste programma.
Pagina 46
Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x LED geel 1x LED groen 1x LED blauw 4x 220-ohm-weerstand 5x verbindingskabel Afb. 5.2: Vier LED's met voorweerstanden.
Pagina 47
Aan de hand van verschillende LED-knipperpatronen, leggen wij andere lussen en programmeermethoden uit in Python. Het volgende programma biedt verschillende LED-patronen, die door de gebruiker via toetsenbordinvoer kan worden gekozen. Het programma laat de LED's in verschillende patronen knipperen. ledmuster.py # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time...
for j in range(z): GPIO.output(LED[j], False) time.sleep(t) elif e == "5": for i in range(w*z): j = random.randint(0,z-1) GPIO.output(LED[j], True); time.sleep(t) GPIO.output(LED[j], False) else: print ("Ongeldige invoer") except KeyboardInterrupt: GPIO.cleanup() 5.1.1 Zo werkt het De eerste regels van het programma met de definitie van de UTF-8-codering en de import van de noodzakelijke bibliotheken zijn al vanuit eerdere experimenten bekend.
Pagina 49
Om het programma algemeen geldend en gemakkelijk wijzigbaar te houden, worden nu nog slechts drie variabelen gedefinieerd: Aantal LED's Het aantal LED's wordt met behulp van de functie automatisch uit de lijst len() overgenomen Elk patroon wordt, opdat men het beter herkent, standaard vijf keer herhaald. Herhalingen Dit aantal kan willekeurig worden gewijzigd en geldt dan voor alle patronen.
Pagina 50
gevallen is dus de betere keuze, omdat men zich niet bezig hoeft te houden met veel raw_input() eventualiteiten van mogelijke invoeren. [Enter] Het programma wacht, tot de gebruiker een letter invoert en op de -toets drukt. Afhankelijk hiervan, welk getal de gebruiker heeft ingevoerd, moet nu een bepaald patroon met de LED's worden aangegeven. Om dit op te vragen, gebruiken wij een -constructie.
Pagina 51
for i in range(w): for j in range(z): GPIO.output(LED[j], True); time.sleep(t) GPIO.output(LED[j], False) for j in range(z-1, -1, -1): GPIO.output(LED[j], True); time.sleep(t) GPIO.output(LED[j], False) Ook hier worden in elkaar geschakelde lussen gebruikt. Na de eerste binnenste lus, die overeenkomt met het eerder beschreven programmadeel, dus nadat de LED met nummer 3 brandt, start nog een lus voor het looplicht in tegengestelde richting.
Pagina 52
De eerste binnenste lus schakelt de LED's opeenvolgend met een vertraging in. Aan het einde van de lus, die kan worden herkend aan het uitspringen van de regel , wordt de dubbele vertragingstijd time.sleep(2*t) onderhouden. Gedurende die tijd branden alle LED's. Hierna begint een andere lus, die achterwaarts telt en de één na de andere LED weer uitschakelt.
Ongeldige invoer Bij alle programma's, die invoer van gebruikers vereisen, moet foute invoer worden ondervangen. Wanneer de gebruiker iets invoert dat niet wordt verwacht, moet het programma hierop reageren. else: print ("Ongeldige invoer") Als de gebruiker iets anders ingevoerd, wordt de onder aangegeven aanwijzing uitgevoerd.
Pagina 54
Afb. 6.2: Opbouw insteekbord met een LED Benodigde onderdelen: 1x insteekprintplaat 1x LED geel 1x 220-ohm-weerstand 2x verbindingskabel...
Pagina 55
Afb. 6.3: Een LED aan de GPIO-poort 18. Het programma dimt de LED cyclisch lichter en donkerder en gebruikt hiervoor een eigen leddimmen01.py PWM-functionaliteit van de GPIO-bibliotheek. Het PWM-signaal wordt als eigen thread gegenereerd. Op deze manier kan een gedimde LED (bijna) als een normaal brandende LED in een programma worden toegepast. import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM);...
6.1.1 Zo werkt het Een deel van dit programma zal u bekend voorkomen, enkele elementen echter helemaal niet, omdat wij op deze plaats een intermezzo in het objectgeoriënteerde programma maken. Aan het begin worden, zoals bekend, de bibliotheken geïmporteerd. Dit keer wordt slechts een enkele variabele, , voor de GPIO- port 18 vastgelegd, deze wordt als uitgang geïnitialiseerd.
Nadat de LED de volledige lichtsterkte heeft bereikt, regelt een tweede lus haar volgens hetzelfde schema weer omlaag. Deze lus telt van in stappen van omlaag. Deze cyclus herhaalt zich tot een gebruiker de [Strg] toetscombinatie indrukt. except KeyboardInterrupt: p.stop(); GPIO.cleanup() activeert nu aanvullende de methode van het PWM-object.
Pagina 58
Benodigde onderdelen: 1x insteekprintplaat 1x LED geel 1x LED rood 2x 220-ohm-weerstand 3x verbindingskabel Afb. 6.5: Een tweede LED aan de GPIO-poort 25. Het programma dimt een LED cyclus lichter en donkerder, terwijl de andere LED weliswaar leddimmen02.py samen met de eerste LED lichter, maar in de andere cyclus niet donkerder wordt, maar weer vanaf 0 lichter wordt en hierbij snel flikkert.
GPIO.setmode(GPIO.BCM); LED = [18,25] GPIO.setup(LED[0], GPIO.OUT); GPIO.setup(LED[1], GPIO.OUT) print ("Strg+C beëindigt het programma") p = GPIO.PWM(LED[0], 50); q = GPIO.PWM(LED[1], 50) p.start(0) q.start(0) try: while True: for c in range(0, 101, 2): p.ChangeDutyCycle(c); q.ChangeDutyCycle(c) time.sleep(0.1) q.ChangeFrequency(10) for c in range(0, 101, 2): p.ChangeDutyCycle(100-c);...
Nu start de tweede lus, omwille van het overzicht dit keer ook met oplopende telling. Voor de eerste LED uit het PWM-object , die in deze cyclus stap-voor-stap moet worden gedimd, worden de betreffende waarden voor de pulsverhouding in elke doorloop berekend. Bij de tweede LED uit het PWM-object wordt de pulsverhouding eenvoudig weer bijgeteld.
Pagina 61
Afb. 7.2: Opbouw insteekbord voor de ruimteweergave van de geheugenkaart. Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x LED geel 1x LED groen 3x 220-ohm-weerstand 4x verbindingskabel...
Afb. 7.3: De drie LED's geven de vrije geheugenruimte op de geheugenkaart weer. Het programma levert afhankelijk van de vrije geheugenruimte op de geheugenkaart speicheranzeige.py verschillende LED-indicaties: Vrije geheugenruimte LED-indicator < 1 MB Rood 1 MB tot 10 MB rood–geel 10 MB tot 100 MB geel 100 MB tot 500 MB...
import RPi.GPIO as GPIO import time import os g1 = 1; g2 = 10; g3 = 100; g4 = 500 GPIO.setmode(GPIO.BCM) LED = [4,18,23] for i in range(3): GPIO.setup(LED[i], GPIO.OUT, initial=False) print ("Strg+C beëindigt het programma") try: while True : s = os.statvfs('/') f = s.f_bsize * s.f_bavail / 1000000 if f <...
Pagina 64
GPIO.setmode(GPIO.BCM) LED = [4,18,23] for i in range(3): GPIO.setup(LED[i], GPIO.OUT, initial=False) Een lijst definieert de GPIO-nummer van de drie LED's. Vervolgens initialiseert een lus de drie GPIO-poorten als uitgangen en zet alle LED's op uitgeschakeld. Ook in dit experiment gebruiken wij een -constructie en een gesloten lus, om het programma try...except [Strg]...
Een lus legt de GPIO-uitvoerwaarden voor de drie LED's vast. Opeenvolgend krijgen alle LED's de getalwaarde van het betreffende cijfer uit de tekenvolgorde toegekend. De waarden kunnen evenals False worden gebruikt, om GPIO-uitgangen aut- of in te schakelen. De functie berekent uit een True int()
Loopt zonder sudo Omdat dit programma geen GPIO-poorten nodig heeft, loopt het ook zonder superuser-rechten. U kunt de IDLE Python-IDLE eenvoudig via het desktop-pictogram starten. 8.1.1 Zo werkt het Dit programma toont een veelvoud aan nieuwe functies, in het bijzonder voor de grafische weergave met de PyGame-bibliotheek, die natuurlijk niet alleen voor spellen, maar ook voor alle andere grafische weergaves op het beeldscherm kan worden gebruikt.
Pagina 68
Het coördinatensysteem voor computergrafiek Ieder punt in een scherm resp. op een surface-object wordt door een x- en een y-coördinaat gekenmerkt. Het nulpunt van het coördinatensysteem is niet, zoals men het op school heeft geleerd, linksonder, maar linksboven. Net als dat men een tekst van linksboven naar rechtsonder leest, loopt de x-as van links naar rechts, de y-as van boven naar onderen.
Pagina 69
Hiermee is de basis gemaakt, en het eigenlijke spel kan beginnen. mainloop = True print "Druk op een willekeurige toets, om te dobbelen, [Esc] beëindigt het spel" Deze regel legt in het kort uit aan de gebruiker, wat er moet worden gedaan. Bij elke keer indrukken van een willekeurige toets op het toetsenbord, wordt opnieuw gedobbeld.
Pagina 70
Nu genereert de willekeursfunctie een willekeurig getal tussen en slaat deze op in de random variabele ZAHL Deze regel schrijft alleen ter controle het dobbelresultaat in het Python-shell-scherm. Deze regel print ZAHL kan ook worden weggelaten, wanneer u op de op tekstgebaseerde uitvoer wilt afzien. if ZAHL == 1: pygame.draw.circle(FELD, WEISS, P1, 40) Nu volgen er zes vragen, allen volgens hetzelfde schema.
Pagina 71
Afb. 8.3: De zes mogelijke dobbelresultaten.
De lus start direct vanaf het begin en wacht weer op het indrukken van een toets door de gebruiker. Wanneer tijdens de lus is gezet, omdat de gebruiker het spel wil beëindigen, wordt de mainloop False lus niet nog een keer doorlopen, maar in plaats daarvan wordt de volgende regel uitgevoerd. Deze regel beëindigt de PyGame-module, waardoor tevens het grafische scherm sluit en pygame.quit() daarna het volledige programma.
Het programma geeft de afgebeelde analoge klok weer op het beeldscherm: uhr01.py import pygame, time from pygame.locals import * from math import sin, cos, radians pygame.init() ROT = (255, 0, 0); WEISS = (255, 255, 255); SCHWARZ = (0, 0, 0) FELD = pygame.display.set_mode((400, 400)) FELD.fill(WEISS) MX = 200;...
Pagina 74
De drie in de grafiek gebruikte kleuren worden in drie variabelen opgeslagen. FELD = pygame.display.set_mode((400, 400)); FELD.fill(WEISS) Een 400 x 400 pixel groot scherm wordt geopend en volledig met wit ingevuld. MX = 200; MY = 200; MP = ((MX, MY)) Drie variabelen leggen de coördinaten van het middelpunt vast, waarop de betrokken verdere grafische elementen, de wijzerplaat en de wijzers worden uitgelijnd.
Pagina 75
Een lus tekent opeenvolgend de minutenpunten op een cirkel. Alle punten worden met de functie punt() bepaald. Ze hebben de gelijke afstand vanaf het middelpunt, dat met pixels in de vier kwadranten nog exact 10 pixels van de schermrand is verwijderd. De punten hebben een radius van pixels.
Pagina 76
opgeteld. In elke minuut beweegt de urenwijzer 1/60 uur verder. De berekende waarde wordt met vermenigvuldigd, omdat de urenwijzer in een uur vijf minuteneenheden op de wijzerplaat vooruitgaat. De duur van een lusdoorloop in een programma is niet bekend. Voor de analoge klok betekent if s1 <>...
Deze regel tekent de secondewijzer als rode lijn met een breedte van pixels, vanuit het middelpunt pixels lang in een hoek, die door de secondewaarde wordt aangegeven. Nu wordt de zojuist weergegeven seconde in de variabele opgeslagen, om deze waarde in de s1 = s volgende lusdoorlopen met de actuele seconde te vergelijken.
Pagina 78
Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x 220-ohm-weerstand 2x verbindingskabel Afb. 10.1: Eén LED aan de GPIO-poort 4. Sluit een LED via een voorweerstand aan op GPIO-poort 4. Het programma zorgt ervoor dat deze ledtk01.py gaan branden. import RPi.GPIO as GPIO from Tkinter import * LED = 4;...
def LedEin(): GPIO.output(LED,True) def LedAus(): GPIO.output(LED,False) root = Tk(); root.title("LED") Label(root, text="Klik op de toets. om de LED aan- en uit te schakelen").pack() Button(root, text="Aan", command=LedEin).pack(side=LEFT) Button(root, text="Uit", command=LedAus).pack(side=LEFT) root.mainloop() GPIO.cleanup() Afb. 10.2: Zo zal het voltooide dialoogveld er uitzien. 10.1.1 Zo werkt het Dit programma laat de basisfuncties van de Tkinter-bibliotheek zien voor de opbouw van de grafische dialoogvelden.
Pagina 80
Tkinter werkt met zogenaamde widgets. Hierbij betreft het zelfstandige beeldschermelementen, root = Tk() in de meeste gevallen dialoogvelden, die van hun kant verschillende elementen bevatten. Elk programma heeft een -widget nodig, van waaruit alle andere objecten worden opgeroepen. Deze -widget heet root root altijd...
Nu zijn alle functies en objecten gedefinieerd en het eigenlijke programma kan starten. Het hoofdprogramma bestaat slechts uit een losse regel. Het start de hoofdlus root.mainloop() , een methode van de -widget. Deze programmalus wacht, tot de gebruiker een van de mainloop() root widgets bedient en hiermee een actie activeert.
Pagina 82
Afb. 10.4: Opbouw insteekbord voor experiment 10.2. Benodigde onderdelen: 1x insteekprintplaat 1x LED rood 1x LED geel 1x LED groen 1x LED blauw 4x 220-ohm-weerstand 5x verbindingskabel...
Pagina 83
Afb. 10.5: Vier LED's knipperen in verschillende patronen. Het programma gebaseerd op het vorige programma, is echter met de radiobuttons alsmede ledtk02.py met de functies voor de LED-looplichten en knippervoorbeelden uitgebreid. import RPi.GPIO as GPIO import time from Tkinter import * GPIO.setmode(GPIO.BCM) LED = [4,18,23,24] for i in LED:...
root = Tk(); root.title("LED"); v = IntVar(); v.set(1) def LedEin(): e = v.get() if e == 1: for i in range(w): for j in range(4): GPIO.output(LED[j], True) time.sleep(t) GPIO.output(LED[j], False) elif e == 2: for i in range(w): for j in range(4): GPIO.output(LED[j], True) time.sleep(t) for j in range(4):...
Pagina 85
Muster = [ ("Loopflicht naar links",1), ("Knipperen",2), ("Looplicht naar rechts",3) De teksten van de drie patronen, die kunnen worden gekozen, worden in een speciale lijstvorm gedefinieerd. Elk van de drie lijstelementen bestaat uit een waardepaar, elk bestaand uit de aangegeven tekst en een getalwaarde, die later bij de keuze van de betreffende radiobuttons moet worden teruggegeven.
Pagina 86
else: for i in range(w): for j in range(4): GPIO.output(LED[3-j], True); time.sleep(t) GPIO.output(LED[3-j], False) Het derde geval is gelijk aan het eerste, met als verschil, dat de LED's achteruit worden geteld en hierdoor het looplicht in omgekeerde richting loopt. Nadat de functie is gedefinieerd, worden de elementen van de grafische oppervlakken gecreëerd. Label(root, text="Klik op de button, om het looplicht te starten").pack()
Start keuze maken. Door op te klikken, start aansluitend het gekozen patroon en laat het vijf keer lopen. Hierna kunt u een ander patroon kiezen. 10.3 Knippersnelheid instellen In de derde stap wordt het dialoogveld opnieuw uitgebreid. De gebruiker kan nu via een schuifregelaar de knippersnelheid instellen.
e = v.get() t = 1.0/g.get() if e == 1: for i in range(w): for j in range(4): GPIO.output(LED[j], True); time.sleep(t) GPIO.output(LED[j], False) elif e == 2: for i in range(w): for j in range(4): GPIO.output(LED[j], True) time.sleep(t) for j in range(4): GPIO.output(LED[j], False) time.sleep(t) else:...
Omdat een gebruiker intuïtief het sneller knipperen combineert met een hogere snelheid, wordt de schuifregelaar naar rechts hogere waarden teruggeven. In het programma is echter voor een hogere snelheid een kortere wachttijd, oftewel een lagere waarde nodig. Dit wordt bereikt door het berekenen van de omgekeerde waarde, die uit de waarden tot en met van de schuifregelaar, de waarden...
Pagina 90
Senso Touch Me Duitsland onder de naam op de markt. Atari bracht een kopie onder de naam ter grootte Einstein van een zakrekenmachine uit. Nog een kopie verscheen als , in de Engelstalige landen werd Senso Simon op de markt gebracht. Python Games Simulate Raspbian levert een grafische versie van dit spel mee bij de...
Pagina 91
Afb. 11.2: Opbouw insteekbord voor experiment 11. Benodigde onderdelen: 2x insteekprintplaat 1x LED rood 1x LED geel 1x LED groen 1x LED blauw 4x 220-ohm-weerstand 4x 1-kilo-ohm-weerstand 4x 10-kilo-ohm-weerstand 4x toets 10x verbindingskabel 4x korte draadbrug...
Pagina 92
Afb. 11.3: PiDance met LED's en toetsen op twee insteekprintplaten. De toetsen zijn tegenover de bijbehorende LED's gebouwd. De middelste lange rijen van de insteek- printplaten aan beide zijden van de verbindingsplaat dienen als 0-V- en +3,3-V-leiding voor de schakeling. Het programma bevat het kant-en-klare spel.
return 2 if(GPIO.input(TAST[3])): return 3 ok = True for runde in range(1, rzahl +1): print "Ronde", runde for i in range(runde): LEDein(farbe[i], 1) for i in range(runde): taste = Druecken() LEDein(taste, 0.2) if(taste != farbe[i]): print "Verloren!" print "Je hebt tot ronde", ronde – 1, "gehaald" for j in range(4): GPIO.output(LED[j], True) for j in range(4):...
Pagina 94
LED = [23,24,25,8] for i in LED: GPIO.setup(i, GPIO.OUT, initial=False) De GPIO-poorten voor de LED's worden volgens het bekende schema in een lijst als uitgangen ingesteld en allemaal uitgeschakeld. TAST = [4,17,21,22] for i in TAST: GPIO.setup(i, GPIO.IN) Volgens hetzelfde principe worden de GPIO-poorten voor de vier toetsen in een lijst als ingangen TAST ingesteld.
Pagina 95
print "Ronde", runde De actuele ronde wordt in het Python-shell-scherm weergegeven. for i in range(ronde): LEDein(farbe[i], 1) Nu speelt het programma het voorbeeld af, dat de speler moet onthouden. Afhankelijk van het actuele aantal ronden, gaan achtereenvolgens het overeenkomstige aantal LED's branden, volgens de aan het begin van het programma vastgestelde lijst met de willekeurig gekozen kleuren.
Pagina 96
if(ok == False): break Wanneer staat, wordt tevens de buitenste lus afgebroken, er volgens geen andere ronden meer. False Als de invoer van de volgorde correct was, wacht het programma 0,5 seconden, tot de time.sleep(0.5) volgende ronde start. Het programma bereikt deze plaats, wanneer de lus volledig is doorlopen, de speler dus if(ok == True): alle volgordes correct heeft ingevoerd, of de eerdere lus door een speelfout is afgebroken.