rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web...

83
Rik Puts Game Console 2019-2020 Voorwoord Ik ben Rik Puts, 17 jaar en woon in Lichtaart. Ik werk als garçon in de Netherust in Kasterlee. Ook ben ik een leider voor de Ksa. Mijn richting is Elektronica ICT. In mijn vrije tijd game ik en probeer ik wat te maken met wat ik al geleerd heb op school en op YouTube. Zo heb ik deze zomervakantie de laatste twee weken een website gemaakt voor de muziekgroep van mijn ouders; The Cook The Thief & The lover (www.cookthieflover.be ) met hulp van YouTube tutorials. Tevens heb ik ook al eens een paar kleine spelletjes gemaakt in C++ en JavaScript zoals Snake en Flappybird om te oefenen, wat ik heel leuk vond. Daarom wil ik voor mijn eindwerk iets uitwerken met spelletjes. Het leukste aan programmeren vind ik interactieve dingen maken. Voor mijn eindwerk heb ik hulp gekregen van een aantal mensen. Mijn papa heeft me geholpen met de behuizing te maken zodat ik overal gemakkelijk aankan en de meeste grote onderdelen kan loskoppelen. Anton Vroemans heeft me geholpen met wat tips hier en daar, en hij vond ook de naam voor mijn eindwerk. Thomas Smets heeft mij het grootste deel van wat ik weet over electronica en ICT geleerd en heeft mij ook geholpen met plannen hoe ik mijn eindwerk moest maken en met problemen oplossen. 1

Transcript of rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web...

Page 1: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Voorwoord

Ik ben Rik Puts, 17 jaar en woon in Lichtaart. Ik werk als garçon in de Netherust in Kasterlee. Ook ben ik een leider voor de Ksa. Mijn richting is Elektronica ICT. In mijn vrije tijd game ik en probeer ik wat te maken met wat ik al geleerd heb op school en op YouTube. Zo heb ik deze zomervakantie de laatste twee weken een website gemaakt voor de muziekgroep van mijn ouders; The Cook The Thief & The lover (www.cookthieflover.be) met hulp van YouTube tutorials.

Tevens heb ik ook al eens een paar kleine spelletjes gemaakt in C++ en JavaScript zoals Snake en Flappybird om te oefenen, wat ik heel leuk vond. Daarom wil ik voor mijn eindwerk iets uitwerken met spelletjes. Het leukste aan programmeren vind ik interactieve dingen maken.

Voor mijn eindwerk heb ik hulp gekregen van een aantal mensen. Mijn papa heeft me geholpen met de behuizing te maken zodat ik overal gemakkelijk aankan en de meeste grote onderdelen kan loskoppelen. Anton Vroemans heeft me geholpen met wat tips hier en daar, en hij vond ook de naam voor mijn eindwerk. Thomas Smets heeft mij het grootste deel van wat ik weet over electronica en ICT geleerd en heeft mij ook geholpen met plannen hoe ik mijn eindwerk moest maken en met problemen oplossen.

1

Page 2: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Samenvatting

Voor mijn eindwerk wil ik een game console maken. (Of lunapark kast.)

Het idee is om met een led strip scherm en wat knopjes, spelletjes te spelen zoals: Snake, Flappy bird, Tetris, en Pacman.

Verder wil ik ook nog speakers voor geluidseffecten toevoegen en RFID (Radio frequency identification).

RFID zal dienen om spelers te herkennen. Wanneer spelers binnenkomen in de klas, typen ze hun naam in en wordt deze gekoppeld aan een RFID badge, gekoppeld aan een database.

Wanneer ze deze badge scannen op mijn eindwerk kunnen ze spelen en hun score zal op een website verschijnen. Op deze website kan je zien hoe goed je bent tegenover iedereen die al gespeeld heeft.

Sebastiaan en Wout gaan dezelfde RFID badges gebruiken met hun eindwerk en de scores van hun spelletjes komen allemaal op de site.

2

Page 3: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

InhoudVoorwoord...................................................................................................................................................1

Samenvatting................................................................................................................................................2

Figuren.........................................................................................................................................................7

1 Blokschema..........................................................................................................................................8

1.1 Blokschema samenvatting............................................................................................................8

1.1.1 Input:....................................................................................................................................8

1.1.2 Output:.................................................................................................................................9

1.2 Situatieschema...........................................................................................................................10

1.3 Verloopschema...........................................................................................................................11

2 Componenten.....................................................................................................................................12

2.1 Led scherm.................................................................................................................................12

2.1.1 Welk soort scherm nodig?..................................................................................................12

2.1.2 Opties.................................................................................................................................12

2.1.3 Keuze..................................................................................................................................13

2.1.4 WS2812 protocol................................................................................................................14

2.2 Power supply..............................................................................................................................15

2.2.1 Benodigdheden...................................................................................................................15

2.2.2 Opties.................................................................................................................................15

2.2.3 Keuze..................................................................................................................................16

2.3 RFID chip.....................................................................................................................................16

2.3.1 Nut......................................................................................................................................16

2.3.2 Opties.................................................................................................................................16

2.3.3 Keuze..................................................................................................................................17

2.3.4 Probleem............................................................................................................................17

2.4 Analog Digital Converter.............................................................................................................18

2.4.1 Nut......................................................................................................................................18

2.4.2 Opties.................................................................................................................................19

2.4.3 Keuze..................................................................................................................................20

2.4.4 Besturing.............................................................................................................................21

2.4.5 SAR......................................................................................................................................25

2.5 Joystick.......................................................................................................................................26

2.5.1 Opties.................................................................................................................................26

2.5.2 Keuze..................................................................................................................................27

3

Page 4: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.5.3 Besturing.............................................................................................................................28

2.6 Klein scherm...............................................................................................................................31

2.6.1 Nut......................................................................................................................................31

2.6.2 Opties.................................................................................................................................31

2.6.3 Keuze..................................................................................................................................32

Gyro sensor............................................................................................................................................33

2.6.4 Nut......................................................................................................................................33

2.6.5 Opties.................................................................................................................................33

2.6.6 Keuze..................................................................................................................................34

2.7 Development PCB board............................................................................................................34

2.7.1 Uitleg..................................................................................................................................34

2.7.2 Opties.................................................................................................................................34

2.7.3 Keuze:.................................................................................................................................35

2.8 Audio..........................................................................................................................................36

2.8.1 Uitleg..................................................................................................................................36

2.8.2 Opties.................................................................................................................................36

2.9 Vermogen Tabel.........................................................................................................................37

2.9.1 Probleem?..........................................................................................................................37

2.9.2 Prijs per uur........................................................................................................................37

3 Console Behuizing..............................................................................................................................40

3.1 Opties.........................................................................................................................................40

3.1.1 Game boy...........................................................................................................................40

3.1.2 miniatuur lunapark kast......................................................................................................40

3.1.3 keuze..................................................................................................................................40

3.2 Materiaal....................................................................................................................................40

3.3 Console pcb schema...................................................................................................................41

3.3.1 Praktisch shema..................................................................................................................41

3.3.2 Praktische board layout......................................................................................................42

4

Page 5: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

...........................................................................................................................................................42

3.4 3D printen...................................................................................................................................43

3.4.1 Voordelen & prijs................................................................................................................43

3.5 Drukknoppen..............................................................................................................................43

4 Code...................................................................................................................................................45

5

Page 6: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.1 Legende......................................................................................................................................45

4.2 Flappy Bird..................................................................................................................................47

4.2.1 Speluitleg............................................................................................................................47

4.2.2 Even kort.............................................................................................................................47

4.2.3 Code indeling......................................................................................................................48

4.2.4 FlappyBird class..................................................................................................................49

4.2.5 Wall class............................................................................................................................50

4.2.6 Flappy bird AI (bot).............................................................................................................55

4.3 Bestuurbare cirkel animatie........................................................................................................58

4.3.1 HSL......................................................................................................................................58

4.3.2 De cirkel..............................................................................................................................59

6

Page 7: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

FigurenFigure 1-blokschema....................................................................................................................................7Figure 2-simpele versie van mijn eindwerk..................................................................................................8Figure 3 verloopschema...............................................................................................................................9Figure 4-ledscherm.....................................................................................................................................10Figure 5-ledscherm.....................................................................................................................................10Figure 6-ledstrip.........................................................................................................................................11Figure 7-ledscherm.....................................................................................................................................11Figure 8 ws2812 protocol...........................................................................................................................12Figure 9-psu................................................................................................................................................13Figure 10-psu..............................................................................................................................................14Figure 11-rfid kit.........................................................................................................................................14Figure 12-rfid sticker..................................................................................................................................16Figure 13-ADC uitlegschema......................................................................................................................16Figure 14-MCP3008....................................................................................................................................17Figure 15-PCF8591.....................................................................................................................................18Figure 16-MCP3008....................................................................................................................................19Figure 17-MCP3008 port schematic...........................................................................................................19Figure 18-stuur schema..............................................................................................................................20Figure 19-adress tabel................................................................................................................................20Figure 20-MCP3008 aansluitschema..........................................................................................................22Figure 21-Arduino Joystick.........................................................................................................................23Figure 22-Retro Joystick.............................................................................................................................24Figure 23-Arduino Joystick.........................................................................................................................25Figure 24-schema zonder oplossing...........................................................................................................25Figure 25-schema met oplossing................................................................................................................26Figure 26-MCP3008+Joystick schema........................................................................................................27Figure 27-MCP3008+Joystick schema........................................................................................................27Figure 28 Groen/Rood lcd scherm..............................................................................................................28Figure 29 16x2 LED LCD mudule.................................................................................................................28Figure 30 16x2 LED LCD mudule.................................................................................................................29Figure 31GY-521-MPU-6050 gyrosensor....................................................................................................30Figure 32-behuizing schets.........................................................................................................................35Figure 33-voorbeeld metalen randen.........................................................................................................35Figure 34 Praksich schema.........................................................................................................................36Figure 35 Praktisch Board...........................................................................................................................37Figure 36 Global variables..........................................................................................................................38Figure 37 Schets convert functie................................................................................................................39Figure 38 Convert function.........................................................................................................................39Figure 39 FlappyBird constructor...............................................................................................................41Figure 40 FlappyBird update function........................................................................................................42Figure 41 Flappy Bird update function.......................................................................................................43Figure 42 Wall class variables.....................................................................................................................43Figure 43 wall constructor..........................................................................................................................45Figure 44 Wall update function..................................................................................................................45

7

Page 8: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Figure 45 verticale muur beweging............................................................................................................45Figure 46 wall score check & in scherm zetten...........................................................................................46Figure 47 python 3 meme.........................................................................................................................47 Figure 48....................................................................................................................................................49 Figure 49....................................................................................................................................................49 Figure 50....................................................................................................................................................49Figure 51....................................................................................................................................................49Figure 52....................................................................................................................................................51Figure 53....................................................................................................................................................51Figure 54....................................................................................................................................................53Figure 55....................................................................................................................................................53

1 Blokschema

Figure 1-blokschema

1.1 Blokschema samenvatting1.1.1 Input:De rfid scanner stuurt het id van een badge naar de pi waardoor de pi via een database de naam van de speler weet.

8

Page 9: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Via de besturingsknopjes en de joystick kan je spelletjes spelen en navigeren op de pi.

1.1.2 Output:De pi laat zien wat je aan het doen bent via het led scherm. (Dat werkt met WS2812B)

De pi stuurt geluidseffecten naar de speakers.

Eveneens stuurt hij de behaalde score en de naam van de speler naar de webserver die het vervolgens op de website zet.

De website is bereikbaar via smartphone, tablet, of pc.

9

Page 10: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

1.2 Situatieschema

Figure 2-Situatieschema

10

Page 11: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

1.3 Verloopschema

Figure 3 verloopschema

11

Page 12: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2 Componenten2.1 Led scherm2.1.1 Welk soort scherm nodig?Lcd schermen zijn ingewikkelder om te besturen en kleiner voor dezelfde prijs als led matrixen en led strips. Om deze reden heb ik niet voor en lcd scherm gekozen. (Ook al hebben ze wel een hogere resolutie.)

Een led matrix is goedkoper dan een ledstrip voor een scherm. Bovendien zijn alle led matrixen rechthoeken, in tegenstelling tot ledstrips waar het moeilijker kan zijn om rechthoeken te vinden.

Maar bij een led matrix stuur je 1 led of rij aan voor een bepaalde tijd en dan gaat hij uit, vervolgens stuur je de volgende led aan. Dit heeft als nadeel dat het scherm veel minder licht is. Bijvoorbeeld bij een 265 led scherm zal mijn helderheid met een led strip 265 keer zo helder zijn.

Bij betere (Dus ook duurdere) led matrixen zit er een condensator bij elke led waardoor deze iets langer zal blijven branden, met als gevolgd dat de helderheid al sterk verbetert wordt.

2.1.2 OptiesNaam: DC5V WS2812B Led Panel screen 16x16Pixels Full Color Panel screen

Prijs: €15.24

Verkoper: Aliexpress

Voordelen:

zit al in een vierkant, dat bespaart veel tijd en werk aan solderen en positioneren.

niet zo duur Volgens datasheet van

WS2812B energiezuinig Precies genoeg voor een

16*16 scherm. (Omdat het al in een vierkant zit.)

WS2812B heeft ingebouwde pwm.Dit is een eventuele oplossing voor als de led strip te veel stroom trekt.

Nadelen:

Ik kon geen datasheet vinden. (Wel van WS2812B) Er staat niets vermeld van het maximum vermogen.

Op het internet heb ik gevonden dat ik met 8A zou moeten toekomen.Dat is 30mA per led met driver chip.

12

Figure 5-ledscherm Figure 4-ledscherm

Page 13: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Naam: CHINLY WS2811 5m 100IC 300 leds LED pixel strepen flexibel individueel te adresseren Ledstrepen droomkleur niet waterdicht DC12V zwart PCB

Prijs: €23.77

Verkoper: Amazon.de

Voordelen:

Heeft een datasheet. Genoeg leds voor een 16*16 scherm.

Nadelen:

Zit nog niet in een vierkant, dit betekent dat alle Leds nog gepositioneerd en elke rij nog gesoldeerd moet worden.

Link: https://www.amazon.de/CHINLY-individuell-adressierbar-Led-Streifen-wasserdicht/dp/B0792X25G9/ref=sr_1_6?__mk_nl_NL=%C3%85M%C3%85%C5%BD%C3%95%C3%91&keywords=programmierbarer+led+300&qid=1568141772&s=gateway&sr=8-6

Naam: Ubercorn

Prijs: €52.95

VerKoper: kiwi electronics

Voordelen:

Zit al in een vierkant Betrouwbare site Snelle levering Verbruikt minder dan een ledstrip

omdat je gemakkelijk en goedkoop de leds efficiënter kan voeden. Het jouleverlies is hier 16 keer zo ineffectief.

Nadelen:

Heel duur

Link: https://www.kiwi-electronics.nl/pim-406?search=led%20display&description=true

2.1.3 KeuzeIk kies voor de DC5V WS2812B Led Panel van 265px.

Hij is goedkoper en bespaart me tegelijk veel tijd, die anders gespendeerd zou worden aan solderen en uitmeten. (Dingen die ik saai vind.)

13

Figure 6-ledstrip

Figure 7-ledscherm

Page 14: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Ik heb ook een goede library gevonden om ws2812 mee te sturen. Zo kan ik meer tijd spenderen aan spelletjes maken voor de game console.

2.1.4 WS2812 protocolWS2812 heeft maar 1 data kabel nodig samen met een vcc en GND.

WS2812 stuur je aan door een hele lange volgorde van 1’en en 0’en te sturen.

Een 1 is: 8µs hoog, en dan 45µs laag.

Een 0 is: 45µs hoog, en dan 8µs laag.

Eerst reset je de hele strip waardoor de hele strip wacht op een rgb waarde.

De eerste led begint de hele string binnen te krijgen maar focust enkel op de eerste 24 bits.

Die 24 bits worden verdeeld in 8 bits voor rood groen en blauw.

Die 8 bits hebben een waarde van 0 tem 255, waarbij 0 uit betekent en 255 betekent dat het brandt zo hard als kan.

Een waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle, afhankelijk van hoe dicht de waarde tegen 255 zit.

(De ws2812 modules kunnen zelf hun pwm signalen genereren en behouden.)

Nu heeft de led de eerste 24 bits gelezen en wacht hij niet meer op een rgb waarde, wat betekent dat hij niets meer leest totdat hij terug gereset wordt en dat hij alle informatie die hij binnen gestuurd krijgt gewoon doorstuurt naar de volgende led.

Die volgende led denkt dan dat hij de eerste led is en het verhaal speelt zich opnieuw af.

14

Figure 8 ws2812 protocol

Page 15: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.2 Power supply2.2.1 Benodigdheden.Alle componenten werken op 5V.

Het led scherm kunnen we schatten op 5A.

De raspberry pi, knopjes, joystick, de speakers, en RFID reader samen verbruiken 2.5A maximum.

Dus de voeding moet minstens 5V en 7.5A leveren

2.2.2 OptiesNaam: LianShi DC5V 10A

Prijs: €22.22 (waarvan €5 verzendkosten)

Levertijd: 3-6 dagen.

Verkoper: Amazon

Link: https://www.amazon.de/LianShi-Schaltnetzteil-Transformator-Kurzschluss-%C3%9Cberstromschutz/dp/B073GS41PG/ref=sr_1_16?ie=UTF8&keywords=power%2Bsupply%2B5v%2B10A%2BTrafo&language=en_GB&qid=1567582967&s=ce-de&sr=1-16&th=1

Voordelen:

Zeer snelle levering, wat betekent dat ik sneller verder kan.

Nadelen:

Eerder duur voor een 5V power supply. Grootte niet vermeld maar Package dimensions zijn vrij

groot. (16.7cm x 10.5cm x 4.8 cm)

Naam: Vusum AC110V-220V naar DC 5V Voeding Adapter 10A

Verkoper: Aliexpress

Levertijd: 20-25 dagen

Prijs: €8.87

Link: https://nl.aliexpress.com/item/32983648084.html?spm=a2g0o.productlist.0.0.3f87543eWk9LBb&algo_pvid=b3837b8a-d7ab-45bc-bd0a-cf507ce432fd&algo_expid=b3837b8a-d7ab-45bc-bd0a-cf507ce432fd-0&btsid=88520bea-b8a8-4aae-a266-c2bf80b8b083&ws_ab_test=searchweb0_0,searchweb201602_5,searchweb201603_52

Voordelen:

Zeer goedkoop klein. 11cm x 7.8cm x 6.3cm

Nadelen:

Zeer lange levertijd, wat betekent dat ik langer moet wachten voor ik verder kan.

15

Figure 10-psu

Figure 9-psu

Page 16: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Ziet er minder betrouwbaar uit.

2.2.3 KeuzeDe LianShi DC5V 10A van €22.22 euro.

Met als reden dat ik het binnen een week kan beginnen met het uitdenken van het kader van de game console. Ik heb niet genoeg tijd om een maand te wachten en er dan misschien zelfs achter te komen dat het niet werkt.

In een project heb je altijd maar 2 van de 3: kwaliteit, tijd of prijs. In dit project komt de tijd voor de prijs.

2.3 RFID chip2.3.1 NutDe Rfid scanner scant de rfid chips die je kan aanmaken als je binnenkomt door je naam in te vullen in een chip te krijgen.

De naam van de speler staat dan in een database zodat wanneer de scanner de chip scant, de pi weet wat de naam van de speler is.

2.3.2 OptiesNaam: arduino RC522 kit

Prijs: €0.90

Verkoper: aliexpress

Link: https://nl.aliexpress.com/item/32909482286.html?spm=a2g0o.productlist.0.0.1406ece0U7K9MP&algo_pvid=39991baf-1b37-46a6-af97-2f81b127d7f9&algo_expid=39991baf-1b37-46a6-af97-2f81b127d7f9-0&btsid=308f6a9b-9f0c-4221-ac1b-063f26f57a26&ws_ab_test=searchweb0_0,searchweb201602_7,searchweb201603_52

Levertijd: 25-30 dagen

Voordelen:

Goedkoop Van arduino, dus je kan er gemakkelijk veel uitleg/hulp voor krijgen

omdat bijna elke hobbyist deze chip gebruikt voor RFID.

Nadelen:

Lange levertijd. ( Ik heb er echter nog 2 thuis liggen dus dat maakt niet uit.)

Moet nog gesoldeerd worden. Vrij groot

Naam: 13.56MHz RFID/NFC Sticker

Prijs: €5

Verkoper: kiwi electronics

Levertijd: 1 week

16

Figure 11-rfid kit

Figure 12-rfid sticker

Page 17: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Link: https://www.kiwi-electronics.nl/13-56mhz-rfid-nfc-sticker-40x25mm-1KB?search=rfid&description=true

Voordelen:

Heel klein (4cm op 2.5cm) Betrouwbare verkoper Goedkoop Is een sticker dus ik moet me geen zorgen maken over hoe ik hem ga vastmaken in de bak.

Nadelen:

Zit geen sturingschip bij. Dus die moet nog apart gekocht worden, of moet geregeld worden met de pi zelf wat het veel ingewikkelder maakt dan het zou kunnen zijn.

Minder bekend, dus minder hulp op internet.

2.3.3 KeuzeIk kies voor de Arduino RC522 kit.

Deze keuze is in bijna alle opzichten beter behalve in de levertijd. Maar ik heb er al 2 thuis liggen van Arduino kits die ik als hobbyist ooit eens goedkoop heb besteld op Aliexpress.

2.3.4 ProbleemToen ik alles samen wou laten werken, merkte ik dat mijn adc altijd 0V gaf, wat niet klopte. Dit kwam omdat de RC522 de MISO lijn naar 0V trok ook al was zijn slave select lijn niet laag getrokken. Dus hij kwam aan de data lijnen op momenten dat het niet mag. De oplossing was vrij simpel; ik heb een normaly opened (het eerste wat ik vond) transistor tussen de MISO poort van de RC522 en de MISO lijn gezet. (transistor: BC547C) Omdat het een NO was moest de gate alleen hoog worden als de RC522 moest sturen.

Aangezien slave select lijnen standaard hoog zijn, ben ik gewoon via een weerstand van het andere SPI apparaat zijn slave select lijn naar de gate gegaan. Hierdoor zou de MISO altijd doorverbonden zijn behalve als het andere apparaat aangestuurd wordt. Op deze manier werkt het perfect maar je zou wel extra transistors parallel moeten zetten als je extra apparaten met SPI wilt.

Een andere mogelijkheid is met een normaly closed transistor de MISO altijd onderbreken tenzij de slave select van de RC522 laag wordt. (Door de gate te verbinden met de slave select van de RC522.) Er moet wel nog een weerstand voor de gate, het maakt niet echt uit welke weerstand maar om zeker te zijn heb ik hem toch berekend.

De minimum Hfe van de BC547C is 420, dus als er 1mA door de gate vloeit dan kan er maximum 420mA door de collector, wat veel meer dan genoeg is. De spanning van de slave select is 3.3V dus de weerstand is dan: 3.3V / 0.001A = 3k3. Natuurlijk hoeft het niet exact een 3k3 te zijn, maar alles wat ervoor zorgt dat de gate stroom niet te hoog wordt is voldoende. (De collector stroom is sowieso begrensd door de inwendige weerstand aan de MISO poort op de PI.)

2.4 Analog Digital Converter2.4.1 NutDe Joystick die ik van plan ben te gebruiken, gaat 2 analoge signalen sturen.

17

Page 18: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Analoge signalen zijn signalen die oneindig verschillende waarden kunnen hebben.

Digitale signalen daarentegen zijn signalen die in stappen gaan. Hoeveel spanning elke stap voorstelt, noemt men de resolutie.

Een ADC zet die analoge signalen om in digitale signalen en stuurt ze meestal via een bus verder.

Op mijn Raspberry pi heb ik alleen digitale pinnen die maar 2 stappen hebben; hoog en laag.

Daarom heb ik een ADC nodig om de analoge signalen om te zetten in digitale signalen.

18

Figure 13-ADC uitlegschema

Page 19: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.4.2 OptiesNaam: MCP3008

Prijs: €1.48

Verkoper: Aliexpress

Levertijd: 15 dagen.

Type: SAR

Voordelen

Wordt veel gebruikt, dus ik kan er veel informatie op internet over vinden. Werkt op SPI, wat ik al ken. Heeft time division multiplexing, waardoor je 8 channels kan inlezen voor de prijs van 1. Dit komt

goed van pas aangezien ik meer dan 1 channel moet inlezen. (X en Y van de joystick.) Werkt van 2.7V tot .5.5V dus ik kan hem rechtstreeks met mijn pi (3.3V) aansturen. SPI is iets sneller dan I²c. (Het andere populaire bus protocol.) Een voordeel van SAR t.o.v. sigma-delta is dat het een vaste berekentijd heeft. Wat voordelig kan

zijn in games.

Nadelen:

SPI is wel iets moeilijker dan bv I²c. (Maar zal wel lukken.)

19

Figure 14-MCP3008

Page 20: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Naam: PCF8591

Prijs: €1.74

Verkoper: Aliexpress

Voordelen:

Werkt op I²c, wat ik al ken. Heeft time division multiplexing, waardoor je 8

channels kan inlezen voor de prijs van 1. Dit komt goed van pas aangezien ik meer dan 1 channel moet inlezen. (X en Y van de joystick.)

Werkt van 2.5V tot .6V dus ik kan hem rechtstreeks met mijn pi (3.3V) aansturen.

SPI is iets sneller dan I²c. (Het andere populaire bus protocol.)

Nadelen:

I²c is iets trager dan SPI. (Het andere populaire bus protocol.)

2.4.3 KeuzeIk heb gekozen voor de MCP3008 op SPI, met als reden dat hij sneller zal zijn. Voor een game console draait alles om snelheid. Tevens heb ik ook al eens gewerkt met de MCP3008, wat me tijd zal besparen.

20

Figure 15-PCF8591

Page 21: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.4.4 BesturingDe MCP3008 kan gestuurd worden met een voltage van 2.7V tot 5.5V, wat betekent dat ik geen omwegen moet zoeken om het met mijn raspberry pi van 3.3V te kunnen laten praten.

Type adc: SAR

2.4.4.1 Hoe communiceren?De MCP3008 werkt op SPI, wat betekent dat ik 6 pins moet verbinden. (Waarvan 4 data pinnen.)

2.4.4.1.1Pins VDD: mag van 2.7V tot 5.5V, ik sluit deze aan op 3.3V

omdat de Pi ook op 3.3V werkt. Vref: De maximale spanning van je te meten signaal, mag maximum je VDD zijn. AGND, DGND: gewoon ground. MISO (Master In Slave Out): data van slave (MCP3008) naar master (Pi).(Dout op foto) MOSI (Master Out Slave In): data van master naar slave. (Din op foto) SS (Slave select, ook wel CS: chip select genoemd): Pin die maar naar 1 enkele Slave (SPI

component) gaat.De SS is normaal hoog, wanneer deze laag wordt getrokken, begint de chip te luisteren. Dit dient voor als je meerdere SPI chips wilt aansluiten op je Pi. Het aantal SS-pins van je Pi bepaalt dan hoeveel chips je maximaal (tegelijk) kan aansluiten. Maar als je zelf je library schrijft, kan je volgens mij, elke pin een SS pin maken. (Aangezien het gewoon een GPIO pin is die hoog of laag moet zijn.)In het pinout schema van de Raspberry Pi 3 t.e.m. de 3b+ heb je 2 SS-pins.Vanaf de Pi 4 heb je 4 verschillende SPI pin sets, met elk 2 SS pins.Ze noemen SPI_CE0_N en SPI_CE1_N.

SCK (serial clock): SPI is synchroon, wat betekent dat de master en de slave tegen dezelfde kloksnelheid werken. (Min of meer, de pi draait eigenlijk sneller maar voor SPI werkt hij tegen de ingestelde SPI snelheid.)Deze pin dient om die kloksnelheid in te stellen.

CH[0-7]: Channel pins, hier sluit je de analoge signalen aan.

21

Figure 16-MCP3008

Figure 17-MCP3008 port schematic

Page 22: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.4.4.1.2Communicatie

Figure 18-stuur schema

2.4.4.1.2.1 Uitleg SPI sturingSturen: (Je stuurt of ontvangt altijd 3 bytes.)

1. Byte 1 = 1 0b00000001 (startbit)2. Byte 2

a. Bit 1: single ended of differential. Single ended vergelijkt een channel met GND, differential vergelijkt 2 channels. (Zie tabel.)Meestal vergelijk je gewoon met GND dus dan is deze bit 1.Ik ga in mijn programma ook altijd Single ended meten.

b. De volgende 3 bits bevatten de meet channel poort nummer. (CH0, CH1, CH….)Bij de MCP3008 zijn er 8 channels dus 3 bits is juist genoeg. (2³ = 8)

c. De laatste 4 bits zijn altijd 0.3. Byte 3: allemaal 0.

Ontvangen: (De chip heeft 10 bit resolutie, dus er worden 10 nuttige bits terug gestuurd, maar toch ontvang je 3 bytes.)

1. Byte 1: xxxx xxxx x=random bit (negeren dus)2. Byte 2: xxxx x0DD D=nuttige data.3. Byte 3: DDDD DDDD meer nuttige data.

2.4.4.1.2.2 Commando’s Importeren van SPI library

o import spidev Code om datastroom te initialiseren (Begin programma)

o spi = spidev.SpiDev()o spi.open(0,0) #SPI bus 0 openen op SS 0

22

Figure 19-adress tabel

Page 23: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

o spi.max_speed_hz = 5000 #Max speed instellen Code om data te zenden/ontvangen

o result = spi.xfer2([1, (8 + port) << 4, 0]) Je stuurt een array van 3 ints. [int1, int2, in3], met de spi library Byte 1 is gewoon 1. (de startbit.) (alleen de laatste bit is 1) Byte 2:

Je stuurt single ended. (bit 4 is dus 1 2^4 = 8) en je stuurt naar CH0 dus bit 3,2,1 zijn 0 1*8 + 0*4 + 0*2 + 0*1 = 8 Dan shuif je die nibble (4 bits) 4 plaatsen op naar links. ( << 4 ) Hierdoor wordt de eerste nibble je data en de laatste 0000

Byte 3 is gewoon 0. Code om data om te zetten

o adcValueX = (((result[1] & 3) << 8) + result[2])o Het doel hier is om van de array van 3 bytes die we krijgen een int te maken met alleen

de 10 bits data die we nodig hebben Byte 1 kan je al weglaten, er zit niks nuttigs in. Van Byte 2 willen we alleen de laatste 2 bits.

Door hem de “and-den” met 3 (of 0000 0011 binair) hou je alleen de laatste 3 bits over.

Dus result[1] & 3 We willen ook dat deze de eerste 2 bits van onze uitkomst voorstellen,

dus we schuiven ze acht bits op. ( << 8 .) Van byte 3 willen we alle 8 bits, dus hier veranderen we niks aan Om nu van die 2 bytes 1 int te maken kunnen we ze gewoon optellen omdat we

de eerste byte 8 bits naar links hebben opgeschoven. Code om de datastroom dicht te doen.

o spi.close() bus vrijgeven BELANGERIJK (Anders moet je de pi opnieuw opstarten voor het

programma opnieuw werkt omdat de bus nog in gebruik zal zijn.)

2.4.4.1.3Code

23

Page 24: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.4.4.2 Aansluiting

Figure 20-MCP3008 aansluitschema

24

Page 25: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.4.5 SARSAR staat voor successive approximation register. Het is een van de meest voorkomende type adc.

2.4.5.1 Werking

Stel we sluiten 11.2V aan de Vin aan en 16V aan de Vref.

1. De Vin wordt vergeleken met de output spanning van de DAC. (In de eerste stap is dat 0V omdat de SAR nog op 000000 staat.)

2. Als de spanning van de + van de comparator (Vin) groter is dan de – (output DAC) dan wordt de volgende bit een 1. (Eerste stap: 11.2 > 0 dus 1 in eerste bit van de SAR, de waarde van de SAR is nu 100000 i.p.v. 000000.Als dat niet zo is dan stuurt de comparator een 0 door en dan maakt de SAR de vorige bit 0 en de volgende bit 1.

3. De DAC maakt van de nieuwe waarde van de SAR een nieuwe spanning. De MSB is +Vref/2 daarnaast +Vref/4 enzovoort. (Eerste stap: DAC leest 100000 en stuurt dus Vref/2 wat 8V is.

Vanaf hier beginnen we terug bij stap 1, Vin wordt nu vergeleken met 8V. Vin is groter dan 8V dus de tweede bit in de SAR wordt ook een 1.

Dan krijgt de DAC 110000 en maakt daarvan 8 + 4 + 0 + 0 + 0 + 0 = 12V van.

Dan wordt Vin opnieuw vergeleken maar deze keer is Vin lager dan 12V dus wordt er een 0 gestuurd. De SAR weet dan dat hij iets lager moet en maakt verandert zijn 110000 dus in 101000.

De DAC maakt hiervan 8 + 0 + 2 + 0 + 0 + 0 = 10V.

Vin is weer groter dan de DAC waarde dus de 4de bit wordt een 1, dus de waarde is nu 101100.

De DAC maakt daarvan: 8 + 0 + 2 + 1 + 0 + 0 = 11V.

Dat is nog steeds lager dan Vin dus bij de volgende ronde wordt de SAR waarde 101110. (11.5V)

Dat is weer te veel dus de SAR maakt er 101101 van.

Dat was de laatste bit, dus hij wordt nog 1 keer gecontroleerd en blijkt weer te hoog te zijn dus de vorige (laatste) bit wordt een 0 en de volgende bit bestaat niet meer dus het is klaar.

De SAR heeft zo nauwkeurig mogelijk de spanning bepaalt en dat is 0b101100 ofwel 11V.

25

Page 26: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.5 Joystick2.5.1 OptiesNaam: Dual-as XY Joystick Module PS2 Joystick KY-023

Prijs: €0.50

Verkoper: Aliexpress

Voordelen:

Van Arduino, dus veel uitleg/hulp op internet. Ik ken iemand die precies deze component vorig jaar heeft gebruikt. Goedkoop Heb ik thuis liggen

Nadelen:

Geeft 2 analoge waarden weer, dus voor hem te kunnen gebruiken zal ik een analog digital converter, verbonden met een seriële bus zoals I²c of SPI, nodig hebben.

Link: https://nl.aliexpress.com/item/32656963271.html?spm=a2g0o.productlist.0.0.5495692em6IDLA&algo_pvid=94483e82-f90e-45d7-ba1e-a8da1e0e4aa8&algo_expid=94483e82-f90e-45d7-ba1e-a8da1e0e4aa8-4&btsid=cb236652-811c-4a11-983b-0da1f4a6557b&ws_ab_test=searchweb0_0,searchweb201602_7,searchweb201603_52

26

Figure 21-Arduino Joystick

Page 27: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Naam: Arcade joystick DIY Joystick

Prijs: €5

Verkoper: Aliexpress

Levertijd: 45 dagen.

Voordelen:

Retrolook Retrofeel

Nadelen:

Te groot wanneer vergeleken met de rest van de console, zou er heel raar uitzien.

Met de hefboom van deze hendel zou misschien heel het kastje verschuiven wat uiteraard niet de bedoeling is.

Er stond niets op de site van uitvoer, misschien is het analoog zoals bij de Arduino joystick, misschien niet.

Minder betrouwbaar Minder uitleg op internet

Link: https://nl.aliexpress.com/item/32986375817.html?spm=a2g0o.productlist.0.0.4c5839a0UyvAq0&algo_pvid=518a9b8b-2ea5-4329-84af-425e43e77ea4&algo_expid=518a9b8b-2ea5-4329-84af-425e43e77ea4-3&btsid=367a3e3a-ab53-4798-9661-b646c0d32401&ws_ab_test=searchweb0_0,searchweb201602_7,searchweb201603_52

2.5.2 KeuzeIk kies voor de Arduino joytstick omdat dit de goedkoopste en snelste oplossing is.

27

Figure 22-Retro Joystick

Page 28: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.5.3 BesturingDe joystick die ik gekozen heb heeft normaal 5 pins.

2.5.3.1 Pins GND: ground +5V: normal 5V, maar dat is omdat de arduino (voor wat hij

is gemaakt.) op 5V werkt en dus van 0V tot 5V kan lezen.Mijn raspberry pi werkt op 3.3V, dit zorgde voor een probleem. (Zie joystick problemen subtitel hier onder.)

VRx: voltage van de x potentiometer. (Aansluiten op een channel van de ADC.)

VRy: voltage van de y potentiometer. (Aansluiten op een channel van de ADC.)

SW: De drukknop onder de joystick.

2.5.3.2 Problemen & oplossingen Voltage verschil Arduino & Raspberry Pi

o Het probleem was dat de joystick gemaakt is voor op 5V te werken en dus 5V signalen kan terugsturen.Dit is een probleem want mijn raspberry pi 3b+ is gemaakt voor maximaal 3.3V signalen te lezen.

o Een makkelijke oplossing zou zijn om tussen de VRx en VRy poorten een logic level converter te steken, maar het kan ook veel simpeler worden opgelost.

o Aangezien deze component gewoon bestaat uit 2 potentiometers en een drukknop, kan ik hem gewoon op 3.3V aansluiten en zou hij hetzelfde moeten werken.De potentiometers werken dan exact hetzelfde, maar op 3.3V.De drukknop heeft een weerstand die berekend is om op 5V een stroom door te laten die een arduino gemakkelijk aan kan, wat deze waarde is weet ik niet. (De datasheets van arduino componenten zijn heel beperkt.)Maar dat maakt niet uit want als het voltage verlaagt zal de stroom hetzelfde doen.

De drukknop weerstand is niet inbegrepen.o Toen ik deze component voor het eerst heb getest, werkte de drukknop niet. Dit kwam

omdat de weerstand “R1” niet op de print gesoldeerd is.Ik ben hiermee naar mijn klastitularis gegaan, (Mr Smets) en we hebben toen samen de print ge-reverse engineered en zijn tot een oplossing geraakt.

o We konden niks veranderen aan de GND en (+5V) pins, want anders zou de rest van de joystick niet hetzelfde werken.

o Hier rechts zie je het ge-reverse engeneerde schema van de drukknop in de joystick.

o Hier zie je de oplossing die we erop gevonden hebben.

28

Figure 23-Arduino Joystick

Figure 24-schema zonder oplossing

Page 29: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Wanneer de drukknop in rust staat, staat er 3.3V over de drukknop.En de SW (drukknop) pin aan de 3.3V kant.

Wanneer de drukknop wordt ingedrukt, staat er 3.3V over de bijgevoegde weerstand.De weerstand staat nu aan de GND kant.

2.5.3.3 Code sturing joystickVoor uitleg over SPI en ADC’s zie hoofstuk:”Analog Digital Converter”.

29

Page 30: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.5.3.4 Aansluiting

30

Figure 26-MCP3008+Joystick schema

Figure 27-MCP3008+Joystick schema

Page 31: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.6 Klein scherm2.6.1 NutWanneer je een spel speelt, weet je graag wat je momentele score is.

Het groot scherm is 16 pixels breed en 16 pixels hoog. Deze resolutie is te laag om er in het klein letters en nummers op te laten komen.

Daarom heb ik er nog een klein scherm bijgevoegd om informatie op te laten komen zoals je naam, je score, en de highscore van dat spel.

2.6.2 OptiesNaam: EA LED66X40-GR LED-verlichting, groen/rood

Prijs: €14,73 (waarvan €6.95 verzendkosten)

Levertijd: 1-2 werkdagen.

Verkoper: Reichelt

Link: https://www.reichelt.nl/led-verlichting-groen-rood-ea-led66x40-gr-p140431.html?&trstct=pos_2

Voordelen:

Werkt op I²c of op SPI, hierdoor heb ik veel minder data pins nodig. Vrij goedkoop.

Nadelen:

Ik vind hierover niet veel op het internet.

Naam: LCD 162C LED LCD-MODULE 16X2 M.BEL.

Prijs: €16,20

Levertijd: 1-2 werkdagen

Verkoper: Reichelt

Voordelen:

Vrij goedkoop. Een van de meest gebruikte lcd displays onder hobbyisten, dus je vindt veel info op het internet.

Nadelen:

Gebruikt 6 datapins.

31

Figure 28 Groen/Rood lcd scherm

Figure 29 16x2 LED LCD mudule

Page 32: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Naam: LCD module Blauw Groen scherm 1602 LCD scherm

Prijs: €1.89

Levertijd: 42 dagen.

Verkoper: Aliexpress

Link: https://nl.aliexpress.com/item/32786773241.html?

spm=a2g0o.productlist.0.0.54db7d59ebmRF6&algo_pvid=8d5a8fe4-66d5-4371-acd4-871621d9ccde&algo_expid=8d5a8fe4-66d5-4371-acd4-871621d9ccde-0&btsid=f65d884a-b688-4862-804d-f6c01ffb50a0&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_60

Voordelen:

Super goedkoop. Eigenlijk exact hetzelfde al die van Reichelt, maar dan €12 goedkoper. Ik heb er al 1 thuis liggen. Een van de meest gebruikte lcd displays onder hobbyisten, dus je vindt veel info op het internet.

Nadelen:

Gebruikt 6 datapins. Lange levertijd. Van Aliexpress; je weet niet 100% zeker dat hij wel goed werkt. (Tenzij als je hem al thuis hebt

liggen.☺)

2.6.3 KeuzeIk kies voor de LCD matrix van Aliexpress omdat bijna alle nadelen niet tellen voor mij:

Ik heb hem thuis liggen dus ik hoef niet lang op hem te wachten. Hij gebruikt 6 data pins, maar ik gebruik helemaal nog niet zoveel datapins dus ik hoef hier niet

voor op te letten. Ik heb er 1 thuis liggen, ik weet zeker dat ik hem ga kunnen besturen en vrij zeker dat het samen

gaat gaan met de andere componenten. Dit is eigenlijk een goedkope deal met weinig risico.

32

Figure 30 16x2 LED LCD mudule

Page 33: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Gyro sensor2.6.4 NutAls eventuele uitbreiding voor mijn eindwerk wil ik een minicontroller maken en deze, eventueel draadloos met een Raspberry Pi Zero W. Ik ga er een gyro sensor op zetten om zo spelletjes te maken zoals doodle jump.

Aangezien dit uitbreiding is, hoef ik hem niet noodzakelijk snel te hebben en is Aliexpress een goede optie, ook al heb ik dit achteraf nog bedacht en moet ik er dus langer op wachten.

2.6.5 OptiesNaam: GY-521 MPU-6050 MPU6050 Module 3 Axis analoge gyro sensor + 3 Axis Accelerometer Module

Prijs: €0.68

Link: https://nl.aliexpress.com/item/1954221775.html?spm=a2g0s.9042311.0.0.370e4c4dMg2RGu

Levertijd: 49 dagen

Voordelen:

I²c output Werkt op 3.3V Heeft ook een accelerometer, wat ik kan gebruiken

om vb. schudden te detecteren. Super goedkoop Van Arduino, dus er is waarschijnlijk veel informatie

over op het internet. Klein

Nadelen:

Lange levertijd

Naam: DEBO SENS 3AXIS Ontwikkelaarsraden - Acceleratie & Gyroscoop, 3-assig, MPU-6

Prijs: €9,44 (Waarvan €6.95 verzendingskosten.)

Levertijd: 51-2 dagen

Voordelen:

I²c Werkt op 3.3V Heeft ook een accelerometer, wat ik kan gebruiken om vb. schudden te detecteren. Van Arduino, dus er is waarschijnlijk veel informatie over op het internet. Klein & snelle levering

Nadelen:

Veel duurder dan die van AliExpress, terwijl ze exact hetzelfde zijn.

33

Figure 31GY-521-MPU-6050 gyrosensor

Page 34: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.6.6 KeuzeIk kies voor de goedkope van Aliexpress omdat ik toch nog tijd heb voordat hij moet aankomen en ze zijn exact hetzelfde.

2.7 Development PCB board2.7.1 Uitleg Aangezien ik het grootste deel van mijn componenten op aparte plaatsten nodig heb, zoals de RFID links tegen de muur, alle inputs op de juiste plaats, het scherm, en het lcd scherm bij de inputs, kan ik niet alles op 1 pcb zetten. Ik kan meerdere PCB’s maken, maar dat lijkt me verloren moeite aangezien ik dan bijna een aparte PCB per component moet maken wat veel geld zal kosten en er moeten nog draadjes tussen. Dus de draadjes gaan er sowieso zijn.

Daarom is een betere manier van aansluiten development PCB board, ik ga een aantal kleine bordjes bestellen en zelf alle componenten eraan solderen en verbinden. Ik ga wel 1 gewoon PCB maken waar ik mijn Raspberry Pi op kan aansluiten en vanaf daar via AST 021 connectors kan verder gaan naar de development boards.

Het lijkt misschien dat dit overkill is maar volgens meneer Smets is dit goed tegen slecht contact. Hij zei ook dat als je slecht contact hebt dan is het vaak de dag voor de Jury wanneer je alles snel opstelt. Deze connectors moet je niet aandraaien maar gewoon klikken, wat de levensduur verlengt aangezien je juist genoeg druk op de kabels zet in plaats van te blijven draaien tot het niet meer gaat.

2.7.2 OptiesNaam: 5 PCS Universele PCB Board 50x70mm 2.54mm Hole Pitch DIY Paper Prototype Printplaat Panel 5x7 cm Enkelzijdige Board

Prijs: €0.78 (per 5pcs)

Link: https://nl.aliexpress.com/item/32858951350.html?spm=a2g0s.9042311.0.0.39274c4d9WX9g3

Levertijd: 40 dagen

Voordelen:

Super goedkoop Juist groot genoeg voor de grootste component

(De pin spreader) 5 stuks, dus ik kom toe met 1 lot

Nadelen:

Vrij lange levertijd Metaal langs maar 1 kant

34

Page 35: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Naam: 4 stks/partij 4x6 5x7 6x8 7x9 Double Side Prototype PCB Universal Gedrukt circuit Board

Prijs: €2.09

link: https://nl.aliexpress.com/item/32824842884.html?spm=a2g0o.productlist.0.0.4e3b68c2qdYBm9&algo_pvid=abf91fe2-1646-4aaa-a8aa-135cf5034617&algo_expid=abf91fe2-1646-4aaa-a8aa-135cf5034617-0&btsid=c2ece4a5-b889-415d-b91b-

dc8b43656ab7&ws_ab_test=searchweb0_0,searchweb201602_4,searchweb201603_53

Levertijd: 70 dagen

Voordelen:

Hoge kwaliteit Metaal langs 2 kanten. 4 stuks (Wel maar exact genoeg) Goedkoop.

Nadelen:

Zeer lange levertijd.

2.7.3 Keuze:De bruine, ze zijn iets goedkoper, exact groot genoeg en ik krijg er meer. Maar de grootste reden is de levertijd van de andere optie.

35

Page 36: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.8 Audio2.8.1 UitlegGeluidseffecten zijn een belangerijk deel van een spelletje. Geluid op mijn eindwerk leek eerst heel simpel; je kan namelijk met python heel gemakkelijk geluid sturen naar een raspberry pi. Maar het bleek in combinatie met juist het scherm dat ik heb heel moeilijk te zijn, aangezien de zelfde hardware nodig is op het zelfde moment.

2.8.2 Opties2.8.2.1 Audio jack van de Pi 3b+Met de library “os.system” kan je shell commando’s in python gebruiken en kan je met het programma omxplayer geluid afspelen.

Dit doe je zo: os.system("omxplayer sounds/sfx_flappy_die.mp3")

Er bestaat ook een library genaamd pygame (Het onderdeel “mixer”) dat gemaakt is om in python geluid af te spelen.

Het probleem echter met mijn eindwerk was dat alle dingen die ik aanstuur, de hele tijd storingen veroorzaken op de audio jack. Ik heb alles wat ik op het internet vond geprobeerd om dat op te lossen maar het werkte niet. Vooral het scherm veroorzaakte de meeste storingen, maar die moest sowieso om een bepaalde tijd gestuurd worden. (Een tijd korter dan de duur van de geluidseffecten.)

De raspberry pi genereert de verschillende spanningsniveaus voor geluid met PWM. En dit moet software PWM zijn aangezien het constant verandert. Maar PWM wordt door heel wat meer gebruikt dan alleen audio generatie, ik kan dus bijvoorbeeld niets naar mijn scherm sturen of niets uitlezen van mijn joysticks terwijl er audio wordt afgespeeld.

2.8.2.2 Bluetooth audioWat misschien wel zou kunnen samenwerken met mijn eindwerk is bluetooth audio. Aangezien de box dan het PWM signaal genereert.

Een nadeel hiervan is dat het voor een te grote delay zou zorgen tussen de actie in het spel en het geluid.

Ik meette iets meer dan 1 seconde maar dat is al heel veel voor een spelletje, stel je voor dat je op een knop klikt en dat het een hele seconde duurde voor het geluid kwam.

Een groter nadeel is dat het geluid realtime moet doorgestuurd worden naar bluetooth box, wat betekent dat het even lang duurt om het commando te sturen, wat het weer gevoelig maakt voor storingen. (Simpeler gezegd: De Pi moet nog altijd het geluid zelf genereren om het te sturen.)

2.8.2.3 RS232 naar Pi zeroEen derde optie was om heel het audio-gebeuren door een ander apparaat te laten doen. Het enige nadeel leek dat dit het eindwerk direct €10 duurder zou maken. Ten minste dit dacht ik, ik wou het met een Raspberry Pi Zero W doen. Maar deze heeft blijkbaar geen audio jack, wat het wederom veel ingewikkelder zou maken.

36

Page 37: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

2.9 Vermogen TabelOm een idee te krijgen hoeveel mijn eindwerk gaat verbruiken heb ik een vermogen tabel gemaakt, maar omdat de waardes die ik online vond van sommige component niet echt accuraat is heb ik ook wat schattingen gemaakt. De kolom “Typ” van Typical gaat geeft de waarde weer die ik verwacht dat mijn eindwerk meestal gaat trekken. (De tabel lijkt hoge waardes te geven, maar hij staat in mW.)

2.9.1 Probleem?Er staat dat het maximum vermogen 53W is, maar mijn supply kan maar 50W leveren. Maar dit komt omdat sommige waardes nogal ruim genomen zijn, een ledstrip met WS2812b zou veel meer trekken dan mijn scherm omdat je daarbij de weerstand van de lange kabels moet tellen. Maar mijn scherm voedt zijn strip om de 16 leds i.p.v. 256, waardoor het Jouleverlies gedeeld wordt door 16.

2.9.2 Prijs per uurMet deze info kan ik een prijs per uur bereken van €0,00463983219. (Ik heb €0,2331 als prijs per kWh genomen maar deze prijs kan veranderen.)

Dit gaat er ook van uit dat de Raspberry Pi constant belast wordt.

37

Page 38: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Voor een idee te krijgen, als ik dit op de kermis zet en €20 geef als je Stacker kan uitspelen en ik vraag €0.10 per keer dat je speelt. (Na mijn 2de presentatie hebben de leerlingen dit bijna constant gespeeld voor een uur en niemand kon het uitspelen, en elke 10s werd er gemiddeld een nieuw spel gestart.)

Als je per minuut 1 iemand telt die probeert de €20 euro te winnen dan heb je een omzet van ongeveer €60 per dag van 10u. Dat wordt €40 per dag als je telt dat 1 iemand wint per uur wat waarschijnlijk niet zo zal zijn. (En voor veilig te zou ik kunnen instellen dat er maximum een aantal mensen mogen winnen voordat de prijs wordt uitgeschakeld en je alleen nog maar gratis spelletjes kan spelen.)

2.9.2.1 Web interface audioWat eventueel ook zou kunnen werken is het geluid al laten laden op een pagina op het internet met de Flask server. Het idee is dan om het geluid al op de site te zetten, en het dan via een javascript functie ofzo af te spelen. Wat misschien een probleem ging zijn is de latency van de Flask server. Hij werkt namelijk met polling, wat betekent dat je om de zoveel seconden gaat kijken of er nieuwe informatie is. Ik kon proberen om deze tijd zo laag mogelijk te zetten en daardoor de Flask server tot zijn uiterste te duwen, wat geen probleem zou zijn zolang hij snel genoeg is.

Maar als hij niet snel genoeg is was een andere optie Web Sockets.

Met Web Sockets heb je een constante connectie die altijd opengehouden wordt, wat ervoor zorgt dat de latency veel lager is.

38

Page 39: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

3 Console Behuizing3.1 OptiesIk had de keuze tussen een game boy stijl (dikke tablet) en een miniatuur lunapark retrokast.

3.1.1 Game boyDe game boy aanpak heeft als voordeel dat het compacter is, wat het project sowieso goedkoper zou maken en het zou in de kast passen die we van onze titularis hebben gekregen om ons eindwerk in op te bergen.

3.1.2 miniatuur lunapark kastDe miniatuur lunapark retrokast daarentegen zou groter zijn, wat betekent dat ik meer behuizingmateriaal zou nodig hebben wat mijn eindwerk duurder zou maken. Maar als voordelen heeft het dat ik veel meer plaats had, wat meer uitbreidingsmogelijkheden en werkruimte geeft. De retrolook is een stijlbreuk met de huidige gsm’s en tablets, en kan een “nieuwe” spelervaring zijn voor onze generatie.

Met de retrokast kan ik mijn eindwerk gemakkelijk demonteerbaar maken, ik kan de achterplaat loskoppelbaar maken, wat me direct toegang tot de hele binnenkant geeft. Ook kan ik het scherm loskoppelbaar maken, wat me de mogelijkheid geeft om er later lichtbrekende plastic voor te steken. (zodat de leds niet rechtstreeks in je ogen schijnen.)

3.1.3 keuzeUiteindelijk heb ik voor de retrokast gekozen, ik vind het belangrijker om makkelijk te kunnen werken aan mijn console dan dat ik het makkelijk kan wegbergen. Ik kan het thuis laten staan en alleen mee naar school nemen wanneer dat nodig is.

En over het algemeen had de retrokast meer voordelen dan de game boy aanpak.

3.2 MateriaalIk wou mijn behuizing sowieso uit hout maken omdat het een betere retrolook geeft en over het algemeen mooier is dan plastic.

Maar ik twijfelde tussen twee soorten hout: platen materiaal (triplex geverfd) en massief hout.

Massief hout is mooier maar ook duurder en moeilijker te bewerken.

Platen materiaal zou de retrolook beter benadrukken, verder is het ook goedkoper en makkelijker te bewerken.

Dus mijn keuze is platen materiaal.

Om mijn eindwerk een robuuste finish te geven was ik van plan er eventueel langs de zijkanten aluminium L-profieltjes in te steken, zoals grotere muziekinstallaties op al hun componenten hebben. Maar aangezien die veel te groot en zwaar zijn voor mijn eindwerk heb ik dat idee opgegeven.

39

Figure 32-behuizing schets

Figure 33-voorbeeld metalen randen

Page 40: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

3.3 Console pcb schemaZoals ik eerder al heb gezegd bestaat mijn eindwerk uit verschillende boards met componenten op, maar degene waar ik mijn Raspberry Pi op aansluit is een getekende en uitgesneden. Besteld op jclpcb.com.Deze pcb bestaat vooral uit connectors die dan naar de aparte componenten gaan.

3.3.1 Praktisch shema.

Figure 34 Praktsich schema

40

Page 41: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

3.3.2 Praktische board layout

Figure 35 Praktisch Board

41

Page 42: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

3.4 3D printen3.4.1 Voordelen & prijsDrukknoppen, exact zoals ik ze wou, worden niet gemaakt, dus heb ik ze getekend en laten 3d printen. Dit is zeer goedkoop voor niet te grote onderdelen en je kan het exact maken zoals jij het wil. De normale prijs is rond de €0.025/gram filament, maar omdat je soms ondersteuningen moet printen zodat het werkstuk niet ineen zakt tijdens het printen en omdat de print soms kan mislukken kost het meestal iets meer.

Ik heb mijn drukknoppen laten printen bij iemand die ik kende met een 3D printer genaamd Simon Huysmans. Ik moest voor alles wat ik heb laten printen samen maar €2 betalen. Ik heb alles getekend in Inventor van Autodesk. Al hun producten zijn gratis voor leerlingen tot ze afstuderen. Het duurt wel even voor je kan tekenen met zo’n 3d tekenprogramma maar het resultaat is het zeker waard.

3.5 DrukknoppenNormaal gezien ging ik drukknoppen kopen die al in de juiste vorm zaten maar dat was heel moeilijk te vinden, en toen ik doorhad dat mijn houten plank bijna 2cm dik was en de knopjes dus zeer hoog moesten zijn wist ik dat ik ze moest laten 3d printen.

Ik had 2 soorten knopjes nodig:

4 pijltjes 2 vierkantjes. (1 als midden knop en 1 als stopknop)

3.5.1.1 Pijltjes poging 1In het begin wist ik nog niet dat de knopjes 19mm groter moesten worden dus had ik het volgende gemaakt. Ik had de klemsystemen nagetekend van de originele button caps. Sommige delen moesten kunnen buigen om vast te klikken dus moest ik ze dun genoeg tekenen. Ik had ze dikker getekend dan het dunste dat Simon zijn printer kon printen, maar omdat het zo dun en zo recht omhoog was zijn de armpjes ingezakt tijdens het printen en moest ik een andere oplossing voor het vastmaken aan de switches bedenken.

3.5.1.2 Pijltjes poging 2Met wat ik geleerd had uit poging 1 heb ik de volgende knoppen gemaakt.

Ik ben begonnen uit de vorige tekening omdat ik de vorm goed vond en heb het vastklemstuk weggeknipt en een nieuw design daarvoor getekend, en alles 19mm langer gemaakt. De nieuwe drukknop moet met lijm worden vastgemaakt.

42

Page 43: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

3.5.1.3 Midden knopVoor binnen in de pijltjes had ik nog een gewone knop nodig; normaalgezien ging ik daarvoor de originele nemen maar omdat de knoppen nu 19mm langer moeten zijn heb ik de vorige tekening genomen en alles behalve de onderkant weggedaan, dan opgeknapt (de twee ontbrekende 3driehoekjes) en ten slotte gewoon een blokje op getekend. Dit alles was 5 minuten werk. De reden dat ik geen holle binnenkant meer heb getekend is omdat het toch niet volledig wordt gevuld, er wordt een structuur van dunne stukjes filament gebruikt om de print op een zuinige manier toch stevig te maken.

3.5.1.4 Knopjes poging 3UIteindelijk moest ik de knopjes bevestigen op mijn eindwerk. Ik had er niet aan gedacht dat je alleen ronde gaatjes kon boren en de oude knopjes zagen er nogal raar uit in die ronde gaatjes.

Daarom heb ik deze nieuwe getekend, 5 dezelfde knopjes, super simpel.

Gewoon een cilinder die vanboven een beetje is afgerond, 1mm dunner dan het gat waar ze in zitten. Door de wrijving van het gat bleven de knopjes niet aan je vinger plakken en had ik dus geen klemsysteem of lijm nodig. (Lijm kon de knopjes misschien vastlijmen en dan had ik een probleem.)

Het knopje dat eerst ongeveer een half uur duurde om te tekenen, duurde nu nog een halve minuut en zag er even goed uit.

43

Page 44: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

3.5.1.5 Joystick poging 1Op mijn Arduino joystick zit een cap zoals die op een PlayStation controller, wat niet echt is waar ik naar zocht. Dus heb ik die eraf getrokken en heb ik een nieuwe getekend. Maar er waren 2 problemen met mijn eerste tekening:

Omdat de connector een speciale vorm heeft moest mijn opening heel exact geprint worden, maar dat ging niet en dus paste hij niet.

Ik had de bol niet helemaal rond getekend omdat dat er in Inventor leuk uitzag, maar in het echt is dat vrij lelijk.

Dus daarom heb ik een nieuwe getekend.

3.5.1.6 Joystick poging 2Na de aanpassingen zag hij er zo uit, maar omdat er ergens tijdens het tekenen iets verkeerd is gegaan werd hij een beetje anders toen hij werd afgeprint (niet perfect rond maar met vlakken zoals een voetbal), maar ik was er tevreden mee dus mijn 3d print avontuur was voorlopig klaar.

44

Page 45: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4 CodeIk ben niet van plan om alle code uit te leggen maar gewoon de code die misschien wat moeilijker te begrijpen is, de volledige code vind je achteraan de scriptie of op mijn website. (rik20192020.kogekaschoolverlaters.be)

4.1 LegendeHier wat uitleg over de basisfuncties en variabelen, waar ik in elk programma naar verwijs zodat je direct mee bent.

Rpi_ws251x library, de library die ik gebruik om mijn led scherm aan te sturen.

o LED_COUNT: het aantal leds in je ledstrip

o LED_PIN: de pin waarmee je pwm stuurt, er staat dat je ook met SPI kan sturen maar dat heb ik nooit kunnen laten werken.

o LED_DMA: De direct acces memory channel die de library zal gebruiken om het pwm signaal te genereren. Best channels: 0, 1, 2, 3, 5, 6, 7 niet gebruiken omdat ze door andere processen standaard worden gebruikt.

o LED_BRIGHTNESS: De helderheid van je hele scherm, je kan elke kleur van elke led op een ws2812 strip een pwm waarde geven en hij onthoudt en genereert die waarde zelf. Deze waarde wordt door de library er mee in berekend bij het sturen, dus als je een rood waarde van 255 stuurt (Het maximum, je moet een 8 bit waarde sturen.), dan maakt de library er de LED_BRIGHTNESS van. En als je een andere waarde geeft, dan maakt de library die waarde * LED_BRIGHTNESS / 255.

o LED_INVERT: Als dit True is dan wordt het signaal inverted. (0 wordt 1 en andersom.)o LED_CHANNEL: Moet je 1 maken als je een van de volgende GPIO pins gebruikt: 13, 19,

41, 45, of 53.o strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT,

LED_BRIGHTNESS, LED_CHANNEL)De Adafruit_NeoPixel class heeft om een object te maken al die argumenten nodig.Die class is eigenlijk een lege class die de PixelStrip class inherit, wat wil zeggen dat de Adafruit_NeoPixel class alles kan wat de PixelStrip class kan, en als je er nog extra functionaliteit in zou maken, zelfs meer. Maar aangezien het een lege class is, is het gewoon een kopie van de PixelStrip class.Ik maak in die regel dus een object aan van de class Adafruit_Neopixel.

o Strip.begin()Initialiseer de strip, moet 1 keer gecalled worden voor de andere functies werken.

o Color()Een functie die van 3-8 bit kleuren waarden 1-24 bit waarde maakt en ook rekening houdt met LED_BIRGHTNESS. Je moet dus gewoon 3 kleuren meegeven (Waarden van 0-256 8 bit), en dan returned de functie de rggb kleur.

45

Figure 36 Global variables

Page 46: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Dit wordt gedaan door deze regel code in de library:return (white << 24) | (red << 16)| (green << 8) | blue

o Setpixelcolor(lednr, kleur) #Zet “Kleur” in nummer “lednr” van de ledstrip array die de library heeft aangemaakt.

background_color = Color(50, 0, 0) De achtergrondkleur, gemaakt met een functie van het rpi_ws281x library die ik hiervoor net besproken heb.

Slen = 16 De breedte en hoogte van mijn led scherm. (Side length, vierkant scherm) Convert() Een functie die ervoor zorgt

dat als ik een led nummer geef dat hij er het nummer van maakt zoals een scherm en niet zoals een slang van een ledstrip die van links naar rechts en dan andersom.Dit doe ik door eerst te kijken of de rij van de positie een oneven rij is met: En als dat zo is, draai ik de rij om met de rest van de functie:

o Eerst bereken ik het aantal rijen. (In python 3.x moet je // doen, dit doet hetzelfde als / in python 2.7.x. In 3.x behoudt / de originele variabele types niet dus een deling van een int door een int, kan dan een float worden.)

o Dan bereken ik de rest van de vorige deling waardoor ik enkel de led positie in die rij krijg.

o Als laatste tel ik alles terug op maar spiegel ik de rijpos, de -1 is omdat mijn berekening telde van 1 tem 16 per rij maar in werkelijkheid is het van 0 tem 15.

o Als de rij van de positie niet oneven is, return ik gewoon hetzelfde getal zonder het aan te passen.

o De get = int(get) is omdat toen ik het programma veranderde van python 2.7 naar 3.5, er zoveel dingen veranderden dat ik niets meer op mijn scherm kreeg omdat het floats werden door de nieuwe logica. Deze regel is een failsafe.Elke waarde die naar mijn led scherm wordt gestuurd, passeert hierlangs dus door er hier al een int van te maken komt het wel op mijn scherm en kan ik uitzoeken waar het probleem zit.

convertPos Een functie die van een X en een Y coördinaat een lednr maakt door het Y coördinaat maal slen te doen. (Side length)Vervolgens kan ik de waarde nog langs de functie convert sturen; de reden hiervoor las je hier net boven.

46

Figure 37 Schets convert functie

Figure 38 Convert function

Page 47: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2 Flappy Bird4.2.1 SpeluitlegJe kent Flappy Bird waarschijnlijk wel maar ik zal het kort uitleggen.

Dit is een spel origineel gemaakt door Dong Nguyen bij zijn game development bedrijf DotGears.

Het is een spel waarbij je constant vooruit gaat en op Mario style buizen afvliegt, die je dan moet ontwijken door te springen.

47

Page 48: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.2 Verloopschema

Figure 39 Flappy Bird Oversimplified

48

Page 49: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.3 Even kortAangezien we met de klas nooit classes hebben gezien in python zal ik een beetje uitleg over geven over hoe ze werken, doorheen de uitleg van de FlappyBird class.

Moest je niet weten hoe een class werkt, lees dan “Basis van een class” hieronder, anders sla je dit deel best over en ga je rechtstreeks naar “Code indeling”.

4.2.3.1 Basis van een class4.2.3.1.1Het nutStel je schrijft een programma over een auto en je hebt variabelen: de snelheid, de grootte, de breedte en hoeveel brandstof.

Dat zou vrij simpel zonder class gaan maar toch is het beter het met een class te maken.

Stel je wil namelijk een tweede auto, dan moet je al die variabelen opnieuw maken en je moet ze ook anders noemen. Dit wordt heel snel heel onoverzichtelijk.

4.2.3.1.2De classIn dit voorbeeld zou je dan een class maken bijvoorbeeld genaamd Auto.

Auto is gewoon de class, vergelijkbaar met de fabriek van de auto’s.

4.2.3.1.3De membersDe members van Auto zijn dan de variabelen waar je eerder mee zat te knoeien.

4.2.3.1.4De objectenStel je wilt nu 1 auto, dan maak je een object van de class Auto. En noemt hem bijvoorbeeld Auto1.

Dit doe zo: Auto1 = Auto()

Auto1 is een object van de class Auto, dus hij heeft alle members van die class.

Auto1.snelheid is bijvoorbeeld de snelheid van Auto1.

Als je nu een Tweede auto wil maken, doe je dit super simpel op dezelfde manier als Auto1. Het tweede object (Bijvoorbeeld Auto2) heeft nu ook alle members van de class Auto en die zijn enkel van Auto2 dus niet gedeeld met Auto1.

Dit is veel overzichtelijker dan altijd opnieuw elke variabele die je nodig hebt handmatig aan te maken. Stel je voor dat je niet 2 auto’s wil maken maar 10 of zelfs 100, dan is dat bijna onmogelijk zonder classes. Het zou gaan met arrays maar je kan ook een array maken van een class en dat is opnieuw veel overzichtelijker en makkelijker. Stel je wil bijvoorbeeld een extra member dan is dat met een class direct gebeurd.

4.2.3.1.5De methodesMethodes zijn functies van een class.

Stel je wil de brandstof een beetje minder maken en de snelheid een beetje meer.

Dan maak je een methode, bijvoorbeeld genaamd gas.

In python zet je dan binnen je class:

49

Page 50: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

def gas(self, snelheidmeer, gasminder):

self.snelheid += snelheidmeer

self.brandstof -=gasminder

En als je dit wil uitvoeren, doe je dit zo: Auto1.gas(5, 2)

Dit zorgt ervoor dat de member van het object Auto1 5 meer wordt.

En de brandstof wordt 2 minder.

Dit is maar 1 regel code voor wat normaal meer regels code zouden zijn. Je kan natuurlijk ook veel meer laten gebeuren in methodes.

4.2.3.1.6De constructorDit is een functie/methode die doorlopen wordt wanneer de class wordt aangemaakt.

Je initialiseert hier normaal de members en zet hier code die alleen bij het initialiseren moet doorlopen worden. Zoals ik later nog uitleg moet je de variabelen van een object binnen de class, de prefix self. geven.

4.2.4Code

indelingIk heb het spel zo gemaakt dat het ingewikkeldste deel zich in de classes flappy en wall bevindt, en in de loop die zich elke frame herhaalt, call ik gewoon de methodes van de classes die ik dan al geschreven heb.

Op deze manier (met classes werken) is de code veel overzichtelijker en als er iets moet veranderd of gemaakt worden vind ik sneller terug waar dat deel code zich bevindt.

Elke class heeft 2 methodes; de eerste is de constructor en de tweede de functie die ik elke frame zal laten doorlopen en die zal alle waarden van dat object updaten. (Daarom noemt die tweede functie ook update.)

4.2.5 FlappyBird class4.2.5.1 Class variablesIn C++ heb je “static variables”, dat zijn members van classes die overal hetzelfde zijn. Eigenlijk zijn ze hetzelfde als

50

Figure 40 FlappyBird constructor

Page 51: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

variabelen buiten de class. In python heb je die variabelen ook maar behoren ze niet tot een object maar tot de class zelf. (Wat eigenlijk logischer is.)

Je kan ze dus in de class gebruiken door gewoon hun naam te typen, en buiten de class door de naam van de class (niet van een object; werkt ook maar is niet juist.) te typen en dan een punt met de variabele erachter.

In Flappy Bird heb ik maar 1 class variable, namelijk color. Dat komt omdat ik maar 1 object ga maken, dus ik heb eigenlijk geen class variables nodig. Maar door color een class variable te maken zal de kleur van elke flappy hetzelfde zijn. Het zou kunnen dat ik dit nog verander als ik het spel ooit voor twee personen maak.

4.2.5.2 De constructorIn de constructor van een class maak je de variabelen van een object aan.

Om in python een member te maken en te gebruiken zeg je self.var, var is dan een member.

Binnen de class blijft deze member self.var heten, maar als je hem buiten de class nodig hebt dan verandert “self” in de naam van het object waarvan je de member wilt gebruiken.

Dus stel dat ik de member “var” van het object “flappy” buiten de class “FlappyBird” wil gebruiken, dan is het flappy.var .

Hier rechts kan je zelf zien welke members ik heb aangemaakt, in de constuctor: def __init__(self):

4.2.5.3 UpdateHier update ik flappy elke frame. Zie foto hiernaast.

4.2.5.3.1VelocityIk kijk eerst of flappy deze frame spring. (self.jump is dan 1)

Als dat zo is maak ik self.jump 0 en maak ik self.vel 2. (Dus 2 pixels/frame.)

Anders tel ik 1 af van self.vel .

51

Page 52: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.5.3.2PositionIk tel bij de positie de velocity op.

Natuurlijk mag daardoor flappy niet buiten het veld komen, dus controleer ik of dat gebeurt en als dat gebeurt, plaats ik flappy op de rand.

4.2.5.3.3Death checkHier kijk ik of de momentele pixelkleur van de positie van flappy dezelfde is als de achtergrondkleur.

Als dat niet zo is, dan is het een muur en dan is flappy dood. (De muren zijn op dat moment al geupdated.)

4.2.5.3.4Positie in scherm zettenTen slotte zet ik de positie van flappy in de array van de ledstrip.

Figure 42 Flappy Bird update function

4.2.6 Wall class4.2.6.1 Class variablesIn de class wall zijn er meer objecten. Die objecten hebben allemaal een aantal dingen gemeen; het zou dan zot zijn om voor elk object voor die waarden een variabele aan te maken. Dit is waar class variables heel handig voor zijn.

totaant: hoeveel wall objecten er in totaal zijn.

Num: om te kijken het hoeveelste wall object dit is, deze variable wordt alleen gebruikt bij het initialiseren en wordt dan dus telkens met 1 verhoogt.

Width: De breedte van de walls. Opening: Het aantal pixels tussen de

walls. Min_spacing: De minimum spacing tussen een doorgang en de boven/onderkant. Extra_plek: Als de verdeling van de pixels niet uitkomt moet de (denkbeeldige) breedte groter

worden zodat de muren toch even ver uit elkaar staan. Color: de kleur van de walls. Beweging: Of de muren moeten bewegen of niet; dit is voor als ik ooit de muren maar om de 2

frames wil laten updaten zodat ik dan de frames 2 keer zo snel kan laten komen. Hierdoor zou ik flappy vloeiender kunnen laten vliegen. Het is een boolean die elke frame van waarde zou wisselen. Uiteindelijk heb ik het zo gemaakt dat dit niet nodig is.

52

Figure 43 Wall class variables

Page 53: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.6.2 De constructor Eerst tel ik wall.num op. (De class variable die ik hiervoor besproken heb.) Dan maak ik self.y aan. (De hoogte van de onderkant tot de opening van de muur.)

Dit doe ik door een random getal te nemen met de functie randint van de library random.In deze functie moet je 2 getallen geven, het kleinste en het grootste, de functie returned dan een random int tussen die 2 getallen.

Het eerste getal is hier de wall.min_spacing – 1. Wall.minspacing omdat de opening anders te dicht tegen de vloer zou kunnen komen, en -1 is omdat het scherm zijn onderste rij pixels niet 1 maar 0 is.

Het tweede getal is: slen - wall.min_spacing - wall.opening.Slen omdat het van de bovenkant naar beneden telt, - wall.min_spacing zodat de opening niet te dicht tegen het plafond komt, en wall.opening omdat self.y de onderkant van de opening is en omdat ik van boven naar beneden tel moet ik dus de opening zelf erbij af tellen.(Min 1 zou hier ook kunnen maar dit zit al bij in de wal.min_spacing.)

Dan maak ik self.x aan, de muren moeten gelijk verdeelt worden over de breedte van het scherm, daarvoor komt wall.num goed van pas. Ik vermenigvuldig hem gewoon met de plek die tussen elke muur moet gelaten worden.Je zou zeggen dat dit gewoon slen // wall.totaalaant is, maar dat is niet zo.

De muren hebben een breedte, en de laatste muur zal op het einde van het scherm staan maar heeft dus extra breedte nodig zodat hij past.Toen ik dat had gevonden dacht ik dat het zou werken, maar de muren waren niet dezelfde afstand uit elkaar omdat de deling gewoon niet uitkwam.

Ik heb hier veel verschillende oplossingen voor geprobeerd zoals andere muurbreedtes en muuraantallen. Maar uiteindelijk was het probleem heel simpel opgelost door bij de teller van de deling gewoon 1 bij op tellen en dus eigenlijk zeggen dat het scherm 1 pixel breder is waardoor het wel uitkomt.

Door te upgraden naar python 3.5 veranderde de manier waarop berekeningen werkte in python en ging de self.x berekening kapot. Daarom staat eronder nog een print van self.x voor te debuggen.

De volgende is self.richting, dit is voor als ik de opening van de muren op en neer wil laten gaan, maar omdat het spel maar op weinig frames per seconde is gemaakt is dit moeilijk te volgen en heb ik dit niet gebruikt.Elke muur zou in de andere richting gaan als de vorige, om dit in 1 regel te doen heb ik een macht gebruikt met als grondtal -1 en als exponent wall.num. de even getallen zijn dan hebben dan 1 als richting en de oneven hebben -1. Dit is ideaal want dan kan ik de richting gewoon optellen bij de muurhoogte. En als de muurhoogte buiten wall.min_spacing valt verander ik gewoon de richting weer.

De laatste is self.bewegingTeller, maar die heb ik gecancelled omdat hij net zo goed een class variable kon zijn.

53

Page 54: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.6.3 Update Elke frame moeten de muren 1 pixel naar links

komen. Dus: self.x -= 1 Als de muur helemaal voorbij het scherm is, moet hij

terug naar rechts springen.Self.x is het begin van de muur, maar de muur heeft een breedte. Dus pas als self.x –wall.width is is hij volledig van het scherm.Als dat zo is moet dus self.x de breedte worden, plus de wall.extra plek. (zodat de plek tussen de muren mooi uitkomt.)En de hoogte moet opnieuw berekent worden, anders zou het spel te voorspelbaar zijn.

Als de muur gedeeltelijk van het scherm is komen de negatieve of te hoge waardes ergens verkeerd op het scherm doordat de convert functie er iets verkeerd uit berekent, wat logisch is omdat hij alleen juiste waardes verwacht.

Daarom kijk ik in het gedeelte #Temp variabelen of er delen van het scherm vallen en maak ik tijdelijke variabelen die een deel van de muren afsnijden zodat ze wel passen.

Het gedeelte #Muur beweging is weg gecomment omdat het niet gebruikt wordt zoals ik bij de constructor al heb uitgelegd.

54

Figure 44 Wall update function

Figure 45 verticale muur beweging

Page 55: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

In het gedeelte #Flappy score kijk ik gewoon of flappy.x hetzelfde is als self.x.Dit wordt voor elke wall doorlopen dus als het bij 1 van de walls zo is zal de score opgeteld worden.

In het laatste gedeelte zet ik alles in het scherm.Het is een nested for loop die twee binnenste delen heeft, voor het bovenste en het onderste deel van de muur.In de opening ertussen moet namelijk niks in het scherm gezet worden hier.

4.2.6.4 Problemen bij flappy birdHier kort samengevat de grootste problemen die ik had met het schrijven van Flappy Bird en hoe ik ze heb opgelost.

4.2.6.4.1Spacing murenDoordat het scherm 16px breed is en mijn muren 3px breed zijn was er een ongelijke spacing tussen de muren omdat het gewoon niet uitkwam. (Dit laat het spel er onprofessioneel uitzien naar mijn mening.)

Ik heb eerst geprobeerd het wel te laten uitkomen door de muren breder of smaller te maken en Andere aantallen muren te nemen maar niets liet het spel eruit zien zoals ik wou.

Dan heb ik geprobeerd om elke muur wanneer hij wordt geteleporteert wordt naar het einde 1 frame niet te verplaatsten waardoor het wel uitkwam maar je zag de muur staan op het einde van het scherm en je zag ook dat hij 1 frame niet bewoog.

Toen ik daar een oplossing voor aan het bedenken was kwam ik ineens op een veel simpelere oplossing: het programma laten denken dat het scherm 17px breed is.

Na wat functies aan te pakken om de nieuwe waardes te aanvaarden was het probleem opgelost.

55

Figure 46 wall score check & in scherm zetten

Page 56: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.6.4.2Overschakeling python 2.7 naar 3.5In het 5de jaar toen we python leerde bestond python 3 al, maar onder andere omdat python 2 meer gebruikt werd leerden we python 2.

Maar nadat ik flappy bird voor python 2 had geschreven, leerden we de flask server. Een python webserver, en het was niet verplicht maar wel aangeraden om dit te gebruiken in ons eindwerk.

Dus ik moest flappy bird updaten naar python 3. (Er bestaan hier websites voor maar deze werkten niet.)

Python 3 is gemakkelijker gemaakt voor beginners om te begrijpen, maar daarvoor zijn er wel wat fundamentele dingen verandert.

Python 2.7:

I = 3 / 2

Print(i) geeft 1, omdat 3 een int is. (Wat wel logischer is als je lagere talen hebt geleerd zoals C++.)

I = 3.0 / 2 geeft 1.5, omdat 3.0 een float is.

Python 3.5:

I = 3 / 2

Print(i) geeft 1.5.

Verder is ook xrange() weg, je moet er nu gewoon range() voor geruiken.

En raw_input() is gewoon input() geworden, dit gebruikte ik niet in mijn programma maar het is wel handig om te weten.

En als laatste gebruikte ik een comstum unichr om hartjes te tekenen op mijn lcd, unichr is verandert in chr.

Dit zorgde ervoor dat sommige dingen die een int moesten zijn een float werden, na heel lang zoeken had ik dit gevonden en dacht ik dit te hebben opgelost door in een functie waar al die waarden doorgingen (namelijk convert().) in plaats van “return get”, “return int(get)” heb gemaakt.

Dit was echter geen goede oplossing omdat de foute berekeningen nog altijd gemaakt werden, alleen de errors gingen weg maar dat betekende niet dat het programma goed zou werken.

Toen leerde ik dat als ik alle ‘/’ verving met ‘//’ dat dan alle berekeningen werden uitgevoerd zoals in Python 2.7.

Dus na alle dingen te veranderen in hun python3 equivalent en de python3 equivalenten van mijn library’s te downloaden werkte het programma uiteindelijk wel.

Ik had het geluk dat er python3 equivalenten van mijn library’s waren, maar als dat niet zo is kan je ook gewoon zelf een python3 equivalent schrijven.

Je moet dan de path van je library uitzoeken, waarschijnlijk is dat ongeveer dit /usr/lib/python2.7/dist-packages, en dan moet je ze in de python3.5 map in je /usr/lib/ steken.

En het kan dat je de files ook moet aanpassen zoals ik mijn programma moest aanpassen.

56

Figure 47 python 3 meme

Page 57: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.6.4.3AudioIk heb dit probleem al uitgebreid besproken in hoofdstuk 2.8 audio, maar kort samengevat: ik kon met mijn Raspberry 3b+ niet audio sturen en de rest van mijn eindwerk laten werken tegelijk.

Ik ben van plan dit op te lossen door via internet een website het geluid te laten regelen.

4.2.7 Flappy bird AI (bot)4.2.7.1 InleidingIk moest bijna een nieuw filmpje maken voor op de school YouTube pagina en had ook nog een achtergrond animatie nodig voor als er niemand aan het spelen was. Ik kon een standaard animatie maken maar dat was eerder saai en niet genoeg voor in een filmpje te steken. Toen uploadde er plots een van mijn favoriete YouTubers genaamd Code Bullet een video waar in hij zelf een perfecte snake AI maakte. (AI betekent artificial intelligence). De video was super leuk om te kijken en zien hoe de Snake AI versnelt snake uitspeelde zag er echt geweldig uit. Dus ik wou dat ook maken, maar er was een probleem. In zijn video was Snake natuurlijk een veel hogere resolutie waardoor je kon zien hoe Snake was opgebouwd ookal lagen er meerdere lijnen naast elkaar. Daar zat het probleem, omdat bij mij de slang 1 pixel breed was kon je niet goed zien of er nu 2 naast elkaar liggen of dat hij gewoon dikker was. (Het Snake probleem heb ik later opgelost door Snake een gradient te geven.) Daardoor zou je uiteindelijk gewoon een groene vierkant zien. Dus een Snake AI was geen optie. Ik had toen 3 spelletjes: Flappy Bird, Snake, en Stacker. Snake ging niet, Stacker zou veel te makkelijk en saai zijn, maar een AI voor Flappy Bird was eigenlijk een goed idee. Dus daarom heb ik dat gemaakt.

Het doel is om een perfecte AI te maken, dus hij moet voor altijd kunnen verder spelen zonder dood te gaan. (Aangezien je Flappy Bird niet kan uitspelen.)

57

Page 58: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.2.7.2 WerkingDeze code zit nu gewoon bij in de hoofd while loop van Flappy bird.

Figure 48

Deze blok hierboven leg ik verder beneden volledig uit.

Deze code hieronder moest er bovenaan bij

Figure 49

Figure 50

En ik heb de functie game_FlappyBird een argument gegeven dat zegt of je wel of geen AI wilt. Het is een boolean, dus hij kan True of False zijn. True is met AI en False zonder.

Figure 51

Ten slotte heb ik er ook voor gezorgd dat als doAI True is, de thread voor de drukknoppen in te lezen niet aangemaakt wordt. Aangezien de AI flappy gaat besturen.

58

Page 59: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Nu Zal ik de eerste blok code van in de hoofd while loop uitleggen.

De AI focust zich altijd maar op 1 wall, het nummer van deze wall zit in de variable “voorsteWall” in de begin waarde is 0 omdat dat de eerste muur is die getekend wordt.

De voorsteWall variable moet natuurlijk wel worden aangepast, dat gebeurt in de eerste if clause.

Simpel gezegd kijk ik of flappy voorbij de wall is. Dat doe ik door de x waarde van die wall op te vragen en er de breedte van de walls bij te tellen. Maar de x waarde waarde van de muur is de linker pixel, dus als je er dan nog eens de volledige breedte bij op telt kom je te ver uit. Dus daarom moet ik er 1 van af tellen. Verder weet ik omdat de muren elke frame 1 pixel naar links gaan, dat als we juist boven het onderste muur gedeelte zijn bij het laatste muur gedeelte (wanneer we normaal moeten springen) er eigenlijk niet gesprongen moet worden omdat de muur toch uit de weg zal schuiven in de volgende frame. Dus kan ik van onze muur x waarde nog 1 aftellen.

Als dat statement waar is increment voorsteWall, maar als voorsteWall moet wel terug naar 0 springen om de 3 keer (Er zijn 3 walls), daarvoor is de tweede if clause. De reden dat er >= staat i.p.v. > is dat we bij 0 beginnen te tellen en nr 2 dus al de 3de is. (En nr 3 dus niet bestaat.)

Als tweede kijk ik of we moeten springen. Als we juist veranderd zijn van focus zullen we nooit moeten springen, dus voor bonus efficiëntie heb ik er een elif van gemaakt zodat hij hier niet eens naar kijkt als we in dezelfde frame al veranderd zijn van focus. Zoals je ziet staat er bij allebei de kanten -1, in de echte code staan die er niet meer omdat ze elkaar opheffen. Maar waarom ze er zouden moeten staan is wel belangrijk.

De y waarde van flappy verandert elke frame, maar velocity kan niet lager dan -1 gaan, dus daarom staat er -1. Er + flappy.vel te zetten zou juister zijn, maar omdat die niet lager kan zijn is er -1 van maken niet erg, flappy kan erdoor niet doodgaan. (Er flappy.vel van maken kan ervoor zorgen dat flappy minder springt, maar niet dat hij minder doodgaat want met deze formule gaat hij nooit dood van teveel springen.) Ik heb er dus -1 van gemaakt om de 2 keer -1 te kunnen wegdoen.

Bij het rechtse deel moet ook een -1, dit komt omdat de muur getekend wordt met een for loops, for loops gaan tot een waarde. (niet t.e.m.) Dus de muur is eigenlijk 1 minder hoog dan de zijn y waarde.

Wat je nog zou kunnen doen om de AI nog beter te maken is 2 aftrekken van de wall y waarde totdat flappy.x maar 1 kleinder is dan de wall zijn x. Dit is omdat als flappy spring hij in de eerste frame 2 pixels omhoog gaat. Stel de opening zou nog kleiner zijn dan hij al is, dan zou je dit moeten doen. Maar zoals hij nu is is dit niet nodig.

Ik heb de AI getest tijdens het eten en na een score van meer dan 3000 had hij nog altijd al zijn levens, dus ik denk dat het veilig is om te zeggen dat het een perfecte AI is.

59

Figure 52

Figure 53

Page 60: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.3 Bestuurbare cirkel animatieIk wou mijn eindwerk ook een beetje indrukwekkend maken voor de mensen die niet goed zijn in spelletjes; daarom heb ik een bestuurbare animatie gemaakt. Het doel hier is gewoon de visuele effecten.

Het idee is om van het midden naar buiten (of andersom) cirkels te laten vloeien in een regenboog effect. De twee uitdagingen zijn hierbij om mooie cirkels te maken en om een mooie en vloeiende afwisseling van de kleuren te hebben.

4.3.1 HSLHet staat voor Hue Saturation, en Lightness. Het is een color system zoals RGB maar beter voor deze toepassing.

4.3.1.1 HueDit is de eerste waarde die je moet ingeven in een HSL functie. Je geeft een waarde van 0 tot 360 in en je krijgt basis kleur van het Hue color wheel terug. Dit is puur de kleur, er zit geen lichtheid of helderheid in.

Een heel groot voordeel is dat ik nu gewoon een waarde kan laten optellen en de functie maakt er een regenboog effect van. De kleuren volgen de natuurlijke volgorde van het licht: van de laagste frequentie rood naar de hoogste blauw. (Ongeveer) Als je kleuren wil laten opvallen moet je de kleuren 180 graden verschil maken, dus hier ook weer gemakkelijk gewoon de andere kant van het wiel.

RGB zit ook verwerkt in Hue, met rood op 0°, groen op 120°, en blauw op 240°.

In de animatie ga ik deze waarde laten oplopen van 0 tot 360 en weer opnieuw zodat ik een mooi regenboog effect krijg. Ik ga de snelheid of terwijl hoeveel graden ik per stap verander bestuurbaar maken.

4.3.1.2 SaturationDit is de tweede waarde en geeft weer hoe hoe dicht de kleur bij grijs moet zijn.

Bij 0 heb je gewoon Grijs, en bij 1 heb je de basis kleur van het Hue color wheel. Voor mijn project ga ik dit waarschijnlijk gewoon op 1 laten.

4.3.1.3 LightnessDit is de derde waarde en geeft weer hoe licht de kleur moet zijn. Bij 0 heb je gewoon zwart, bij 1 heb je gewoon wit, en bij 0.5 heb je de basis kleur van het Hue color wheel.

Ik ga deze waarde bestuurbaar maken.

60

Page 61: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

4.3.2 De cirkelOm te berekenen in welke cirkel elke pixel zit moet ik de afstand tot het midden van het scherm berekenen. Hiervoor gebruik ik Pythagoras. (X2 – X1) is de basis van de driehoek, (Y2 – Y1) is de hoogte.

De manier waarop ik een kleur voor een pixel bereken is een basis kleur hebben die ik laat optellen van 0 tot 360 in de Hue color wheel. En dan de afstand maal een ingestelde waarde daarbij optellen.

Dus veronderstel dat de basis kleur momenteel Exact groen is en ik bereken de kleur voor een pixel die 5 pixels van het midden verwijderd is, en de ingestelde waarde van de snelheid is 2. Dan is de kleur van de pixel 120° (groen in het wiel) + 5 (afstand) * 2 (snelheid).

Figure 55

Dit is de code in mijn programma, hier laat ik de basis kleur “Hue” maar optellen tot 60, dat komt omdat ik toch een waarde van 0 t.e.m. 1 moet sturen naar mijn hls functie, en ik moet hem dus toch nog delen door die 60. Het maakt dus geen verschil, alleen dat de animatie nu standaard 6 keer sneller gaat, en dat is beter aangezien hij anders heel traag ging.

Natuurlijk als ik de afstand gewoon bij de Hue waarde optel komt hij soms boven zijn maximum waarde. Als je bij 360° komt begin je terug bij 0. Dus in mijn programma als de afstand + Hue groter is dan 60, tel ik 60 af van de afstand.

Mijn scherm accepteert alleen RGB waardes van 8 bits per kleur (bereik van 0 – 255) dus ik gebruik een hls_to_rgb functie om de waarde om te zetten. Maar deze functie geeft waarden tussen 0 en 1 terug, dus ik doe ze maal 255 en maak er een int van voor ik ze in de Color functie zet om er een geldige waarde van te maken.

61

Figure 54

Page 62: rik20192020.kogekaschoolverlaters.berik20192020.kogekaschoolverlaters.be/downloads/Scri… · Web viewEen waarde daartussen betekend dat de led een pwm signaal krijgt met duty cycle,

Rik Puts Game Console 2019-2020

Als ik de variabelen lightness en snelheid gewoon meegeef met de functie maakt de functie een kopie van de waarden en werkt daar mee. In C++ zou je dit gemakkelijk en efficiënt oplossen door ze als refference mee te geven. Maar in python kan je niet kiezen of je ze als refference meegeeft of niet, numeric values, strings, en tuples worden altijd gekopieerd en objecten worden altijd als referrence meegegeven. Dus heb ik er objecten van gemaakt door ze in een list te zetten.

4.4 De rest van de code?Ik heb nog veel meer spelletjes en ik zou nog 20 pagina’s kunnen schrijven gewoon over hoe ze werken, met elk spel komen nieuwe uitdagingen, maar ik zou ook veel in herhaling vallen. Je kan de volledige code van mijn eindwerk op de website vinden ( rik20192020.kogekaschoolverlaters.be ). Er staat vrij veel uitleg bij. Of als je de afgeprinte versie op school leest dan zit de code waarschijnlijk achteraan dit document.

5 BesluitIk heb superveel geleerd bij het maken van deze GIP. Moest ik het opnieuw doen, dan zou ik een aantal zaken helemaal anders doen. Eveneens zou het ook sneller gaan door de ervaring die ik heb gekregen bij het maken van deze GIP.

Wat me enorm deugd doet is dat veel mensen zeggen dat het een knap eindwerk is. Ik vermoed wel dat ze onderschatten hoeveel energie er in zit. (Dit maakt het compliment nog beter.)

Zoals ik al zei zijn er veel dingen die ik anders zou doen, een paar tips die ik handig zou gevonden hebben zijn:

-Bij het kiezen van componenten moet je ook goed nadenken over hoe je ze gaat bevestigen aan je eindwerk en of er misschien andere oplossingen zijn die veel eenvoudiger zijn. Zo ben ik bijvoorbeeld door 3 verschillende knopjes designs gegaan. (In het geval van knopjes dacht ik in het begin niet na over hoe ik ze netjes in een houten plank ging vastmaken. Had ik van het begin geweten hoe dik de plank ging zijn dan was alles veel gemakkelijker geweest; ik had geen vastklem systeem nodig want de knopjes werden op hun plek gehouden door de plank.)

-Je moet niet noodzakelijk alles van 0 beginnen maken. In mijn geval ben ik halverwege mijn project een library beginnen gebruiken die kleuren gemakkelijk en vlot regelt. Dit is iets kleins wat de moeilijkheid van de GIP niet echt naar beneden trekt, maar het is wel 1 ding minder waar ik rekening mee moet houden.

Uiteindelijk waren er moeilijke, stressvolle, intensieve maar ook veel leuke momenten en al bij al kijk ik trots en tevreden terug op het voorbije jaar.

62