TARTALOMJEGYZÉK 1 Az 1.1 1 1.1.2 1.1.3 1.1.4 1.1.5 1,6 0,1 - 7 1.1.8 1.2 1.2.1 1.2.2 123 1.2.4 1,3 1.3.1 1.4 1.4.1 1.4.
6 LED 6.1.1 6.1.2 6.1.3 7 Memóriakártya szabad kapacitás jelzése LED-ekkel 7.1.1 Így működik 60 63 8 Grafikus dobókocka 8.1.1 Így működik 65 67 9 Analóg óra a képernyőn 9.1.1 Így működik 72 73 10 Grafikus párbeszédablak a programvezérléshez 10.1.1 Így működik 10.2 Futófény vezérlése grafikus felülettel 10.2.1 Így működik 10.3 A villogási sebesség beállítása 10.3.1 Így működik 77 79 81 84 87 88 11 PiDance a LED-ekkel 11.1.
1 Az operációs rendszer telepítésétől kezdve az első Python-programig. Szinte nincs olyan elektronikai készülék ebben az árkategóriában, amelyről annyit beszéltek volna, mint a Raspberry Pi-ról. A Raspberry Pi, bár első pillantásra egyáltalán nem látszik rajta, teljes értékű számítógép mintegy hitelkártya méretben – nagyon kedvező áron. Nemcsak a hardver olcsó, hanem a szoftver is: az operációs rendszer és az összes mindennapi alkalmazás ingyenesen letölthető az interneten. 1.1 ábra 1.
1.1.1 Mikro-USB-mobiltelefon-töltő A Raspberry Pi számára megfelel minden modern mobiltelefon-töltő. Az USB-töltéstechnika kezdeti idejéből származó régebbi töltőkészülékek azonban túl gyengék. Ha teljesítményéhes USB-készülékeket, például saját tápegységrész nélküli hordozható merevlemezt csatlakoztat, erősebb tápegységre van szüksége. A hálózati tápegységnek 5 V-ot és legalább 700 mA-t, de még inkább 1.000 mA-t kell szolgáltatnia.
1.1.7 Audiokábel 3,5 mm-es jack-dugóval szerelt audiokábel segítségével fejhallgatót vagy számítógéphangszórót csatlakoztathat a Raspberry Pi-ra. Az audiojel a HDMI-kábelen is rendelkezésre áll. HDMI-hüvellyel bíró TV-készülékhez vagy monitorhoz nincs szükség audiokábelre. Ha egy számítógép-monitort HDMI-kábellel köt össze a DVI-adapterrel, az audiojel ezen a helyen többnyire elvész, úgyhogy ismét szüksége van az analóg audiokimenetre. 1.1.
A memóriakártya törlődik. A legjobb, ha egy üres memóriakártyát használ az operációs rendszer telepítésére. Ha adatok lennének a memóriakártyán, ezek az operációs rendszer telepítése közbeni újraformatálás következtében visszavonhatatlanul törlődnek. 1.2.2 A szoftver-telepítő NOOBS A »New Out Of Box Sofware« (NOOBS) egy különösen egyszerű telepítő a Raspberry-Pi operációs rendszere számára.
1.2 ábra 1.2: A Raspberry Pi státusz-LED-jei 1.2.4 A Raspberry Pi első indítása A befejezett telepítés után a Raspberry Pi újra betölti az operációs rendszert, és automatikusan elindítja a raspi-configkonfigurációs eszközt. Itt csak választania kell az Enable Boot to Desktop (engedélyezve az operációs rendszer betöltése az asztalra) és a Desktop Log in as user 'pi' bejelentkezés az asztalon 'pi' felhasználóként) opció között.
1.3. ábra 1.3: A Raspberry Pi LXDE-asztala nagyon hasonlít a Windows XP-ére. A Raspberry Pi-on futó Raspbian-Linux egy LXDE (Lightweight X11 Desktop Environment) felületet alkalmaz, amelynek egyrészt nagyon kevés rendszer-erőforrásra van szüksége, másrészt startmenüjével és fájlkezelőjével nagyon hasonlít a megszokott Windows-felülethez. Linux-bejelentkezés Még a Linuxra jellemző felhasználói bejelentkezés is a háttérben történik meg.
1.3.1 Saját fájlok tárolása a Raspberry Pi-on. Bár a fájlkezelő a Linux alatt egy kicsit másképp fut, mint a Windows alatt, de nem nehezebb használni. A Raspbian magával hoz egy fájlkezelőt, amely megtévesztésig hasonlít a WindowsExplorerhez. Egy fontos különbség ahhoz képest: a Linux nem választja el szigorúan egymástól a meghajtókat, az összes fájl egy közös fájlrendszerben található. A Linux alatt az összes saját fájlt alapvetően csakis a sajátkönyvtárba (home directory) helyezi el.
1.5 ábra 1.5: ... vagy így. Mennyi szabad hely van még a memóriakártyán? Nemcsak a számítógépek merevlemeze van állandóan megtelve - a Raspberry Pi memóriakártyája még sokkal hamarabb megtelhet. Annál fontosabb tehát, hogy állandóan a szemünk előtt legyen az, hogy mennyi szabad hely van még a memóriakártyán, és mekkora hely foglalt már. A fájlkezelőnek az ablak alsó szélén lévő státuszsora mutatja jobbra a szabad 1.
Python 2.7.3 vagy 3.3.0? A Raspberry Pi-on gyárilag egyszerre két Python-verzió van telepítve. A legújabb 3.x Python-verzió sajnos könyvtárként más szintaxist alkalmaz, mint a bevált 2.x verzió, emiatt az egyik verzióban írt programok nem futnak a másikkal. Néhány fontos könyvtár, például a játékok és általában a grafikus megjelenítések programozására szolgáló jól ismert PyGame, nem kapható még a Python 3.x-hez. Emiatt, és mert a legtöbb, az interneten hozzáférhető program a Python 2.
A Python 2.7.3 verziót az asztalon lévő IDLE szimbólummal lehet elindítani. Itt az első pillantásra egyszerű beadási ablak jelenik meg egy parancsprompttal. 1.6. ábra 1.6: A Python-Shell beadási ablaka. Ebben az ablakban nyithatja meg a meglévő Python-programokat, írhat újakat, vagy interaktív módon kidolgozhat közvetlen Python-parancsokat anélkül, hogy saját programot kellene írnia.
Python-flashcardok (flash háttértárolók) A Python az ideális programozási nyelv a programozás kezdeteinek az elsajátítására. Csupán a szintaxist és a layout-szabályokat kell kissé megszokni. A mindennapi programozás segítésére a legfontosabb szintaxis-elemeket röviden kis "puskák" formájában ismertetjük. Ezek David Whale PythonFlashcardjain alapulnak. Hogy pontosan miről is van szó, megtudhatja a bit.ly/pythonflashcards. web-oldalról.
1.8 ábra 1.8: A helyes beállítás az umlautok/ékezetek megjelenítésére a Pythonban. 4. Indítsa el most a játékot az [F5] nyomógombbal vagy a Run/Run Modulemenüponttal. 5. A játék az egyszerűség kedvéért lemond mindenféle grafikus felületről, továbbá a magyarázó szövegekről vagy a beadások plauzibilitására való rákérdezésről. A számítógép a háttérben 0 és 1000 közé eső véletlen számot generál. Adjon be egy tippet, és megtudja, hogy a keresett szám nagyobb vagy kisebb nála.
1.9 ábra 1.9: Számjáték a Pythonnal 1.4.2 Ez így működik: A játék működését azzal próbálhatja ki, hogy játszik vele. Adódik most néhány kérdés: Mi történik a háttérben? Mit jelentenek az egyes programsorok? A véletlenszám generálásához a random nevű külső Python-modul kerül importálásra, amely a véletlengenerátorok különféle funkcióit tartalmazza. import random szám = random.
Hogyan jönnek létre a véletlenszámok? Általában úgy hiszik, hogy egy programban semmi se történik véletlenül. Hogyan lehetséges akkor egy program számára, hogy véletlenszámokat generál? Ha egy nagy prímszámot valamilyen értékkel elosztunk, akkor az xedik tizedesjegytől olyan számok jelennek meg, amelyekre már alighanem nem vártunk. Ezek ráadásul bármilyen szabályosság nélkül változnak, ha az osztót állandóan növeljük.
... ez a szöveg kerül kiírásra. A végén itt a tippváltozó áll, hogy a beírt szám a szövegben megjelenjen. Ha ez a feltétel nem teljesül, a beugrasztott sor egyszerűen átugrásra kerül. if zahl > tipp: Ha azahl titkos szám nagyobb mint a felhasználó által beírt tipp szám, akkor ... print "Die gesuchte Zahl ist größer als " ("A keresett szám nagyobb mint a ",tipp ... egy másik szöveg kerül kiírásra.
2.1 ábra 2.1: A GPIO-interfész bekötése A szürke vonal fent és balra a kártya szélét jelöli. A GPIO 2. csapja teljesen a Raspberry Pi sarkának a szélén helyezkedik el. Vigyázat! Ne kösse össze a GPIO egyetlen csapját se egy másikkal, arra várva, hogy mi történik, hanem feltétlenül tartsa be az alábbiakat: A GPIO néhány csapja közvetlenül össze van kötve a processzor megfelelő kivezetésével, ha rövidre zárja őket, teljesen tönkreteheti a Raspberry Pi-t.
tényleges kísérletek hozzák magukkal. • 2 db dugasztábla • 1 db piros LED • 1 db sárga LED • 1 db zöld LED • 1 db kék LED • 4 db nyomógomb • 4 db 10 kohm-os ellenállás (barna-fekete-narancs) • 4 db 1 kohm-os ellenállás (barna-fekete-piros) • 4 db 220 ohm-os ellenállás (piros-piros-barna) • 12 db összekötőkábel (dugasztábla – Raspberry Pi) • kb. 1 m kapcsolóhuzal 2.1.1 dugasztábla Elektronikai kapcsolások felépítésére két dugasztáblát tartalmaz a csomag.
2.2 ábra 2.2: A csomagban található dugasztábla néhány példaként berajzolt összeköttetéssel. Ezeket az érintkezősorokat gyakran a kapcsolások tápáramforrásának a pozitív és negatív pólusául használjuk. A többi érintkezősorban öt-öt érintkező (A-tól E-ig és F-től J-ig) keresztben van összekötve egymással, míg a tábla közepén egy hézag van. Így a tábla közepén nagyobb alkatrészeket lehet bedugni, és a széle felé lehet huzalozni. 2.1.
Ezenkívül még egy kapcsolóhuzalt is tartalmaz a tanulókészlet. Általa rövid áthidalókat lehet létrehozni a dugasztábla érintkezősorainak az áthidalására. Vágja le kellő hosszúságú darabokra a kapcsolóhuzalt egy oldalcsípőfogó segítségével az egyes kísérletek leírásának megfelelően. Ahhoz, hogy a huzalokat könnyebben be lehessen dugni a dugasztáblába, ajánlatos kissé ferdén levágni őket, hogy egy kis ékalakú végződés jöjjön létre.
A tanulókészletben három különböző értékű ellenállások vannnak: érték 1. gyűrű (tizes) 2. gyűrű 3. gyűrű (szorzó) 4. gyűrű (tűrés) Alkalmazás 220 ohm piros piros barna arany előtétellenállás a LED- 1 kohm barna fekete piros arany védőellenállás a GPIO- 10 kohm barna fekete narancs arany lehúzó-ellenállás a GPIO-bemenetekhez 1. táblázat 2.2: A tanulókészletben lévő ellenállások színkódja. Különösen az 1 kohmos és a 10 kohmos ellenállások színjelöléseire figyeljen pontosan.
2.3 ábra 2.3: A dugasztábla beültetése egy LED csatlakoztatásakor.
2.4 ábra 2.4: Az első LED a Raspberry Pi-on. Ebben az első kísérletben a Raspberry csupán a LED tápáramforrásául szolgál. A LED folyamatosan világít, nem kell hozzá szoftver. A következő kísérletben rakjon be egy nyomógombot a LED bekötővezetékébe. A LED most csak akkor világít, ha megnyomja ezt a nyomógombot. Ehhez se kell szoftver.
2.5 ábra 2.5: A dugasztábla beültetése egy nyomógombbal kapcsolható LED számára.
2.6 ábra. 2.6: A LED nyomógombbal a Raspberry Pi-on. 2.3 A GPIO a Pythonnal Ahhoz, hogy a GPIO-portokat a Python-programokkal tudjuk használni, telepíteni kell a PythonGPIO-Bibliothek könyvtárat. Ha nem biztos afelől, hogy az összes szükséges modul telepítve van, telepítse az aktuális verziót az alábbi konzolparancsokkal: sudo apt-get update sudo apt-get install python-dev sudo apt-get install python-rpi.
2.4 LED-ek be- és kikapcsolása Csatlakoztasson a következő ábrának megfelelően egy LED-et egy 220-ohmos előtétellenálláson (piros-piros-barna) keresztül a 25. GPIO-portra (22. csap), és már nem közvetlenül a +3,3 V-os csatlakozópontra, és kösse össze a LED negatív pólusát a dugasztábla testsínjén át a Raspberry Pi testvezetékével (6. csap). A szükséges alkatrészek: 1 db dugasztábla 1 db piros LED 1 db 220-ohmos ellenállás 2 db összekötőkábel A következő program, a led.
2.7 ábra 2.7: Egy LED a 25. GPIO-porton 2.4.1 Így működik A példa az RPi.GPIO-könyvtár alapvető funkcióit mutatja be. import RPi.GPIO as GPIO Az RPi.GPIO könyvtárat minden olyan Python-programba importálni kell, amelyben alkalmazni akarjuk. Ezzel az írásmóddal a könyvtár összes funkciója a GPIO előtaggal megszólítható. import time A gyakran alkalmazott time Python-könyvtárnak semmi köze sincs a GPIOprogramozáshoz. Az idő- és dátumszámítás funkcióit tartalmazza, többek között a time.
A GPIO-portok számozása Az RPi.GPIO könyvtár két különböző módszert támogat a portok megjelölésére. A BCM üzemmódban az ismert GPIO-portszámokat alkalmazzuk, amelyeket a parancssorok szintjén vagy a Shell-scriptekben (parancsállományok) is használunk. A másik lehetséges üzemmódban, a BOARD-ban, a megjelölés a Raspberry-Pi-kártya érintkezőcsapjai számozásának felel meg. GPIO.setup(25, GPIO.OUT) A GPIO.setup funkció egy GPIO-portot kimenetként vagy bemenetként inicializál.
• Helyezze el az előre telepített IDLE asztali szimbólum egy másolatát. Ehhez tegye a következőket: • Kattintson a jobb egérgombbal az asztalon lévő IDLE szimbólumra, és válassza ki a felbukkanó menüből a Kopieren (másolás) opciót. 2.8 ábra 2.8: Az IDLE-asztali szimbólum másolása. Majd kattintson a jobb egérgombbal az asztalra, és válassza ki a felbukkanó menüben az Einfügen (beillesztés) opciót.
2.9 ábra 2.9: Üzenet egy asztali parancsikon másolásakor. Kattintson a jobb egérgombbal az asztalon lévő szimbólum másolatára, és válassza ki a felbukkanó menüben a Leafpad opcióra. Az asztali parancsikonok a Linuxban tiszta szövegfájlok, amelyek egy szövegszerkesztővel módosíthatók. 2.10 ábra 2.10: Az asztali parancsikonok a Leafpad szövegszerkesztőben. Végezze el itt az ábrán látható két változtatást: • Változtassa meg a Name (név) mezőben lévő szöveget az IDLE GPIO szövegre.
3 Közlekedési lámpa Egyetlen LED bekapcsolása, majd kikapcsolása izgalmas lehet az első pillanatban, de ehhez tulajdonképpen nincs szükség számítógépre. Egy közlekedési lámpa felépítése a tipikus világítási ciklusával a zöld lámpáról a sárgán keresztül a pirosra, majd egy piros-sárga fénykombináción át vissza a zöld lámpára három LED-del könnyen megy, és további programozási technikákat mutat be a Pythonban. Építse fel az ábrázolt kapcsolást a dugasztáblán.
3.2 ábra 3.2: Egy egyszerű közlekedési lámpa. Az ampel01.py program vezérli a közlekedési jelzőlámpát: import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) rot = 0; gelb = 1; gruen = 2 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 beendet das Programm") try: while True: time.sleep(2) GPIO.output(Ampel[gruen],False); GPIO.
time.sleep(0.6) 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 Így működik Az első sorok már ismertek, ezek importálják az RPi.GPIO könyvtárat a GPIO-portok vezérléséhez és a time könyvtárat az időkésleltetéshez.
rendszerkivétel lépne fel – ami hiba is lehet, vagy akár megszakadt a [Strg]+[C] nyomógomb-kombináció, és az except-utasítás a program végén hajtódik végre. except KeyboardInterrupt: GPIO.cleanup() Ezzel a nyomógomb-kombinációval egy KeyboardInterrupt-ot (nyomógombos megszakítás) váltunk ki, és a hurkot automatikusan elhagyjuk. Az utolsó sor lezárja az alkalmazott GPIO-portokat, és ezzel kikapcsolja az összes LED-et. Majd befejeződik a program.
4 Gyalogos jelzőlámpa A következő kísérletben kibővítjük a jelzőlámpakapcsolást még egy gyalogos jelzőlámpával, amely a közlekedési lámpa piros fázisa alatt villogó fénnyel jelez a gyalogosoknak, ahogy azt némelyik országban alkalmazzák. Természetesen beépíthetnénk a programba a KözépEurópában megszokott piros- és zöldfényű gyalogos jelzőlámpát is, csakhogy ez a tanulókészlet a közlekedési lámpában alkalmazott LED-eken kívül már csak egy további LED-et tartalmaz.
4.2 ábra 4.2: Közlekedési lámpa gyalogos villogófénnyel. Az ampel02.py program vezérli az új jelzőlámpát. Az előző verzióhoz képest a program csekély mértékben kibővült. import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) rot = 0; gelb = 1; gruen = 2; blau = 3 Ampel=[4,18,23,24] GPIO.setup(Ampel[rot], GPIO.OUT, initial=False) GPIO.setup(Ampel[gelb], GPIO.OUT, initial=False) GPIO.setup(Ampel[gruen], GPIO.OUT, initial=True) GPIO.setup(Ampel[blau], GPIO.
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.
time.sleep(0.6) Az utolsó hurokmenet után 0,6 másodperc késleltetéssel folytatódik a közlekedési lámpa normális kapcsolási ciklusa, amennyiben a már világító piros LED mellé a sárga is bekapcsolódik. Eddig még nincs semmi új a nap alatt. Valóban érdekessé akkor válik a gyalogos jelzőlámpa, ha nem automatikusan fut, hanem egy gombnyomásra kell elindulnia, mint ahogy ez az eset sok gyalogoslámpa működésében.
4.4 ábra. 4.4: Nyomógomb védőellenállással és lehúzó ellenállással egy GPIO-bemeneten. Építsen be az alábbi ábrának megfelelően egy nyomógombot a két ellenállással a kapcsolásba. 4.5 ábra 4.
A szükséges alkatrészek: 1 db dugasztábla 1 db piros LED 1 db sárga LED 1 db zöld LED 1 db kék LED 4 db 220-ohmos ellenállás 1 db nyomógomb 1 db 1 kohmos ellenállás 1 db 10 kohmos ellenállás 7 db összekötőkábel 1 db rövid huzaláthidaló A nyomógombnak az ábrán látható alsó érintkezőkapcsa a dugasztábla pozitív sínjén keresztül össze van kötve a Raspberry Pi +3,3 V-os vezetékével (1. csap).
4.6 ábra 4.6: Gyalogos villogófény nyomógombbal. Az ampel03.py program vezérli az új nyomógombos gyalogos villogófény jelzőlámpa-elrendezést.
GPIO.setup(Ampel[gomb], GPIO.IN) print ("Taster drücken, um Fußgängerblinklicht einzuschalten, Strg+C beendet das program") try: while True: if GPIO.input(Ampel[gomb] )==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.
ASCII, ANSI és Unicode A normál (latin) ábécé 26 betűből (a magyar 40-ből) áll, és még néhány umlautos/ékezetes betűből, mind nagybetűs és kisbetűs írásmódban, ehhez járul még a tíz számjegy és néhány írásjel; mintegy 100 különböző karakter adódik ki ezekből. Egy byte segítségével 256 különböző karakter jeleníthető meg. Ennek tehát elegendőnek kellene lennie - így gondolták a számítógép történetének a kezdetén, amikor a mai technika legfontosabb alapelveit meghatározták.
Amikor később az ASCII-karakterkészlettel párhuzamosan bevezették a régebbi Windowsverziók által használt ANSI-karakterkészletet, ugyanazt a hibát még egyszer elkövették. Hogy a bábeli zűrzavart még tovább fokozzák, a német umlautokat és más ékezetes betűket az ASCII-szabványétól eltérő helyekre sorolták be a karakterkészletben.
while True: if GPIO.input(Ampel[gomb])==True: A végtelen hurokba most be van építve egy lekérdezés. A következő utasításokat csak akkor hajtja végre a program, ha a 25. GPIO-port felvette a True értéket, azaz a felhasználó megnyomta a nyomógombot. Eddig az időpontig a közlekedési lámpa a zöld fázison áll. A hurok további menete lényegében megfelel az utolsó programéval. A közlekedési lámpa a sárgán keresztül pirosra vált, a gyalogos villogófény tízet villan.
A szükséges alkatrészek: 1 db dugasztábla 1 db piros LED 1 db sárga LED 1 db zöld LED 1 db kék LED 4 db 220-ohmos ellenállás 5 db összekötőkábel 5.2 ábra 5.2: Négy LED előtétellenállásokkal.
Különböző LED-villogási minták alapján ismertetünk további hurkokat és programozási módszereket a Pythonban. A következő program különböző LED-mintákat ajánl, amelyek közül a felhasználó tasztatúra-beadással választhat. A ledmuster.py program a LED-eket különféle fénymintákban villogtatja. # -*import import import coding: utf-8 -*RPi.GPIO as GPIO time random GPIO.setmode(GPIO.BCM) LED = [4,18,23,24] for i in LED: GPIO.setup(i, GPIO.OUT, initial=0) z = len(LED); w = 5; t = 0.
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 ("Ungültige Eingabe") ("Érvénytelen beadás") except KeyboardInterrupt: GPIO.cleanup() 5.1.1 Így működik A program első sorait az UTF-8-kódolás megadásával és a szükséges könyvtárak importálásával a korábbi kísérletekből már ismerjük.
Ahhoz, hogy a program végérvényesen és könnyen változtatható maradjon, még három változót definiálunk: z A LED-ek száma A LED-ek számát a program a len() funkció segítségével automatikusan átveszi a LED listából. [W] Ismétlések Mindegyik fényminta a jobb felismerhetőség érdekében alapvetően ötször ismétlődik. Ez a szám tetszés szerint megváltoztatható, és utána mindegyik mintára érvényes. t Idő Ez a változó azt adja meg, hogy mennyi ideig legyen bekapcsolva a szünet ugyanennyi ideig tart.
matematikai műveleteket vagy változóneveket közvetlenül feldolgozza a program. A legtöbb esetben tehát a raw_input() a jobb választás, mivel nem kell tépelődnie a lehetséges beadások esetlegességével. A program vár, amíg a felhasználó egy betűt bead, majd megnyomja az [Enter]-nyomógombot. Attól függően, hogy melyik számot adta be a felhasználó, elő kell jönnie egy meghatározott LED-mintának. Ennek a lekérdezésére egy if...elif...else-szerkezetet alkalmazunk. 1.
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) Itt is egymásba skatulyázott hurkokat alkalmazunk. Az előzőleg ismertetett programrésznek megfelelő első belső hurok után, azaz miután kigyulladt a 3-es számú LED, elkezdődik egy további hurok az ellenkező irányú futófény számára. A lista elemei minden esetben 0-val kezdődő számozásúak.
Az első belső hurok a LED-eket egymás után késleltetéssel kapcsolja be. A hurok végén, amely a time.sleep(2*t) sor kiugrasztásáról ismerhető fel, a késleltetési idő dupláját várja ki a hurok. Ez idő alatt az összes LED világít. Ezután elkezdődik egy újabb hurok, amely visszaszámlál, és az egyik LED-et a másik után kapcsolja ki. Itt is a hurok végén, amikor már az összes LED kialudt, a késleltetési idő dupláját várja ki a hurok, mielőtt a külső hurok még egyszer elindítaná a teljes ciklust. 4.
Érvénytelen beadás Az összes, a felhasználó részéről beadást kérő program esetében a hibás beadásokat el kell csípni. Ha a felhasználó valami nem várt dolgot ad be, a programnak reagálnia kell rá. else print ("Ungültige beadás") ("Érvénytelen beadás") Ha a felhasználó valami mást adott be, az else alatt beadott utasítás végrehajtódik. Ez a lekérdezést tartalmazó szakasz mindig akkor igaz, ha más lekérdezések nem adnak igaz eredményt. Esetünkben a program egy üzenetet jelenít meg a képernyőn.
6.2 ábra 6.2: A dugasztábla beültetése egy LED-del.
6.3 ábra 6.3: Egy LED a 18. GPIO-porton. A leddimmen01.py program a LED fényét ciklikusan szabályozza fényesebbre és sötétebbre, és ehhez a GPIO-könyvtár saját PWM-funkcióját alkalmazza. A PWM-jel saját thread-ként lesz generálva. Ezen a módon egy fényszabályzott LED (szinte) úgy használható egy programban, mint egy normálisan világító LED. import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM); LED = 18 GPIO.setup(LED, GPIO.OUT) print ("Strg+C beendet das program") p = GPIO.PWM(LED, 50); p.
6.1.1 Ez így működik: A program egy része ismerősnek tűnhet, néhány eleme azonban nem, mert ezen a helyen kiruccanunk az objektum orientált programozáshoz. A kezdésnél, mint ismert, könyvtárakat importálunk. Ezúttal csak egyetlen LEDváltozót határozunk meg a kimenetként inicializált 18. GPIO-port számára. print ("Strg+C beendet das program") ("A Ctrl + C befejezi a programot")Mivel ez a program is atry...
Miután a LED elérte teljes fényességét, egy második hurok azonos séma szerint visszafelé számlál. Ez a hurok 100-tól -2-es lépésekben lefelé számlál. Ez a ciklus addig ismétlődik, amíg a felhasználó meg nem nyomja a [Strg]+[C] nyomógomb-kombinációt. except KeyboardInterrupt: p.stop(); GPIO.cleanup() A KeyboardInterrupt (nyomógombos megszakítás) kiváltja most kiegészítőleg a PWM-objektum stop() metódusát. Ez a metódus befejezi a PWM-jel előállítását.
A szükséges alkatrészek: 1 db dugasztábla 1 db sárga LED 1 db piros LED 2 db 220-ohmos ellenállás 3 db összekötőkábel 6.5 ábra 6.5: Egy második LED a 25. GPIO-porton A leddimmen02.py program ciklikusan szabályozza az egyik LED fényét világosabbra és sötétebbre, mialatt a másik LED fényét ugyan az elsővel együtt világosabbra szabályozza, a másik ciklusban azonban a LED nem válik sötétebbé, hanem ismét 0-ról világosodik, és közben gyorsan lobog a fénye. import RPi.
GPIO.setmode(GPIO.BCM); LED = [18,25] GPIO.setup(LED[0], GPIO.OUT); GPIO.setup(LED[1], GPIO.OUT) print ("Strg+C beendet das program") 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); q.ChangeDutyCycle(c) time.sleep(0.1) q.ChangeFrequency(50) except KeyboardInterrupt: p.stop(); GPIO.cleanup() 6.1.
Most elindul a második hurok, az áttekinthetőség kedvéért ezúttal növekvő számlálással. A pPWM-objektumból való, az ebben a ciklusban lépésről lépésre leszabályozandó fényű első LED számára a kitöltési tényező megfelelő értékei minden egyes menetben kiszámítódnak. A q PWM-objektumból való második LED kitöltési tényezője egyszerűen ismét felfelé számlálódik. A villogó hatást a megváltoztatott frekvencia hozza létre. q.
7.2 ábra 7.2: A dugasztábla beültetése a memóriakártya töltöttségi állapotának a kijelzésére.
41. 7.3: Három LED jelzi a memóriakártyán lévő szabad tárolóhelyet. A speicheranzeige.py program a szabad tárolóhelytől függően különféle LED-jelzést szolgáltat: szabad memóriahely LED-jelzés < 1 MB piros 1 MB-tól 10 MB-ig piros–sárga 10 MB-tól 100 MB-ig sárga 100 MB-tól 500 MB-ig sárga–zöld > 500 MB zöld 7.1 táblázat 7.
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 beendet das program") try: while True : s = os.statvfs('/') f = s.f_bsize * s.f_bavail / 1000000 if f < g1: x = "100" elif f < g2: x = "110" elif f < g3: x = "010" elif f < g4: x = "011" else x = "001" for i in range(3): GPIO.output(LED[i], int(x[i])) time.sleep(1.0) except KeyboardInterrupt: GPIO.
GPIO.setmode(GPIO.BCM) LED = [4,18,23] for i in range(3): GPIO.setup(LED[i], GPIO.OUT, initial=False) Egy lista definiálja a három LED GPIO-portjainak a számát. Majd egy hurok a három GPIOportot kimenetként inicializálja, és az összes LED-et kikapcsolt állapotba állítja. Ebben a kísérletben is egy try...except-szerkezetet és egy végtelenhurkot alkalmazunk azért, hogy a program automatikusan újra és újra fusson mindaddig, amíg a felhasználó meg nem szakítja a [Strg]+[C] gombkombinációval.
Egy hurok határozza meg a három LED GPIO-kiviteli értékeit. Az összes LED sorra megkapja a karaktersor mindenkori sorszámának megfelelő számértéket, a 0-át vagy az 1-et. A 0 és az 1 érték ugyanúgy használható, mint a False és a True , a GPIO-kimenetek ki- vagy bekapcsolására. Az int() funkció megállapítja egy karakterből annak a számértékét. A karaktert az i hurokszámláló olvassa ki a minta karaktersorozatának az adott helyéről. time.sleep(1.0) A program 1 másodpercig vár a következő hurokmenetig.
from pygame.locals import * pygame.init() FELD = pygame.display.set_mode((320, 320)) pygame.display.set_caption("Wuerfel") BLAU = (0, 0, 255); WEISS = (255, 255, 255) P1 = ((160, 160)); P2 = ((60, 60)); P3 = ((160, 60)); P4 = ((260, 60)) P5 = ((60, 260)); P6 = ((160, 260)); P7 = ((260, 260)) mainloop = True print "Beliebige Taste drücken, um zu würfeln, [Esc] beendet das Spiel" while mainloop: for event in pygame.event.get(): if event.type == QUIT or (event.type == KEYUP and event.
A "sudo" nélkül fut Mivel ennek a programnak nincs szüksége a GPIO-portokra, korlátozás nélküli felhasználói felhatalmazás nélkül is futtatható. A Python-IDE egyszerűen az asztalon lévő IDLE szimbólummal indítható el. 8.1.1 Így működik Ez a program számos új funkciót mutat be, különösen a PyGame könyvtár segítségével történő grafikus megjelenítéshez, amelyet természetesen nemcsak játékokhoz, hanem a képernyőn megjelenítendő bármilyen más grafikához is alkalmazni lehet .
A számítógépes grafika koordinátarendszere Egy ablak, ill. egy Surface-objektum minden egyes pontját egy x- és egy ykoordináta jelöli meg. A koordinátarendszer nullapontja az iskolában tanultaktól eltérően nem balra lent, hanem balra fent van. Ugyanúgy, mint A hét pont, a P1 - P7 jelölik a kocka pöttyeinek a grafikában megadott középpontjait. A kocka mindegyik pöttyének a sugara 40 pixel. 80 pixel tengelytávolság mellett a kocka pöttyei, ill. a pöttyök és az ablak szélei között 20 pixel távolság marad. 8.
mainloop = True Ezzel elintéztük az alap-tennivalókat, és elkezdhetjük a tulajdonképpeni játékot. "Beliebige Taste drücken, um zu würfeln, [Esc] Ez a sor röviden elmondja a felhasználónak, hogy mit kell tennie. A tasztatúra bármelyik gombjának a megnyomására egy új kockadobás történik. A print mindig a Python-Shell-ablakba ír ki, és nem az új grafikus ablakba. while mainloop: Most kezdődik el a játék főhurka.
Most a random véletlen-funkció egy 1 és 6 közé eső véletlenszámot generál, és elmenti a ZAHL változóba. print ZAHL Ez a sor csak ellenőrzésül kiírja a kockadobás eredményét a Python-Shell-ablakba. Ezeket a sorokat el is hagyhatja, ha lemond a szövegalapú megjelenítésről. if ZAHL == 1: pygame.draw.circle(FELD, WEISS, P1, 40) Most ugyanazon séma szerint következik hat lekérdezés. Ha a véletlen kockadobás egy adott értékű számot adott, annak megfelelően egytől hatig terjedő pöttyöt jelenít meg.
8.3 ábra 8.3: A kockadobás lehetséges hat eredménye.
A hurok azonnal újraindul, és ismét a felhasználó egy gombnyomására vár. Ha a hurok folyamán a mainloop False értékre lett állítva, mert a felhasználó be akarja fejezni a játékot, a hurok nem fog még egyszer lefutni, hanem ehelyett a következő sor kerül végrehajtásra: apygame.quit() Ez a sor befejezi a PyGame-modult, ami által a grafikus ablak is bezárul, majd az egész program is.
A uhr01.py program jeleníti meg az ábrán látható analóg órát a képernyőn: 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; MY = 200; MP = ((MX, MY)) def punkt(A, W): w1 = radians(W * 6 – 90); x1 = int(MX + A * cos(w1)) y1 = int(MY + A * sin(w1)); return((x1, y1)) for i in range(60): pygame.draw.
FELD = pygame.display.set_mode((400, 400)); FELD.fill(WEISS) Megnyílik egy 400 x 400 pixel méretű ablak, és teljesen kitöltődik fehér színnel. MX = 200; MY = 200; MP = ((MX, MY)) Három változó rögzíti a középpontok koordinátáit, amelyekhez viszonyítva van az összes többi grafikus elem, a számlap és az óramutató. Az MX és MY változó tartalmazza a középpontok xés y-koordinátáját, az MP változó a középpontot egy pontként, ahogyan a grafikus funkciókhoz alkalmazzuk.
Egy hurok rajzolja be egymás után a 60 percpontot egy körre. Az összes pontot a punkt()funkcióval határozza meg. A pontok azonos távolságra vannak a középponttól, és negyedenként 190 pixelnyire lévén még pontosan 10 pixel távolságra vannak az ablak szélétől. A pontok sugara 2 pixel. for i in range(12): pygame.draw.circle(FELD, SCHWARZ, punkt(190, i * 5), 4) Egy második hurok 12 nagyobb kört rajzol, amelyek az órákat jelölik a számlapon.
része. Minden percben az óramutató egy óra 1/60 részével továbbmegy. A számított értéket 5 tel megszorozza a program, mivel az óramutató óránként öt percegységet halad előre a számlapon. if s1 <> s: Egy hurokmenet időtartama a programban nem ismert. Az analóg óra esetében ez azt jelenti, hogy a grafikát nem kell miden egyes hurokmenetben frissíteni, hanem csak akkor, ha az aktuális másodperc más mint az előzőleg kiírt. Ehhez később a programban a kiírt másodperc az s1 változóban áll.
Ez a sor megrajzolja a másodpercmutatót egy 2 pixel szélességű, a középponttól vett 180 pixel hosszúságú piros vonalként, a másodpercérték által megadott szögben. s1 = s Most az éppen kijelzett másodperc tárolásra kerül az s1 változóban, hogy ezt az értéket a következő hurokmenetekben össze lehessen hasonlítani az aktuális másodperccel. pygame.display.set_caption("Aktuelle Zeit: " + time.asctime()) Ez a sor digitális alakban kiírja az aktuális pontos időt az ablak címsorába. Ehhez a program a time.
A szükséges alkatrészek: 1 db dugasztábla 1 db piros LED 1 db 220-ohmos ellenállás 2 db összekötőkábel 10.1 ábra 10.1: Egyetlen LED a 4. GPIO-porton. Csatlakoztasson egy LED-et egy előtétellenálláson keresztül a 4. GPIO-portra. A ledtk01.py program kigyújtja a LED-et. import RPi.GPIO as GPIO from Tkinter import * LED = 4; GPIO.setmode(GPIO.BCM); GPIO.setup(LED,GPIO.
def LedEin(): GPIO.output(LED,True) def LedAus(): GPIO.output(LED,False) root = Tk(); root.title("LED") Label(root, text="Bitte Button klicken, um die LED ein- und auszuschalten").pack() Button(root, text="Ein", command=LedEin).pack(side=LEFT) Button(root, text="Aus", command=LedAus).pack(side=LEFT) root.mainloop() GPIO.cleanup() 10.2 ábra 10.2: Így fog kinézni a kész dialógusmező. 10.1.1 Így működik Ez a program bemutatja a Tkinter-könyvtár alapfunkcióit egy grafikus párbeszédablak elkészítéséhez.
úgynevezett widget-ekkel dolgozik. Itt önálló képernyőelemekről, a legtöbb esetben különféle elemeket tartalmazó párbeszédablakokról van szó. Mindegyik programnak egy root (gyökér) widgetre (eszköztár) van szüksége, amelyből kiindulva az összes további objektum lehívható. Ennek a root-widget-nek a neve mindigTk(), amely automatikusan generál egy ablakot, és inicializálja a Tkinter-könyvtárat is. root = Tk() Tkinter A Tkinterben lévő root.
Most már definiálva van az összes funkció és objektum, így el lehet indítani a tulajdonképpeni programot. root.mainloop() A főprogram csak egyetlenegy sorból áll. Ez indítja el a mainloop()főhurkot, a rootwidget egy metódusát. Ez a programhurok arra vár, hogy a felhasználó működtessen egy widget-et, és ezzel beindítson egy műveletet. A jobbra fent lévő, az ablak bezárására szolgáló x-szimbólumot nem kell a Tkinter által külön definiálni.
10.4 ábra 10.4: A dugasztábla beültetése a 10.2 kísérlethez.
10.5 ábra 10.5: Négy LED villog különféle fénymintákban. A ledtk02.py program az előző programon alapszik, azonban ki lett bővítve a rádiógombokkal, továbbá a LED-futófények és a villogásminta számára készült funkcióval. import RPi.GPIO as GPIO import time from Tkinter import * GPIO.setmode(GPIO.BCM) LED = [4,18,23,24] for i in LED: GPIO.setup(i, GPIO.OUT, initial=0) w = 5; t = 0.2 muster = [ ("Lauflicht nach links",1), ("Blinken",2),(1.
] 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): GPIO.output(LED[j], False) time.sleep(t) else for i in range(w): for j in range(4): GPIO.output(LED[3-j], True); time.sleep(t) GPIO.
A választható három minta szövegét egy külön listaformátum definiálja. Mindhárom listaelem egy értékpárból áll, amely a kijelzett szöveget és egy számértéket tartalmaz, amelyet később az adott rádiógomb kiválasztásakor vissza kell adnia. root = Tk(); root.title("LED") A root-widget inicalizálása megint megfelel az előző programénak, csak a párbeszédmező tartalmai különbözőek. v = IntVar(); v.
GPIO.output(LED[3-j], True); time.sleep(t) GPIO.output(LED[3-j], False) A harmadik eset megegyezik az elsővel, azzal a különbséggel, hogy a LED-ek számlálása visszafelé történik, és emiatt a futófény fordított irányban fut. Miután a funkció definiálva lett, a grafikus felület elemei kerülnek elhelyezésre. Label(root, text="Bitte Button klicken, um das Lauflicht zu starten") pack() ("A futófény elindításához nyomja A párbeszédmező szövege ismét Label-objektumként definiálódik.
10.3 A villogási sebesség beállítása A harmadik lépésben még egyszer bővítjük a párbeszédmezőt. A felhasználó most egy tolószabályzóval beállíthatja a villogási sebességet. 10.6 ábra 10.6: Választható három LEDminta, és beállítható villogási sebesség. A tolószabályzók alkalmazása A tolószabályzók nagyon ösztönös módszert adnak egy adott tartományba eső számértékeknek a beadására.
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 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) Label(root, text="Bitte Button klicken, um das Lauflicht zu starten").
amely a tolószabályzó 1 -től 10 ig terjedő értékeire az 1.0 -től 0.1 -ig terjedő értékeket adja a t változóra. A képletben 1.0 -nek kell lennie és nem 1 -nek, hogy az eredmény lebegőpontos szám és ne egész szám legyen. Egész számok átszámítása lebegőpontos számmá Egy számítás eredménye automatikusan lebegőpontos számként kerül tárolásra, ha legalább egy érték a képletben lebegőpontos szám. Ha a képletben lévő minden érték egész szám (integer), akkor az eredmény ugyancsak egész számmá rövidül le.
A Raspbian ennek a játéknak a grafikus verzióját forgalmazza a Python Games között Simulate néven. 11.1 ábra 11.1: A Simulate játék a Python Games-ből. A PiDance nevű játékunk ugyancsak ezen a játékelven alapszik. LED-ek villognak véletlenszerű sorrendben. A felhasználónak ezután ugyanebben a sorrendben kell megnyomnia nyomógombokat. Minden egyes játékmenettel meggyullad egy további LED, úgyhogy egyre nehezebben lehet megjegyezni a sorrendet. Ha hibát követünk el, a játék befejeződik.
11.2 ábra 11.2: A dugasztábla beültetése a 11.
11.3 ábra 11.3: A PiDance LED-ekkel és nyomógombokkal két dugasztáblán. A nyomógombok a hozzájuk tartozó LED-ekkel szemben vannak beépítve. A dugasztáblák összeköttetési helyénél lévő két-két középre eső hosszanti sor a kapcsolás számára a 0 V-os és a +3,3 V-os tápvezetékül szolgál. A pidance01.py program a kész játékot tartalmazza. # -*- coding: utf-8 -*import time, random import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) rzahl = 10; farbe = [] for i in range(rzahl): farbe.append(random.
if(GPIO.input(TAST[2])): return 2 if(GPIO.input(TAST[3])): return 3 ok = True for runde in range(1, rzahl +1): print "Runde", 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 "Du hast es bis Runde", runde – 1, "geschafft" for j in range(4): GPIO.output(LED[j], True) for j in range(4): time.sleep(0.5) GPIO.output(LED[j], False) ok = False break if(ok == False): break time.sleep(0.
LED = [23,24,25,8] for i in LED: GPIO.setup(i, GPIO.OUT, initial=False) A LED-eket vezérlő GPIO-portok az ismert séma szerint egy LED listába vannak kimenetként elrendezve, és mind ki van kapcsolva. TAST = [4,17,21,22] for i in TAST: GPIO.setup(i, GPIO.IN) Ugyanezen elv alapján vannak a négy nyomógomb GPIO-portjai egy TAST listába bemenetként elrendezve. Ezzel az alapok el vannak intézve, és még két funkciót definiálunk, amelyre a programnak többször szüksége van. def LEDein(n, z): GPIO.
print "Runde", runde Az aktuális forduló a Python-Shell-ablakban jelenik meg. for i in range(runde): LEDein(farbe[i], 1) Most a program lejátssza azt a mintát, amelyet a játékosnak meg kell jegyeznie. Az aktuális fordulószámnak megfelelően egymás után kigyullad sok LED a program kezdetén meghatározott farbe lista szerinti véletlenül kiválasztott színnel. Mivel a runde számláló 1-gyel kezdődik, már az első fordulóban világít pontosan egy LED.
if(ok == False): break Ha az ok változó a False értéken áll, a külső hurok is megszakad, nincs további forduló már. time.sleep(0.5) Ha a beadási sorrend helyes volt, a program 0,5 másodpercig vár, mielőtt elindítaná a következő fordulót. if(ok == True): Ide akkor érkezik a program, ha vagy a hurok teljesen lefutott, a játékos tehát az összes szekvenciát helyesen adta be, vagy az előző hurok egy játékhiba miatt megszakadt. Ha az ok még a True állapoton állna, következik a győztes ünneplése.
Impresszum © 2012 Franzis Verlag GmbH, RichardReitzner-Alle 2, 85540 Haar bei München Szerző: Christian Immler ISBN 978-3645-10145-5 Minden jog fenntartva, a fotómechanikus lejátszásé és az elektronikus médiákon történő mentésé is. Csak a kiadó írásos engedélyével szabad másolatokat készíteni és terjeszteni papíron, adathordozókon vagy az interneten, különösen PDFfájlként, ellenkező esetben büntetőjogi következményekkel járhat.