Wat is een Microcontroller? - 1.1a

Wat is een Microcontroller?
Studentengids
VERSIE 3.0NL
Page 2 · Wat is een Microcontroller?
GARANTIE
Parallax garandeert haar producten tegen defecten in materiaal en fabricagefouten voor een periode van 90 dagen na ontvangst van het
product. Als u een fout ontdekt, dan zal Parallax, de gekochte goederen naar eigen keuze repareren of vervangen, dan wel overgaan tot
terugbetaling van de aankoopprijs. Voordat u het product naar Parallax terugstuurt, moet u een een RMA-nummer (Return
Merchandise Authorization) aanvragen. Schrijf het RMA-nummer op de buitenkant van de doos die u gebruikt om de goederen naar
Parallax terug te sturen. Voeg een brief toe met daarop een omschrijving van de geretourneerde koopwaar, uw naam, telefoonnummer,
afleveradres en een beschrijving van het probleem. Parallax zal het vervangende product op dezelfde wijze toesturen, als bij de
aankoop is gebruikt
GELD TERUGGARANTIE BINNEN 14 DAGEN
Het product dat u bij Parallax heeft gekocht, kan binnen 14 dagen worden teruggestuurd Parallax zal de aankoopprijs van het product
terugbetalen, exclusief de verzendkosten en eventuele kosten voor orderafhandeling. Deze garantie is niet geldig als het product is
veranderd of beschadigd.
COPYRECHTS EN HANDELSMERKEN
Deze documentatie valt onder het Copyrihts 2003-2009 van Parallax Inc Door het downloaden of door de ontvangst van een gedrukt
exemplaar van deze documentatie of software gaat u ermee akkoord dat deze uitsluitend wordt gebruikt in combinatie met Parallax
producten. Gebruik in combinatie met andere toepassingen is niet toegestaan en is een schending van auteursrechten van Parallax.
Overtreding is wettelijk strafbaar. Elke vermenigvuldiging van deze documentatie voor commercieel gebruik is uitdrukkelijk verboden
door Parallax Inc. Vermenigvuldiging voor educatief gebruik, in gehele of gedeeltelijke vorm, is toegestaan onder de voorwaarden dat
het materiaal uitsluitend wordt gebruikt in combinatie met Parallax producten, en dat aan de student uitsluitend de kosten voor
vermenigvuldiging in rekening worden gebracht. Neem vooraf contact op met Parallax ter goedkeuring van gebruik van onze
documentatie in zijn geheel, of gedeeltelijk of voor enig ander gebruik.
BASIC Stamp, Board of Education, Boe-Bot, Stamp in de klas, en SumoBot zijn geregistreerde handelsmerken van Parallax Inc.
Evenzo zijn Homework Board, PING))), Parallax, de Parallax logo’s, Propeller, en Spin zijn handelsmerken van Parallax Inc. Als u
besluit om een van deze woorden te gebruiken op uw elektronische of gedrukt materiaal, moet u bij het eerste gebruik van de
merknaam van het betreffende handelsmerk expliciet vermelden, dat het een geregistreerde handelsnaam betreft van Parallax Inc en
hun respectievelijke houder.
ISBN 9781928982524
3.0.0-09.12.09-HKTP
BEPERKING AANSPRAKELIJKHEID
Parallax Inc is niet verantwoordelijk voor bijzondere, incidentele of gevolgschade schade die voortvloeit uit een schending van de
garantie, of op grond van een jurisprudentie, met inbegrip van gederfde winst, stilstand, goodwill, schade aan of vervanging van
apparatuur of eigendom, of alle kosten van herstel, herprogrammering, of het herstellen van gegevens opgeslagen in of gebruikt met
Parallax producten. Parallax is ook niet verantwoordelijk voor eventuele persoonlijke schade, waaronder die voor leven en gezondheid,
als gevolg van gebruik van een van onze producten. U neemt de volledige verantwoordelijkheid voor uw BASIC Stamp toepassing,
ongeacht hoe levensbedreigend kan worden.
ERRATA
Ondanks onze inspanningen om de juistheid van onze teksten te verzekeren, kunnen er nog steeds fouten aanwezig zijn. Met enige
regelmaat, zal er op de desbetreffende productpagina van www.parallax.com zal er af en toe een errata blad worden geplaatst met een
lijst van bekende fouten en correcties voor een gegeven tekst. Mocht u een fout ontdekken, stuur dan een melding per e-mail naar
[email protected].
Voorwoord · Page 3
Inhoudsopgave
Voorwoord...................................................................................................................5
Over versie 3.0................................................................................................................5
Doelgroep .......................................................................................................................5
Ondersteuning via het forum op internet.........................................................................5
Informatie Voor docenten................................................................................................6
Vertalingen......................................................................................................................7
Over de auteur ................................................................................................................7
Speciale bijdrage ............................................................................................................7
Hoofdstuk 1 : Om te beginnen ..................................................................................8
Hoeveel microcontrollers heb je vandaag gebruikt? .......................................................8
De BASIC Stamp 2 – Je eigen microcontrollermodule ...................................................8
Verbazingwekkende ontwikkelingen met BasiC Stamp microcontrollers........................9
Hardware en software...................................................................................................11
Opdracht #1 : Het Inrichten van de Werkomgeving ......................................................11
Opdracht #2 : Gebruik de Help File voor de Hardware Setup ......................................14
Samenvatting ................................................................................................................16
Hoofdstuk 2 : LED’s aan- en uitschakelen ............................................................19
Indicatielampjes ............................................................................................................19
Inschakelen van een Light-Emitting Diode (LED) .........................................................19
Opdracht #1 : Bouwen en testen van een led schakeling............................................19
Opdracht #2 : Aan en uit met de BASIC Stamp............................................................25
Opdracht #3 : Tellen en herhalen .................................................................................29
Opdracht #4 : Bouwen en Testen van een Tweede LED-Schakeling...........................31
Opdracht #5 : Stroomrichting Gebruiken om Tweekleurige LED’s te Besturen ............34
Samenvatting ................................................................................................................38
Hoofdstuk 3 : Digitale Input - Druktoetsen ............................................................41
Te vinden op rekenmachines, spelletjes, enzovoort .....................................................41
Hoge en lage signalen ontvangen en versturen ...........................................................41
Opdracht #1 : Testen van een druktoets met een LED Schakeling ..............................41
Opdracht #2 : Inlezen van een Druktoets met de BASIC Stamp ..................................44
Opdracht #3 : Besturen van een LED Schakeling met een drukknop...........................47
Opdracht #4 : Twee Druktoetsen Sturen Twee LED’s ..................................................49
Opdracht #5 : Test je Reactietijd...................................................................................52
Samenvatting ................................................................................................................58
Hoofdstuk 4 : Besturen van beweging ...................................................................63
Beweging met een Microcontroller................................................................................63
Aan/Uit-Signalen en Beweging van Motoren ................................................................63
Introductie van de Servo ...............................................................................................63
Opdracht #1 : Aansluiten en testen van de Servo ........................................................64
Opdracht #2 : Het Test Programma om de servo te testen ..........................................68
Opdracht #3 : Vastzetten positie gedurende een tijd ....................................................75
Opdracht #4 : Positie van een servo besturen met je Computer ..................................79
Opdracht #5 :Omzetten van Position in beweging.......................................................84
Opdracht #6 : De servo wordt gecontroleerd met drukknoppen ...................................86
Samenvatting ................................................................................................................89
Hoofdstuk 5 : Meten van beweging ........................................................................93
Draaiknoppen Controleren Machines ...........................................................................93
De Variable Weerstand onder de KNOP is Een Potentiometer ....................................93
Opdracht #1 : Bouwen en Testen van een Potentiometer Schakeling .........................94
Opdracht #2 : Meten van weerstand door tijdsmeting ..................................................95
Opdracht #3 : Lezen van een potmeter met knop Met de BASIC Stamp ...................100
Opdracht #4 : Besturen van Servo met een Potentiometer ........................................104
Samenvatting ..............................................................................................................109
Hoofdstuk 6 : Digitale Display...............................................................................113
De alledaagse Digitale Display ...................................................................................113
Wat is een 7-Segment Display?..................................................................................113
Opdracht #1 : Bouwen en Testen van een 7-Segment LED Display ..........................114
Opdracht #2 : aanSturen van een 7-Segment LED Display .......................................116
Opdracht #3 : Displaying Digits...................................................................................119
Page 4 · Wat is een Microcontroller?
Opdracht #4 : Weergeven van de positie van een draaiknop.....................................124
Samenvatting..............................................................................................................127
Hoofdstuk 7 : Meten van licht ............................................................................... 129
Apparaten met lichtgevoelige sensoren .....................................................................129
Introductie van de fototransistor .................................................................................131
Opdracht #1 : Bouwen en Testen van een LichtMeter ...............................................131
Opdracht #2 : het volgen van veranderingen van licht ...............................................134
Opdracht #3 : Grafieken maken van de metingen (OPTIONEEL) ..............................140
Opdracht #4 : Een eenvoudige lichtmeter ..................................................................141
Opdracht #5 : On/Off Phototransistor Output .............................................................148
Opdracht #6 : Nog een leuke opdracht – Buitenshuis licht meten met een LED........154
Samenvatting..............................................................................................................157
Hoofdstuk 8 : Geluid en Frequentie ..................................................................... 161
Hoeveel Elektronische piepjes hoor je op een dag? ..................................................161
Microcontrollers, Luidsprekers, Beeps Aan/uit signalen .............................................161
Opdracht #1 : Bouwen en testen van een luidspreker................................................161
Opdracht #2 : Actiegeluiden .......................................................................................163
Opdracht #3 : Muzieknoten en simpele liedjes ...........................................................166
Opdracht #4 : Muziek maken met een microcontroller ...............................................170
Opdracht #5 : Mobiele telefoon RingTonen met RTTL ...............................................178
Samenvatting..............................................................................................................186
Hoofdstuk 9 : Elektronische Bouwstenen ........................................................... 189
Die kleine zwarte Chips ..............................................................................................189
Geintegreerde schakelingen voor het aansluiten van randapparatuur .......................190
Opdracht #1 : Stroomsturing met een Transistor .......................................................190
Opdracht #2 : Introductie van de Digitale Potentiometer ............................................192
Samenvatting..............................................................................................................198
Hoofdstuk 10 : Je eigen uitvinding bouwen........................................................ 202
Pas alles wat je weet toe op nieuwe onderdelen en toepassingen ............................202
Een prototype bouwen van een eenvoudig bewakings Systeem ...............................202
Opdracht #1 : Van Idee tot haalbaarheid ( Proof of Concept) ....................................203
Opdracht #2 : Ieder deel van de schakeling afzonderlijk testen .................................205
Opdracht #3 : Organiseer je programma in kleine stukjes..........................................206
Opdracht #4 : Documenteer je code!..........................................................................209
Opdracht #5 : Geef je toepassing nieuwe interessante functies ................................210
Opdracht #6 : Hoe vermijd je ontwerpproblemen? .....................................................211
Opdracht #7 : Hoe verder? .........................................................................................215
Samenvatting..............................................................................................................218
Appendix A : Onderdelenlijst en Kit opties ......................................................... 219
Complete Kit Opties....................................................................................................219
Appendix B : Meer over elektriciteit..................................................................... 220
Bonus Opdracht: Wet van Ohm, spanning en stroom ...............................................221
Appendix C : Samenvatting RTTTL Formaat....................................................... 226
Appendix D Inhoud van de kit .............................................................................. 228
Voorwoord · Page 5
Voorwoord
Deze handleiding geeft antwoord op de vraag "Wat is een microcontroller?” Studenten gaan in dit
boek aan de slag met hun eigen projecten rond Parallax Inc 's BASIC Stamp microcontroller ®
module. Deze tekst biedt een verscheidenheid aan leuke en interessante experimenten en ontwerpen
die tot de verbeelding van een student moeten spreken. De experimenten maken gebruik van
beweging, licht, geluid, en tactiele feedback om de elektronica en microcontrollers te verkennen. In
deze activiteiten maken studenten kennis met enkele beginselen op het gebied van programmeren,
elektriciteit en elektronica, wiskunde en natuurkunde. De activiteiten maken waar mogelijk op een
praktische wijze gebruik van de ontwerppraktijken van ingenieurs en technici voor het ontwerpen van
moderne machines en apparaten. Waar mogelijk, wordt gebruik gemaakt van algemeen verkrijgbare en
goedkope onderdelen.
Dit boek, Wat is een Microcontroller? geeft toegang tot het gebruik van het onderwijsprogramma:
“Stamp in Class”. Op de site www.parallax.com /education vind je de volledige serie, met titels als
Robotica met de Boe-Bot, Intelligente sensoren en toepassingen, Process Control, en meer.
OVER VERSIE 3.0
Dit is de eerste herziening van deze titel sinds 2004. De belangrijkste veranderingen zijn:
• Vervanging van de cadmium sulfide Lichtgevoelige weerstand met een RoHS-compliant
lichtsensor (RoHS betekent, die gebruik maakt van loodvrije soldeer) van een meer gangbaar
type. Dit leidde ertoe dat de hoofdstukken 7 en 10 herschreven moesten worden, en tot
aanpassingen in de andere hoofdstukken.
• Verbeterde opdrachten (activiteiten) en illustraties van servo controle in hoofdstuk 4.
• Door toevoeging van het "Setup and Testing"-gedeelte van hoofdstuk 1 en de Hardware en
probleemoplossingbijlagen bij het Help-bestand. Dit werd gedaan om zowel seriële- als USBaansluitingen te kunnen ondersteunen ten behoeve van de programmering en om verbindingen
met onze andere producten en technologieën verder uit te breiden.
• Het verwijderen van verwijzingen naar de Parallax CD. Deze is verwijderd om afval te
verminderen en ervoor te zorgen dat de klanten de meest recente BASIC Stamp Editor software en
USB-stuurprogramma’s gebruiken via downloads.
Tenslotte zijn er allerlei kleine foutjes uit de vorige versie 2.2 hersteld.
Het doel van het boek is echter hetzelfde gebleven. Wat betreft het leren programmeren, zijn een
aantal commando’s toegevoegd. Ten slotte zijn paginanummers gewijzigd zodat de PDF-pagina en de
fysieke paginanummers hetzelfde zijn voor gebruiksgemak.
DOELGROEP
Dit boek richt zich op studenten van middelbare scholen en mensen, die door zelfstudie een embedded
apparaat willen ontwerpen en programmeren. Het boek biedt een eenvoudige leercurve waarbij alle
basisprincipes stap voor stap worden uitgelegd. Aan de hand van bijbehorende voorbeelden, wordt het
geleerde in praktijk gebracht. De tekst is zo georganiseerd dat deze enerzijds kan worden gebruikt door
een grote verscheidenheid aan
studenten zonder speciale voorkennis. Het boek biedt
aanknopingspunten voor zowel de student als de docent. Het bevat vele voorbeelden in de tekst, die
door de student uitgevoerd kunnen worden. Voor de docent/instructeur zijn er vragen en instructies
opgenomen. De vragen en oefeningen in dit boek kunnen ook gebruikt worden om studenten te testen
op basiskennis van engineering en op hun probleemoplossende vaardigheden. Ieder hoofdstuk heeft
een samenvatting. De leerlingen kunnen in hun eigen tempo werken, en indien ze Engels machtig zijn,
hulp krijgen op het forum van Stamps in Class.
ONDERSTEUNING VIA HET FORUM OP INTERNET
Parallax biedt voor klanten en gebruikers een verscheidenheid aan onderwerpen en ondersteuning aan
op het gratis forum :
Page 6 · Wat is een Microcontroller?
•
•
•
•
•
•
•
•
•
Propeller Chip: voor alle discussies over de multicore Propeller microcontroller de bijbehorende
ontwikkeltools
BASIC Stamp: Project ideeën, ondersteuning en aanverwante onderwerpen voor de Parallax
BASIC Stamp modellen.
SX Microcontrollers: Technische bijstand voor alle SX chip producten, inclusief de SX / B
Compiler, en SX-Key Tool.
Sensoren: Discussie met betrekking tot breed scala Parallax's van sensoren, interfaces en sensoren
met Parallax microcontrollers.
Stamps in Class: Studenten, docenten en klanten bespreken hier hun Parallax's
onderwijsmaterialen en schoolprojecten.
Robotica: Voor alle Parallax robots en aangepaste robots gebouwd met Parallax processoren en
sensoren.
De Sandbox: Onderwerpen in verband met het gebruik van Parallax producten, maar niet specifiek
voor de andere fora.
Voltooide Projecten: Plaats hier uw voltooide projecten die met behulp van Parallax producten
gerealiseerd zijn.
HYDRA Propeller System en Game Development: Discussie en technische bijstand voor de
HYDRA Game Development Kit en aanverwante Propeller microcontroller programmeren.
INFORMATIE VOOR DOCENTEN
We bieden een grote verscheidenheid aan hulpmiddelen bij dit boek, ter ondersteuning van de
docenten.
Stamps in Class “Mini Projects”
Naast onze boeken, bieden we vele voorbeelden van projecten voor gebruik in de klas. Deze "Mini
Projecten" zijn ontworpen om studenten te betrekken en bevatten de volledige broncode, een "Hoe het
werkt" uitleg, schema's, en schema's of foto's voor een apparaat. Veel projecten hebben een inleidende
video, om de zelfredzaamheid te bevorderen van studenten die het meest geïnteresseerd zijn in de
elektronica en programmering. Volg eventueel de Stamps in Class "Mini Projecten" link op
www.parallax.com
Cursussen voor docenten
Deze hands-on cursussen duren 1 of 2 dagen en zijn bedoeld voor instructeurs. Ze worden gegeven
door Parallax ingenieurs of docenten die veel ervaring hebben met Parallax educatieve materialen.
Bezoek www.parallax.com / Onderwijs → Opvoeders Cursussen voor meer informatie.
Parallax Docenten Forum
In dit gratis forum kunnen opleiders vragen stellen en hun ervaringen delen over het gebruik van
Parallax producten in hun klaslokalen. Deze fora zijn Engelstalig. Ook aanvullende
onderwijsmaterialen zijn hier te vinden. U kunt zich laten inschrijven, door een e-mail te sturen aan
[email protected] voor instructies. U zult moeten aangeven, wat uw onderwijservaring is.
Aanvullend onderwijsmateriaal
Op het onderwijsforum staan een reeks niet-gepubliceerde vragen en oplossingen behorende bij de
Parallax educatieve teksten. We nodigen opvoeders uit om waar nodig dit materiaal te kopiëren en te
wijzigen ten behoeve van huiswerk, quizzen en tests. Ook eventuele PowerPoint presentaties en tests
van materialen van andere opleiders vindt u hier. U kunt zelf ook materiaal plaatsen
Copyrights voor gebruik in het onderwijs
Er zijn geen zogenaamde site-licenties vereist voor het downloaden, dupliceren en installeren van
Parallax educatieve software mits gebruikt in combinatie met Parallax producten. De software mag
indien nodig op zowel school- als thuiscomputers geïnstalleerd worden.. Onze “Stamps in Class”
teksten en BASIC Stamp handleiding zijn beschikbaar als gratis downloads in de vorm van een PDF,
en mogen voor educatief gebruik en uitsluitend in combinatie met Parallax producten door de
Voorwoord · Page 7
studenten gratis worden gedupliceerd. De PDF-bestanden zijn niet geblokkeerd, waardoor de selectie
van teksten en afbeeldingen naar hand-outs of PowerPoint mogelijk is
VERTALINGEN
Veel van onze “Stamps in Class” teksten zijn vertaald in andere talen. Deze teksten kan men gratis
downloaden, maar ze zijn onderworpen aan dezelfde voorwaarden van copyright voor educatief
gebruik als de oorspronkelijke versies. Voor de volledige lijst, klikt u op de Tutorials en Vertalingen
link op www.parallax.com /Education. Deze vertalingen zijn gerealiseerd in samenwerking met het
Parallax Vrijwillige Vertalers programma. Als u geïnteresseerd bent in deelname aan dit programma,
stuur dan een e-mail naar [email protected].
OVER DE AUTEUR
Andy Lindsay trad in 1999 bij Parallax Inc in dienst en heeft sindsdien acht boeken en talloze
artikelen en documenten voor het bedrijf geschreven. De laatste drie versies van “What's a
Microcontroller?” werden ontworpen en bijgewerkt op basis van waarnemingen en opmerkingen
vanuit het onderwijs, die Andy verzamelde tijdens de reizen door de VS en daarbuiten naar Parallax
Educator cursussen en evenementen. Andy studeerde Electrical and Electronic Engineering aan de
California State University, Sacramento, en is mede auteur voor verschillende tijdschriften die
betrekking hebben op het onderwerp van microcontrollers in de pre-engineering curricula. Wanneer hij
niet schrijft is Andy verantwoordelijk voor de product- en applicatie- engineering voor Parallax.
SPECIALE BIJDRAGE
Het Parallax team dat deze uitgave schreef, bestond uit Aristides Alvarez die verantwoordelijk was
voor de teamleiding, Andy Lindsay, die verantwoordelijk was voor ontwerp en de redactie van het
lesmateriaal, Jen Jacobs, die de omslag ontwierp, Rich Allred en Andy Lindsay die de grafische
illustraties verzorgden, Jessica Uelmen, voor de technische evaluatie en Stephanie Lindsay, die zich
bezighield met technische details, redactie en de lay-out. Speciale dank gaat uit naar Ken Gracey,
oprichter van het Stamps in the Class programma, en naar Tracy Allen en Phil Pilgrim voor hun
aanbevelingen bij de selectie van de lichtsensor die in deze versie gebruikt wordt ter vervanging van
de cadmium-sulfide lichtgevoelige weerstand.
Veel mensen hebben bijgedragen aan de ontwikkeling van What's a Microcontroller? en hebben
geadviseerd bij de voorgaande edities. Parallax wil nogmaals Ang Robert bedanken voor zijn grondige
herziening en gedetailleerde input, en de oudgediende ingenieur en gewaardeerde klant Sid Weaver
voor zijn inzichtelijke aanvullingen. Dank ook aan Stamps in the Class auteurs Tracy Allen (Applied
Sensoren) en Martin Hebel (Process Control) voor hun onderzoek en aanbevelingen. Andy Lindsay wil
zijn vader en zijn zwager Kubilay bedanken voor hun deskundig advies en hun suggesties.
Pagina 8 · Wat is een Microcontroller? NL HJK
Hoofdstuk 1: Om te beginnen
HOEVEEL MICROCONTROLLERS HEB JE VANDAAG GEBRUIKT?
Een microcontroller is een soort miniatuur computer die je tegenwoordig in allerlei apparaten aantreft.
In figuur 1-1 zijn enkele voorbeelden te zien van gewone, alledaagse producten die microcontrollers
ingebouwd hebben. Als een apparaat knoppen heeft en een digitale display, is de kans heel groot dat
het ook een programmeerbare microcontroller aan boord heeft als hersenen.
Figuur 1-1
Alledaagse voorbeelden
van apparaten met
Microcontrollers
Probeer eens een lijst te maken van het aantal apparaten met microcontrollers die je op een dag zoal
tegenkomt. Hier zijn enkele voorbeelden: Als je wekkerradio afgaat en je de snooze-knop indrukt, is
dat die dag de eerste interactie met een microcontroller. Opwarmen van wat eten in de magnetron en
het voeren van een gesprek via je mobiele telefoon is ook een interactie met microcontrollers. En dat is
nog maar het begin. Hier zijn nog een paar voorbeelden: het aanzetten van de televisie met een
afstandsbediening, het spelen van een gameboy en het gebruik van een rekenmachine. Bij al deze
apparaten werk je samen met de microcontrollers die erin zitten.
DE BASIC STAMP 2 – JE EIGEN MICROCONTROLLERMODULE
De BASIC Stamp 2 module van Parallax Inc 's ® zoals die in figuur 1-2 is te zien, heeft een
microcontroller gebouwd. De microcontroller is de grootste zwarte chip. De rest van de componenten
op de BASIC Stamp module tref je ook aan in veel consumentenapparaten die je dagelijks gebruikt. Al
deze onderdelen bij elkaar, worden wel een embedded computersysteem genoemd. Deze naam wordt
bijna altijd afgekort tot "embedded systeem." En om de verwarring groter te maken, worden dergelijke
modules vaak aangeduid als "microcontrollers."
Aan de hand van de opdrachten in deze handleiding zul je schakelingen opbouwen die vergelijkbaar
zijn met die welke in consumentenapparatuur en hightech gadgets zitten. Verder zul je leren om
computerprogramma’s voor de BASIC Stampmodule te schrijven. Deze programma’s gaan ervoor
zorgen dat de BASIC Stamp module elektronische schakelingen kan besturen om allerlei nuttige
functies te verrichten.
Figuur 1-2
BASIC Stamp 2
Microcontroller
Module
Het woord "BASIC Stamp" verwijst naar de BASIC Stamp ® 2 microcontroller module. Deze
is ontworpen en wordt geproduceerd door Parallax Incorporated. De naam van deze module
wordt vaak afgekort als BS2, en het is de meest linkse in de reeks van modules van figuur
1-3. De andere modules zijn in detail iets anders, hebben een hogere snelheid, meer
geheugen, extra functionaliteit, of een combinatie van deze extra functies. Voor meer
informatie, verwijzen we naar de link op de website "Vergelijk BASIC Stamp Modules"
www.parallax.com / basicstamp).
Om te beginnen· Pagina 9
Figuur 1-3
BASIC Stamp 2
Models, van links
naar rechts: BS2,
BS2e, BS2sx,
BS2p24,
BS2p40, BS2pe,
BS2px
VERBAZINGWEKKENDE ONTWIKKELINGEN MET BASIC STAMP
MICROCONTROLLERS
Consumentenapparaten zijn niet de enige toepassingen met microcontrollers. Ook robots, machines,
vliegtuigen en andere hightech apparaten gebruiken microcontrollers. Laten we eens een paar
voorbeelden onder de loep nemen, die met BasicStamp modules gerealiseerd zijn.
Robots zijn ontworpen om allerlei taken uit te voeren, van het helpen van studenten om meer te leren
over microcontrollers, of om het gazon maaien, tot het oplossen van complexe mechanische
problemen. Figuur 1-4 toont twee voorbeelden van robots. In beide robots maken studenten gebruik
van de BASIC Stamp 2 om sensoren uit te lezen, motoren te besturen, en om te communiceren met
andere computers. De robot aan de linkerkant is Parallax Inc 's Boe-Bot ® robot.
De andere robot in het rechtse plaatje is een zogenaamd onderwatervaartuig of ROV (Remotely
Operated Vehicle). Hij werd gebouwd en getest bij het MATE (Marine Advanced Technology
Onderwijs) tijdens een Summerschool voor docenten. Met behulp van een camera wordt op een laptop
zichtbaar gemaakt wat de ROV ziet. De ROV wordt bestuurd door een combinatie van
bedieningsorganen met handbediening en via een laptop. De BASIC Stamp meet diepte en de
temperatuur en zorgt voor de bediening van de verticale stuwkracht, de motor, en de uitwisseling van
informatie met een laptop. MATE coördineert regionale en internationale ROV wedstrijden voor
studenten op niveaus variërend van middelbare school tot de universiteit.
Figuur 1-4
Robots in onderwijs
Boe-Bot robot (links)
ROV bij MATE Summer
Teachers Institute (rechts,
www.marinetech.org)
Andere robots lossen complexe problemen op, zoals de op afstand bediende zelfstandig vliegende
robot (rechts Figuur 1-5). Deze robot is gebouwd en getest door studenten werktuigbouwkunde aan de
Universiteit van Californië, Irvine. Ze gebruikten een BASIC Stamp module om te communiceren met
satellieten van het Global Positioning System (GPS), zodat de robot zijn positie en de hoogte zou
kunnen vaststellen. De BASIC Stamp leest ook de sensoren voor hoogte en bestuurt de motor om de
robot goed op koers te houden. De mechanische duizendpootrobot aan de rechterkant van Figuur 1-5
werd ontwikkeld door een professor aan de Nanyang Technische Universiteit, Singapore. Het apparaat
heeft meer dan 50 BASIC Stamp modules aan boord, en ze kunnen allemaal met elkaar communiceren
in een uitgebreid netwerk voor het orkestreren van de bewegingen van elke set van benen. Robots als
deze helpen ons niet alleen de ontwerpen uit de natuur beter te begrijpen, maar ze kunnen uiteindelijk
ook worden gebruikt om afgelegen locaties, of zelfs andere planeten te verkennen.
Pagina 10 · Wat is een Microcontroller? NL HJK
Figuur 1-5
Research Robots
uitgerust met
Microcontrollers
Autonome vliegende
robot op UC Irvine (links)
en het Millipede Project
aan de Nanyang
University (rechts)
Met de hulp van microcontrollers kunnen robots ook voor dagelijkse taken worden ingezet, zoals het
maaien van het gazon. De BASIC Stamp module binnen de robotgrasmaaier van figuur 1-6 zorgt dat
de maaier binnen de grenzen van het gazon blijft. Verder leest hij de sensoren uit die obstakels
detecteren en bestuurt hij de motoren die de maaier voortbewegen.
Figuur 1-6
BASIC Stamp 2
Grasmaaier met
Microcontroller Module
Microcontrollers worden, zoals eerder verteld, ook gebruikt voor allerlei wetenschappelijke projecten,
hightech toepassingen en in ruimtevaartprojecten. Het weerstation aan de linkerkant van Figuur 1-7
wordt gebruikt om gegevens te verzamelen over het milieu rond koraalriffen, om gegevens te
verzamelen rond het afsterven van koraal. De BASIC Stamp module meet en verwerkt de gegevens
van een verscheidenheid aan sensoren en slaat deze op. De wetenschappers halen deze gegevens later
op. De onderzeeër in het midden van de figuur is een onderzees exploratievoertuig, en zijn schroeven,
camera's en verlichting worden allemaal bestuurd door BASIC Stamp microcontrollers. De raket die
rechts te zien is, was onderdeel van een wedstrijd om een amateurraket in de ruimte te lanceren.
Niemand won de wedstrijd, maar deze raket haalde het bijna! De BASIC Stamp bestuurde bijna elk
aspect van de lancering.
Figuur 1-7
Voorbeelden van toepassingen
met microcontrollers in
ruimtevaart en meteorologie
Links: Verzamelen van
klimaatgegevens v ( EME
Systems) (links) Midden:
Diepzee research ( Harbor
Branch Institute. Rechts een
testlancering van een raket (JP
Aerospace)
Van gewone huishoudelijke apparaten via wetenschappelijkeapparaten tot ruimtevaarttoepassingen, je
zult de basisbeginselen van microcontrollers telkens weer nodig hebben voordat je kunt beginnen met
projecten zoals die hier in de voorbeelden worden beschreven. Door de opdrachten in dit boek te
volgen, zul je via de verschillende opdrachten leren hoe je een verscheidenheid aan bouwstenen kunt
gebruiken zoals je die ook tegenkomt in de hier beschreven hightech uitvindingen. Je gaat
schakelingen bouwen voor displays, sensoren, en motioncontrollers. Je zult leren hoe deze
schakelingen verbinding maken met de BASIC Stamp 2 module, en hoe je een computerprogramma
kunt schrijven, gegevens kunt verzamelen van sensoren en hoe je beweging kunt besturen. Terloops
leer je vele belangrijke concepten en technieken over elektronica en computerprogrammering. Tegen
de tijd dat je klaar bent, heb je voldoende kennis om een apparaat naar eigen ontwerp uit te vinden.
Om te beginnen· Pagina 11
HARDWARE EN SOFTWARE
Aan de slag gaan met de BASIC Stamp microcontroller modules is vergelijkbaar met het gaan werken
met een gloednieuwe PC of laptop. De eerste dingen die de meeste mensen moeten doen is het
apparaat uit de doos halen, aansluiten en het installeren en testen van software, en soms misschien
zelfs wat eigen software schrijven met behulp van een programmeertaal. Als dit je eerste ervaringen
zijn met een BASIC Stamp module, zul je ongeveer dezelfde dingen doen. Als je in een klas zit, staat
de hardware misschien al helemaal klaar voor je. Als dit het geval is, heeft je leraar waarschijnlijk
instructies voorbereid. En indien dat allemaal niet het geval is, zullen we je in dit hoofdstuk door alle
stappen loodsen, om je nieuwe BASIC Stamp microcontroller op gang te krijgen.
OPDRACHT #1: HET INRICHTEN VAN DE WERKOMGEVING
De BASIC Stamp Editor (versie 2.5 of hoger) is de software die je gaat gebruiken in de meeste
opdrachten en projecten in deze handleiding. Deze software wordt gebruikt om programma’s te
schrijven die in de BASIC Stamp module worden uitgevoerd. De software is ook te gebruiken voor het
weergeven van boodschappen en berichten die verzonden worden door de BASIC Stamp. Je kunt
bijvoorbeeld een tekst laten verschijnen, die aangeeft, welke waarden sensoren meten.
Systeemeisen Computer
Je hebt een Personal Computer nodig om de BASIC Stamp Editor software te kunnen gebruiken. Die
computer zal de volgende eigenschappen moeten hebben:
•
•
•
Microsoft Windows 2000 of een nieuwer besturingssysteem
Een beschikbare seriële of USB-poort
Internet toegang en een internet-browser
Downloaden van de software van het Internet
Het is belangrijk om altijd de nieuwste versie van de BASIC Stamp Editor software te gebruiken. Voor
de eerste stap ga je naar de Parallax website om de software te downloaden.
9 Met behulp van een web browser, ga je naar www.parallax.com / basicstampsoftware (Figuur
1-8). Deze website is alleen in het Engels beschikbaar.
Figuur 1-8
The BASIC Stamp Editor
software pagina op
www.parallax.com/
Basicstampsoftware
Hier kun je de laatste
software versie ophalen.
9 Klik op de Click Here to Download knop en download de nieuwste versie van de BASIC Stamp
Editor-software van Windows (figuur 1-9).
Pagina 12 · Wat is een Microcontroller? NL HJK
Figuur 1-9
The Download button op
de BASIC Stamp Editor
Software pagina.
Klik op de knop en start
het downloaden
9 De File Download dialoog zal zichtbaar worden en je de vraag stellen of je de file wilt opslaan
of uitvoeren. Kies voor opslaan (Figuur 1-10).
Figuur 1-10
File Download venster
Klik Save, om de file op
je computer op te slaan.
9 Type de filenaam in het veld Save in om de file op een plaats op te slaan die jij wilt. (Figuur 1-11)
Figuur 1-11
Save As venster
Kies een folder en geef
een filenaam om het
installatiepakket op je PC
op te slaan en klik Save.
9 Als je de boodschap ziet, “Download Compleet” klik je op de Run knop (Figuur 1-12.)
9 Afhankelijk van het besturingssysteem op je PC, krijg je wellicht de boodschap te zien met de
vraag of deze toepassing geïnstalleerd mag worden. Beantwoord deze vraag altijd met ja.
Om te beginnen· Pagina 13
Figuur 1-12
Download gereed
scherm
klik Run.
Als gevraagd wordt
om de toepassing te
installeren, antwoord
dan met ja
9 Hierna wordt het installatiescherm van de BASIC Stamp Editor zichtbaar (Figuur 1-13) Click
Next, en bevestig alle volgende boodschappen met standaard instellingen.
Figuur 1-13
BASIC Stamp Editor
Installatiescherm
klik Next.
9 BELANGRIJK: Als de boodschap verschijnt: “Install USB Driver” (Figuur 1-14), laat je de
checkbox aangevinkt op Automatically install/update driver (recommended) en klik Next.
Figuur 1-14
Install USB Driver
scherm
Laat de box
aangevinkt en klik
Next.
9 Indien de boodschap “Ready to Install the Program” verschijnt (Figuur 1-15), klik de Install
button. Er verschijnt een progress bar, die de voortgang van de installatie aangeeft.
Pagina 14 · Wat is een Microcontroller? NL HJK
Figuur 1-15
Gereed voor
Installatie van het
programma
klik Install om door
te gaan.
Op dit punt kan een extra venster verschijnen achter het huidige venster, terwijl de USBstuurprogramma’s worden bijgewerkt. Dit venster zal uiteindelijk vanzelf sluiten wanneer de
installatie is voltooid. Als je dit venster niet ziet, dan duidt dat dus niet meteen op een probleem.
Over USB-stuurprogramma's. De USB-stuurprogramma’s installeren zich tegelijk met de
BASIC Stamp Editor Windows installer en zijn nodig om de Parallax hardware te verbinden
met de USB poort van de computer. VCP staat voor Virtual COM-poort en maakt het
mogelijk om de USB-poort van je computer te behandelen als een standaard RS232 seriële
poort.
USB-stuurprogramma’s voor andere besturingssystemen Het standaard USBstuurprogramma's VCP dat is opgenomen in de BASIC Stamp Editor software is maar voor
bepaalde Windows-besturingssystemen te gebruiken. Voor de laatste informatie over
drivers, kun je het beste kijken op de website www.parallax.com/usb/drivers.
9 Als er een scherm verschijnt met de melding, dat de installatie gelukt is, klik je op Finish
(Figuur 1-16).
Figuur 1-16
BASIC Stamp
Editor Installatie
voltooid
klik Finish.
OPDRACHT #2: GEBRUIK DE HELP FILE VOOR DE HARDWARE SETUP
We gaan nu het Helpbestand van de BASIC Stamp Editor leren gebruiken. In het Help-bestand vind je
informatie over de verschillende BASIC Stamp ontwikkelborden die beschikbaar zijn voor het Stamps
in Class programma en kun je vaststellen welk bordje je zelf gebruikt. Door de stappen te volgen in de
Help krijg je instructie, hoe het bordje moet worden aangesloten op je computer en hoe het BASIC
Stamp programmeersysteem getest kan worden.
Om te beginnen· Pagina 15
Start de BASIC Stamp Editor voor de eerste keer
9 Als je de BASIC Stamp Editor icoon op de desktop van je computer ziet, dubbel-klik op dit
icoontje (Figuur 1-17).
9 Of, klik in het Start menu, daarna All Programs Parallax Inc BASIC Stamp Editor 2.5 BASIC Stamp Editor 2.5.
Figuur 1-17
BASIC Stamp Editor
Desktop Icon
Dubbel-klik om het
programma te starten
9 Klik op de BASIC Stamp Editor’s toolbar op Help (Figuur 1-18) selecteer dan BASIC Stamp
Help… uit het drop-down menu. LET OP: Alle helpteksten zijn wel in het Engels.
Figuur 1-18
Openen van het Help
Menu
Klik Help,kies dan BASIC
Stamp Help uit het dropdown menu.
Figuur 1-19: BASIC Stamp Editor Help
9 Klik op de link Getting Started with Stamps in Class onder aan de Welcome page, zoals
linksonder te zien is in Figuur 1-19.
Pagina 16 · Wat is een Microcontroller? NL HJK
Volg de aanwijzingen in het Helpscherm
Vanaf hier volg je de aanwijzingen in het Helpbestand om de volgende taken te voltooien:
• Stel vast welk BASIC Stamp bordje je gebruikt
• Sluit je bordje aan op de computer via de USB-kabel
• Test je programmeerverbinding
• Los problemen met de verbinding op, indien nodig
• Schrijf je eerste PBASIC programma voor je BASIC Stamp
• Schakel de spanning van het bordje uit als je klaar bent
Wanneer je gereed bent met alle opdrachten in dit deel van het Helpbestand, ga je terug naar dit boek
en kun je de samenvatting hieronder doorlezen, voordat je doorgaat naar hoofdstuk 2.
Wat moet ik doen als het niet werkt?
Als je in de problemen komt, terwijl volgens de instructies in dit boek of in het Help-bestand,
heb je veel mogelijkheden om gratis technische ondersteuning te krijgen:
•
Forums: meld je aan en laat een bericht achter op ons gratis Stamps in Class forum op
forums.parallax.com.
•
E-mail: Stuur een e-mail naar [email protected].
•
Meer bronnen: Bezoek www.parallax.com / support.
SAMENVATTING
In dit hoofdstuk heb je het volgende geleerd:
• Een introductie in apparaten, die microcontrollers bevatten
• Een introductie in de BASIC Stamp module
• Een aantal voorbeelden van interessante uitvindingen en projecten met BASIC Stamp
modules
• Hoe de gratis BASIC Stamp Editor software te verkrijgen is. Je hebt deze bij alle
experimenten nodig
• Hoe de BASIC Stamp Editor software geïnstalleerd moet worden.
• Hoe de BASIC Stamp Editor’s Help en het BASIC Stamp handboek gebruikt moeten worden
• Een inleiding tot de BASIC Stamp module, en de verschillende testbordjes
• Hoe je de BASIC Stamp hardware moet aansluiten
• Hoe je de software en hardware kunt testen
• Hoe je een PBASIC programma moet schrijven en uitvoeren
• Het gebruik van de commando’s DEBUG en END
• Het gebruik van het CR control teken en de formatteerinstructie DEC
• Een korte inleiding in ASCII codes
• Hoe de spanning uit te schakelen, als je klaar bent
Vragen
1. Wat is een microcontroller?
2. Is de BASIC Stamp module een microcontroller of bevat hij er een?
3. Welke kenmerken zou je willen bekijken, om van bijvoorbeeld een printer vast te stellen, of
er een microcontroller in zit?
4. Wat doet een apostrof aan het begin van een regel in een PBASIC programcode?
5. Welk PBASIC commando heb je in dit hoofdstuk geleerd?
6. Laten we voorstellen, dat je even een pauze neemt. Misschien tot zo meteen, of misschien tot
over een paar dagen. Wat moet je altijd doen, als je stopt met de BASIC Stamp?
Oefeningen
1. Leg uit wat het *-teken in deze regel doet?
DEBUG DEC 7 * 11
Om te beginnen· Pagina 17
2. Geef aan, wat de terminal zou laten zien bij het volgende commando:
DEBUG DEC 7 + 11
3. Er is een probleem bij de volgende twee commando’s. Als je het programma uitvoert, lijken
de getallen aan elkaar geplakt te zijn. Pas het programma zo aan, dat de antwoorden op
verschillende regels verschijnen.
DEBUG DEC 7 * 11
DEBUG DEC 7 + 11
Opdrachten
1. Gebruik het commando DEBUG om het resultaat van de volgende som te laten zien: 1 + 2 + 3 +
4
2. Sla je eerste programma op onder een andere naam. Als je nu het DEBUG commando zoals
hieronder is te zien, net boven het END commando plaatst, welke andere regels kun je dan
weggooien, zonder dat de werking van het programma verandert? Pas je programma aan en
kijk of dit klopt.
DEBUG "What's 7 X 11?", CR, "The answer is: ", DEC 7 * 11
Antwoorden
V1. Een microcontroller is een soort miniatuurcomputer
V2. De BASIC Stamp module bevat een microcontrollerchip.
V3. Als een apparaat knoppen heeft en een digitale display, is er een goede kans, dat er een
microcontroller in zit.
V4. Dit geeft aan, dat de regel commentaar is en niet wordt uitgevoerd.
V5. DEBUG en END
V6. Schakel de spanning van BASIC Stamp project uit als je stopt.
Het *-teken is het teken om getallen te vermenigvuldigen, zodat het vermenigvuldigen van de
twee getallen 7 en 11, 77 oplevert..
De Debug Terminal toont: 18
Om het probleem op te lossen, moet je een CR teken (nieuwe regel) en een komma toevoegen.
DEBUG DEC 7 * 11
DEBUG CR, DEC 7 + 11
P1. Hier is een programma met de oplossing voor de vraag: 1+2+3+4.
' What's a Microcontroller - Ch01Prj01_Add1234.bs2
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "What's 1+2+3+4?"
DEBUG CR, "The answer is: "
DEBUG DEC 1+2+3+4
END
P2. De laatste drie DEBUG regels kunnen worden verwijderd. Er is een extra CR-teken nodig na de
"Hello" boodschap.
Pagina 18 · Wat is een Microcontroller? NL HJK
' What's a Microcontroller - Ch01Prj02_ FirstProgramYourTurn.bs2
' BASIC Stamp sends message to Debug Terminal.
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Hello, it's me, your BASIC Stamp!", CR
DEBUG "What's 7 X 11?", CR, "The answer is: ", DEC 7 * 11
END
Het resultaat op de Debug terminal is;
Hello, it's me, your BASIC Stamp!
What's 7 X 11?
The answer is: 77
Het resultaat is hetzelfde als bij het vorige programma. Dit voorbeeld laat zien, hoe je met
slechts een DEBUG commando en komma’s meerdere variabelen op de terminal kunt laten
zien.
LED’s aan- en uitschakelen · Page 19
Hoofdstuk 2: LED’s aan- en uitschakelen
INDICATIELAMPJES
Indicatielampjes komen zo vaak op apparaten voor dat de meeste mensen er niet meer bij stil staan.
Figuur 2-1 toont drie indicatielampjes op een laserprinter. De lichtjes geven aan of de printer goed
werkt of misschien aandacht nodig heeft. Hier zijn nog een paar voorbeelden van apparaten met
indicatielampjes: autoradio's, televisies, dvd-spelers, harde schijven en printers.
Figuur 2-1
Indicatielampjes
Indicatielampjes zijn
heel gewoon op
allerlei apparaten.
Een lampje aan- en uitzetten is eigenlijk het verbinden en loskoppelen van een LED met een
spanningsbron. In sommige gevallen wordt de indicatielamp of LED rechtstreeks aangesloten op de
accu of voeding, zoals het lampje op het bordje, dat aangeeft of de spanning is ingeschakeld. Andere
lampjes worden in- en uitgeschakeld door een microcontroller in een apparaat. Dit zijn meestal
lampjes die je iets vertellen over de status van het apparaat.
INSCHAKELEN VAN EEN LIGHT-EMITTING DIODE (LED)
Een LED schakeling kan aangesloten worden op de BASIC Stamp en de BASIC Stamp kan zo
geprogrammeerd worden dat de pen, die op de LED is aangesloten, spanning krijgt of niet. Dit is veel
makkelijker dan met de hand de draden in de schakeling met de batterij te verbinden. De BASIC
Stamp kan geprogrammeerd worden om het volgende te doen:
•
Aan- en uitzetten van de LED op verschillende snelheden
•
Een vast aantal keren de LED aan- en afzetten
•
Controle over meer dan een LED
•
Controle over de kleur van een tweekleurige LED
OPDRACHT #1: BOUWEN EN TESTEN VAN EEN LED SCHAKELING
Het is belangrijk om onderdelen afzonderlijk te testen, voordat deze in een groter systeem worden
ingebouwd. Dit voorkomt, dat een systeem onverwachte fouten heeft. In deze activiteit richten we ons
op het bouwen en testen van twee verschillende LEDschakelingen. Bij de eerste schakeling zetten we
de LED aan. De tweede schakeling laat de LED uit. In de volgende opdracht verbind je de
LEDschakeling aan de BASIC Stamp. Je zult zelf een programma schrijven dat de BASIC Stamp LED
afwisselend aan en uit zet. Door de beide schakelingen eerst afzonderlijk te testen of ze naar behoren
werken, weet je zeker dat deze werken als je alles tegelijk aansluit op een BASIC Stamp.
Wat is een weerstand
Een weerstand is een onderdeel dat "weerstand" biedt aan een elektrische stroom. Elke weerstand heeft
een waarde die aangeeft hoe sterk weerstand geboden wordt aan een elektrische stroom. Deze
weerstandswaarde wordt uitgedrukt in de ohm, en het teken voor de ohm is de Griekse letter omega:
Ω. Later in dit boek zie je ook het symbool kΩ, hetgeen de aanduiding is voor kilo-ohm, of duizend
ohm. In deze opdracht wordt een weerstand gebruikt van de 470 Ω De weerstand is te zien in Figuur
2-2. Een weerstand heeft twee draden, elk aan een uiteinde van de weerstand. Er zit een keramische
Pagina 20 · Wat is een Microcontroller? NL HJK
kern tussen de twee draden en dit is het deel dat weerstand biedt aan de stroom. De meeste schema's
die gebruik maken van weerstanden, gebruiken het gekartelde symbool aan de linkerzijde van de
figuur. Het vertelt de persoon die de schakeling bouwt, dat hij of zij een 470 Ω weerstand moet
gebruiken. Zo’n symbool noemen we een schematisch symbool. De tekening aan de rechterkant is een
onderdeeltekening die gebruikt wordt in teksten voor beginners in dit boek om je te helpen de goede
weerstand uit de kit te kiezen, en deze op de juiste manier te plaatsen wanneer je de schakeling bouwt.
Gold
Silver
or
Blank
470 Ω
Yellow
Violet
Figuur 2-2
470 Ω weerstand symbool (links) en
voorbeeld (rechts)
Brown
De weerstanden die we gebruiken in deze activiteit hebben gekleurde strepen die je vertellen welke
weerstandswaarde de weerstand heeft. Elke weerstandswaarde heeft een eigen kleurcombinatie. Zo is
de kleurcode voor de weerstand van 470 Ω bijvoorbeeld geel-violet-bruin.
Er kan een vierde streep op de weerstand staan, die de tolerantie van de weerstand aangeeft. De
tolerantie wordt aangegeven in procenten en het vertelt welke afwijking de weerstandswaarde kan
hebben ten opzichte van de aangegeven waarde van de kleurcode. We kennen de volgende
aanduidingen voor toleranties: goud (5%), zilver (10%) of geen streep (20%). Voor de opdrachten in
dit boek, doet de tolerantie van de weerstand er niet toe, maar de waarde ervan.
Elke gekleurde streep op de weerstand komt overeen met een cijfer. De kleuren zijn te zien in Tabel 21. Figuur 2-3 laat zien hoe je een gekleurde streep via de tabel kunt omzetten in een cijfer om zo de
waarde van een weerstand te bepalen.
Tolerance
Code
Tabel 2-1
Weerstand code
waarde
Getal
0
1
2
3
4
5
6
7
8
9
kleur
Zwart
Bruin
Rood
Orange
Geel
Groen
Blauw
Violet
Grijs
Wit
First Digit
Number of Zeros
Figuur 2-3
Kleurcodering
weerstand
Second Digit
Hier volgt een voorbeeld dat laat zien hoe Tabel 2-1 en Figuur 2-3 gebruikt kunnen worden om de
kleurcodering geel-violet-bruin om te zetten in de weerstandswaarde van 470 Ω:
•
•
•
De eerste streep is geel, wat betekent dat het meest linkse cijfer een 4 is.
De tweede streep is paars, wat betekent dat het volgende cijfer een 7 is.
De derde streep is violet en geeft aan hoe vaak het getal 47 met 10 moet worden vermenigvuldigd.
Omdat bruin 1 is, betekent dit dat de we het getal 47 met 1x10 moeten vermenigvuldigen. We moeten
dus een nul toevoegen aan de rechterkant van de eerste twee cijfers wat resulteert in een waarde van:
Geel-Violet-Bruin = 4-7-0 = 470 Ω.
LED’s aan- en uitschakelen · Page 21
Introductie van de LED
Een diode is op te vatten als een fietsventiel. Een lichtemitterende diode (LED) straalt licht uit
wanneer er stroom doorheen gaat. In tegenstelling tot de kleurcodes op een weerstand is de kleur van
een LED alleen maar een indicatie van de kleur waarmee de LED opgloeit als er stroom doorheen
gaat. De belangrijke markeringen van een LED zijn zichtbaar aan de buitenkant. Voor een LED is het
belangrijk, dat deze in de goede richting is aangesloten, anders zal de LED geen licht geven.
Figuur 2-4 toont het schematische symbool LED's en een tekening. Een LED heeft twee aansluitingen.
De ene heet de anode, en de andere wordt de kathode genoemd. In deze opdracht gaan we een LED
aansluiten. Zorg ervoor dat de aansluitingen van de anode en kathode op de goede manier zijn
aangesloten. Op de onderdeeltekening is de anode aangegeven met een plusteken (+).De anode is het
brede deel van de driehoek. De kathode is de ongelabelde pin, en in het schemasymbool is de kathode
de lijn bij de punt van de driehoek.
Figuur 2-4
LED tekening (boven) en
Schemasymbool (onder)
In tekeningen van LED’s in de
volgende plaatjes wordt de anode
steeds met een + teken aangeven.
+
LED
Wanneer je begint met de bouw van een schakeling, let dan goed op het symbool en op de
onderdeeltekening. De aansluitingen van de LED hebben een verschillende lengte. De lange draad is
de anode (+ aansluiting) van de LED. De korte draad is de kathode. Als je het plastic huisje goed
bekijkt, zie je een kleine platte kant op de LED. Dat is een andere aanduiding voor de kathode. Deze
komt van pas als de draden van de LED op dezelfde lengte zijn afgeknipt.
Onderdelen voor de LED schakeling
(1) LED – Groen
(1) Weerstand – 470 Ω (geel –violet- bruin)
Het identificeren van de onderdelen: In aanvulling op de onderdeel tekeningen in Figuur
2-2 en Figuur 2-4, kun je gebruik maken van de foto op de laatste pagina van het boek om
de onderdelen in de kit te herkennen die nodig zijn voor deze en volgende opdrachten.
Bouwen van de LED schakeling
De volgende schakeling gaan we bouwen door de draden van de LED en weerstand in de kleine
gaatjes van het prototypegebied van Figuur 2-5 te steken. Dit prototypegebied heeft zwarte
“contactstroken” aan de bovenzijde en langs de linkerzijde. Deze zwarte “contactstroken” op de
bovenkant hebben de namen: Vdd, Vin, en Vss. Ze hebben een naam die verwijst naar de
aansluitingen van de voeding. Ze zullen gebruikt worden om de schakeling van voedingsspanning te
voorzien. De zwarte “contactstroken” aan de linkerkant hebben labels zoals P0, P1, tot P15. Deze
zullen gebruikt worden om je schakeling te verbinden met de in- en uitgangspennen van de BASIC
Stamp module. Het witte bordje met de vele gaatjes noemt men een “soldeerloos” printbord of
“Breadboard”. Op dit bordje gaan we de schakeling opbouwen
Pagina 22 · Wat is een Microcontroller? NL HJK
Vdd
Vin
Vss
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 2-5
Prototype gebied
Aansluitingen voor voeding (zwarte
strip langs de bovenzijde), I/O
penaansluitingen zwarte strip links),
en soldeerloos printbord(witte vlak)
Input / output pinnen worden doorgaans " I/O-pinnen genoemd. Nadat je de schakeling
hebt opgebouwd, en de verbindingen zijn gelegd met deze in- en uitgangen (Met I/O-pinnen)
kun je signalen besturen (uitgangen) en bekijken (ingangen) vanuit een programma in de
BASIC Stamp.
Je gebruikt het breadboard om de verbinding tussen de onderdelen te maken en deze samen te bouwen
tot een schakeling. Dit breadboard heeft 17 rijen met gaatjes. In elke rij zijn telkens vijf gaatjes
gegroepeerd ,gescheiden door een groef in het midden. Alle 5 gaatjes in een groep zijn met elkaar
verbonden. Dus, als je twee draden aansluit op dezelfde rij van 5 gaatjes, zijn ze elektrisch verbonden.
Twee draden in dezelfde rij, maar aan weerszijden van de centrale groef zijn niet doorverbonden. Veel
onderdelen zijn zo ontworpen dat hun aansluitingen elk aan een zijde van de centrale groef kunnen
worden aangesloten. De drukknop die we later zullen gebruiken in : Digitale Input - Druktoetsen, is
een goed voorbeeld.
Meer over breadboarding: Om meer te leren over het ontstaan van breadboards of hoe de
moderne breadboards worden gemaakt en hoe ze te gebruiken zijn, kun je kijken op
www.parallax.com/go/ WAM.
Figuur 2-6 laat het schema en de schakeling zien zoals deze wordt opgebouwd op het breadboard. Per
groep van 5 gaatjes kunnen steeds maximaal 5 draden worden verbonden. In deze schakeling zijn de
weerstand en de LED verbonden omdat de draden zijn aangesloten op dezelfde groep gaatjes. Een
draad van de weerstand is aangesloten op Vdd (+5 V), zodat de schakeling gevoed wordt. De andere
aansluiting van de weerstand is met de anode van de LED verbonden. De kathode van de LED is
aangesloten op Vss (0 V, massa). De schakeling is nu klaar.
De schakeling van Figuur 2-6 kan worden opgebouwd door het inpluggen van de LED en de
weerstand op het prototypebord via de volgende stappen:
9 Schakel de stroom uit.
9 Gebruik Figuur 2-4 om te beslissen welke draden moeten worden aangesloten op de kathode
van de LED.
9 Kijk goed naar de korte aansluiting en de afplatting op het plastic deel van de LED. Steek de
kathodeaansluiting van de LED's in een van de zwarte aansluitingen bij het label Vss in het
prototyping gebied.
9 Plug de anode van de LED's (de andere, lange draad) in de aangegeven aansluiting op het
prototypebord.
9 Plug een van de aansluitingen van de weerstand in dezelfde groep gaatjes als de anode van de
LED
9 Steek de andere aansluiting van de weerstand in een van de aansluitingen met de aanduiding
Vdd
LED’s aan- en uitschakelen · Page 23
Oriëntatie van een LED is belangrijk. Maar is dat niet voor de weerstand. Als je de
aansluitingen van de LED omwisselt, zal de LED geen licht geven wanneer je de voeding
verbindt. Een weerstand kent geen richting en werkt altijd hetzelfde, ongeacht de
stroomrichting
9 Sluit de spanning aan op je bordje
9 Controleer of de LED groen licht uitstraalt.
Vdd
Vdd
X3
470 Ω
LED
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
Vss
+
Figuur 2-6
LED aan, direct aangesloten op de
voeding.
Schema (links) en aansluitingen
(rechts).
Let op, dat een aansluiting van de
weerstand en een van de LED ‘s (de
anode) in dezelfde groep gaatjes zijn
aangesloten
Wat kun je doen als de groene LED geen licht geeft en de voeding is aangesloten op het bord:
9 Sommige LED’s zijn het helderst als je er van boven op kijkt.
9 Indien er teveel licht in de kamer is, moet je wat lampen uitdoen, of met je handen een
schaduw rond de LED maken.
Indien je nog steeds geen groene LED ziet branden kun je deze stappen volgen.
9 Sommige LED’s zijn het helderst als je er van boven op kijkt.
9 Dubbelcheck om er zeker van te zijn dat de kathode en de anode juist zijn aangesloten. Indien
niet, verwijder de LED uit het bord, geef hem een halve draai en plug hem terug in het bord.
Dit zal de LED niet beschadigen. Check of de Led nu licht uitstraalt.
9 Dubbelcheck om er zeker van te zijn dat je schakeling exact hetzelfde is zoals in Figuur 2-6.
9 Indien iemand voor jou de microcontrollerkit gebruikt heeft, kan het zijn dat de LED
beschadigd is, probeer een andere.
9 Indien je in een klas zit, vraag dan je instructeur om hulp.
Werkt het nog steeds niet? Indien je geen instructeur of vriend hebt die kan helpen, kun je
altijd de Stamps in Class discussiegroep aanspreken op de website. De eerste pagina’s in
dit boek gaan over Internet toegangsinformatie en waar je de discussiegroep kan vinden.
Indien de groep je niet kan helpen, kan je nog het Parallax Technical Support departement
raadplegen door de link te volgen naar Support op www.parallax.com.
Hoe de LED schakeling werkt
De Vdd en Vss aansluitingen leveren elektrische druk op dezelfde manier als een batterij dat zou doen.
Vergelijk het met druk van water, als je een tuinslang dichtknijpt De Vdd aansluitingen zijn de
positieve aansluiting van de batterij, en de Vss aansluitingen zijn de negatieve aansluiting van de
batterij. Figuur 2-7 laat zien hoe de elektrische druk met behulp van een batterij er voor zorgt, dat
elektronenstromen door een schakeling lopen. Deze stroom van elektronen wordt elektrische stroom
genoemd, of gewoon stroom. Elektrische stroom wordt afgeremd door de weerstand. Vergelijk dit met
het gedeeltelijk dichtknijpen van de tuinslang bij stromend water. De stroom door de LED zorgt dat
deze licht geeft.
Pagina 24 · Wat is een Microcontroller? NL HJK
+
N
-
-
N N
+++
+++
+++
_
--- - -N
-N - N
-
+
+
=
N
Figuur 2-7
LED aan. De elektronenstroom door
de LED
-
-
-
-
-
-
-
-
-
-
-
De mintekens in de cirkels laten zien,
dat elektronen eigenlijk vanuit de
negatieve aansluiting van de batterij
naar de positieve aansluiting
stromen.
Chemische reacties in de batterij voorzien een elektrische schakeling van stroom. De
negatieve pool van de batterij bevat de moleculen met extra elektronen (zoals in Figuur 2-7
met min tekens). De positieve pool van de batterij bevat moleculen die elektronen tekort
hebben (getoond met plus tekens). Als een elektron een negatieve molecule verlaat en door
de draad wordt getransporteerd, noemt men het een vrij elektron ( ook getoond met –
tekens). De molecule die geen extra elektronenladingen meer heeft wordt een neutraal
element genoemd (getoond met een N). Als het elektron aan de positieve pool aankomt,
wordt het bij een molecule gevoegd die een elektron miste, en zo wordt die molecule ook
neutraal.
Figuur 2-8 toont de stroomrichting van elektriciteit door een LED-schakeling zoals beschreven in de
opmerking van het schema. De elektrische druk in het schema wordt spanning genoemd. De + en –
tekens worden gebruikt om de richting van de stroom in de schakeling aan te duiden. De pijl toont hoe
de stroom zich door de schakeling verplaatst. De pijl wijst altijd in de tegengestelde richting van de
eigenlijke elektronenstroom. Benjamin Franklin was niet op de hoogte van deze elektronen toen hij
besloot om stroomrichting aan te duiden van de positieve naar de negatieve pool. Tegen de tijd dat de
fysicageleerden hadden ontdekt dat de waarheid net andersom is, was de conventie al lang vastgelegd.
Voltage
+
Vdd
Resistance
Current
LED
Voltage
-
Figuur 2-8
Schema van LED Aan schakeling
Schematische voorstelling van de
afspraak over spanning en stroom
De + en – tekens tonen de spanning
en de pijlen tonen de stroomrichting
door de schakeling
Vss
Een schematische tekening (zoals Figuur 2-8) is een tekening die uitlegt hoe een of
meerdere schakelingen samengevoegd zijn. Schema’s worden gebruikt door studenten,
elektronicahobbyisten, elektriciens, ingenieurs en ongeveer iedereen die met elektrische
schakelingen werkt.
Appendix F: Meer over Elektriciteit: Dit appendix bevat meer uitleg en opdrachten
waardoor je meer vertrouwd raakt met spanning, volt, stroom, ampère en weerstand.
Jouw beurt – Aanpassen van de LED-schakeling
In de volgende opdracht zul je een programma laten draaien op de BASIC Stamp om de LED aan- ,
uit- en daarna weer aan te zetten. De BASIC Stamp zal dit doen door de schakeling van de LED
achtereenvolgens te verbinden met Vdd en Vss. Wat je in de vorige opdracht met de hand hebt gedaan,
namelijk het aansluiten van een weerstand op Vdd, waardoor de LED licht uitzendt, wordt nu door de
microcontroller gedaan. Voer de veranderingen uit van Figuur 2-9 om te controleren of de LED dooft
indien de weerstand van Vdd wordt losgekoppeld en indien je deze hebt verbonden met Vss.
9 Verwijder de voeding van het Board of Education of het HomeWork Board.
9 Trek de weerstand uit de voet Vdd, en plug hem in de voet met naam Vss zoals in Figuur 2-9.
LED’s aan- en uitschakelen · Page 25
9 Sluit de voeding weer aan op het Board of Education of het HomeWork Board.
9 Ga na dat de groene LED niet brandt!
Waarom geeft de LED geen licht? Aangezien beide uiteinden van de schakeling zijn
aangesloten op dezelfde spanning (Vss), staat er geen elektrische spanning op de LED. Er
loopt dus geen stroom door de schakeling en de LED blijft uit.
Vdd
Vin
Vss
X3
470 Ω
Vss
LED
Vss
+
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 2-9
LED Uit Schakeling
Schematisch (links) en
draad diagram (rechts).
OPDRACHT #2: AAN EN UIT MET DE BASIC STAMP
In Opdracht # 1, zijn er twee verschillende schakelingen gebouwd en getest. De ene schakeling deed
de LED oplichten, de andere zorgde er juist voor dat de LED uit bleef. Figuur 2-10 toont hoe de
BASIC Stamp hetzelfde kan doen als je de LEDschakeling aansluit op de I/O pinnen. In deze opdracht
ga je de LEDchakeling aansluiten op de BASIC Stamp en de microcontroller programmeren om de
LED aan of uit te zetten. Je gaat experimenteren met een ander programma om met de BASIC Stamp
de LED in verschillende snelheden aan en uit te zetten.
.
SOUT
1
24
VIN
23
VSS
SIN
2
22
RES
ATN
3
21
VDD (+5V)
VSS
4
20
P15
P0
5
19
P14
P1
6
18
P13
P2
7
SIN
2
ATN
3
VSS
4
P0
5
P1
6
P2
7
P3
8
17
P4
9
BS2
Vdd
Vss
SOUT
1
BS2
Vdd
Vss
24
VIN
23
VSS
22
RES
21
VDD (+5V)
20
P15
19
P14
18
P13
P12
P3
8
17
P12
16
P11
P4
9
16
P11
P5 10
15
P10
P5 10
15
P10
P6
11
14
P9
P6
11
14
P9
P7 12
13
P8
P7 12
13
P8
BS2-IC
BS2-IC
Figuur 2-10
BASIC Stamp
Schakeling
De BASIC Stamp
kan zo
geprogrammeerd
worden om intern
de verbinding te
maken van de
LED input met
Vdd of Vss.
Er zijn twee grote verschillen tussen het veranderen van de stroom, met de hand, of met de BASIC
Stamp. Ten eerste hoeft de BASIC Stamp de voeding niet af te koppelen om de LED afwisselend met
Vdd of met Vss te verbinden. Ten tweede kan de mens zo’n verandering maar enkele keren per
minuut maken, terwijl de BASIC Stamp dat wel duizend keer per seconde kan!
LED Testschakeling
Hetzelfde als opdracht #1.
Verbinden van de LED-schakeling met de BASIC Stamp
De LEDschakeling van Figuur 2-11 is verbonden met dezelfde schakeling van de vorige oefening. Het
verschil is, dat waar de aansluiting van de weerstand eerst met de hand geschakeld moest worden
tussen Vdd en Vss dit nu gedaan wordt door de BASIC Stamp I/O pin.
Pagina 26 · Wat is een Microcontroller? NL HJK
9 Koppel de voeding af van het Board of Education of het HomeWork Board.
9 Verander het schema van opdracht #1 zodat het overeenkomt met Figuur 2-11.
Vdd
P14
X3
470 Ω
LED
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
Vss
+
Figuur 2-11
BASIC Stamp
gestuurd LED
Schakeling
De LED schakeling
input is nu verbonden
met de BASIC Stamp
I/O pin in plaats van
rechtstreeks
verbonden met Vdd of
Vss.
Weerstanden zijn essentieel. Onthoud om altijd een weerstand te gebruiken,
zonder de weerstand kan er teveel stroom door de schakeling lopen en
verschillende componenten kunnen beschadigd worden op de schakeling
De LED Aan/Uit zetten met een Programma
Dit voorbeeldprogramma laat een LED een aantal malen per seconde knipperen. Er worden
verschillende programmatechnieken gebruikt. Nadat je het programma gedraaid hebt, zal ga je
experimenteren met verschillende delen in je programma om beter te verstaan begrijpen hoe het
programma werkt.
Programma: LedOnOff.bs2
9
9
9
9
9
Geef de LedOnOff.bs2 code in op de BASIC Stamp Editor.
Sluit de voeding terug aan op het Board of Education of het HomeWork Board.
Start het programma.
Controleer of de LED eens eenmaal per seconde aan en uitgeschakeld wordt.
Koppel de voeding los als je klaar bent met het programma.
'What's a Microcontroller - LedOnOff.bs2
'Turn an LED on and off. Repeat 1 time per second indefinitely.
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "The LED connected to P14 is blinking!"
DO
HIGH 14
PAUSE 500
LOW 14
PAUSE 500
LOOP
Hoe LedOnOff.bs2 Werkt
Het commando DEBUG "The LED connected to Pin 14 is blinking!" zorgt ervoor dat deze
zin op de Debug Terminal tevoorschijn komt. Het commando HIGH 14 zorgt ervoor dat intern in de
BASIC Stamp de I/O pin P14 verbonden wordt met Vdd. Hierdoor zal de LED gaan branden.
Het commando PAUSE 500 zorgt ervoor dat de BASIC Stamp een halve seconde niets doet terwijl de
LED blijft branden. Het getal 500 vertelt het PAUSE commando om gedurende 500/1000 van een
seconde te wachten. Het getal dat na PAUSE komt noemen we een argument. Indien je PAUSE opzoekt
LED’s aan- en uitschakelen · Page 27
in de BASIC Stamp handleiding, zul je ontdekken dat het argument de lengte van de pauze bepaalt in
milliseconden.
Wat is een Milliseconde? Een milliseconde is 1/1000 van een seconde. De afkorting
hiervoor is ms. Er zijn 1000 ms in een seconde.
Het commando LOW 14 zorgt ervoor dat de BASIC Stamp intern de verbinding maakt met I/O pin
P14 naar Vss. Dit zorgt ervoor dat de LED wordt afgezet. Aangezien LOW 14 gevolgd wordt door
PAUSE 500, zal de LED een halve seconde uitblijven.
De reden dat de code zichzelf voortdurend herhaalt, komt door de commando’s die tussen de twee
PBASIC woorden DO en LOOP staan. Figuur 2-12 laat zien hoe een zogenaamde lus met DO…LOOP
werkt. Door de code tussen DO en LOOP te plaatsen wordt de LED telkens aan en uit gezet doordat
telkens vier commando’s en daarbij behorende pauzes worden uitgevoerd. Het resultaat is dat de LED
knippert totdat je de voeding uitschakelt, de batterij leeg is of je de resettoets indrukt.
DO
HIGH 14
PAUSE 250
LOW 14
PAUSE 250
Figuur 2-12
DO…LOOP
De code tussen de kernwoorden DO
en LOOP wordt telkens opnieuw
uitgevoerd.
LOOP
Een Diagnose Test voor uw Computer
Enkele computers, zoals laptops, zullen stoppen na de eerste keer de DO...LOOP sequentie. Deze
computers hebben een niet- standaard seriële poort. Door toevoegen van een DEBUG commando, zoals
in programma LedOnOff.bs2, wordt dit voorkomen. Door het programma aan te passen en te
herstarten zonder het DEBUG commando en kun je zien of je computer een niet- standaard seriële poort
heeft. Handig om te weten.
9 Open LedOnOff.bs2.
9 Verwijder de hele regel met het DEBUG commando.
9 Start het aangepaste program terwijl je naar de LED kijkt.
Indien de LED continu blijft knipperen zoals bij het originele programma, dan weet je dat je een
standaard seriële poort hebt.
Indien de LED slechts eenmaal heeft geknipperd, heeft je computer een niet-standaard seriële poort en
blijft hangen in de eerste DO...LOOP cyclus. Om dit probleem op te lossen, moet je de seriële kabel
van het bordje loskoppelen, de Resettoets indrukken waarna de BASIC Stamp het programma zal
uitvoeren zonder vast te lopen. In de programma’s die je later schrijft kun je het beste het volgende
commando toevoegen pal na de zogenaamde ‘compiler directives’of aanwijzingen voor het
vertaalprogramma:
DEBUG "Program Running!"
Hierdoor wordt de Debug Terminal automatisch geopend en wordt de COM poort open gelaten. Dit
voorkomt dat het programma vastloopt na het uitvoeren van de eerste DO…LOOP of een vergelijkbaar
commando dat je in een later hoofdstuk zult leren. Je zult dit DEBUG-commando in elk voorbeeld
terugvinden, zodat alle programma’s in dit boek met je computer samenwerken.
Pagina 28 · Wat is een Microcontroller? NL HJK
Jouw beurt – Tijden en herhalingen
Door in het PAUSE commando het Duration argument aan te passen, kun je ervoor zorgen dat de
LED langer aan of uit blijft. Als je bijvoorbeeld het Duration argument op 250 zet, zal de LED twee
maal per seconde knipperen. De DO…LOOP ziet er dan als volgt uit:
DO
HIGH 14
PAUSE 250
LOW 14
PAUSE 250
LOOP
9 Open LedOnOff.bs2 en sla een kopie op als LedOnOffYourTurn.bs2.
9 Verander in het PAUSE commando het Duration argument van 500 naar 250, en, laad het
programma en start het opnieuw.
Als je de LED drie maal per seconde wil laten knipperen, waarbij de tijd, dat de LED uit is, tweemaal
zolang is als de tijd dat de LED aan is, kun je in het programma het PAUSE commando toevoegen na
het HIGH 14 commando met als argument 1000. Het PAUZE commando na het LOW 14 commando
is PAUSE 2000. Het programma ziet er dan als volgt uit:
DO
HIGH 14
PAUSE 1000
LOW 14
PAUSE 2000
LOOP
9 Pas het programma aan met behulp van het code fragment hierboven.
In het volgende leuke experiment ga je uitproberen, hoe kort je de pauzes kunt maken en het knipperen
van de LED nog steeds kunt zien. Als de LED zeer snel knippert, lijkt het net of de LED aan blijft.
Maar dit is gezichtsbedrog. Hieronder wordt beschreven, hoe je dit experiment kunt opzetten:
9
9
9
9
Pas in beide PAUSE commando’s het Duration argument aan naar 100.
Herstart het programma en kijk of de LED nog knippert
Verklein beide Duration argumenten met 5 en probeer opnieuw.
Blijf de Duration argumenten verkleinen totdat het lijkt, of de LED aan blijft. De LED zal
wel iets zwakker zijn dan anders, maar niet meer knipperen.
In de laatste test laten we de LED een keer knipperen. Als het programma loopt, knippert de LED
maar een keer. Door de commando’s DO…LOOP te verwijderen, wordt de lus ook verwijderd en wordt
het programma maar een keer doorlopen. Je kunt de functie DO…LOOP tijdelijk verwijderen uit het
programma door aan het begin van de regel een apostrof (‘) te plaatsen voor het woord DO en voor
LOOP zoals hieronder aangegeven.
' DO
HIGH 14
PAUSE 1000
LOW 14
PAUSE 2000
' LOOP
9 Pas het programma aan en herstart het met bovenstaande code.
9 Leg uit wat er gebeurde, waarom flitste de LED maar één keer?
LED’s aan- en uitschakelen · Page 29
We noemen DO en LOOP ook wel sleutelwoorden. Dit zijn vaste woorden van de BASIC
programmeertaal.
Commentaar bij een programmaregel: Het plaatsen van een apostrof links van een
commando, verandert het in een commentaar. Dit is een handig hulpmiddel om de code niet
te hoeven verwijderen, of om even te kijken wat er gebeurt met het programma als de code
niet gelezen wordt. Het is veel makkelijker om de apostrof toe te voegen en te verwijderen
dan hele commando’s opnieuw te typen.
OPDRACHT #3: TELLEN EN HERHALEN
In de vorige activiteit, knipperde de LED de hele tijd of de LED knipperde eenmalig en stopte. Wat
zouden we moeten doen, om de LED precies tien keer willen te laten knipperen? Computers (en dus
ook de BASIC Stamp) , zijn goed in het onthouden van getallen en hoeveel keer iets gebeurt.
Computers kunnen zo geprogrammeerd worden, dat ze beslissingen kunnen nemen op basis van
verschillende condities. In deze activiteit, zul je de LED met de BASIC Stamp 10 keer laten
knipperen, waarna het programma stopt.
Tellen, onderdelen en de schakeling
Gebruik het voorbeeld schakeling zoals te zien in Figuur 2-11 op pagina 26.
Hoe vaak laten we de LED knipperen?
Er zijn vele manieren om de LED 10 keer te laten knipperen. De eenvoudigste manier is het gebruik
van een FOR ... NEXT lus. De FOR ... NEXT lus is vergelijkbaar met de DO ... LOOP. Hoewel
beide lussen gebruikt kunnen worden om commando's een vast aantal keren te herhalen, is de FOR ...
NEXT lus gemakkelijker te gebruiken. Dit wordt ook wel een eindige lus genoemd.
De FOR ... NEXT lus hangt af van een variabele die aangeeft hoeveel keer de LED heeft geknipperd.
Een variabele is eigenlijk een zelfgekozenwoord dat je gebruikt om de waarde van een getal op te
slaan. In het volgende voorbeeldprogramma kiezen we het woord "counter" om te bewaren hoe vaak
de LED is ingeschakeld en uitgeschakeld.
De volgende regels gelden voor het kiezen van een naam voor een variabele:
1.
Een naam kan geen woord zijn, dat al door PBASIC wordt gebruikt. De woorden, die
in PBASIC gebruikt worden zijn zogenaamde gereserveerde woorden. Met sommige
daarvan, zou je al vertrouwd moeten zijn, zoals DEBUG, PAUSE, HIGH, LOW, DO, and
LOOP. De volledige lijst staat in het BASIC Stamp Manual.
2.
Een naam mag geen spatie bevatten. Een Underscore (_) mag wel.
3.
Namen moeten altijd beginnen met een letter. In de naam mogen cijfers staan.
4.
De naam mag maximaal 32 tekens (letters en cijfers) lang zijn.
Voorbeeldprogramma: LedOnOffTenTimes.bs2
Het programma LedOnOffTenTimes.bs2 demonstreert hoe de FOR…NEXT sequentie te gebruiken om
een LED 10 maal te laten knipperen.
9
9
9
9
9
De testschakeling van Activiteit #2 moet al opgebouwd zijn.
Laad de LedOnOffTenTimes.bs2 code in de BASIC Stamp Editor.
Verbind de voeding met het Board of Education of HomeWork Board.
Start het programma.
Kijk of de LED tien maal knippert.
' What's a Microcontroller - LedOnOffTenTimes.bs2
' Turn an LED on and off. Repeat 10 times.
' {$STAMP BS2}
' {$PBASIC 2.5}
Pagina 30 · Wat is een Microcontroller? NL HJK
counter VAR Byte
FOR counter = 1 TO 10
DEBUG ? counter
HIGH 14
PAUSE 500
LOW 14
PAUSE 500
NEXT
DEBUG "All done!"
END
Hoe LedOnOffTenTimes.bs2 werkt
Het volgende PBASIC statement:
counter VAR Byte
…vertelt de BASIC Stamp Editor dat je programma het woord counter wil gebruiken als variabele
voor een getal van het type byte.
Wat is een Byte? Een byte biedt ruimte om getallen tussen 0 en 255 op te kunnen slaan.
De BASIC Stamp heeft vier verschillende type variabelen, die elk een getal met een eigen
grootte kunnen opslaan:
Variabelen Typen en de waarden die ze kunnen opslaan
Variabele type Bereik
Bit
0 tot 1
Nibble
0 tot 15
Byte
0 tot 255
Woord (word)
0 tot 65535
Een DEBUG instructie kan formatters (formatteer instructies) bevatten die bepalen hoe informatie moet
worden weergegeven in de Debug Terminal. Het vraagteken voor een variabele in a DEBUG commando
vertelt de Debug Terminal om de naam van de variabele en de waarde ervan weer te geven. Je kunt dit
commando als volgt gebruiken:
DEBUG ? counter
Dit geeft zowel de naam als de waarde van de waarde van de variabele counter in de Debug Terminal
weer.
De FOR…NEXT loop en alle commando’s die tussen deze twee woorden staan, zie je in het voorbeeld
hieronder. Het commando FOR counter = 1 to 10 vertelt de BASIC Stamp de variabele counter op 1 te
zetten en daarna de volgende commando’s uit te voeren. Als de BASIC Stamp bij het volgende NEXT
commando komt, dan keert hij terug naar het FOR statement. Dit FOR statement telt één op bij de
waarde van de counter. Vervolgens wordt gecontroleerd of de waarde van de counter groter is dan 10.
Indien dit niet het geval is, worden weer alle commando’s tot aan NEXT uitgevoerd en springt het
programma terug naar FOR. Dit proces herhaalt zich totdat het elf keer is uitgevoerd. Het programma
springt dan naar de eerste instructie na het NEXT statement.
LED’s aan- en uitschakelen · Page 31
FOR counter = 1 to 10
DEBUG ? counter
HIGH 14
PAUSE 500
LOW 14
PAUSE 500
NEXT
Het commando dat na het NEXT statement komt is:
DEBUG "All done!"
Dit commando is alleen maar toegevoegd om te laten zien, wat het programma doet nadat de
FOR...NEXT lus tien maal is uitgevoerd. Het springt verder naar het volgende NEXT commando (of
statement).
Jouw beurt- Andere manieren om te tellen
9 Vervang in het programma LedOnOffTenTimes.bs2, het commando:
FOR counter = 1 to 10
met:
FOR counter = 1 to 20
9 Herstart het programma. Wat werkt er nu anders? Was dit verwacht?
9 Probeer een tweede aanpassing aan het FOR statement. Verander het deze keer in:
FOR counter = 20 to 120 STEP 10
Hoe vaak heeft de LED geflitst? Welke waarde werd in the Debug Terminal getoond?
OPDRACHT #4: BOUWEN EN TESTEN VAN EEN TWEEDE LED-SCHAKELING
Indicator LED's kunnen gebruikers van machines veel dingen vertellen. Veel apparaten hebben twee,
drie of meer LED's die de gebruiker vertellen of de machine klaar is of niet, of er een storing, of een
taak gereed is, en zo voort.
In deze opdracht zul je de LED-schakeling van opdracht # 1 met een tweede LED uitbreiden. Daarna
zul je het voorbeeldprogramma van opdracht # 2 aanpassen, om er zeker van te zijn, dat de LEDschakeling goed is aangesloten op de BASIC Stamp. Vervolgens pas je het programma van opdracht #
2 zo aan, dat de beide LED’s tegelijk aan gaan.
Extra Onderdelen
Je hebt de volgende extra onderdelen nodig ten opzichte van de opdrachten 1 en 2:
(1) LED - geel
(1) Weerstand – 470 Ω (geel-violet-bruin)
Bouwen en testen van de tweede schakeling
In opdracht #1, heb je de LED schakeling met de hand bediend, om te kijken of die werkte voordat je
deze aansloot op de BASIC Stamp. Voordat je de tweede LED schakeling aansluit op de BASIC
Stamp, is het belangrijk om ook dit te testen.
9 Koppel de voeding af van het Board of Education of het HomeWork Board.
9 Maak de tweede LED schakeling zoals op Figuur 2-13.
9 Schakel de voeding weer in.
Pagina 32 · Wat is een Microcontroller? NL HJK
9 Is de tweede LED schakeling aangegaan? Zoja, ga verder. Indien neen, in Opdracht #1 worden
de vragen en oplossingen beschreven. Kijk, of je met deze aanwijzingen ook deze schakeling
aan het werk kunt krijgen.
Vdd
X3
Vdd
470 Ω
P14
470 Ω
LED
LED
Vss
Vss
Vin
+
Vss
+
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 2-13
Handmatige
testschakeling voor de
tweede LED
9 Schakel de voeding uit van het Board of Education en het HomeWork Board.
9 Pas de tweede LED schakeling zo aan, dat de weerstanddraad (ingang) naar P15 gaat, zoals in
Figuur 2-14.
Vdd
X3
P15
470 Ω
P14
470 Ω
LED
Vss
LED
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
+
Vss
+
Figuur 2-14
Aansluiten
van de
tweede LED
op de BASIC
Stamp
Schema
(links)en
bedrading
(rechts).
Bouwen en testen van de tweede schakeling
In opdracht # 2, gebruikte je een voorbeeldprogramma waarbij de LED met hoge en lage signalen via
uitgang P14 werd aangestuurd . Deze commando's zullen nu moeten worden aangepast omdat de LEDschakeling is aangesloten op pin P15. In plaats van HIGH 14 and LOW 14, gebruik je nu HIGH 15
and LOW 15.
Voorbeeldprogramma: TestSecondLed.bs2
9
9
9
9
Voeg TestSecondLed.bs2 in op de BASIC Stamp Editor.
Sluit de voeding aan op het Board of Education of het HomeWork Board.
Start TestSecondLED.bs2.
Ga na zodat de LED schakeling die is verbonden met P15 knippert. Indien ja, ga verder naar
het volgende voorbeeld. Indien de LED schakeling die verbonden is met P15 niet flikkert,
controleer dan de draden en aansluitingen en ga na of er geen typefouten in het programma
staan. Probeer daarna opnieuw de schakeling te testen.
' What's a Microcontroller - TestSecondLed.bs2
' Turn LED connected to P15 on and off.
' Repeat 1 time per second indefinitely.
LED’s aan- en uitschakelen · Page 33
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!"
DO
HIGH 15
PAUSE 500
LOW 15
PAUSE 500
LOOP
Besturen van de twee LED’s
Ja, het is mogelijk om beide LED’s tegelijk te laten knipperen. Een van de mogelijkheden is om twee
HIGH commando’s te gebruiken voor het eerste PAUSE commando. Een HIGH commando zet P14
hoog, en het volgende commando HIGH zet P15 hoog. Dan heb je ook twee LOW commando’s
nodig. Je kunt je wel voorstellen, dat de beide LED's niet op exact hetzelfde moment aan en uit zullen
schakelen. Maar het tijdverschil zal niet meer dan een milliseconde zijn voor zowel het in- als
uitschakelen. Het menselijk oog kan een dergelijk klein tijdsverschil niet zien.
Voorbeeldprogramma: FlashBothLeds.bs2
9 Geef de FlashBothLeds.bs2 code in op de BASIC Stamp Editor.
9 Start het programma.
9 Ga na dat beide LED’s tegelijkertijd knipperen.
' What's a Microcontroller - FlashBothLeds.bs2
' Turn LEDs connected to P14 and P15 on and off.
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!"
DO
HIGH 14
HIGH 15
PAUSE 500
LOW 14
LOW 15
PAUSE 500
LOOP
Jouw beurt – Afwisselend knipperende LED's
Je kunt de LED’s afwisselend laten knipperen door HIGH en LOW commando’s te verwisselen. Dit
houdt in dat de ene LED aan is, terwijl de andere uit en omgekeerd.
9 Verander FlashBothLeds.bs2 zodat de commando’s tussen de DO en LOOP sleutelwoorden er
als volgt uitzien:
HIGH 14
LOW 15
PAUSE 500
LOW 14
HIGH 15
PAUSE 500
9 Start de aangepaste versie van FlashBothLeds.bs2 en controleer of de LED’s afwisselend
knipperen.
Pagina 34 · Wat is een Microcontroller? NL HJK
OPDRACHT #5: STROOMRICHTING GEBRUIKEN OM TWEEKLEURIGE LED’S TE
BESTUREN
Het apparaat, dat je in Figuur 2-15 ziet, is een veiligheidsmonitor voor elektronische sleutels. Indien
een elektronische sleutel met de juiste code wordt gebruikt, verandert de LED van kleur en dan gaat de
deur open. Deze LED noemen we een tweekleurige LED. Deze opdracht beantwoordt twee vragen:
1. Hoe verandert de LED van kleur?
2. Hoe kan je dat met BASIC Stamp toepassen?
Figuur 2-15
Tweekleurige LED in een
bewakingsapparaat
Wanneer de deur is
vergrendeld, geeft de
tweekleuren LED rood
licht. Wanneer de deur
wordt ontgrendeld door
een elektronische sleutel
met de juiste code, wordt
de LED groen.
Introductie van de Bicolor LED (tweekleurige LED)
Het tweekleurige LED schematisch symbool en stuktekening zijn in Figuur 2-16 te zien.
Figuur 2-16
Bicolor LED
(Tweekleurige LED)
Schema symbool (links)
en onderdeeltekening
(rechts).
De bicolor LED is eigenlijk gewoon twee LED's in een omhulling. Figuur 2-17 laat zien hoe de LED
van kleur verandert, als de stroom in de andere richting loopt. Als de stroom in de ene richting loopt,
brandt de LED groen. Als de LED omgekeerd wordt aangesloten, brandt de LED rood. Als je beide
aansluitingen met VSS verbindt, loopt er geen stroom en is deze LED, net als de voorgaande LED’s
gewoon uit.
Figuur 2-17
Tweekleuren LED
(Bicolor) LED en
de aangelegde
spanning
Groen (links),rood
(midden) en geen
licht (rechts)
LED’s aan- en uitschakelen · Page 35
Onderdelen voor de schakeling met de tweekleurige LED
(1) LED – twee kleurig
(1) Weerstand 470 Ω (geel-violet-bruin)
(1) Jumper draad
Bouwen en Testen van een tweekleurige LED Schakeling
Figuur 2-18 laat je de schakeling zien voor de handmatige test van de tweekleurige LED.
9
9
9
9
9
9
9
9
Schakel de voeding af van het Board of Education of het HomeWork Board.
Bouw de schakeling zoals op de linkerkant van Figuur 2-18.
Sluit de voeding terug aan en ga na of de tweekleurige LED rood brandt.
Koppel de voeding terug af.
Pas de schakeling aan voor de rechterkant zoals in Figuur 2-18.
Koppel de voeding terug aan.
Ga na of de tweekleurige LED nu groen is.
Koppel de voeding af.
Wat als de kleuren van mijn bicolor LED's zijn omgedraaid? Bicolor LED's worden
geproduceerd in een vorm als in Figuur 2-16 te zien is. Als de kleuren zijn omgedraaid licht
de bicolor-LED rood op wanneer deze groen moet oplichten en omgekeerd. Als dat het
geval is, heb je waarschijnlijk pin 1 en pin 2 omgekeerd.
Vdd
1 Vin 2
Vss
Vdd
X3
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
2 Vin 1
Vss
Figuur 2-18
Handmatige test van de
tweekleuren LED
Tweekleuren LED groen
(links)en rood (rechts).
Het besturen van een tweekleurige LED met de BASIC Stamp gebeurt met twee I/O pinnen. Nadat je
met de manuele test controleerde dat de tweekleurige LED werkte, kan je nu de BASIC Stamp
aansluiten zoals in Figuur 2-19.
9 Verbind de schakeling van de bicolor LED met de BASIC Stamp als in Figuur 2-19 is te zien.
Pagina 36 · Wat is een Microcontroller? NL HJK
Figuur 2-19
Tweekleurige LED
verbonden met de BASIC
Stamp
Schema (links) en
aansluitingen (rechts).
BASIC Stamp Bicolor LED Control
Figuur 2-20 laat zien hoe je P15 en P14 kunt gebruiken om stroom door de tweekleurige LED
schakeling te sturen. Het bovenste schema laat zien hoe de stroom door de rode LED gaat indien P15
aangesloten is op Vdd en P14 aangesloten is op Vss. Dit komt doordat de rode LED stroom krijgt,
zoals met de pijl aangegeven. De groene LED is op dat moment dicht, net als een gesloten fietsventiel
en laat geen stroom door. De tweekleurige LED licht rood op.
Het onderste schema laat zien, wat er gebeurd als P15 aangesloten is op Vss en P14 aangesloten is op
Vdd. Nu is de elektrische “druk” (spanning) omgekeerd. De rode LED sluit af en zal geen stroom meer
doorlaten, de groene LED zal licht geven. De stroom loopt in de tegenovergestelde richting.
HIGH = Vdd P15
1
Current
2
LOW = Vss P14
Figuur 2-20
BASIC Stamp
tweekleuren LED Test
470 Ω
LOW = Vss P15
Stroom door de groene
LED (boven) en rode
LED (onder).
1
Current
2
HIGH = Vdd P14
470 Ω
Figuur 2-20 is de sleutel tot het programmeren van de BASIC Stamp om een tweekleurige LED te
laten oplichten. Het bovenste schema toont hoe je een tweekleurige LED rood kunt maken door
gebruik te maken van HIGH 15 en LOW 14. Het onderste schema toont hoe je een tweekleurige LED
groen kunt laten oplichten door LOW 15 en HIGH 14 te gebruiken. Om de LED uit te zetten, stuur je
het lage signaal naar zowel P14 als P15 door gebruik te maken van LOW 15 en LOW 14. Met andere
woorden, gebruik LOW op beide pinnen.
LED’s aan- en uitschakelen · Page 37
indien je hoge signalen stuurt naar zowel
P14 en P15. Waarom? Omdat de elektrische spanning gelijk is op P14 en
P15, zowel bij een laag of hoog signaal.
De tweekleurige LED zal ook uit gaan
Voorbeeldprogramma: TestBiColorLED.bs2
9
9
9
9
Sluit de voeding weer aan.
Type de TestBiColofLed.bs2 code in the BASIC Stamp Editor.
Start het programma.
Ga na dat de LED cyclus gelijk is aan rood, groen en uit is.
' What's a Microcontroller - TestBiColorLed.bs2
' Turn bicolor LED red, then green, then off in a loop.
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
DEBUG "Program Running!", CR
DO
DEBUG "Green..."
HIGH 15
LOW 14
PAUSE 1500
DEBUG "Red..."
LOW 15
HIGH 14
PAUSE 1500
DEBUG "Off...", CR
LOW 15
LOW 14
PAUSE 1500
LOOP
Jouw beurt – Laat licht zien
In Opdracht #3, werd er een variabele counter gebruikt om te controleren hoelang een LED oplicht.
Wat gebeurt er als je de counter gebruikt om het PAUSE commando te sturen met het Duration
argument terwijl je de kleur van de tweekleuren LED laat variëren?
9 Vervang de test code in the DO...LOOP door de FOR...NEXT loop.
9 Hernoem en sla TestBiColofLed.bs2 op als TestBiColofLedYourTurn.bs2.
9 Voeg een variabele teller toe voor het DO statement:
counter VAR BYTE
9 Vervang de test code in de DO...LOOP door een FOR...NEXT loop:
FOR counter = 1 to 50
HIGH 15
LOW 14
PAUSE counter
LOW 15
HIGH 14
PAUSE counter
NEXT
Pagina 38 · Wat is een Microcontroller? NL HJK
Als je klaar bent, moet het programma er als volgt uit zien:
counter VAR BYTE
DO
FOR counter = 1 to 50
HIGH 15
LOW 14
PAUSE counter
LOW 15
HIGH 14
PAUSE counter
NEXT
LOOP
Aan het begin van elk ronde door de FOR ... NEXT lus, is de waarde voor PAUSE (Duration argument)
slechts een milliseconde. Elke volgende ronde door de FOR ... NEXT lus, wordt de pauze telkens een
milliseconde langer totdat de tijd 50 milliseconden lang is. De DO ... LOOP zorgt ervoor dat de FOR
... NEXT lus telkens weer wordt uitgevoerd.
9 Start het aangepaste programma en kijk wat het effect is.
SAMENVATTING
De BASIC Stamp kan geprogrammeerd worden door licht emitterende diodes (LED) in een schakeling
aan en uit te kunnen zetten. LED indicators zijn heel handig op bijvoorbeeld computermonitoren, disk
drives, en andere toestellen. Je hebt met de LED kennis gemaakt samen met technieken om de anode
en kathode aansluitingen van elkaar te kunnen onderscheiden. Een LED schakeling moet altijd een
weerstand hebben om de stroom door de LED te beperken. In dit hoofdstuk heb je ook geleerd, dat de
kleurcoderingen van een weerstand de waarde van de weerstand aangeven.
De BASIC Stamp schakelt een LED schakeling aan of uit door intern de I/O pin te verbinden met de
Vdd of de Vss. Het HIGH commando kan gebruikt worden om de BASIC Stamp intern te verbinden
met een van de I/O pinnen met de Vdd, en het LOW commando kan gebruikt worden om intern de I/O
pin te verbinden met Vss. Het PAUSE commando wordt gebruikt om de BASIC Stamp gedurende een
bepaalde tijd geen commando’s te laten voeren. Dit commando werd bijvoorbeeld gebruikt om LED's
gedurende een bepaalde tijd aan en uit te zetten. De tijdsduur wordt bepaald door het argument van het
PAUSE commando Duration.
De DO…LOOP kan gebuikt worden om een oneindige lus te creëren. De commando’s tussen de DO en
LOOP sleutelwoorden worden telkens opnieuw uitgevoerd. Deze lus wordt oneindig genoemd, maar
toch kan het programma herstart worden door ofwel de voeding kort te onderbreken of de resettoets in
te drukken en terug los te laten. Je kunt nu een nieuw programma in de BASIC Stamp laden dat
tegelijkertijd het vorige programma met de oneindige lus zal wissen.
Stroomrichting en polariteit van voeding werden geïntroduceerd met een tweekleurige LED
schakeling. Indien er voeding op de LED schakeling aanwezig is, en de stroom in een richting vloeit,
zal de LED een bepaalde kleur weergeven. Indien de voeding wordt omgedraaid, zal de stroom in
tegengestelde richting lopen en zal de LED een andere kleur geven.
Vragen
1. Wat is de naam van de Griekse letter: Ω en waarnaar verwijst deze?
2. Welke weerstand zal meer stroom doorlaten? Een 470 Ω of 1000 Ω weerstand?
3. Hoe verbind je twee draden door gebruik te maken van het bord? Kan het bord vier draden
samen verbinden?
4. Wat moet je altijd doen voordat er een schakeling wordt aangepast op het bord?
LED’s aan- en uitschakelen · Page 39
5.
6.
7.
8.
9.
Hoe lang zal het PAUSE 10000 commando duren?
Hoe kunt u de BASIC Stamp niks laten doen gedurende een volle minuut?
Wat zijn de verschillende types variabelen?
Kan een byte de waarde 500 opslaan?
Wat zal het commando HIGH 7 doen?
Oefeningen
1. Teken het schema van een LED schakeling zoals uit opdracht #2, maar maak de verbinding
met P13 in plaats van P14. Leg uit hoe je het programma LedOnOff.bs2 gaat veranderen
(Pagina 26) opdat het de groene LED vier maal per seconde zal laten branden.
2. Leg uit hoe je het programma LedOnOffTenTimes.bs2 dient te veranderen om er een rode
LED van te maken die 5000 maal knippert voordat hij stopt. Hint: je hoeft slechts twee regels
code te veranderen.
Project
1. Maak een 10-seconde afteller door middel van een gele LED en een tweekleurige LED. Maak
de tweekleurige LED rood gedurende de eerste 3 seconden, daarna groen. Als de tweekleurige
LED groen wordt, laat dan de gele LED elke seconde knipperen gedurende 10 seconden. Als
de gele LED klaar is, moet je de tweekleurige LED terug op rood zetten. Daarna is het
programma klaar.
Oplossingen
V1. Omega is het Ω symbool en geeft weer hoe sterk een weerstand is.
V2. Een 470 Ω weerstand. Weerstanden met hogere waarden verzetten zich meer dan weerstanden
met lage waarden. M.a.w. een weerstand met een lage waarde laat meer stroom door.
V3. Om 2 draden met elkaar te verbinden kan je 2 draden op de zelfde rij steken. Je kunt 4 draden
aansluiten op een rij van 5 contactpunten.
V4. De voeding uitschakelen.
V5. 10 seconden.
V6. PAUSE 60000
V7. Bit, Nibble, Byte, and Woord
V8. Nee. De grootste waarde die een byte kan vasthouden is 255. De waarde 500 is buiten het
bereik van de byte.
V9. HIGH 7 zal in de BASIC Stamp intern de I/O pin P7 verbinden met Vdd.
E1. De PAUSE Duration dient gereduceerd naar 500ms / 4 = 125ms. De I/O pin P13, HIGH 14
en LOW 14 moeten vervangen worden door HIGH 13 en LOW 13.
P13
470 Ω
Vss
DO
HIGH 13
PAUSE 125
LOW 13
PAUSE 125
LOOP
De counter variabele dient te veranderen naar een Word formaat, en het FOR statement dient
veranderd van 1 naar 5000.
E3. De teller variabele moet worden gewijzigd in Word-formaat, en het FOR commando moet
worden aangepast om van 1 tot 5000 te tellen.
counter VAR Word
FOR counter = 1 to 5000
DEBUG ? counter, CR
HIGH 14
PAUSE 500
LOW 14
PAUSE 500
Pagina 40 · Wat is een Microcontroller? NL HJK
NEXT
P1. Het tweekleurige LED schema, op de linker zijde, is niet anders dan Figuur 2-19 op pagina 36.
Het gele LED schema is gebaseerd op Figuur 2-11 op pagina 26. Voor dit project werd P14
naar P13 veranderd en een gele LED gebruikt in plaats van een groene
Opmerking: Als de BASIC Stamp aan het eind van zijn programma komt, gaat hij in
zogenaamde low power mode, om stroom te sparen. Hierdoor knippert de bicolor LED iedere
2,3 seconden. Hetzelfde gebeurt, als een END commando wordt uitgevoerd. Door het STOP
commando te gebruiken voorkom je, dat de BASIC Stamp in de low power mode gaat,
waardoor de LED niet knippert.
P13
470 Ω
Yellow
LED
Vss
' What's a Microcontroller - Ch02Prj01_Countdown.bs2
' 10 Second Countdown with Red, Yellow, Green LED
' Red/Green: Bicolor LED on P15, P14. Yellow: P13
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!"
counter VAR Byte
' Red for three seconds
LOW 15
HIGH 14
PAUSE 3000
' Green for 10 seconds...
HIGH 15
LOW 14
' ...while the yellow LED is flashing
FOR counter = 1 TO 10
HIGH 13
PAUSE 500
LOW 13
PAUSE 500
NEXT
' Red stays on
LOW 15
HIGH 14
' Bicolor LED Red
' Bicolor LED Green
' Yellow LED on
' Yellow LED off
' Bi Color LED Red
Digitale Input - Druktoetsen · Page 41
Hoofdstuk 3: Digitale Input - Druktoetsen
TE VINDEN OP REKENMACHINES, SPELLETJES, ENZOVOORT
Hoeveel apparaten met knoppen gebruik je dagelijks? Hier zijn er een paar die op je lijstje zouden
kunnen staan: computer, muis, rekenmachine, magnetron, tv-afstandsbediening, gameboy en mobiele
telefoon. In elk apparaat, zit een microcontroller die de drukknoppen aftast en wacht tot er een knop
wordt ingedrukt en er iets in de schakeling verandert. Als de microcontroller een verandering ten
gevolge van een ingedrukte knop ‘ziet’ start hij een of andere actie. Tegen het einde van dit hoofdstuk
heb je ervaring met het ontwerpen van schakelingen met een drukknop en het programmeren van de
BASIC Stamp om de knop te bewaken en actie te starten als er op een knop wordt gedrukt.
HOGE EN LAGE SIGNALEN ONTVANGEN EN VERSTUREN
In hoofdstuk #2, heb je geleerd de BASIC Stamp zo te programmeren, dat je signalen hoog en laag
kunt sturen en een LED schakeling kunt gebruiken om deze signalen zichtbaar te maken. Als je hoge
en lage signalen wilt verzenden, moet je de gebruikte I/O-pin van de BASIC Stamp als uitgang
gebruiken. In dit hoofdstuk ga je gebruik maken van een BASIC Stamp I / O-pin als input. Een I / Opin die gebruikt wordt als ingang ‘luistert’ naar hoge / lage signalen in plaats van ze te verzenden. Je
stuurt in deze opdracht signalen naar de BASIC Stamp met behulp van een drukknopschakeling, en je
gaat de BASIC Stamp zo programmeren dat deze herkent of de drukknop wel of niet wordt ingedrukt.
Andere termen voor zenden, hoog/laag en ontvangen: Zenden van hoog/laag signalen is
op verschillende manieren beschreven. Je kunt zenden zien als versturen, doorsturen,
controleren, of besturen van een schakeling. In plaats van hoog/laag, kan je verwijzingen
zien naar binaire code, TTL, CMOS, of Boolean signalen. Een andere term voor ontvangen
is voelen.
OPDRACHT #1: TESTEN VAN EEN DRUKTOETS MET EEN LED SCHAKELING
Als je een drukknop kunt gebruiken om een hoog of laag signaal naar de BASIC Stamp te sturen, kun
je dan ook een LED met een drukknop besturen? Het antwoord is ja, en je gaat in deze opdracht dan
ook een LED gebruiken om een drukknop te testen .
Introductie van een Druktoets
Figuur 3-1 laat het schemasymbool en de onderdeeltekening zien van een normaal geopende
drukknop. Er zijn telkens twee pinnen van de drukknop aangesloten op elke aansluiting. Dit betekent
dat het aansluiten van een draad of onderdeel op pin 1 van deze drukknop hetzelfde is als een
aansluiting op pin 4. Hetzelfde geldt voor de pinnen 2 en 3. Deze drukknop heeft twee pinnen per
aansluiting om de knop stevig te kunnen monteren. Als de drukknop slechts twee pinnen had, zouden
die pinnen als gevolg van het indrukken kunnen gaan buigen om ten slotte af te breken.
Hetzelfde geldt voor de pinnen 2 en 3. Deze drukknop heeft twee pinnen per aansluiting, om de knop
stevig te kunnen monteren. Als de drukknop slechts twee pinnen had, zouden die pinnen als gevolg
van het indrukken kunnen gaan buigen om tenslotte af te breken.
1, 4
2, 3
1
4
2
3
Figuur 3-1
Normaal Open drukknop
Schema symbool (links) en
onderdeeltekening (rechts)
Links in Figuur 3-2 zien we hoe een normaal open drukknop eruitziet wanneer deze niet is ingedrukt.
Wanneer de knop niet wordt ingedrukt, is er een spleet tussen de 1,4 en 2,3 aansluitingen. Deze spleet
zorgt dat de 1,4 aansluitingen geen verbinding maakt met de 2,3 aansluitingen. We noemen dit een
open schakeling. De naam "normaal open" betekent dat indien de knop niet wordt ingedrukt, de
Pagina 42 · Wat is een Microcontroller? NL HJK
drukknop geen verbinding maakt. We noemen we dat de normale toestand van de drukknop. Wanneer
de knop wordt ingedrukt, wordt de spleet tussen de aansluitingen 1,4 en 2,3 overbrugd door geleidend
metaal. Als de knop wordt ingedrukt heet dit een gesloten schakeling. De elektrische stroom kan nu
wel via de drukknop verder.
1, 4
1, 4
2, 3
2, 3
Figuur 3-2
Normaal geopende drukknop
Niet ingedrukt (links) en ingedrukt
(rechts)
Onderdelen voor de schakeling met een drukknop
(1) LED – kies een kleur
(1) Weerstand – 470 Ω (geel-violet-bruin)
(1) Drukknop – normaal open
(1) Jumper wire
Opbouw van de schakeling
Figuur 3-3 Laat de schakeling zien die je moet opbouwen voor het testen van de drukknop.
Schakel altijd de stroom uit van je Board of Education of BASIC Stamp voordat je
wijzigingen in de schakeling aanbrengt. We zullen in het vervolg niet meer overal zeggen:
"Schakel de stroom ..." bij iedere wijziging in de schakeling. Je moet hier ook zelf aan
denken om dit te doen.
Schakel de spanning altijd weer in op het bordje, voordat je een programma gaat
downloaden in de BASIC Stamp.
9 Bouw de schakeling van Figuur 3-3.
Vdd
Vdd
Vin
Vss
+
X3
1, 4
2, 3
470 Ω
LED
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 3-3
Opbouw schakeling met
drukknop
Testen van de drukknop
Als de drukknop niet is ingedrukt, zal de LED uit zijn. Als de bedrading correct is aangesloten, licht de LED
op als de drukknop wordt ingedrukt. .
Waarschuwingssignalen: Indien de Power LED op het Board of Education knippert, uit
gaat en uit blijft als je de voeding terug aansluit, betekent dit dat je een kortsluiting hebt.
Indien dit gebeurt, koppel de voeding onmiddellijk los en ga na waar de fout is en verbeter
deze in de schakeling.
De controle LED voor voeding op het HomeWork Board werkt anders. De LED zal niet
alleen branden als het programma draait. Indien een programma eindigt (met het END
commando), zal de Power LED ook uitgaan.
Digitale Input - Druktoetsen · Page 43
9 Controleer of de LED uit is.
9 Druk op de knop en houd deze ingedrukt en controleer, dat de LED licht geeft, tot de knop
wordt losgelaten.
Hoe werkt de drukknopschakeling?
Links in Figuur 3-4 zie je wat er gebeurt wanneer de drukknop niet is ingedrukt. De LED-schakeling is
niet verbonden met Vdd. De schakeling is open waarin geen stroom loopt. Door op de drukknop te
drukken, zoals te zien aan de rechterkant van de figuur, sluit je de verbinding tussen de terminals met
geleidend metaal. Hierdoor ontstaat een verbinding, waarlangs de elektronenstroom door de
schakeling kan stromen en waardoor de LED licht gaat uitzenden
Vdd
Vdd
1, 4
1, 4
2, 3
2, 3
No
Current
470 Ω
Figuur 3-4
Drukknop niet ingedrukt
en wel ingedrukt
Drukknop niet ingedrukt:
schakeling open en LED
uit (links)
470 Ω
Current
LED
Drukknop ingedrukt:
Schakeling: Schakeling
gesloten, LED aan
(rechts))
LED
Vss
Vss
Jouw beurt: Schakel de LED uit met een drukknop
Figuur 3-5 laat de schakeling zien, die ervoor zorgt, dat de LED zich wat anders gaat gedragen dan je
verwacht. Wanneer de knop niet wordt ingedrukt, gaat de LED branden, wanneer de knop wordt
ingedrukt, gaat de LED uit. Omdat de drukknop een verbinding maakt tussen de aansluitingen 1,4 en
2,3. Wanneer de knop wordt ingedrukt, neemt elektriciteit de weg van de minste weerstand en die
loopt via de drukknop in plaats van door de LED. In de vorige waarschuwingstekst werd een
mogelijke kortsluiting besproken. De drukknop maakt in deze schakeling ook een soort van
kortsluiting, als de knop wordt ingedrukt sluit deze de aansluitingen van de LED’s kort, maar deze
kortsluiting beschadigt de schakeling niet door de weerstand die in serie met de schakelaar en de LED
staat.
9 Bouw de schakeling van Figuur 3-5.
9 Herhaal de tests van de vorige schakeling met deze nieuwe schakeling.
Vdd
Vdd
1, 4
LED
2, 3
470 Ω
Vss
Vin
Vss
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
+
Figuur 3-5
LED wordt overbrugd
door de Drukknop
Pagina 44 · Wat is een Microcontroller? NL HJK
Kun je dit echt met een LED doen? Tot nu toe is de LED altijd verbonden geweest met de
kathode aan de Vss. Nu is de LED in een andere plaats in de schakeling ingebouwd, met de
anode aan Vdd. Vele mensen vragen of dit niet tegen de wetten van een schakeling is, het
antwoord is neen. De elektrische druk geleverd door Vdd en Vss is 5 Volt. De diode zal altijd
1.6 Volt gebruiken en de weerstand altijd 3.4 Volts, de een of de andere, onafhankelijk van
elkaar.
OPDRACHT #2: INLEZEN VAN EEN DRUKTOETS MET DE BASIC STAMP
In deze opdracht, ga je een drukknop aansluiten op de BASIC Stamp en zul je op het beeldscherm een
melding laten verschijnen of de knop al dan niet is ingedrukt. Je zult dit doen door een PBASIC
programma te schrijven dat de status van de drukknop leest en de status van de knop op de display in
de Debug Terminal zal tonen.
Onderdelen voor het Druktoets Schakeling
(1) Drukknop - normaal open
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Weerstand – 10 kΩ (bruin-zwart-orange)
(2) Jumper draden
Bouwen van een Druktoets Schakeling voor de BASIC Stamp
Figuur 3-6 toont een drukknopschakeling die verbonden is met de BASIC Stamp I/O pin P3.
9 Bouw de schakeling van Figuur 3-6.
Vdd
X3
Vdd
P3
220 Ω
10 kΩ
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
Vss
Figuur 3-6
Druktoets
schakeling
verbonden met
I/O Pin P3
Op het
aansluitschema,
wordt de 220 Ω
weerstand aan de
linker zijde
verbonden met de
druktoets pin P3.
De 10 kΩ
weerstand is
rechts verbonden
met de druktoets
en met Vss.
Figuur 3-7 toont wat de BASIC Stamp ziet, indien de toets niet is ingedrukt. Indien de drukknop wel is
ingedrukt, zal de BASIC Stamp voelen dat Vdd verbonden is met P3. Inwendig in de BASIC Stamp
wordt het getal 1 opgeslagen in een deel van het geheugen dat informatie over de I/O-pin bijhoudt.
Indien de drukknop niet is ingedrukt, kan de BASIC Stamp de Vdd voeding niet voelen, maar de
spanning Vss gevoeld via de 10 kΩ en 220 Ω weerstanden. Dit zorgt ervoor dat er het getal 0 in de
geheugenplaats van de I/O-pin wordt opgeslagen.
Digitale Input - Druktoetsen · Page 45
Vdd
220 Ω
10 kΩ
SOUT
1
SIN
2
BS2
24
VIN
23
VSS
22
RES
ATN
3
VSS
4
21
VDD (+5V)
P0
5
20
P15
P1
6
19
P14
P2
7
P3
8
P4
9
P5
1
18
P13
17
P12
16
P11
10
15
P10
P6
11
14
P9
P7
12
13
P8
0
BS2-IC
Vss
Vdd
220 Ω
10 kΩ
24
VIN
23
VSS
22
RES
4
21
VDD (+5V)
P0
5
20
P15
P1
6
19
P14
P2
7
18
P13
P3
8
17
P12
SOUT
1
SIN
2
ATN
3
VSS
BS2
1
0
P4
9
16
P11
P5
10
15
P10
P6
11
14
P9
P7
12
13
P8
Figuur 3-7
BASIC Stamp inlezen van
de druktoets
Als de toets is ingedrukt,
leest de BASIC Stamp een
1 in (boven). Als de toets
niet is ingedrukt, ziet de
BASIC Stamp niks en
wordt er een 0 ingelezen
(onder).
BS2-IC
Vss
Binaire getallen en schakelingen: Het binaire of tweetallig getallensysteem wordt gebruikt
om getallen te vormen met enkel de cijfers 1 en 0. Deze binaire waarden kunnen verzonden
worden vanuit het ene apparaat naar een ander. De BASIC Stamp interpreteert de Vdd (5
V) als een binair getal 1 en de Vss (0 V) als een binair getal 0. Evenzo, geldt, dat als de
BASIC Stamp een I/O pin aanstuurt met de Vdd door het commando HIGH, te gebruiken, t
er een binaire code 1 wordt verzonden. Indien de I/O pin op Vss staat door het LOW
commando te gebruiken, wordt er een binair getal 0 verstuurd. Dit is een normale gang van
zaken voor de communicatie tussen verschillende computer chips en andere toestellen.
Programmeren van de BASIC Stamp om de Druktoet te Monitoren
De BASIC Stamp slaat een één of een nul op in een geheugenlocatie genoemd IN3 afhankelijk van de
spanning op de I/O pin P3. Hier volgt een voorbeeld hoe dit werkt:
Voorbeeldprogramma: ReadPushbuttonState.bs2
Met dit programma controleert de BASIC Stamp de drukknop elke ¼ seconde of er mogelijk op de
toets gedrukt wordt of niet. Vervolgens stuurt het programma de waarde van IN3 naar de Debug
Terminal. Figuur 3-8 toont de Debug Terminal terwijl het programma loopt. Indien de drukknop is
ingedrukt, toont de Debug Terminal display het getal 1. Indien de drukknop niet is ingedrukt, toont dee
het getal 0.
Figuur 3-8
Debug Terminal die de stand van de
knoppen laat zien
De Debug Terminal laat een 1 zien
als de knop is ingedrukt en een 0 als
de knop is losgelaten .
9 Type het programma ReadDrukknoppentate.bs2 programma in de BASIC Stamp Editor in.
9 Start het programma.
Pagina 46 · Wat is een Microcontroller? NL HJK
9 Ga na dat het Debug Terminal de waarde 0 toont indien de toets niet is ingedrukt.
9 Ga na dat het Debug Terminal de waarde 1 toont indien de toets is ingedrukt en vastgehouden
wordt.
' What's a Microcontroller - ReadPushbuttonState.bs2
' Check and send pushbutton state to Debug Terminal every 1/4 second.
' {$STAMP BS2}
' {$PBASIC 2.5}
DO
DEBUG ? IN3
PAUSE 250
LOOP
Hoe ReadPushbuttonState.bs2 Werkt
De DO…LOOP in het programma herhaalt zich elke ¼ seconde omdat het argument van het commando
PAUSE 250 is. Elke keer, dat de DO…LOOP wordt doorlopen, stuurt het commando DEBUG ? de
waarde van IN3 naar de Debug Terminal. De waarde IN3 is de status van de I/O pin P3 gemeten op
het moment dat het DEBUG commando wordt uitgevoerd.
Jouw beurt – Een druktoets met een Pull-up Weerstand
De schakeling waarmee je net geëindigd bent heeft een weerstand die verbonden is met Vss. Deze
weerstand noemt men de pull-down weerstand omdat deze het voltage van de P3 naar beneden trekt tot
Vss (0 volt) indien de toets niet is ingedrukt. Figuur 3-9 -toont een drukknopschakeling die een pull-up
weerstand heeft. Deze weerstand zorgt ervoor dat het voltage aan de Vdd tot 5 volt stijgt indien de
toets niet is ingedrukt. Nu zijn de spelregels net andersom. Indien de toets niet is ingedrukt, slaat IN3
het getal 1 op en indien de toets niet is ingedrukt slaat, IN3 het getal 0 op.
De 220 Ω weerstand wordt gebruikt in het voorbeeld met de drukknop om de BASIC Stamp
I/O pin te beveiligen. Hoewel de weerstand eigenlijk de beste beveiliging geeft voor een I/Opin, wordt in de voorbeelden hierna, toch meestal een draadje gebruikt, omdat dit goedkoper
is en ook goed werkt.
9 Pas je schakeling aan, als in Figuur 3-9.
9 Laad en start ReadPushbuttonState.bs2.
9 Gebruik de Debug Terminal, Controleer, dat IN3 1 is, als de knop wordt ingedrukt en 0, als je
de knop loslaat.
Vdd
Vdd
10 kΩ
P3
220 Ω
Vss
Vin
Vss
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 3-9
Aangepaste
drukknopschakeling
Actief-laag vs. Actief-hoog: Deze drukknop op Figuur 3-9 is de “active-low “ genoemd
omdat het de BASIC Stamp een laag signaal (Vss) doorstuurt indien de toets geactiveerd is.
De drukknop in de schakeling van Figuur 3-6 heeft als grootste activiteit de “active-high”
omdat deze een hoog signaal (Vdd) stuurt als de toets actief is.
Digitale Input - Druktoetsen · Page 47
OPDRACHT #3: BESTUREN VAN EEN LED SCHAKELING MET EEN DRUKKNOP
Figuur 3-10 laat een vergroting zien van een drukknop en een LED die gebruikt worden om de
instellingen op de computermonitor te veranderen. Dit is een van de vele toestellen die een drukknop
hebben, een LED die de status toont van het toestel.
Figuur 3-10
Toets en LED op
een Computer
Monitor
De BASIC Stamp kan geprogrammeerd worden om beslissingen te nemen gebaseerd op wat de
controller voelt. Als voorbeeld, de microcontroller kan geprogrammeerd worden om te beslissen dat de
LED tien maal aan en af gezet dient te worden per seconden als er op de toets wordt gedrukt.
Onderdelen voor drukknop en LED schakeling
(1) Druktoets – normaal open
(1) Weerstand - 10 kΩ (bruin-zwart-orange)
(1) LED – gelijk welke kleur
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Weerstand – 470 Ω (geel-violet-bruin)
(2) Jumper draden
Bouwen van de Druktoets en LED schakeling
Figuur 3-11 toont de drukknopschakeling voor deze opdracht zoals je die eerder hebt opgebouwd rond
de LED schakeling van Hoofdstuk 2, Opdracht #2.
9 Bouw de schakeling van Figuur 3-11.
P14
470 Ω
LED
Vdd
X3
Vss
Vdd
P3
220 Ω
10 kΩ
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
Vss
+
Figuur 3-11
Druktoets en LED
schakeling
Pagina 48 · Wat is een Microcontroller? NL HJK
Programmeren van de druktoetsbesturing
De BASIC Stamp kan programmeerd worden om te beslissen door het IF…THEN…ELSE commando te
gebruiken. Het voorbeeldprogramma, dat je straks zult starten, zet de LED aan en uit afhankelijk of er
op de toets is gedrukt. Er wordt gebruik gemaakt van IF…THEN…ELSE commando’s. Elke keer dat het
programma de DO...LOOP en het IF...THEN...ELSE commando doorlopen wordt, controleert de
microcontroller of de toets is ingedrukt of niet en beslist op die basis hiervan of dat de LED moet
branden of niet.
Voorbeeld Programma: PushbuttonControlledLed.bs2
9 Type het programma PushbuttonControlledLed.bs2 in de BASIC Stamp Editor en start het
programma.
9 Controleer of de LED oplicht als de toets is ingedrukt en vastgehouden wordt.
9 Controleer dat de LED niet oplicht indien de toets niet is ingedrukt.
' What's a Microcontroller - PushbuttonControlledLed.bs2
' Check pushbutton state 10 times per second and blink LED when pressed.
' {$STAMP BS2}
' {$PBASIC 2.5}
DO
DEBUG ? IN3
IF (IN3 = 1) THEN
HIGH 14
PAUSE 50
LOW 14
PAUSE 50
ELSE
PAUSE 100
ENDIF
LOOP
Hoe PushbuttonControlledLed.bs2 Werkt
Dit programma is een aangepaste versie van ReadPushbuttonState.bs2 uit de vorige oefening. De
DO…LOOP en DEBUG ? IN3 commando’s zijn dezelfde. Het PAUSE 250 commando is vervangen door
een IF…THEN…ELSE statement. Indien de conditie na het IF sleutelwoord waar is(IN3 = 1), worden
de commando’s uitgevoerd die achter het THEN sleutelwoord komen. Ze zullen worden uitgevoerd
totdat het ELSE sleutelwoord bereikt is. Vanaf daar zal het programma de regels overslaan tot het
sleutelwoord ENDIF. Indien de voorwaarde na IF niet waar is(IN3 = 0), zullen de commando’s na
het ELSE sleutelwoord uitgevoerd worden totdat het woord ENDIF bereikt is.
Je zou bijvoorbeeld een gedetailleerde opsomming kunnen maken, wat het programma zou moeten
doen. We noemen zo’n beschrijving ook wel pseudo code. Een voorbeeld van pseudocode staat
hieronder, het beschrijft hoe het programma PushbuttonControlledLed.bs2 werkt.
•
•
Voer de volgende commando’s vanaf hier tot aan het woord Loop telkens opnieuw uit
o Toon de waarde van IN3 in de Debug Terminal
o Indien de waarde van IN3 is 1, doe dan het volgende:
ƒ Zet de LED aan
ƒ Wacht 1/20 seconde
ƒ Zet de LED uit
ƒ Wacht 1/20 seconde
o Anders, (als de waarde van IN3 0 is)
ƒ Doe niks, maar wacht dan even lang als de LED gebrand zou hebben, met
andere woorden wacht 1/10 seconde.
Loop
Digitale Input - Druktoetsen · Page 49
Jouw Beurt – Sneller/Trager
9 Sla het voorbeeldprogramma op onder een andere naam.
9 Pas het programma zo aan dat de LED tweemaal zo snel gaat knipperen als de toets wordt
ingedrukt.
9 Pas het programma zo aan dat de LED tweemaal zo traag gaat knipperen als de toets wordt
ingedrukt.
OPDRACHT #4: TWEE DRUKTOETSEN STUREN TWEE LED’S
Laten we een tweede drukknop toevoegen aan het project, om de dingen wat interessanter te maken.
De tweede drukknop moet de tweede LED gaan besturen.
Onderdelen voor tweede druktoets en LED
(2) druktoetsen – normaal open
(2) Weerstanden - 10 kΩ (bruin-zwart-orange)
(2) Weerstanden – 470 Ω (geel-violet-bruin)
(2) Weerstanden – 220 Ω (rood-rood-bruin)
(2) LED's – gelijk welke kleur
Toevoegen van een Druktoets aan de LED schakeling
Figuur 3-12 laat de tweede LED en druktoets zien, die je toevoegt aan de schakeling die je in de
vorige opdracht getest hebt.
9 Bouw de schakeling zoals in Figuur 3-12. Indien je hulp nodig hebt om de schakeling op te
bouwen zoals in het schema, gebruik dan de draden van het diagram in Figuur 3-13 als
voorbeeld.
9 Pas ReadPushbuttonState.bs2 zo aan dat er IN4 ingelezen wordt in plaats van IN3 en gebruik
dit om de tweede schakeling met de tweede LED en druktoets te testen.
P15
470 Ω
P14
470 Ω
LED
Vss
LED
Vss
Vdd
Vdd
Figuur 3-12
Schematisch: Twee
Druktoetsen en LED's
P4
220 Ω
P3
220 Ω
10 kΩ
Vss
10 kΩ
Vss
Zwarte punten geven knooppunten van draden aan: Er zijn in deze schakeling drie
plaatsen waar de draden samenkomen en deze plaatsen zijn aangegeven met zwarte
punten. Als twee draden samenkomen in een zwarte punt, dan zijn ze verbonden. De draad
die P4 drukknop verbindt met de 10 kΩ weerstand, is niet verbonden met de P3 drukknop,
aangezien er geen zwarte punt is aangeduid.
Pagina 50 · Wat is een Microcontroller? NL HJK
Vdd
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
Vss
++
Figuur 3-13
Bedrading met twee drukknoppen en
twee LED’s
Programmeren van de Druktoetsen besturing
In de vorige opdracht heb je geëxperimenteerd met het maken van beslissingen door de
microcontroller met de commando’s IF...THEN...ELSE . Dit werkt prima om te beslissen welke
LED er aan of uit gezet dient te worden. Hieronder staat een voorbeeldprogramma.
Voorbeeldprogramma: PushbuttonControlOfTwoLeds.bs2
9 Schrijf het PushbuttonControlOfTwoLeds.bs2 in de BASIC Stamp Editor en start het
programma .
9 Ga na dat de LED in de schakeling verbonden met de P14 en aan en uit knippert indien de
toets verbonden met P3 wordt ingedrukt.
9 Ga ook na dat de LED in de schakeling ,verbonden met P15 en aan en uit knippert indien de
toets verbonden met P4 wordt ingedrukt.
' What's a Microcontroller - PushbuttonControlOfTwoLeds.bs2
' Blink P14 LED if P3 pushbutton is pressed, and blink P15 LED if
' P4 pushbutton is pressed.
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
DO
DEBUG HOME
DEBUG ? IN4
DEBUG ? IN3
IF (IN3 = 1) THEN
HIGH 14
PAUSE 50
ELSEIF (IN4 = 1) THEN
HIGH 15
PAUSE 50
ELSE
PAUSE 50
ENDIF
LOW 14
LOW 15
PAUSE 50
LOOP
Digitale Input - Druktoetsen · Page 51
Hoe PushbuttonControlOfTwoLeds.bs2 Werkt
Indien het weergeven van de waarde van IN3 en IN4 het scherm vult in de Debug Terminal, zoals in
het vorige voorbeeld, zou de waarde moeilijk te lezen zijn. Door gebruik van het HOME controleteken
kun je dit probleem van doorlopende tekst op de Debug terminal oplossen:
DEBUG HOME
Door de cursor telkens terug te sturen naar het begin van de regel in de DO...LOOP lus met de
commando’s:
DEBUG ? IN4
DEBUG ? IN3
...worden de waarden van IN4 and IN3 telkens op dezelfde plek in de Debug Terminal weergegeven.
De lus start met het DO commando:
DO
De commando’s in het IF statement (commando) zijn hetzelfde als in het programmavoorbeeld van de
vorige opdracht:
IF (IN3 = 1) THEN
HIGH 14
PAUSE 50
Hier helpt het ELSEIF commando. Als IN3 niet 1 (0) is en IN4 is 1, willen we de LED die met P15 is
verbonden aanzetten, in plaats van de LED die met P14 is verbonden.
ELSEIF (IN4 = 1) THEN
HIGH 15
PAUSE 50
Als geen van de statements waar is, willen we, dat de schakeling 0 ms pauzeert, zonder dat er een LED
van status verandert.
ELSE
PAUSE 50
Denk eraan, om het commando ENDIF niet te vergeten als je klaar bent met het opstellen van alle
beslissingen.
ENDIF
Nu is het jouw beurt, om de LED’s uit te schakelen en de pauze in te lassen. Je kunt bijvoorbeeld
kiezen, welke LED je uitschakelt, om hem daarna weer in te schakelen. PBASIC commando’s worden
heel snel uitgevoerd. Waarom zou je dan niet beide LED’s uitschakelen en verder geen beslissingen
nemen?
LOW 14
LOW 15
PAUSE 50
Het LOOP statement stuurt het programma terug naar het DO statemen, waarna de status van de
drukknoppen telkens weer gecontroleerd wordt en de LED’s al of niet worden aangezet.
LOOP
Jouw beurt – We gaan beide drukknoppen tegelijk indrukken
Dit voorbeeldprogramma heeft een probleem. Probeer eens beide toetsen tegelijk in te drukken. Je zult
de fout dan direct zien. Je zou verwachten dat beide LED's aan en uit zouden knipperen, maar dat doen
ze niet, omdat er maar één codeblok wordt uitgevoerd in het IF...ELSEIF...ELSE statement
Pagina 52 · Wat is een Microcontroller? NL HJK
waardoor de microcontroller te vroeg naar de ENDIF
manier oplossen:
springt. Je kunt dit probleem op de volgende
9 Sla het programma PushbuttonControlOfTwoLeds.bs2 op onder een nieuwe naam.
9 Vervang het IF statement en het codeblok:
IF (IN3 = 1) THEN
HIGH 14
PAUSE 50
...door het volgende IF...ELSEIF statement:
IF (IN3 = 1) AND (IN4 = 1) THEN
HIGH 14
HIGH 15
PAUSE 50
ELSEIF (IN3 = 1) THEN
HIGH 14
PAUSE 50
Een codeblok is een groep van commando’ s. Het IF statement bovenin het programma
heeft een codeblok met drie commando’s (HIGH, HIGH, en PAUSE). Het ELSEIF statement
heeft een codeblok met twee commando’s (HIGH, PAUSE).
9 Start het aangepaste programma en kijk of het nu wel op de juiste manier omgaat met de
drukknoppen en de LED's.
Het AND sleutelwoord kan gebruikt worden in een IF...THEN statement om te
controleren, of meer dan een van de voorwaarden waar is. Alle voorwaarden (condities)
met AND moeten waar zijn (true) om het IF statement waar te laten zijn.
Het OR sleutelwoord (keyword) wordt ook vaak gebruikt. Met dit sleutelwoord wordt
gecontroleerd, of een van de twee voorwaarden waar is.
Je kunt het programma ook zo aanpassen dat de LED die knippert, gedurende verschillende tijden aan
is. Je kunt bijvoorbeeld de waarde van het argument Duration van het PAUSE voor beide drukknoppen,
met 10 verhogen. Voor de LED die op P14 is aangesloten, verhoog je de waarde tot maximaal 100 en
voor de LED die aan P15 is aangesloten, tot maximaal 200.
9 Pas het PAUSE commando in het IF en in de twee ELSEIF commando’s als besproken.
9 Draai het aangepaste programma.
9 Controleer dat de LED’s zich verschillend gedragen.
OPDRACHT #5: TEST JE REACTIETIJD
Stel, dat je een ontwerper bent van een videospelletje. De marketingafdeling wil graag een
reactietijdmeting toevoegen aan de bedieningconsole van de spelcomputer. Jou wordt gevraagd, om
een eenvoudig prototype te maken, om te bewijzen, dat de reactietijdmeting werkt.
In het volgende voorbeeld, ga je een schakeling en toepassing bouwen en testen, die de gevraagde
oplossing laat zien. Maar het is niet de enige oplossing. Denk, voordat je begint nog even na, hoe je
deze oplossing wilt bouwen.
Onderdelen voor het spelletje voor het meten van de reactietijd
(1) LED – tweekleurig
(1) Weerstand – 470 Ω (geel-violet-bruin)
(1) Druktoets – normaal open
(1) Weerstand – 10 kΩ (bruin-zwart-orange)
Digitale Input - Druktoetsen · Page 53
(1) Weerstand – 220 Ω (rood-rood-bruin)
(2) Jumper draden
Bouwen van de Reactietijd Schakeling
Figuur 3-14 toont een schematische voorstelling van het dradendiagram voor een schakeling die kan
worden gebruikt met de BASIC Stamp om de reactietijd van een speler te testen.
9 Bouw de schakeling van Figuur 3-14 van pagina 53
9 Start TestBiColorLED.bs2 van Hoofdstuk 2Hoofdstuk 2Opdracht #5 met de tweekleurige LED
schakeling en ga na of de aansluitingen correct zijn.
9 Indien je de schakeling opnieuw hebt gebouwd voor deze activiteit, start
ReadPushbuttonState.bs2 van Opdracht #2 van dit hoofdstuk en ga na dat de drukknoppen juist
werken.
P15
1
1
2
Vdd
2
P14
470 Ω
Vdd
P3
220 Ω
Vin
Vss
X3
10 kΩ
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 3-14
Schakeling
voor het
meten van
de reactietijd
Vss
Programmeer de Reactietijd Meter
In het volgende voorbeeldprogramma blijft de tweekleurige LED uit totdat de speler de toets ingedrukt
houdt. Indien de toets is ingedrukt, zal de LED korte tijd rood oplichten. Als de LED weer groen
wordt, moet de speler de toets zo snel mogelijk los laten. De tijd tussen het groen worden van de LED
en het loslaten van de toets, wordt door het programma gemeten als de reactietijd van de speler.
Dit voorbeeldprogramma laat ook zien hoe polling en tellen werkt. Van polling is sprake, als er
voortdurend met hoge snelheid gecontroleerd wordt, of er bijvoorbeeld een statuswijziging is van een
knop of niet. Van tellen is sprake, als er telkens een één wordt opgeteld bij een variabele, als er iets (
of niets) van status verandert. In dit programma, zal de BASIC Stamp constant controleren gedurende
de tijd dat de tweekleurige LED groen wordt totdat de toets is losgelaten. Het programma wacht
telkens 1/1000 van een seconde, door het PAUSE 1 commando te gebruiken. Iedere keer dat er wordt
gecontroleerd of de toets nog niet is losgelaten, zal er 1 bij de variabele teller met de naam
timeCounter, worden opgeteld. Indien de toets is losgelaten, zal het programma stoppen met
controleren en een bericht sturen naar de Debug Terminal met daarin de waarde van de timeCounter
variabele.
Voorbeeldprogramma: ReactionTimer.bs2
9 Type en start ReactionTimer.bs2.
9 Volg de prompts in de Debug Terminal (zie Figuur 3-15).
Pagina 54 · Wat is een Microcontroller? NL HJK
Figuur 3-15
Debug Terminal: Instructies voor het
Reactie Tijden Spel
' What's a Microcontroller - ReactionTimer.bs2
' Test reaction time with a pushbutton and a bicolor LED.
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
timeCounter
' Wait 1 sec before 1st message.
VAR
Word
' Declare variable to store time.
DEBUG "Press and hold pushbutton", CR,
"to make light turn red.", CR, CR,
"When light turns green, let", CR,
"go as fast as you can.", CR, CR
' Display reaction instructions.
DO
' Begin main loop.
DO
LOOP UNTIL IN3 = 1
' Nested loop repeats...
' until pushbutton press.
HIGH 14
LOW 15
' Bicolor LED red.
PAUSE 1000
' Delay 1 second.
LOW 14
HIGH 15
' Bicolor LED green.
timeCounter = 0
' Set timeCounter to zero.
DO
' Nested loop, count time...
PAUSE 1
timeCounter = timeCounter + 1
LOOP UNTIL IN3 = 0
' until pushbutton is released.
LOW 15
' Bicolor LED off.
DEBUG "Your time was ", DEC timeCounter,
" ms.", CR, CR,
"To play again, hold the ", CR,
"button down again.", CR, CR
' Display time measurement.
LOOP
' Play again instructions.
' Back to "Begin main loop".
Hoe ReactionTimer.bs2 Werkt
Aangezien het program bij moet houden hoeveel keer de toets werd gecontroleerd, wordt er een
variabele timeCounter in het leven geroepen.
timeCounter VAR Word
' Declare variable to store time.
Digitale Input - Druktoetsen · Page 55
Variabele initialiseren op nul: Als een variabele in wordt gedeclareed in PBASIC, wordt
de waarde automatisch op nul geplaatst totdat een commando een nieuwe waarde inbrengt.
De DEBUG commando’s bevatten de instructies voor de speler.
DEBUG "Press and hold pushbutton", CR,
"to make light turn red.", CR, CR,
"When light turns green, let", CR,
"go as fast as you can.", CR, CR
DO…LOOP statements kunnen genest worden. Met andere woorden, je kunt een DO…LOOP binnen een
andere DO…LOOP plaatsen.
DO
' Begin main loop.
DO
' Nested loop repeats...
LOOP UNTIL IN3 = 1
' until pushbutton press.
' Rest of program was here.
LOOP
' Back to "Begin main loop".
De binnenste DO…LOOP dient nader bekeken te worden. Een DO…LOOP kan een voorwaarde bevatten die
beslist om al dan niet uit de lus te breken om dan met de volgende commando’s buiten de lus verder te
gaan. Deze DO…LOOP zal zichzelf herhalen zolang de toets niet is ingedrukt (IN3 = 0). De DO…LOOP
zal oneindig worden uitgevoerd totdat IN3 = 1. Dan zal het programma naar het volgende commando
na het LOOP UNTIL statement voort lopen. Dit is een voorbeeld van polling. De DO…LOOP UNTIL
controleert als de toets is ingedrukt.
DO
LOOP UNTIL IN3 = 1
' Nested loop repeats...
' until pushbutton press.
De commando’s die direct na het LOOP UNTIL statement komen kleuren de tweekleurige LED rood,
geven een pauze van één seconde, en maken de LED weer groen.
HIGH 14
LOW 15
' Bicolor LED red.
PAUSE 1000
' Delay 1 second.
LOW 14
HIGH 15
' Bicolor LED green.
Zodra de LED groen wordt, is het tijd om te gaan tellen hoelang de speler er over doet om de toets los
te laten. De timeCounter variabele is op nul gezet. Daarna wordt een andere DO…LOOP gestart met
andere UNTIL voorwaarde die zichzelf herhaalt. De lus blijft zich herhalen totdat de speler de toets
heeft losgelaten (IN3 = 0). Elke keer als de lus wordt doorlopen, wordt de BASIC Stamp met een
milliseconde vertraagd door 1 te gebruiken als argument van het commando PAUSE. Daarna wordt 1
opgeteld bij de waarde van de timeCounter variabele.
timeCounter = 0
' Set timeCounter to zero.
DO
' Nested loop, count time...
PAUSE 1
timeCounter = timeCounter + 1
LOOP UNTIL IN3 = 0
' until pushbutton is released.
Nadat de drukknop is losgelaten, gaat de LED uit.
LOW 15
Pagina 56 · Wat is een Microcontroller? NL HJK
Het resultaat wordt in de Debug Teminal getoond.
DEBUG "Your time was ", DEC timeCounter,
" ms.", CR, CR,
"To play again, hold the ", CR,
"button down again.", CR, CR
Het laatste statement in het programma is LOOP, dat het programma terugstuurt naar de regel met het
eerste DO statement.
Jouw beurt– Aanpassen van het Ontwerp (Voor gevorderden)
De marketingafdeling heeft je prototype aan enkele testers van spellen gegeven. Nadat de tests waren
afgerond, kwam de marketingafdeling terug met drie problemen die opgelost moeten worden voordat
je prototype in het spel kan worden ingebouwd.
9 Sla ReactionTimer.bs2 onder een nieuwe naam op (zoals ReactionTimerYourTurn.bs2).
Punt 1
Indien een speler de toets 30 seconden ingedrukt houdt, is zijn score 14000 ms, wat overeenkomt
met 14 seconden. Dit moet opgelost worden!
Het blijkt, dat het uitvoeren van een lus samen met het optellen van één bij de timeCounter variabele
op zich ongeveer 1 ms in beslag neemt zonder het PAUSE 1 commando. Dit noemt men code
overhead. . Dit is de tijd die de BASIC Stamp nodig heeft om zijn commando uittevoeren. Een snelle
oplossing is om het PAUSE 1 commando niet te laten uitvoeren door links ervan een apostrof te
plaatsen.
' PAUSE 1
9 Probeer het PAUSE 1 commando in commentaar om te zetten en controleer hoe nauwkeurig
het programma nu werkt
In plaats van het commando in commentaar om te zetten, kun je dit probleem ook oplossen door het
resultaat met twee te vermenigvuldigen. Als bijvoorbeeld het DEBUG commando een aantal ms laat
zien, kun je een regel toevoegen, die het resultaat met twee vermenigvuldigt:
timeCounter = timeCounter * 2
' <- Add this
DEBUG "Your time was ", DEC timeCounter, " ms.", CR, CR
Digitale Input - Druktoetsen · Page 57
Voor precisie, kun je de */ operator gebruiken om te vermenigvuldigen. De */ operator is
heel eenvoudig te gebruiken zoals je in het volgende voorbeeld kunt zien:
1)
Plaats de waarde of variabele die je wilt vermenigvuldigen of de fractie ervan voor de */
operator.
2)
Kies een gebroken decimaal getal, bijvoorbeeld 2,5 en vermenigvuldig dit met 256.
3)
Rond af om de cijfers na de komma kwijt te raken.
4)
Plaats de waarde voor de */ operator.
Voorbeeld: Stel dat je de timeCounter variabele met 3,69 wilt vermenigvuldigen.
1)
Plaats de variabele timeCounter links van de */ operator:
timeCounter = timeCounter */
2)
Vermenigvuldig de fractiewaarde met 256: 3.69 X 256 = 944.64.
3)
Rond af: 944.64 ≈ 945.
4)
Plaats de waarde rechts van de */ operator:
timeCounter = timeCounter */ 945
Vermenigvuldigen van bijvoorbeeld het getal 14000 met 2 zal 28000 opleveren. En dat is niet precies
gelijk aan 30000. 30,000 ÷ 14,000 ≈ 2.14. Om met 2,14 me grotere precisie te kunnen
vermenigvuldigen met de */ operator, moeten we uitzoeken hoeveel keer 1/256ste er in 2,14 gaat. En
dit is 2,14 × 256 = 547,84 ≈ 548. Door deze waarde te gebruiken in de */ operator vervang je
timecounter = timeCounter * 2.
9 Vervang timecounter = timeCounter * 2 door timecounter = timeCounter */ 548
en test je programma opnieuw.
Het oorspronkelijke 30-seconde testprogramma zal een waarde opleveren die een klein beetje verschilt
van 14000. Als dat zo is, kun je dezelfde procedure gebruiken , door de */ operator te gebruiken, om
je programma nauwkeuriger te maken.
9 Probeer het maar!
Onderwerp 2: Spelers hadden snel door dat de vertraging van rood naar groen 1 seconde is. Nadat ze
het enkele keren hadden gespeeld, werden ze beter in het voorspellen van het loslaten dan in hun
reactietijd te testen.
De BASIC Stamp heeft een RANDOM commando. Met dit commando kan een willekeurig getal worden
opgewekt. Eigenlijk is het getal niet echt willekeurig en wordt daarom ook wel schijn willekeurig getal
genoemd (Pseudo random) Hieronder staat hoe je de code dient aan te passen om een random getal te
gebruiken als vertraging. Aan het begin van het programma staat een startwaarde (seed), die als
startwaarde dient voor het commando:
9 Voeg aan het begin van de code een declaratie toe van een nieuwe variabele genaamd value,
en zet deze op 23. De waarde 23 wordt startwaarde genoemd, omdat het de start is van het
opwekken van een pseudo (schijnbaar of niet echt) random getal.
timeCounter VAR Word
value VAR Byte
value = 23
' <- Voeg toe
' <- Voeg toe
Pagina 58 · Wat is een Microcontroller? NL HJK
9 Net voor het pauzecommando, plaats je het RANDOM commando om de variabele value een
nieuw “random” waarde te geven van de pseudorandom sequentie die startte bij 23.
9
RANDOM value
DEBUG "Delay time ", ? 1000 + value, CR
√
' <- Voeg toe
' <- Voeg toe
Pas het PAUSE commando Duration argument aan, zodat het randomgetal met 1000 (voor
een seconde) wordt vermeerderd.
PAUSE 1000 + value
' <- Pas dit aan
LOW 14
HIGH 15
9 Een byte kan geen getal groter dan 255 opslaan. Het PAUSE commando, kan daardoor maar ¼
seconde variëren. Je kunt de variabele value met 4 vermenigvuldigen, om de wachttijd op
groen toch tussen 1 en 2 seconden te laten variëren.
DEBUG "Delay time ", ? 1000 + (value*4), CR ' <- Pas aan
PAUSE 1000 + (value * 4)
' <- Pas aan
Wat is een algoritme? Een algoritme is een opeenvolging van wiskundige operaties.
Wat is pseudo random? Pseudo random betekent dat het willekeurig lijkt, maar het
eigenlijk niet echt is. Elke maal dat het programma wordt herstart, zal je dezelfde sequentie
waarden hebben.
Wat is zaad? Een zaad is de waarde die gebruikt wordt om de pseudo random sequentie te
starten. Indien je een andere waarde dan 23 ingeeft, zal er een andere pseudorandom
sequentie gestart worden.
Onderwerp 3: Een speler die de toets voor het groene licht loslaat krijgt de onlogisch goede score van
(1 ms). Je microcontroller moet uitvissen of de speler vals speelt.
Het begrip pseudocode is eerder aan het einde van opdracht #3 in dit hoofdstuk uitgelegd. Hier geven
we de pseudocode die je kunt gebruiken voor het IF...THEN...ELSE statement om dit probleem op te
lossen. Veronderstel, dat je de aanpassingen van onderwerp 1 en 2 hebt uitgevoerd, dan zal
timeCounter nu 2 zijn in plaats van 1 als de speler de knop loslaat, voordat de LED groen wordt. De
wijzigingen hier onder werkt als timeCounter 1 of 2 is.
•
•
•
Indien de waarde van timeCounter gelijk is aan 1:
o Toon het bericht dat de speler dient te wachten met de knop los te laten totdat het licht
groen is.
Anders (indien de waarde van timeCounter groter is dan 1)
o Toon op de Display de waarde van timeCounter (zoals in ReactionTimer.bs2) tijd in ms.
Display een melding “To play again...”.
9 Pas je programma aan door deze pseudocode in PBASIC om te zetten om daarmee het
valsspelen op te lossen.
SAMENVATTING
Dit hoofdstuk heeft je vertrouwd gemaakt met drukknoppen en veel voorkomende schakelingen voor
drukknoppen. In dit hoofdstuk is ook uitgelegd hoe je een schakeling voor druktoetsen dient op te
bouwen en te testen en hoe de BASIC Stamp aangesloten dient te worden om meerdere druktoetsen in
te lezen. De BASIC Stamp is geprogrammeerd om beslissingen te nemen op basis van de status(sen)
van de druktoets(en). En deze informatie werd gebruikt om verschillende LED's te besturen. Verder is
Digitale Input - Druktoetsen · Page 59
er een reactietijdspel gebouwd. De LED's werden gecontroleerd met de BASIC Stamp en je hebt
geleerd hoe de status van een drukknop met behulp van een programma constant gecontroleerd kan
worden. Verder werden er tijdmetingen uitgevoerd met dit programma. Er zijn verschillende nieuwe
concepten geïntroduceerd, zoals tellen en het gebruik van pseudocode om de afloop van een
programma te plannen. Ook leerde je, hoe je moet omgaan met de extra tijd die het kost om
programmaregels uit te voeren, als je tijdkritische toepassingen programmeert. En tenslotte leerde je
over het opwekken van randomgetallen en de startwaarde, die nodig is voor dit commando.
We hebben enkelvoudige druktoetsen ingelezen door middel van speciale I/O variabelen die zijn
ingebouwd in de BASICStamp (IN3, IN4,, etc.). We namen beslissingen op basis van de ingelezen
waarden en gebruikten IF...THEN...ELSE statements. Er werd aandacht besteed aan
IF...THEN...ELSE statements, en het begrip codeblokken werd uitgelegd. Om meer dan een
conditie te evalueren werd uitgelegd hoe de AND en OR gebruikt kunnen worden. Ook werd het gebruik
van het sleutelwoord UNTIL uitgelegd, om zo een voorwaarde aan een DO...LOOP toe te voegen die
tegelijk getest wordtbij het uitvoeren van DO...LOOP codeblokken.
Vragen
1. Wat is het verschil tussen zenden en ontvangen van een HIGH en LOW signaal door de BASIC
Stamp?
2. Wat betekent “normaal open” voor een druktoets?
3. Wat gebeurt er tussen de terminals van een normaal open druktoets indien er op gedrukt
wordt?
4. Wat is de waarde van IN3 indien een druktoets verbonden wordt met Vdd? Wat is de waarde
van IN3 indien de druktoets verbonden wordt met Vss?
5. Wat betekent het commando DEBUG ? IN3 ?
6. Welke codeblokken kunnen gebruikt worden om beslissingen te nemen ,gebaseerd op de
waarde van een of meerdere druktoetsen?
7. Wat doet een HOME formaat in het statement DEBUG HOME?
Oefeningen
1. Leg uit hoe het programma ReadPushbuttonState.bs2 op pagina 46 dient aangepast te worden
opdat er telkens om de seconde een druktoets dient ingelezen te worden in plaats van elke ¼
van een seconde.
2. Leg uit hoe het programma ReadPushbuttonState.bs2 aan te passen is zodat het een knop
inleest, die normaal open is en met een pull-up weerstand is verbonden met I/O pin P6.
Project
1. Pas ReactionTimer.bs2 aan zodat het een spel geschikt wordt voor twee spelers. Voeg een
tweede knop toe aan P4.
Oplossingen
Q1. Bij besturen wordt de BASIC Stamp I/O pin als output gebruikt, bij ontvangen als input.
Q2. Normaal open betekent dat de druktoets normale status niet ingedrukt is en dat er een open
schakeling gevormd wordt.
Q3. Indien de druktoets ingedrukt wordt, wordt het gat gesloten tussen de terminals door een
metaal. De stroom kan dan door de druktoets vloeien.
Q4. IN3 = 1 indien de drukknop verbonden is met Vdd. IN3 = 0 indien de drukknop verbonden is
met Vss.
Q5. DEBUG ? IN3 zendt de waarde IN3 naar de Debug Terminal.
Q6. IF...THEN...ELSE en IF...ELSEIF...ELSE.
Q7. Het HOME formaat zendt de cursor naar linksboven in de Debug Terminal.
Pagina 60 · Wat is een Microcontroller? NL HJK
De DO...LOOP in het programma herhaalt elke ¼ seconde omdat het commando PAUSE, 250/1000
als argument heeft. Om elke seconde te herhalen, verander het PAUSE 250 (250ms = 0.25 s = ¼
s), naar PAUSE 1000 (1000ms = 1 s).
DO
DEBUG ? IN3
PAUSE 1000
LOOP
Vervang IN3 met IN6, om de I/O pin P6 in te lezen. Het programma toont enkel de druktoets status en
niet de waarde om de beslissing te nemen. Het doet er niet toe of de weerstand een pull-up of een pulldown is . Het DEBUG statement zal de status van de toets in beide gevallen weergeven.
DO
DEBUG ? IN6
PAUSE 250
LOOP
P1. In deze opdracht wordt er een toets bijgevoegd voor de tweede speler, aangesloten op de
Stamp I/O pin P4. Het schema is gebaseerd op Figuur 3-14 op page 53.
Vdd
P15
Vdd
1
P4
P3
220 Ω
220 Ω
10 kΩ
2
P14
470 Ω
Vss
10 kΩ
Vss
Hieronder staan stukjes programma om deze opdracht op te lossen. Houd in gedachten dat de
code op verschillende manieren geprogrammeerd kan worden. De meeste oplossingen zullen
onderstaande aanpassingen bevatten:
Gebruik twee variabelen om twee spelers te volgen.
timeCounterA VAR
timeCounterB VAR
Word
Word
' Time score of player A
' Time score of player B
Verander instructies om twee druktoetsen statussen weer te geven:
DEBUG "Press and hold pushbuttons", CR,
DEBUG "buttons down again.", CR, CR
Wacht totdat beide knoppen zijn ingedrukt voordat een Led rood wordt, door de AND operator te
gebruiken.
LOOP UNTIL (IN3 = 1) AND (IN4 = 1)
totdat alle knoppen losgelaten zijn om de tijdsopname te stoppen, opnieuw door de AND operator te
gebruiken.
LOOP UNTIL (IN3 = 0) AND (IN4 = 0)
Voeg logica toe om te beslissen welke spelertijd dient te stijgen.
IF (IN3 = 1) THEN
timeCounterA = timeCounterA + 1
ENDIF
Digitale Input - Druktoetsen · Page 61
IF (IN4 = 1) THEN
timeCounterB = timeCounterB + 1
ENDIF
Verander de displayweergave om de tijden van beide spelers te tonen:
DEBUG "Player A Time:
DEBUG "Player B Time:
", DEC timeCounterA, " ms. ", CR
", DEC timeCounterB, " ms. ", CR, CR
Voeg logica toe om te tonen welke speler de snelste reactie had
IF (timeCounterA < timeCounterB) THEN
DEBUG "Player A is the winner!", CR
ELSEIF (timeCounterB < timeCounterA) THEN
DEBUG "Player B is the winner!", CR
ELSE
DEBUG "It's a tie!", CR
ENDIF
De volledige oplossing staat hieronder.
'
'
'
'
'
'
What's a Microcontroller - Ch03Prj01_TwoPlayerReactionTimer.bs2
Test reaction time with a pushbutton and a bicolor LED.
Add a second player with a second pushbutton. Both players
play at once using the same LED. Quickest to release wins.
Pin P3: Player A Pushbutton, Active High
Pin P4: Player B Pushbutton, Active High
' {$STAMP BS2}
' {$PBASIC 2.5}
timeCounterA VAR
timeCounterB VAR
PAUSE 1000
Word
Word
DEBUG "Press and hold pushbuttons", CR,
"to make light turn red.", CR, CR,
"When light turns green, let", CR,
"go as fast as you can.", CR, CR
DO
' Time score of player A
' Time score of player B
' 1 s before 1st message
' Display reaction
' instructions.
' Begin main loop.
DO
' Nothing
LOOP UNTIL (IN3 = 1) AND (IN4 = 1)
' Loop until both press
HIGH 14
LOW 15
' Bicolor LED red.
PAUSE 1000
' Delay 1 second.
LOW 14
HIGH 15
' Bicolor LED green.
timeCounterA = 0
timeCounterB = 0
' Set timeCounters to zero
DO
PAUSE 1
IF (IN3 = 1) THEN
timeCounterA = timeCounterA + 1
ENDIF
IF (IN4 = 1) THEN
timeCounterB = timeCounterB + 1
ENDIF
' If button is still down,
' increment counter
LOOP UNTIL (IN3 = 0) AND (IN4 = 0)
' Loop until both buttons
' released.
LOW 15
' Bicolor LED off.
Pagina 62 · Wat is een Microcontroller? NL HJK
DEBUG "Player A Time: ", DEC timeCounterA, " ms. ", CR
DEBUG "Player B Time: ", DEC timeCounterB, " ms. ", CR, CR
IF (timeCounterA < timeCounterB) THEN
DEBUG "Player A is the winner!", CR
ELSEIF (timeCounterB < timeCounterA) THEN
DEBUG "Player B is the winner!", CR
ELSE
' A & B times are equal
DEBUG "It's a tie!", CR
ENDIF
DEBUG CR
DEBUG "To play again, hold the ", CR
DEBUG "buttons down again.", CR, CR
LOOP
' Play again instructions.
' Back to Begin main loop.
Besturen van beweging · Page 63
Hoofdstuk 4: Besturen van beweging
BEWEGING MET EEN MICROCONTROLLER
In onze omgeving zijn dagelijks vele microcontrollers actief om voorwerpen in onze omgeving naar
de juiste plek te laten bewegen. Denk bijvoorbeeld aan een inkjetprinter, waar de printkop heen en
weer beweegt over het papier, terwijl het papier vooruit beweegt. De stappenmotoren, die de printkop
en het papier laten bewegen, worden bestuurd door een microcontroller. Als je een winkel inloopt met
automatische deuren, worden de deuren geopend door een microcontroller. Evenzo zorgt een
microcontroller voor het automatisch uitwerpen van een DVD uit een DVD-speler.
AAN/UIT-SIGNALEN EN BEWEGING VAN MOTOREN
Net als bij de LED-schakelingen, waar een hoog of laag signaal de LED bestuurt, worden de motoren
door een hoog-laag signaal bestuurd. Het enige verschil is, dat het signaal nu met een veel hogere
frequentie moet schakelen als bij de LED die aan en uit ging in hoofdstuk 2. Als je een LED zo snel
zou aansturen, dan zou je het in- en uitschakelen van de LED niet kunnen zien. Je zou alleen maar
waarnemen, dat de LED zwakjes opgloeide.
Sommige motoren worden met ingewikkelde schakelingen bestuurd. Andere motoren hebben juist
weer veel mechanische onderdelen nodig om ze goed in een machine te laten werken. Van alle
verschillende soorten motoren is de hobby-servo, die in dit hoofdstuk wordt gebruikt, waarschijnlijk
het eenvoudigst te gebruiken. Zoals je in dit hoofdstuk zult zien is het niet moeilijk om met de BASIC
Stamp een motor zonder ingewikkelde aanpassingen dingen te laten bewegen.
INTRODUCTIE VAN DE SERVO
Een hobby- servo is een apparaat dat naar een bepaalde positie gestuurd kan worden, we noemen dat
positiebesturing. Je vindt deze servo’s terug in iedere radiografische bestuurde (RC) auto, boot of
vliegtuig. In een boot bestuurt de servo het roer. In een RC-auto worden het gas en het stuur ieder
door een servo bediend. En in een modelvliegtuig, worden het richtingroer, het gas en de flappen van
de vleugels door een servo bediend. In Figuur 4-1 zie je een voorbeeld van een radiografisch bestuurd
modelvliegtuig en de bedieningsunit. Degene die het vliegtuig ‘vliegt’, bedient de joystick op de
bedieningsunit, om de positie van kleppen en roer op het vliegtuig te besturen.
Figuur 4-1
Model vliegtuig en
Radiografische besturing
De vraag is nu, hoe de joystick van de bedieningsunit een bepaalde positie van een klep of roer kan
bedienen. Het antwoord is een beetje ingewikkeld. Het werkt als volgt: In de bedieningsunit, wordt de
positie van iedere joystick omgezet in een pulssignaal. De positie van de joystick bepaalt de lengte van
de puls. In de ontvanger in het vliegtuig, worden deze pulssignalen voor iedere servo omgezet in
hoog/laag-signalen en stuurt deze signalen naar de betreffende servo. Iedere servo heeft een
elektronische schakeling die het pulssignaal omzet in een positie van de servo. De lengte van de puls
Pagina 64 · Wat is een Microcontroller? NL HJK
bepaalt de positie van de servo. De lengte van de puls is hooguit een paar milliseconden (1/1000
seconde) lang en de puls wordt ongeveer 40 tot 50 keer per seconde herhaald.
In Figuur 4-2 is een dergelijke servo afgebeeld. Dit is een voorbeeld van een servo van Parallax. De
steker (1) verbindt de servo bijvoorbeeld met de radiografische ontvanger, of een I/O pen van een
BASIC Stamp controller. De steker en kabel (2) hebben drie aansluitingen, twee voor de voeding en
een voor het pulssignaal Het draaiende gedeelte, is het kruis op de servo (3). De schroef (4) klemt het
kruis op het draaiende asje van de servo. Het huisje van de servo (5) bevat een motortje, tandwielen en
elektronica die samen het pulssignaal omzetten in een positie van het kruis.
2
Figuur 4-2
De Parallax Standard
Servo
3
1
(1) Plug
(2) Kabel
(3) Kruis
(4) Schroef die het kruis
op de as klemt
(5) Huis
4
5
In dit hoofdstuk, gaan we een programma schrijven voor de BASIC Stamp, waarbij er een pulssignaal
naar de servo gestuurd wordt om de positie van het kruis te besturen. Het programma in de BASIC
Stamp zal verschillende signalen opwekken en daarmee de servo in verschillende posities zetten. Het
programma kan eigenlijk de servobewegingen nauwkeurig bepalen. Je kunt bijvoorbeeld een
programma maken, waarmee een paar drukknoppen uitgelezen worden, om daarmee de positie van de
servo te besturen (Drukknop besturing van de servo). Maar het BASIC programma kan ook tekst naar
de terminal sturen en getypte informatie van jou terug ontvangen, om met deze informatie de servo te
besturen.
OPDRACHT #1: AANSLUITEN EN TESTEN VAN DE SERVO
In deze Activiteit, zul je een servo aansluiten op de voeding en de BASIC Stamp. Dan wordt de servo
getest op functionaliteit door de BASIC Stamp te programmeren om signalen naar de servo te sturen
om de Servoposities te controleren.
Onderdelen van de schakeling met een Servo en een LED
(1) Parallax Standard Servo
(1) Weerstand – 470 Ω ((geel-violet-bruin)
(1) LED – van een willekeurige kleur
Besturen van beweging · Page 65
Een LED schakeling kan gebruikt worden om na te gaan , welk signaal de BASIC Stamp naar de servo
stuurt. Houd in gedachte dat de LED schakeling niet nodig is om de servo te laten werken. Het is er
juist om te zien wat er met de sturingssignalen gebeurt.
OPGELET: gebruik enkel de Standard Servo van Parallax voor de volgende opdracht!
Gebruik alleen de standaard servo, omdat een ander model servo of een ander merk
misschien stuk kan gaan.
Bouwen van de Servo en het LED Schakeling
In hoofdstuk 1 heb je vastgesteld, welk bordje je gebruikt met behulp van de BASIC Stamp Editor
help. Aan de hand van deze informatie, kun je de juiste schakeling opzetten voor de servo.
9 Als je nog weet welk bordje je gebruikt en welke versie (revisie), dan kun je de BASIC Stamp
Editor starten, de Help openen en op de startpagina (Home page) klikken op getting Started in
Class. Volg daarna de aanwijzingen voor het type bordje en de revisie, die jij hebt.
9 Als je een Studentenbordje met USB of seriële poort hebt, dan maakt het niet uit welke versie
(Revisie) je hebt. Ga dan door met het gedeelte hieronder.
9 Als je bordje niet in de lijst voorkomt, kijk dan op www.parallax.com/Go/WAM → Servo
Circuit Connections, om de instructies voor jouw bordje te vinden. Dit is wel in het Engels.
9 Als je een BASIC Stamp HomeWork Board hebt (Revisie C of hoger), ga dan naar de
beschrijving HomeWork Board Servoschakeling op pagina 67.
9 Als je klaar bent met het opzetten van de schakeling voor servo op jouw bordje, kun je verder
gaan met Opdracht #1.
Board of Education Servo Schakeling
De volgende instructies zijn voor alle Onderwijsbordjes (Board of education), met zowel een USB- als
een aansluiting op de seriëlepoort.
9 Schakel de spanning uit, zoals aangegeven in Figuur 4-3.
Figuur 4-3
Schakel spanning uit
Reset
0
1
2
Zet de 3-standenschakelaar op 0
Figuur 4-4 laat de aansluiting van de servo zien voor het onderwijsbordje. Hier moet je de servo
aansluiten. Op het bordje zit een jumper, waarmee je de voeding van de servo op Vin of Vdd kunt
aansluiten. De jumper is een zwart rechthoekig plastic blokje tussen de twee connectors, aangeduid
met de pijl.
9 Controleer, of de jumper is ingesteld op Vdd, zoals te zien in Figuur 4-4. Als de jumper niet
goed staat, kun je hem eenvoudig van de pennetjes trekken en daarna op de juiste positie
plaatsen
15 14 Vdd 13 12
Red
Black
X4
X5
Vin
Figuur 4-4
Servoaansluiting met Jumper op Vdd
Pagina 66 · Wat is een Microcontroller? NL HJK
De jumper maakt het mogelijk om de voeding voor de servo aan te sluiten op Vin of
Vdd
ƒ
Als je de 9V batterij gebruikt, zet de jumper dan op Vdd. Gebruik nooit
netvoedingen met een 9V batterijaansluiting
ƒ
Als je 4 stuks AA batterijen gebruikt in een 6V pack, kunnen beide instellingen
gebruikt worden.
ƒ
Als je de voeding gebruikt, controleer dan eerst de eigenschappen voor dergelijke
voedingen in de BASIC Stamp Editor Help, voordat je iets aansluit!
Figuur 4-5 geeft de op te bouwen schakeling voor het onderwijsbordje (Board of Education).
9 Bouw de schakeling op van Figuur 4-5 en Figuur 4-6.
9 Wees er zekere van, dat je het stekertje van de servo niet ondersteboven hebt zitten. De witte,
rode en zwarte draad moeten exact hetzelfde zitten als in Figuur 4-6.
P14
470 Ω
Figuur 4-5
Servo en LED
Indicator Schematic
voor het
onderwijsbordje
(Board of
Education)
LED
Vss
Vdd
White
P14
Red
Servo
Black
Veel bordjes met
een seriële
aansluiting Rev C
of nieuwer, of ieder
USB
Onderwijsbordje
Vss
15 14 Vdd 13 12
White
Red
Black
Red
Black
X4
Vdd
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
X5
Vin
Vss
+
Figuur 4-6
Servo and LED
Indicator on Board
of Education
standard servo
www.parallax.com
Besturen van beweging · Page 67
Tot nu toe heeft de driestandenschakelaar in positie 1 gestaan, waardoor de servo nog geen spanning
kreeg. Als je de schakelaar op positie 3 zet, krijgt de servo spanning.
9 Zet de driestandenschakelaar op positie 3, zoals in Figuur 4-7 is te zien. De servo kan een klein
beetje bewegen, als je de spanning inschakelt.
Figuur 4-7
Spanning op de servo ingeschakeld op het
onderwijsbordje ( Board of Education)
Reset
0
1
2
Als je in het vervolg dus leest ”Zet de spanning uit”, zet de schakelaar dan op 0 en als je leest “Zet de
spanning aan” dan zet je de schakelaar op 3.
9 Zet de spanning uit
9 En ga naar Opdracht #2 op pagina 68
BASIC Stamp HomeWork Board Servo-schakeling
Als je de servo wilt aansluiten op de BASIC Stamp Home Work Board (Revisie C of hoger), dan heb
je extra onderdelen nodig uit de kit:
(1) stuks 3 pin header zoals in Figuur 4-8 is te zien
(4) stuks draadjes (Jumper wire)
Figuur 4-8
Extra onderdeel voor het aansluiten
van de servo op het BASIC Stamp
HomeWork Board
3-pin header
Figuur 4-9 laat de aansluitingen zien voor de servo en de LED op het BASIC Stamp HomeWork
Board. De nu volgende instructies zullen helpen de schakeling veilig op te bouwen.
9 Schakel de spanning uit en verwijder de batterij van je HomeWork Board
9 Bouw de schakeling op van Figuur 4-9 en Figuur 4-10.
P14
470 Ω
LED
Vss
Figuur 4-9
Schema voor Servo en
LED op het HomeWork
Board
Vdd
P14
White
Red
Black
Vss
Servo
Pagina 68 · Wat is een Microcontroller? NL HJK
Figuur 4-10
LED Indicator en Servo
Header schakeling op
HomeWork Board
9 Wees er zeker van, dat de oriëntatie van de kleuren van de draden overeenkomt met de
tekening
9 Controleer je bedrading volgens Figuur 4-11. nog een keer
WAARSCHUWING!!
Gebruik uitsluitend de 9V batterij en niet een voeding, die de batterij vervangt.
Je kunt het beste een nieuwe batterij gebruiken, of een vers opgeladen batterij als je
oplaadbare batterijen gebruikt. De capaciteit van de batterij moet dan minimal 100mAh zijn.
Dat staat op de batterij.
9 Sluit de 9V batterij weer aan . De servo kan tijdens het aansluiten een klein beetje bewegen.
Figuur 4-11
Servo verbonden met
het HomeWork Board
OPDRACHT #2: HET TEST PROGRAMMA OM DE SERVO TE TESTEN
De positie of verdraaiing van de servo wordt uitgedrukt in graden en weergegeven met het symbool °.
In Figuur 4-12 zie je verschillende voorbeelden van posities of hoekverdraaiingen. Een volledige
verdraaiing is 360°. Als de servo ¼ omwenteling verdraait, is dat 90° (360°/4). Op dezelfde manier is
een 1/2 omwenteling 180°.
Besturen van beweging · Page 69
Figuur 4-12
Voorbeelden van
hoeken in
graden
De hier gebruikte Parallax servo kan maximaal 180° verdraaien van links naar rechts. . Figuur 4-13
geeft een aantal voorbeelden van hoeken op de servo, door een stukje draad, dat door twee gaatjes van
het kruis is gestoken en daarna in elkaar is gedraaid (getwist). In de figuur zie je een paar voorbeelden
van de stand van de servo en de hoek die het kruis maakt. De getekende hoeken zijn 0°, 45°, 90°, 135°,
en 180°.
Figuur 4-13: Voorbeelden van Servoposities
Opmerking: Mogelijk, dat het kruis op jouw servo anders is gemonteerd, waardoor de hoeken
er wat anders uit zien.
De montage van het kruis in de fabriek is willekeurig, waardoor de hoeken bij jouw servo kunnen
afwijken. Later zullen we zien, dat we de servo naar zijn centrale positie kunnen laten bewegen door
het kruis zodanig te monteren, dat de hoeken wel kloppen met de standen in Figuur 4-13. In Figuur
4-14 zie je een voorbeeld van een kruis, dat 20° scheef gemonteerd.
Figuur 4-14: Een voorbeeld van hoeken bij een scheef gemonteerd kruis, voordat de
montage is gecorrigeerd.
In dit voorbeeld is het kruis 20° verdraaid ten opzichte van Figuur 4-13.
Je kunt het midden van de servo met de hand vinden, door deze helemaal naar links te draaien en
vervolgens helemaal naar rechts te draaien. De centrale 0-positie zit ongeveer in het midden van de
slag, dit noemen we de 90° positie, Figuur 4-15 geeft de slag aan voor een goed gemonteerd kruis.
Pagina 70 · Wat is een Microcontroller? NL HJK
Het midden van het bereik van het kruis op jouw servo
De poistie op jouw servo zou kunnen afwijken.
Figuur 4-15
Gebied van mogelijke
middenposities
In de volgende stappen mag je de servo langzaam verdraaien, zonder veel kracht te
gebruiken
De servo heeft een ingebouwde mechanische begrenzing, om te voorkomen dat het kruis te
ver doordraait. Als je het kruis met de hand voorzichtig beweegt, voel je de eindaanslag
duidelijk. Probeer het kruis niet verder te draaien, omdat anders de tandwielen in de servo
kapot gaan.
9 Controleer of de spanning uit staat
9 Draai de servo langzaam naar links en rechts en zet het kruis daarna in het midden van de
beweging. GEBRUIK GEEN KRACHT, OM DE SERVO TEGEN DE EINDAANSLAG TE
DRAAIEN! Draai net ver genoeg om de aanslag te voelen.
9 Draai de servo een halve slag (90° ) terug, naar de middenstand. Rijg nu een draadje (jumper
wire) door de gaatjes van het kruis, zoals in Figuur 4-15, om een soort van hoekindicator te
maken.
Houd wel in gedachten, dat de schets van Figuur 4-15 alleen maar een voorbeeld is. We gaan de servo
later rechtzetten.
Programmeren van Servo Posities
Voordat we de servo kunnen besturen, leggen we eerst uit, op welke manier het hoog-laag pulssignaal,
dat we van de BASIC Stamp naar de servo sturen, de positie van de servo bepaalt. Figuur 4-16 laat het
signaal zien om de servo in zijn centrale positie op 90° te houden. We noemen een dergelijke
weergave van het pulssignaal een tijddiagram (Engels timing diagram)
Figuur 4-16
Servo Signaal in de
vorm van een
tijddiagram
1.5 ms pulsen zetten
de servo in de
middenpositie op 90°
.
Besturen van beweging · Page 71
Het tijddiagram laat een signaal zien, dat 1,5 ms op 5 volt staat (dit noemen we hoog). Weet je nog, dat
1 ms (of 1 milliseconde) 1/1000 ste seconde is? Daarna is het signaal gedurende 20 ms 0 volt (dit
noemen we laag). Dit signaal wordt telkens herhaald. Het “~” symbool in ~20ms, geeft aan dat de
tijdsduur van 20ms ongeveer 20 milliseconden duurt en niet precies is aangegeven. Deze tijd kan een
paar milliseconden meer of minder zijn, zonder dat hij de positie van de servo beïnvloedt. De servo
stelt zijn positie in op het hoge signaal en niet op het lage.
In de BASIC Stamp is er een speciaal commando, om dit soort pulsen te maken en dat heet PULSOUT.
Met dit commando kunnen we hele nauwkeurige pulssignalen opwekken voor bijvoorbeeld de servo.
De vorm, waarin we dit commando gebruiken (syntax genoemd) is:
PULSOUT Pin, Duration
Waarbij het argument Pin (Pen in het Nederlands), aangeeft, op welke pin van de BasicStamp de servo
is aangesloten en de Duration (Tijdsduur in het Nederlands). Een Duration van 1 maakt een puls van
2 microseconde. Weet je nog, dat 1 microseconde 1 miljoenste van een seconde is?
Een microseconde
Is 1/1000000 (1 miljoenste van een seconde). In plaats van het woordje micro wordt vaak de
Griekse letter μ (mu) gebruikt. Dit is handig als je bijvoorbeeld notities maakt. In plaats van 2
microseconden, kun je nu schrijven: 2 μs.
Weet je nog wat ook alweer een milliseconde was? 1 milliseconde of 1 ms is 1/1000
seconde.
We kunnen nu dus zeggen: 1 ms = 1000 μ
Nu we weten hoe het commando PULSOUT werkt, kunnen we het kleine programma ServoCenter.bs2
gaan gebruiken om pulsen te maken om de servo op zijn centrale positie van 90° te zetten. Het
commando PULSOUT 14, 750, zal een puls van 1,5 ms naar de servo sturen. Een 1 in het argument
Duration, maakt een puls van 2 μs. En omdat 750 × 2 μs = 1500 μs en 1500 μs gelijk is aan 1,5 ms,
moet het argument Duration een waarde hebben van 750. Nadat het commando de puls van 1,5 ms
op de pin van de BasicStamp heeft gezet, blijft het signaal gedurende de rest van de tijd laag. We
zullen daarom een pauze moeten inlassen, om het signaal 20 ms laag te houden Het commando PAUSE
20 maakt een pauze van 20 ms .Door de twee commando’s op te nemen in een DO...LOOP wordt het
signaal telkens weer op de pin van de BASIC Stamp gezet.
Voorbeeld Programma: ServoCenter.bs2
' What's a Microcontroller - ServoCenter.bs2
' Hold the servo in its 90 degree center position.
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!", CR
DO
PULSOUT 14, 750
PAUSE 20
LOOP
Testen van de middenpositie van de Servo’s op 90°
Al eerder is uitgelegd, dat de middenpositie van de servo op 90° vastgesteld is, omdat totale beweging
van de servo 180° bedraagt. Een pulslengte van 1,5 ms stuurt de servo naar deze middenpositie. Als
het programma de servo in de middenstand heeft gezet, kunnen we voorzichtig met een
schroevendraaien, het kruis van de servo los maken en in de goede positie terugplaatsen op de as. Zet
de schroef weer voorzichtig vast. Er volgen nog instructies getiteld: Optioneel – Aanpassen van de
centrale positie van het kruis op 90° uitgaand van de voorbeelden in Figuur 4-14 op bladzijde 69.
Pagina 72 · Wat is een Microcontroller? NL HJK
Laten we proberen te bepalen, wat de centrale positie van de servo is.
De stappen zijn als volgt:
9 Draai de servo voorzichtig in een richting tegen zijn eindaanslag
9 Sluit de spanning op het bordje aan
9 Start het programma ServoCenter.bs2
Zodra het programma is geladen, draait de servo naar zijn middenpositie. De servo houdt deze
middenpositie vast tot er een andere positie wordt opgegeven. Je kunt de servo niet zomaar wegduwen
als je aan het kruis draait. Je zult nu ook begrijpen, hoe een servo het roer van een RC- boot in positie
houdt, of het stuur van een RC-auto in een positie vasthoudt.
9 Noteer de positie van de servo
9 Probeer het kruis voorzichtig met de hand te verdraaien. Je zult merken, dat de servo weerstand
biedt en niet verdraait.
Als je de spanning van het bordje uitschakelt, kun je de servo wel met de hand draaien. Schakel je de
spanning weer in, dan draait de servo weer naar zijn middenpositie.
9 Probeer dit zelf uit!
Optioneel – Aanpassen van de centrale positie van het kruis op 90°
Je kunt de positie van het servokruis aanpassen, zodat het recht staat, als de servo in zijn centrale
positie staat. Hierdoor maak je het eenvoudiger om bewegingen van de servo te begrijpen, omdat de
hoeken er nu net zo uitzien, als in Figuur 4-13 op pagina 69
Je hebt een kleine kruiskopschroevendraaier nodig
Output
shaft
Phillips
Screw
Figuur 4-17
Centrering van het
kruis van de servo
Je kunt het kruis
verdraaien op de as
van de servo
Horn
9
9
9
9
Schakel de spanning uit
Draai de schroef op het kruis los en trek het kruis voorzichtig van de as. Zie Figuur 4-17 links
Schakel de spanning nu in. Het programma houdt nu de centrale positie van de servo vast.
Plaats het kruis in de goede positie op de as, zodat de draden naar voren wijzen zoals in Figuur
4-17 rechts.
Kleine afwijking : Het Is mogelijk, dat het kruis niet exact in het midden geplaatst kan
worden, door kleine mechanische afwijkingen in de servo. Dit is normaal. Buig in dat geval
het draadje zo, dat het toch naar voren wijst.
9 Schakel de spanning uit
9 Zet de schroef vast
Besturen van beweging · Page 73
9 Schakel de spanning weer in en controleer, of het draadje op het kruis netjes naar voren wijst
op de 90° positie.
Jouw beurt, om de servo in verschillende richtingen te laten draaien
Figuur 4-18 laat een paar PULSOUT commando’s zien, die de servo naar vaste posities stuurt, zoals 0°,
45°, 90°, 135°, en 180°. Hat kan zijn, dat de hoeken een klein beetje afwijken. Je zou dit eventueel
kunnen aanpassen in het PULSOUT commando. Als je de servo bijvoorbeeld op positie 30° wit zetten,
gebruik dan het PULSOUT commando met een Duration argument van 417. Dit is 2/3 van de waarde
van de Duration argumenten voor 250 (0°) en 500 (45°).
De pulsduur in Figuur 4-18 zal het kruis redelijk goed in de gewenste positie zetten. maar
er kunnen kleine afwijkingen zijn. Jje kunt met de waarde van Duration in het commando
PULSOUT experimenteren, om de positie exact goed te zetten..
9 Sla een kopie op van het programma ServoCenter.bs2 onder de naam TestServoPositions.bs2
9 Verander in het PULSOUT Duration argument de waarde van 750 naar 500, start het programma
en controleer of de servo nu op 45° staat.
9 Herhaal deze test met verschillende waarden voor Duration die liggen tussen 1000 (135°), en
417 (30°).
9 Probeer te voorspellen, naar welke hoek de servo beweegt bij een zelfgekozen waarde, die niet
in Figuur 4-18 staat
Houd het argument Duration in het commando PULSOUT Duration tussen een waarde
van 350 en 1150 . Het bereik van 250 tot 1250 is in theorie mogelijk. Maar in praktijk
hebben de servo’s kleine verschillen, waardoor de servo tegen zijn mechanische
eindaanslag vastloopt. Dit zou tot slijtage kunnen leiden.
Figuur 4-18: Servo Posities, PULSOUT Commando´s, en de pulsduur in ms (milliseconde)
Doe de sommetjes
Bij ieder PULSOUT is er een verband tussen de pulsduur in het commando en de hoek van de servo.
Bijvoorbeeld het commando PULSOUT 14, 417 maakt een puls van 0.834 ms en PULSOUT 14, 500
maar een puls van 1.0 ms. Je kunt dit iedere keer zelf uitrekenen. Maar een BASIC Stamp kan ook
Pagina 74 · Wat is een Microcontroller? NL HJK
rekenen. Je kunt in het programma de gewenste hoeken omrekenen naar een pulsduur voor het
commando, door gebruik te maken van de volgende vergelijking±
Duration = number of ms × 500
Als je niet wist hoe je dit moet berekenen dan weet je nog wel, dat je voor een puls van 1,5 ms een
waarde van 750 voor het PULSOUT commando in het Duration argument moest gebruiken
Duration = 1 .5 × 500
= 750
De reden, dat we met 500 moeten vermenigvuldigen komt door het feit dat een 1 in het argument
Duration een pulstijd geeft van 2 μs (1 microseconde is 1/1000 ste milliseconde). Als je dus een
bepaalde pulstijd wilt maken, deel je de waarde in microseconden door 2.
1
2
÷
= 500
1,000 1,000 ,000
Bij het commando PULSOUT 14, 500, zal de puls voor 500 × 2 μs = 1000 μs = 1.0 ms duren. (Denk
eraan, 1000 μs = 1 ms.)
Je kunt de waarde van Duration van een PULSOUT commando dus berekenen met de vergelijking:
number of ms =
Duration
500
ms
Stel, dat je een commando PULSOUT 14, 850 ziet staan. Hoe kun je dan uitrekenen, hoelang de puls
echt duurt?
850
ms
500
= 1 .7 ms
number of ms =
Schrijf code vanuit een tijddiagram
Figuur 4-19 laat een tijddiagram zien van het signaal dat de BASIC Stamp naar de servo stuurt, om het
kruis in de positie van 135° te houden. Omdat het tijddiagram herhaalde pulsen laat zien, die
gescheiden zijn door 20 ms laag signalen, biedt de DO...LOOP van ServoCenter.bs2 een goed
startpunt. Meer is er niet nodig, om de duur van de hoge puls in te stellen. Om de duur van het
PULSOUT commando’s Duration argument uit te rekenen voor de 2 ms pulsen in het tijddiagram, kun je
de volgende functie gebruiken voor Duration :
Duration = number of ms × 500
= 2.0 × 500
= 1000
Met de waarde 1000 in het PULSOUT commando’s Duration argument, ziet het programma er als volgt
uit:
DO
PULSOUT 14, 1000
PAUSE 20
LOOP
9 Test de DO...LOOP in een kopie van het programma ServoCenter.bs2 en controleer of de
positie van de servo 135° is.
9 Herhaal deze opdracht voor het tijddiagram van Figuur 4-20
Besturen van beweging · Page 75
Figuur 4-19
Tijddiagram voor
135° positie
2 ms pulsen
gescheiden door 20
ms pauze
Figuur 4-20
Tijddiagram voor 45°
Positie
1 ms pulsen
gescheiden door 20
ms pauze
OPDRACHT #3: VASTZETTEN POSITIE GEDURENDE EEN TIJD
In de filmwereld en dan vooral bij special effects, worden vaak servo´s ingezet om bepaalde
bewegingen te maken. We noemen dit Animatronics, een samenvoeging van animatie en elektronica.
Figuur 4-21 laat een voorbeeld zien van een hand, die met behulp van servo’s kan bewegen. Met een
programma in PBASIC, kunnen de bewegingen van de hand bestuurd worden. Het is dan belangrijk,
dat iedere positie gedurende een bepaalde tijd wordt vastgehouden om de bewegingen er natuurlijk uit
te laten zien. In de vorige opdracht werd een gecommandeerde positie voor onbepaalde tijd
vastgehouden. In deze opdracht gaan we leren, hoe je een programma schrijft, waarbij een bepaalde
positie voor een bepaalde tijd wordt vastgehouden.
Figuur 4-21
Animatronische hand
De servo´s onder de hand trekken
aan kabeltjes, zoals die ook op de
handremmen van je fiets zitten. De
vingers en duim kunnen buigen, via
deze kabels. De BasicStamp bestuurt
de vingers via de servo´s.
Gebruik van FOR...NEXT Loops om de tijd te controleren, date en Servo Position
vasthoudt
Als je code schrijft om iedere seconde een LED te laten knipperen, gebruik je een FOR...NEXT loop.
Je hebt een programma gemaakt, om de LED 3 keer te laten knipperen. Voor iedere keer dat de LED
knippert, wordt de lus een keer doorlopen. We hadden ook al geleerd, dat het signaal, dat naar de servo
gaat, een hoog-laag/signaal is, maar dat het veel te snel gaat om een LED te zien knipperen. Laten we
daarom de snelheid van het signaal 10 maal vertragen om het wel met een LED zichtbaar te maken.
Pagina 76 · Wat is een Microcontroller? NL HJK
Voorbeeldprogramma: SlowServoSignalForLed.bs2
Vergeleken met het vorige programma, is de tijdsduur van PULSOUT en PAUSE 10 keer langer. De
FOR...NEXT loop zal de LED 15 keer laten knipperen in drie seconden.
9 Schakel de spanning op de servo uit door de schakelaar op het Board of Education op de
middenstand te zetten. De microprocessor heeft dan nog wel spanning.
9 Als je een BASIC Stamp HomeWork Board hebt, zul je tijdelijk de servo moeten loskoppelen.
9 Draai het programma SlowServoSignalsForLed.bs2.
9 Controleer, of de LED gedurende drie seconden knippert
9 Pas de eindwaarde van de FOR...NEXT loop aan van 15 naar 30. Omdat de loop nu tweemaal
zolang duurt, moet de LED ook tweemaal zolang knipperen.
9 Schakel de spanning voor de servo weer in door de servo weer te verbinden, of de schakelaar
weer op stand 2 te zetten.
' What's a Microcontroller – SlowServoSignalsForLed.bs2
' Slow down the servo signals to 1/10 speed so that they are we can
' see the LED indicator blink on/off.
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!", CR
counter
VAR
Word
FOR counter = 1 to 15
PULSOUT 14, 7500
PAUSE 200
NEXT
Voorbeeldprogramma: ThreeServoPositions.bs2
Verander in het programma PULSOUT 14, 7500 in PULSOUT 14, 750 en PAUSE 200 in PAUSE 20.
Het programma is nu weer geschikt om een servo te besturen. Omdat de tijden nu weer 1/10de zijn van
de vorige versie met de LED, duurt de lus nu ook maar 1/10. Het doel in het volgende voorbeeld is om
de servo naar een bepaalde positie te sturen en deze gedurende 3 seconden vast te houden. Dat
betekent dat we de eindwaarde van de FOR...NEXT loop 10 maal zo groot moeten maken, namelijk
150 in plaats van 15.
FOR counter = 1 to 150
PULSOUT 14, 750
PAUSE 20
LOOP
' Center for about 3 sec.
Het programma ThreeServoPositions.bs2 zorgt, dat de servo drie posities inneemt en telkens drie
seconden wacht, zoals in Figuur 4-22 te zien is.
Figuur 4-22
ThreeServoPositions.bs2
In dit programma blijft de
servo telkens drie
seconden op dezelfde
positie staan
9 Draai het programma ThreeServoPositions.bs2
9 Controleer de Servoposities en de tijd dat de servo op zijn positie blijft staan.
Besturen van beweging · Page 77
De laatste positie van het programma is 135° . Het programma is dan gestopt en de servo blijft op die
posities staan. De servo kan na afloop van het programma wel met de hand worden bewogen, omdat
de pulsen gestopt zijn. Je kunt dit ook aan de LED zien. Tijdens de pulsen naar de servo brandt de
LED zachtjes. Als het programma is gestopt, is de LED uit.
9 Draai het programma nog een keer en kijk tegelijkertijd naar de LED.
9 Probeer intussen met de hand voorzichtig de servo te verdraaien
Terwijl de LED brandt, kun je de servo niet met de hand bewegen. Als de LED uit is lukt het wel om
het kruis te verdraaien.
9 Controleer, dat als het 135° signaal stopt, de LED uit gaat en je de servo daarna met de hand
kunt bewegen.
' What's a Microcontroller – ThreeServoPositions.bs2
' Servo holds the 45, 90, and 135 degree positions for about 3 seconds each.
' {$STAMP BS2}
' {$PBASIC 2.5}
counter
VAR
Word
PAUSE 1000
DEBUG "Position = 45 degrees...", CR
FOR counter = 1 TO 150
PULSOUT 14, 500
PAUSE 20
NEXT
' 45 degrees for about 3 sec.
DEBUG "Position = 90 degrees...", CR
FOR counter = 1 TO 150
PULSOUT 14, 750
PAUSE 20
NEXT
' 90 degrees for about 3 sec.
DEBUG "Position = 135 degrees...", CR
FOR counter = 1 TO 150
PULSOUT 14, 1000
PAUSE 20
NEXT
' 135 degrees for about 3 sec.
DEBUG "All done.", CR, CR
END
Jouw beurt – Aanpassen versus houdtijd
In het volgende programma ThreeServoPositions.bs2 veronderstellen we, dat het uitvoeren van 50
servopulsen in de FOR...NEXT loop ongeveer 1 seconde duurt. Met deze informatie kun je met de
EndValue bepalen hoe vaak de lus doorlopen wordt. En daarmee kun je de zogenaamde houd-tijd van
de servo beïnvloeden. Veronderstel, dat de servo 2 seconden moet blijven staan en dat moet de lus na
100 keer stoppen. Voor 5 seconden, moet de lus na 250 keer stoppen.
9 Sla een kopie op van ThreeServoPositions.bs2.
9 Pas de EndValue voor de FOR...NEXT loop aan en experimenteer met verschillende waarden
voor verschillende tijden, zodat de servo op zijn positie blijft staan.
9 Voor de gevorderden: Pas de wachttijd per positie aan, door aanpassen van het Duration
argument van ieder PULSOUT commando.
Pagina 78 · Wat is een Microcontroller? NL HJK
FOR...NEXT Loop herhalingstijd: De lus duurt 1/44ste seconde en niet 1/50ste
Eerder hebben we het gehad over de duur van een puls, waarbij we voor het gemak uitgingen van
1/50ste seconde per puls. In de vorige opdrachten heb je waarschijnlijk opgemerkt dat de lussen
langzamer zijn dan verwacht. Dat komt, omdat de lustijd alleen maar een ruwe schatting was. Een
tijdsduur van 1/44ste seconde is een veel betere schatting.
Laten we nog een keer naar de commando’s kijken en de echte tijdsduur proberen te bepalen van de
FOR...NEXT loop . Het commando PULSOUT 14, 750 zet de servo in het midden, maar heeft ook de
gemiddelde pulsduur. Iedere puls duurt 750 × 2 μs = 1500 μs = 1.5 ms. Het PAUSE 20 commando
zorgt ervoor, dat het programma gedurende 20 ms wacht. Tenslotte kost het uitvoeren van een
Het
verschil op de totale pulsduur van 21.3 ms in plaats van 20 ms heeft geen invloed op de servo. De tijd,
dat het signaal laag is gedurende het PAUSE commando, mag voor de servo best een paar ms afwijken.
De tijdsduur van het hoge signaal, dat opgewekt wordt met het PULSOUT commando, moet juist wel
heel precies zijn.
FOR...NEXT loop met een PULSOUT en PAUSE commando ook tijd en wel 1.3 ms per keer.
De totale FOR...NEXT lus duurt dus 1.5 ms + 20 ms + 1.3 ms = 22.8 ms, En dat komt overeen met een
22.8/1000 van een seconde. En hiermee kunnen we uitrekenen hoeveel keer de lus per seconde wordt
uitgevoerd, door 1 seconde of 1000 ms te delen door 22,8 ms:
1 second ÷ 0.0228 seconds/repetition ≈ 43.86 repetition s
≈ 44 repetitions
Daarom weten we nu, dat de lus 44 keer per seconde uitgevoerd wordt. We noemen met aantal keren
per seconde ook wel hertz, afgekort Hz. We kunnen dus zeggen, dat de lus draait op 44 Hz.
Het aantal keren per seconde en Hertz (Hz): Als een signaal zichzelf een aantal malen
per seconde herhaalt, wordt iedere herhaling een cyclus genoemd. Het aantal keren, of het
aantal cycli per seconde wordt uitgedrukt in Hertz, afgekort Hz.
Grotere en kleinere waarden voor PULSOUT Duration zullen ervoor zorgen, dat de FOR...NEXT loop
iedere keer een beetje langer of korter duurt. Bij een waarde van het PULSOUT Duration argument van
750 moet de servo precies in het midden van zijn bereik staan, zoals je in Figuur 4-18 op pagina 73
kunt zien. Je kunt dus 44 Hz gebruiken als een maat voor het aantal pulsen per seconde in je code.
Als we nog nauwkeuriger willen weten hoelang een cyclus van de lus duurt, moeten we ook nog
kijken naar de lustijd voor verschillende servowaarden. Grotere of kleinere waarden voor de Duration
van PULSOUT hebben tot gevolg, dat de FOR ... NEXT lus een beetje korter of langer duurt. De
PULSOUT Duration of 750 zet de servo in de middenpositie en ligt daardoor ook middenin het bereik
van de servo looptijd, zoals te zien in Figuur 4-18 op pagina 73. Hierdoor kunnen we 44 Hz als
maatstaf nemen voor het gemiddelde aantal servopulsen per seconde. Maar wat voor looptijd heeft de
lus bij een PULSOUT commando met een Duration van 1000 in plaats van 750. De puls duurt nu 2 ms
in plaats van 1,5 ms. De lus heeft nog steeds een pauze van 20 ms en 1,3 ms voor de verwerkingstijd
van de FOR ... NEXT lus. En dit betekent, dat de hele FOR ... NEXT lus uitgevoerd wordt op: 1 /
0,0233 ≈ 42,9 ≈ 43 Hz.
FOR...NEXT Loop Servo Control Samenvatting
Figuur 4-23 zet de tijdsduur voor uitvoering van een servolus met een FOR...NEXT loop commando
nog een keer op een rij. De FOR...NEXT loop’s EndValue hoe vaak de lus in een 44ste seconde wordt
uitgevoerd. Het Duration argument van PULSOUT bepaalt de servopositie. Een waarde van 750 maakt
een puls van 1.5 ms, die de servo vertelt om op een positie van 90° te gaan staan, zoals te zien in
Figuur 4-18 op pagina 73. Het Pin argument van het PULSOUT commando bepaalt de I/O-pen, waarop
de servopuls verschijnt. Een waarde van 14 voor Pin zorgt, dat het PULSOUT commando zijn signaal
naar de I/O pen P14 stuurt. Aan het eind van de puls, wordt het signaal op de I-O/pen weer laag.
Gedurende het PAUSE 20 commando blijft het signaal 20 ms tot de volgende puls.
Besturen van beweging · Page 79
Servo I/O pen
Aantal 44ste
seconden dat de
positive wordt
vastgehouden
FOR counter = 1 TO 132
PULSOUT 14, 750
PAUSE 20
NEXT
Positie vasthouden
Figuur 4-23
Servo besturing
For…Next Loop
20 ms pause
tussen iedere puls
Gemiddeld loopt een FOR...NEXT loop 44 keer per seconde. Omdat de lus 132 keer wordt uitgevoerd,
houdt de servo zijn positie van 135° gedurende 3 seconden vast, omdat:
132 repetition s ÷ 44 repetitions/second = 3 seconds
Als jouw toepassing een servosignaal en een servopositie voor een bepaald aantal seconden moet
vasthouden, dan kun je het aantal keren, dat de lus moet worden uigevoerd ,eenvoudig berekenen door
het aantal seconden te vermenigvuldigen met 44 en dit resultaat te gebruiken in het EndValue argument
van de FOR...NEXT loop. Als het signaal bijvoorbeeld vijf seconden moet duren:
5 seconds × 44 repetitions/second = 220 repetition s
OPDRACHT #4: POSITIE VAN EEN SERVO BESTUREN MET JE COMPUTER
In geautomatiseerde productieprocessen in de industrie worden vaak microcontrollers gebruikt, die
kunnen communiceren met grotere computers. De microcontrollers lezen sensoren en geven de
gemeten gegevens door aan de hoofdcomputer. De hoofdcomputer interpreteert en analyseert de
gegevens van sensoren, en stuurt vervolgens positie-informatie terug naar de microcontroller. De
microcontroller kan dan bijvoorbeeld de snelheid van een lopende band aanpassen, de positie van een
klep aanpassen, of een andere mechanische actie uitvoeren met behulp van een motortje.
We gaan nu de Debug Terminal gebruiken om berichten te verzenden vanaf je computer naar de
BASIC Stamp zoals weergegeven in Figuur 4-24. De BASIC Stamp moet zo worden geprogrammeerd
dat deze gaat luisteren naar de berichten die je verzendt via de Debug Terminal. De BASIC Stamp
moet de gegevens die je verzendt ook opslaan in een of meer variabelen.
Figuur 4-24
Berichten sturen naar de
BASIC Stamp
Klik in de witte balk boven
het grijze berichtenscherm
en tik een getal. Een kopie
van het getal, dat je intypte,
verschijnt in het
berichtenscherm. Een
dergelijke kopie wordt teen
echo genoemd
Pagina 80 · Wat is een Microcontroller? NL HJK
In deze opdracht zal de BASIC Stamp steeds twee waarden ontvangen van de Debug Terminal en
daarmee de servo besturen:
•
•
Het aantal pulsen, dat naar de servo moeten worden gestuurd
De tijdsduur (Duration waarde) die door het PULSOUT commando gebruikt wordt.
We gaan nu het programma voor de BASIC Stamp maken, om met deze waarden de servo te besturen.
Onderdelen voor de schakeling
Die zijn hetzelfde als bij de opdracht in Opdracht #2
Het programmeren van de BASIC Stamp om boodschappen van de Debug terminal te
ontvangen
Als we de BASIC Stamp een bericht aan de Debug Terminal willen laten sturen, dan doen we dat met
het DEBUG commando. Om een BASIC Stamp te programmeren om berichten te ontvangen van de
Debug Terminal kunnen we dat doen met het DEBUGIN commando. Als we het DEBUGIN commando
willen gebruiken, moeten we een of meer variabelen declareren in de BASIC Stamp om de ontvangen
waarden in op te slaan.
In het volgende voorbeeld zie je, hoe je een variabele kunt declareren:
pulses VAR Word
Wat verderop zul je zien, hoe deze variabele gebruikt wordt om een waarde op te slaan die met het
DEBUGIN commando is ontvangen:
DEBUGIN DEC pulses
Als de BASIC Stamp een getal ontvangt van de Debug Terminal, wordt die opgeslagen in de variabele
pulses . Het format-commando DEC vertelt het DEBUGIN commando, dat je een getal stuurt. Zodra je
de Enter toets indrukt, nadat je het getal hebt ingetypt, zal de BASIC Stamp de ontvangen waarde als
een getal opslaan in de variabele pulses en daarna verder gaan met het programma.
Hoewel niet opgenomen in dit voorbeeld, kun je een regel toevoegen in je programma, dat bevestigt
dat er een commando is ontvangen en verwerkt door de BASIC Stamp.
DEBUG CR, "You sent the value: ", DEC pulses
Voorbeeld programma: ServoControlWithDebug.bs2
Figuur 4-25 laat op de Debug Terminal’s het deel zien waar je karakters intypt (Transmit window), die
naar de BASIC Stamp worden verzonden. Alle boodschappen die de BASIC Stamp verstuurt, worden
in de ontvangst window of Receive window getoond. Alles wat je intikt in de verzendregel of Transmit
panel, wordt naar de BasicStamp toegestuurd.
Figuur 4-25
Debug Terminal’s Windows
← Transmit window
← Receive window
In Figuur 4-25, wordt het getal 264 in de Debug Terminal’s Transmit window getypt. In de Receive
window verschijnt een kopie van het getal 264 na de boodschap “Enter Run time…” . Een dergelijke
Besturen van beweging · Page 81
kopie word teen echo genoemd en wordt alleen getoond, als de echo-optie uit staat. In dat geval, moet
de checkbox Echo Off uit staan.
Echo is het weergeven van het net ingetypte commando in de Recieve window. Dit gebeurt
automatisch, als je de Echo Off checkbox in de rechter onderhoek aan hebt staan. Als je de
echo uitzet, gebeurt dit niet. En voor het volgende voorbeeld willen we geen echo en moet
de checkbox uit staan (Unchecked)
9 Laad het programma ServoControlWithDebug.bs2 in the BASIC Stamp Editor.
9 Als de Transmit window te klein is kun je het met je muis vergroten. Klik op de
rechteronderhoek met je muis en sleep de hoek naar onderen. Op dezelfde manier kun je ook
alleen de Transmit window vergroten van Figuur 4-25.
9 Zet de Echo Off checkbox uit.
9 Klik op de Transmit window.
9 Als de Debug Terminal je vraagt: “Enter run time as a number of pulses:” type dan het getal r
132, en druk daarna op de Enter key.
9 Als de Debug Terminal je vraagt: “Enter position as a PULSOUT duration:” type dan het getal
1000, en druk op Enter.
De PULSOUT Duration moet een getal tussen 350 en 1150 zijn. Als je getallen intypt
buiten deze reeks van 350 tot 1150 kan de servo te veel naar links of naar rechts bewegen.
Hoewel de servo niet direct stuk gaat, zou het wel ten koste van de levensduur van de servo
kunnen gaan. Gebruik daarom geen waarden die buiten deze reeks liggen
Terwijl de BASIC Stamp het commando uitvoert en pulsen naar de servo stuurt, zal deze de
boodschap “Servo is running…” laten zien. Als het commando uitgevoerd is, verschijnt de boodschap
“DONE” gedurende een seconde. Daarna krijg je weer de vraag om het aantal pulsen in te voeren.
Veel plezier.
Let er wel op geen waarden voor de pulsduur in te voeren die kleiner zijn dan 350 of groter dan 1150.
9 Experimenteer met waarden tussen 350 en 1150 voor de PULSOUT Duration en warden van 1 tot
65534 voor het aantal pulsen
Er waren 44 pulsen nodig om de servo 1 seconde te laten staan Om de servo ongeveer
5 minuten op zijn positie te laten staan tik je 13200 in bij de “number of pulses” prompt. Dat
zijn 44 pulsen/seconde × 60 seconden/minuut × 5 minuten = 13,200 pulsen.
Waarom warden gebruiken tussen 1 en 64434 Als je dat echt wilt weten, moet je het
hoofdstuk over het FOR...NEXT commando lezen in het BASIC Stamp Manual. Hier staat
beschreven, wat 16-bit rollover is of een , or variable range, error. Dit soort van fouten
kunnen een programma heel vreemd gedrag geven.
' What's a Microcontroller - ServoControlWithDebug.bs2
' Send messages to the BASIC Stamp to control a servo using
' the Debug Terminal.
' {$STAMP BS2}
' {$PBASIC 2.5}
counter
pulses
duration
VAR
VAR
VAR
PAUSE 1000
DEBUG CLS, "Servo
" ~44
"Servo
" 350
Word
Word
Word
Run Time:", CR,
pulses in 1 second", CR,
Position:", CR,
<= PULSOUT Duration <= 1150", CR, CR
Pagina 82 · Wat is een Microcontroller? NL HJK
DO
DEBUG "Enter run time as a ", CR,
"number of pulses: "
DEBUGIN DEC pulses
DEBUG "Enter position as a", CR,
"PULSOUT Duration: "
DEBUGIN DEC duration
duration = duration MIN 350 MAX 1150
DEBUG "Servo is running...", CR
FOR counter = 1 TO pulses
PULSOUT 14, duration
PAUSE 20
NEXT
DEBUG "DONE", CR, CR
PAUSE 1000
LOOP
Hoe werkt ServoControlWithDebug.bs2?
Er zijn in dit programma drie zogenaamde Word variabelen gedeclareerd:
counter
pulses
duration
Var
Var
Var
WORD
WORD
WORD
De variabele counter is gedeclareerd om te bepalen hoe vaak de FOR...NEXT loop wordt uitgevoerd.
(Zie Hoofdstuk 2, Opdracht #3 voor details.) De variabelen pulses en duration worden op
verschillende manieren gebruikt. Ze worden allebei gebruikt om waarden van de Debug terminal op te
slaan, te ontvangen en te versturen. De variabele pulses wordt ook gebruikt, om het aantal
herhalingen van de FOR...NEXT loop, die de servopulsen stuurt, te bepalen. De variabele duration
wordt gebruikt om de pulsduur van het PULSOUT commando te bepalen..
Het DEBUG commando herinnert je aan het feit, dat er ongeveer 44 pulsen per seconde in de
FOR...NEXT loop opgewekt worden en dat de waarde van het Duration argument van het PULSOUT
commando tussen 350 en 1150 moet liggen.
DEBUG CLS, "Servo
" ~44
"Servo
" 350
Run Time:", CR,
pulses in 1 second", CR,
Position:", CR,
<= PULSOUT Duration <= 1150", CR, CR
De rest van het programma is ingebed in een DO...LOOP zonder WHILE of UNTIL Condition zodat het
commando eindeloos herhaald wordt.
DO
' De rest van het programma is niet weergegeven.
LOOP
Het DEBUG commando wordt gebruikt om aan jou (de gebruiker of user”van het programma) een
boodschap te sturen over het aantal pulsen. Het DEBUGIN commando wacht dan tot je het getal voor
het aantal pulsen hebt ingetikt en de Enter toets hebt ingedrukt. De cijfers (“digits”) die je invoert
worden omgezet naar een getal en de waarde van dat getal wordt opgeslagen in de variabele pulses.
Dit proces wordt herhaald bij het tweede DEBUG en DEBUGIN commando, waardoor je de waarde
invoert voor de variabele duration.
DEBUG "Enter run time as a ", CR,
"number of pulses: "
DEBUGIN DEC pulses
DEBUG "Enter position as a", CR,
Besturen van beweging · Page 83
"PULSOUT Duration: "
DEBUGIN DEC duration
Nadat je de tweede waarde hebt ingevoerd is het handig, om een boodschap te sturen dat de servo
bezig is. Zo kun je voorkomen, dat er nieuwe waarden worden ingevoerd terwijl de servo bezig is.:
DEBUG "Servo is running...", CR
Terwijl de servo loopt, kun je proberen het kruis met de hand te verdraaien. Je zult merken, dat de
servo weerstand biedt, tot het commando gereed is.
FOR Counter = StartValue TO EndValue {STEP StepValue}...NEXT
Dit is de opbouw van het FOR...NEXT commando (Syntax genoemd) van de BASIC
Stamp. Het laat zien, dat je een teller, een startwaarde en een eindwaarde nodig hebt,
Counter, StartValue en EndValue om te bepalen, hoe vaak de lus of loop doorlopen
wordt. Er is ook nog een optionele stapwaarde, StepValue voor het geval je de teller niet
met 1, maar Counter met een grotere waarde wilt ophogen, voor iedere keer, dat de lus
doorlopen wordt.
In het vorige voorbeeld, werd de variabele counter gebruikt om het aantal herhalingen van de
FOR...NEXT loop in te stellen. De tellervariabele in de nu volgende FOR...NEXT loop laat een aantal
nieuwe mogelijkheden zien voor het gebruik van variabelen en hoe het programma daarop reageert en
daarmee hoe de servo zich gedraagt. Tot nu toe hebben we in de FOR...NEXT loop een constant
gebruikt. We gebruikten bijvoorbeeld 10 of 132 in het EndValue argument van de loop. In deze
FOR...NEXT loop gaan de variabele pulses gebruiken om de EndValue van de FOR...NEXT loop te
besturen. Je voert de waarde van pulses door een getal in te tikken in de Debug Terminal. Dit getal
bepaalt het aantal herhalingen van de FOR...NEXT loop. En het aantal herhalingen bepaalt weer,
hoelang de servo zijn positie vasthoudt.
FOR counter = 1 to pulses
PULSOUT 14, duration
PAUSE 20
NEXT
In dit voorbeeld, wordt de eerder gebruikte constant waarde van bijvoorbeeld 500, 750, en 1000 van
het Duration argument in het PULSOUT commando vervangen door de variabele met de naam
duration. Je voert de waarde van deze variabele in via de Debug Terminal’ en nu bepaalt deze
waarde de pulsduur van het PULSOUT commando, dat op zijn beurt weer de servopositie bestuurt.
Neem de tijd, om te
ServoControlWithDebug.bs2.
begrijpen
hoe
de
FOR…NEXT
loop
werkt
in
Dit is een van de eerste voorbeelden, waarbij we laten zien, wat je voor boeiende dingen
kunt doen met variabelen in lussen. Het maakt ook duidelijk, waar de kracht ligt van een
microcontroller als de BASIC Stamp.
Jouw beurt – Voeg begrenzingen toe aan het programma
Laten we eens veronderstellen, dat deze besturing is ontwikkeld, om iets op afstand te kunnen
bedienen. Neem als voorbeeld een hek, dat door een bewaker op afstand geopend moet kunnen
worden, waarbij de bewaker het hek op een camera kan zien. Of misschien wil een student zijn robotje
in een doolhof laten rondrijden. Als je voor iemand een product ontwikkelt, wil je niet, dat er onveilige
situaties ontstaan of dat er schade ontstaan door jouw toepassing.
Terwijl je het programma ServoControlWithDebug.bs2 gebruikt, is er een kans, dat je een verkeerd
getal intikt voor de waarde van Duration. Laten we veronderstellen, dat je 10 in plaats van 100 hebt
ingetikt. De waarde van 100, laat de servo naar een positie draaien, die buiten zijn mechanische
grenzen ligt. Hoewel de servo niet direct stuk gaat, is dit niet gunstig voor de levensduur .
Daarom gaan we het programma veilig maken door toevoeging van:
Pagina 84 · Wat is een Microcontroller? NL HJK
duration = duration MIN 350 MAX 1150
Hierdoor wordt een per ongeluk ingevoerde waarde van 100 voor de variabele duration automatisch
op 350 gezet. Op dezelfde manier wordt de variabele duration op 1150 gezet, als je per ongeluk
10000 zou invoeren. Je zou dit ook kunnen oplossen met een zogenaamd IF...THEN commando
(Statement):
IF duration < 350 THEN duration = 350
IF duration > 1150 THEN duration = 1150
Ondanks deze beveiliging tegen typefouten, zijn er nog steeds situaties denkbaar, waarin dit niet veilig
genoeg is. Stel je voor, dat je met een computerbestuurde machine heel duur materiaal in stukken
snijdt. Als je nu 100 in plaats van 1000 intikt, wordt de ingevoerde waarde wel gecorrigeerd naar 350.
Het materiaal wordt dan op 350 gesneden in plaats van op 1000. En dat zou nog steeds een kostbare
fout opleveren.
Om ook dit soort fouten te voorkomen, kun je een andere benadering kiezen. Je meldt simpelweg aan
de gebruiker, dat de ingevoerde waarde niet binnen de toegestane grenzen ligt en dat de waarde
opnieuw moet worden ingevoerd. Hier is een voorbeeld, hoe je het programma zou kunnen aanpassen:
9 Sla het programma ServoControlWithDebug.bs2
ServoControlWithDebugYourTurn.bs2.
9 Vervang de volgende twee commando’s:
op
onder
de
nieuwe
naam
DEBUG "Enter position as a", CR,
"PULSOUT Duration: "
DEBUGIN DEC duration
…door:
DO
DEBUG "Enter position as a", CR,
"PULSOUT Duration: "
DEBUGIN DEC duration
IF duration < 350 THEN
DEBUG "Value of duration must be at least 350", CR
PAUSE 1000
ENDIF
IF duration > 1150 THEN
DEBUG "Value of duration cannot be more than 1150", CR
PAUSE 1000
ENDIF
LOOP UNTIL duration >= 350 AND duration <= 1150
9 Sla het programma op.
9 Start het programma en controleer dat het programma om een nieuwe waarde blijft vragen, tot
je een waarde invoert die tussen 350 en 1150 ligt.
OPDRACHT #5:OMZETTEN VAN POSITION IN BEWEGING
In dit voorbeeld ga je de servo laten bewegen met verschillende snelheden. Door de positie van de
servo met een hoger of lager tempo aan te passen zal het kruis met een lagere of hogere snelheid gaan
bewegen. Je kunt op deze wijze de snelheid van de servo besturen in plaats van alleen de positie.
Programmeren van het tempo waarmee een positie verandert
Je kunt een FOR...NEXT loop gebruiken om een servo achtereenvolgens naar een reeks van posities te
laten bewegen zoals in het volgende voorbeeld:
FOR counter = 500 TO 1000
PULSOUT 14, counter
PAUSE 20
NEXT
Besturen van beweging · Page 85
De FOR...NEXT loop laat de servo eerst naar 45° bewegen. Vervolgens draait de servo langzaam
terug naar 135°. De variabele counter die ook de index of teller is voor de FOR...NEXT loop, wordt
bij iedere cyclus met 1 opgehoogd. De waarde van counter wordt ook in het Duration argument van
het PULSOUT commando gebruikt, waardoor de puls tijdens iedere cyclus een klein beetje langer
wordt. Dus terwijl de lengte van de puls geleidelijk langer wordt, iedere keer als het programma de lus
doorloopt, verandert de servo geleidelijk van positie
FOR...NEXT loops hebben een optioneel STEP StepValue argument.
Dit StepValue argument kan
gebruikt worden om de servo sneller te laten draaien. Je kunt bijvoorbeeld een StepValue van 8
gebruiken, om de variabele counter telkens met 8 op te hogen in plaats van met 1, door het FOR
statement op de volgende wijze aan te passen:
FOR counter = 500 TO 1000 STEP 8
Je kunt de servo ook de andere kant op laten draaien, door terug te tellen in plaats van op te tellen.
Een FOR...NEXT loop in PBASIC zal terugtellen, als het StartValue argument groter is dan het
EndValue argument. Hier volgt een voorbeeld, hoe een FOR...NEXT loop van 1000 terugtelt naar 500:
FOR counter = 1000 TO 500
Je kunt dat weer combineren met een StepValue argument om de servo sneller te laten bewegen, zoals
in het volgende voorbeeld:
FOR counter = 1000 TO 500 STEP 20
De opdracht is nu om de FOR...NEXT loop zo te gebruiken, dat de servo met verschillende snelheden
kan bewegen en in twee richtingen, door gebruik te maken van verschillende stapgroottes. Het
volgende laat je een paar mogelijkheden zien, hoe je de servo met verschillende snelheden heen en
weer kunt bewegen.
Voorbeeldprogramma: ServoVelocities.bs2
9 Laad en start ServoVelocities.bs2.
9 Kijk, terwijl het programma loopt, hoe de waarde van counter op de Debug Terminal
verandert.
9 Tegelijkertijd, kun je zien, hoe de servo harder en zachter loopt in de twee verschillende
FOR...NEXT loops. Zowel de richting als de snelheid wordt nu veranderd.
' What's a Microcontroller - ServoVelocities.bs2
' Rotate the servo counterclockwise slowly, then clockwise rapidly.
' {$STAMP BS2}
' {$PBASIC 2.5}
counter
VAR
Word
PAUSE 1000
DO
DEBUG "Pulse width increment by 8", CR
FOR counter = 500 TO 1000 STEP 8
PULSOUT 14, counter
PAUSE 7
DEBUG DEC5 counter, CR, CRSRUP
NEXT
DEBUG CR, "Pulse width decrement by 20", CR
FOR counter = 1000 TO 500 STEP 20
PULSOUT 14, counter
PAUSE 7
DEBUG DEC5 counter, CR, CRSRUP
NEXT
DEBUG CR, "Repeat", CR
LOOP
Pagina 86 · Wat is een Microcontroller? NL HJK
Hoe werkt ServoVelocities.bs2?
De eerste FOR...NEXT loop telt op, van 500 naar 1000 in stappen van 8. Omdat de counter
variabele ook gebruikt wordt in het Duration argument van het PULSOUT commando, draait de servo
tegen de klok in, met stappen van 8.
FOR counter = 500 TO 1000 STEP 8
PULSOUT 14, counter
PAUSE 7
DEBUG DEC5 counter, CR, CRSRUP
NEXT
Waarom PAUSE 7 gebruiken in plaats van PAUSE 20? Omdat het commando DEBUG
DEC5 counter, CR, CRSRUP ongeveer 8 ms nodig heeft, om uitgevoerd te worden. Dit
zou betekenen, PAUSE 12 een 20 ms wachttijd geeft tussen de pulsen. Door wat
experimenten, hebben we echter vastgesteld, dat PAUSE 7 de meest vloeiende beweging
oplevert. En omdat de 20ms tijd, dat het signaal lang is, niet erg kritisch is voor de servo,
mag je de waarde best wat aanpassen.
Er zijn nog meer DEBUG formateer instructies en control tekens (characters)
beschikbaar in het DEBUG commando, om de waarde van de counter variabele te laten
zien. De waarde wordt afgedrukt als een getal van 5 cijfers, door gebruik te maken van de
decimale format instructie (DEC5). Nadat de waarde is afgedrukt, moet er een commando
komen, om het afdrukken op een nieuwe regel te laten beginnen. Dit wordt gedaan door het
afdrukken van een zogenaamd controle teken met de naam carriage return (CR). Nadat de
cursor, dat is de plaats, waar het volgende teken zal worden afgedrukt, aan het begin van
een nieuwe regel staat, willen we deze een regel omhoog bewegen. Dat doen we door het
teken CRSRUP (cursor up) naar de DebugTerminal te sturen. Hierdoor worden de nieuwe
waarden van counter telkens over elkaar heen afgedrukt.
,
De tweede FOR...NEXT loop telt omlaag van 1000 naar 500 in stappen van 20. Omdat de counter
variabele in dit voorbeeld als argument ook gebruikt wordt voor het PULSOUT commando in dit
voorbeeld, draait de servo tegen de klok in..
FOR counter = 1000 TO 500 STEP 20
PULSOUT 14, counter
PAUSE 7
DEBUG DEC5 counter, CR, CRSRUP
NEXT
Jouw beurt –Pas de snelheden aan
9 Probeer verschillende waarden voor STEP om de servo met verschillende snelheden te laten
bewegen.
9 Start het programma telkens opnieuw na iedere aanpassing.
9 Controleer het effect van nieuwe waarden voor Step op de snelheid van de servo.
9 Experimenteer met verschillende waarden voor Duration in het PAUSE commando. Probeer met
welke waarde tussen 3 en 12, de servo het soepelste beweegt.
OPDRACHT #6: DE SERVO WORDT GECONTROLEERD MET DRUKKNOPPEN
In dit hoofdstuk, ga je een programma schrijven, waarbij de servo een aantal vaste posities doorloopt,
op commando’s vanuit de Debug Terminal. Je zult de BASIC Stamp ook programmeren, om de servo
te laten bewegen door het indrukken van drukknoppen.
In deze oefening zul je:
•
•
Een schakeling opbouwen, met drukknoppen om de servo te gaan besturen.
Een BASIC Stamp programma maken, om de servo te laten reageren op de drukknoppen.
Als je klaar bent met deze oefening weet je, hoe je de servo naar links kunt laten bewegen met de ene
knop en de servo naar rechts kunt laten bewegen met de andere knop. Als de beide knoppen worden
losgelaten, stopt de servo en blijft daar staan.
Besturen van beweging · Page 87
Extra onderdelen voor de schakeling om de Servo te besturen met knoppen
Voor deze oefening worden dezelfde onderdelen gebruikt als in de vorige opdracht, aangevuld met de
volgende nieuwe onderdelen:
(2) Drukknoppen – normally open (Normaal geopend, of geen contact)
(2) Weerstanden – 10 kΩ (bruin-zwart-oranje)
(2) Weerstanden – 220 Ω (rood-rood-bruin)
(3) Jumper wires (draadjes)
De schakeling met drukknoppen opbouwen
Figuur 4-26 laat je de schakeling met de drukknoppen zien, waarmee je de servo gaat besturen.
9 Voeg de schakeling toe aan de al aanwezige servo en LED die je eerder gebruikte Als je klaar
bent, moet de opbouw er uitzien, afhankelijk van het type bordje, dat je gebruikt:
o Figuur 4-27 als je gebruik maakt van een Board of Education USB (iedere Rev of
Serial (Rev C of nieuwer).
o Figuur 4-28 als je gebruik maakt van een BASIC Stamp HomeWork Board (Rev C of
nieuwer).
9 Als je bordje er niet bij staat, kun je het beste op de website van Parallax kijken
www.parallax.com/Go/WAM voor de (Engelse) instructies voor jouw bordje.
Vdd
P4
220 Ω
P3
220 Ω
10 kΩ
Vss
10 kΩ
Vdd
Figuur 4-26
Schakeling met
drukknoppen om
de Servo te
besturen.
Vss
15 14 Vdd 13 12
White
Red
Black
Red
Black
X4
Vdd
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 4-27
Board of
Education Servo
Schakeling met
de drukknoppen
toegevoegd
X5
Vin
Vss
+
standard servo
www.parallax.com
Voor Board of
Education Serial
Rev C or hoger,
or USB iedere
revisie
Pagina 88 · Wat is een Microcontroller? NL HJK
Figuur 4-28
HomeWork
Board Servo
Schakeling met
de drukknoppen
toegevoegd
Voor HomeWork
Board Rev C of
hoger
9 Test eerst de schakeling met de drukknop, die met P3 is verbonden, via het programma
ReadPushbuttonState.bs2. Op pagina 45 begint het hoofdstuk, waarin deze test beschreven.
9 Pas het programma zo aan, dat de drukknop op P4 kan worden gelezen.
9 Laad en start het aangepaste programma en test de drukknop, die met P4 is verbonden.
Programmeren van de besturing van de Servo via drukknoppen
Drukknopbesturing van een servo is niet veel anders dan het besturen van een LED met een druktoets.
Door het gebruik van IF…THEN instructies, kan de status van de drukknoppen gebruikt worden om een
variabele duration op en af te laten tellen. Deze variabele wordt gebruikt voor het Duration
argument van het PULSOUT commando. Indien een van de drukknoppen wordt ingedrukt, zal de
waarde van duration groter worden. Indien de andere toets is ingedrukt, zal de waarde kleiner
worden. Er wordt een zogenaamd genest IF…THEN statement gebruikt om te controleren, of de
variabele duration te groot (> 1000) of te klein (<500) wordt.
Voorbeeld Programma: ServoControlWithPushbuttons.bs2
Dit voorbeeldprogramma laat de servo tegen de klok in draaien indien je op de drukknop drukt, die
verbonden is met P4. De servo zal blijven draaien zolang de druktoets wordt ingedrukt en de waarde
van duration kleiner is dan 1000. Indien de knop, die verbonden is met P3 ingedrukt wordt, zal de
servo met de klok mee draaien. De servo stopt deze beweging, zodra de variabele duration de
waarde 500 heeft bereikt. De Debug Terminal toont de waarde van duration terwijl het programma
draait.
9 Schrijf het ServoControlWithPushbuttons.bs2 programma in de BASIC Stamp Editor en start
het.
9 Ga na dat de servo tegen de klok in draait, indien je de knop indrukt, die verbonden is met P4.
De servo beweegt, zolang je op de knop drukt.
9 Ga na dat snel de grens van duration > 1000 overschreden wordt en dat de servo stopt met
draaien.
9 Ga na dat de servo met de klok mee draait indien je op de knop drukt die is verbonden met
P3. De servo draait, zolang de knop is ingedrukt.
9 Ga na dat snel de grens van duration <500 overschreden wordt en dat de servo stopt met
draaien.
Besturen van beweging · Page 89
' What's a Microcontroller - ServoControlWithPushbuttons.bs2
' Press and hold P4 pushbutton to rotate the servo counterclockwise,
' or press the pushbutton connected to P3 to rotate the servo clockwise.
' {$STAMP BS2}
' {$PBASIC 2.5}
duration
VAR
duration = 750
PAUSE 1000
Word
DO
IF IN3 = 1 THEN
IF duration > 500 THEN
duration = duration - 25
ENDIF
ENDIF
IF IN4 = 1 THEN
IF duration < 1000 THEN
duration = duration + 25
ENDIF
ENDIF
PULSOUT 14, duration
PAUSE 10
DEBUG HOME, DEC4 duration, " = duration"
LOOP
Jouw beurt – Mechanische stop en Software stop
Servo's hebben een ingebouwde mechanische stop die voorkomt dat ze voorbij de grenzen van 0° en
180° draaien, wat overeenkomt met waarden voor Duration in het PULSOUT commando tussen
250 en 1250 . Het programma ServoControlWithPushbuttons.bs2 heeft ook ingebouwde begrenzingen,
door het gebruik van IF...THEN commando’s Hierdoor kun je de servo met de knoppen niet naar een
positie buiten zijn grenzen laten bewegen. In tegenstelling tot mechanische begrenzingen, zijn
software grenzen erg eenvoudig aan te passen Je kunt deze besturing met knoppen een groter bereik
geven door de grenswaarden van 500 en 1000 te vervangen door 350 en 1150. Je kunt de servo
natuurlijk ook een kleiner bereik geven, door de grenzen aan te passen naar bijvoorbeeld 650 en 850.
De grenzen hoeven ook niet symmetrisch te zijn. In plaats van de oorspronkelijke grenzen van 500100, kun je ze ook instellen op bijvoorbeeld op 350-750
9 Experimenteer met verschillende software grenzen voor de servo, inclusief 350 - 1150, 650 850, en 350 - 750.
9 Test van iedere set van software grenzen of ze werken, zoals je verwacht.
SAMENVATTING
In dit hoofdstuk is een begin gemaakt met het laten bewegen van een standaardservo met behulp van
een microcontroller. Een servo is een apparaatje, dat naar een bepaalde positie gestuurd kan worden
via elektrische pulssignalen. De pulsduur moet tussen 0,5 en 2,5 ms liggen. Ongeveer iedere 20 ms
moet het signaal herhaald worden, om de servo op zijn positie te houden
Een programmeur kan het PULSOUT commando gebruiken om de BASIC Stamp het gewenste signaal
te laten opwekken. Aangezien de servo iedere 20 ms een nieuwe puls moet ontvangen, zijn de
PULSOUT and PAUSE commando’s in een lus geplaatst. Er kunnen variabelen gebruikt worden om
waarden op te slaan voor het aantal keren, dat de lus wordt uitgevoerd en door gebruik te maken van
het Duration argument van het PULSOUT commando
Dit hoofdstuk heeft verschillende manieren laten zien hoe waarden in de variabelen zijn op te slaan.
De variabelen kunnen een waarde van de Debug Terminal ontvangen door het DEBUGIN commando te
gebruiken. De waarde van een variabele kan een reeks van waarden doorlopen als dezelfde variabele
Pagina 90 · Wat is een Microcontroller? NL HJK
gebruikt wordt in de index van een FOR…NEXT lus. Op deze manier kan de servo heen- en weergaande
bewegingen maken. IF…THEN statements kunnen gebruikt worden om drukknoppen in te lezen.
Afhankelijk van de knop die ingedrukt wordt kan de variabele , die in het Duration argument van het
PULSOUT commando gebruikt wordt, worden verhoogd of verlaagd. Op deze manier kan afhankelijk
van de constructie van het programma, zowel positie als snelheid van de servo bestuurd worden door
de knoppen.
Vragen
1. Wat zijn de vijf onderdelen van een servo. Wat voor functie hebben?
2. Heb je een LED nodig, om een servo te laten werken?
3. Welk commando bestuurt de laag-tijd van het servosignaal? Welk commando bestuurt het hoogsignaal?
4. Met welk commando kun je zorgen, dat de servo een bepaalde tijd zijn positie vasthoudt?
5. Hoe stuur je via de DebugTerminal commando’s naar de BASIC Stamp? Welk commando wordt
gebruikt om boodschappen van de Debug Terminal te ontvangen?
6. Wat voor stukje programma kun je schrijven, om het bereik en de eindposities van de servo te
begrenzen?
Oefeningen
1. Schrijf een programma, dat de servo via Duration van PULSOUT heen en weer laat bewegen tussen
700 en 800 en dan weer terug naar 700 in stappen van 1(a) en daarna in stappen van 4(b).
2. Voeg een geneste FOR...NEXT loop toe aan je programma van 1a , zodat er 10 pulsen gegeven
worden, voordat er stappen van 4 gemaakt worden in het Duration argument van PULSOUT
Project
Pas ServoControlWithDebug.bs2 zo aan dat het een noodtoets bestuurt. Indien de noodknop (P3 toets)
wordt ingedrukt, dient de Debug Terminal geen enkel commando te aanvaarden. Er dient een
boodschap te verschijnen met: “Press Start switch to start machinery”. Indien de startknop (P4) wordt
ingedrukt, dient het programma normaal te werken. Indien de voeding wordt afgekoppeld en terug
aangekoppeld, dient het programma te functioneren alsof de noodknop is ingedrukt.
Oplossingen
Q1. 1. Plug – Verbindt de kabel van de servo op het bord
2. Kabel – Zorgt voor de voeding en signalen op de servo.
3. Kruis – Het bewegende deel van de servo.
4. Behuizing – Bevat een DC motor, tandwielkast en besturingsschakeling.
5. De schroef, waarmee het kruis op de as is geschroefd.
Q2. Nee, De LED laat alleen zien wat er gebeurt met de besturingssignalen.
Q3. Het lage signaal wordt gestuurd door het PAUSE commando. Het hoge signaal door het
PULSOUT commando.
Q4. Een FOR...NEXT lus.
Q5. Klik op het volledige veld boven het berichtvenster in de Debug Terminal en type het bericht
dat je zou willen verzenden. Gebruik het DEBUGIN commando om de karakters in de BASIC
Stamp te ontvangen.
Q6. Ofwel een genest IF...THEN statement of een commando dat gebruik maakt van de MAX en
MIN operator.
Besturen van beweging · Page 91
a) Stappen van 1 of 1
FOR counter =
PULSOUT 14,
PAUSE 20
NEXT
FOR counter =
PULSOUT 14,
PAUSE 20
NEXT
700 TO 800
counter
800 TO 700
counter
b)
Voeg STEP 4
FOR...NEXT lussen.
toe
voor
beide
FOR counter = 700 TO 800 STEP 4
PULSOUT 14, counter
PAUSE 20
NEXT
FOR counter = 800 TO 700 STEP 4
PULSOUT 14, counter
PAUSE 20
NEXT
Veronderstel dat er een variabele pulses is gedeclareerd:
FOR counter = 700 TO 800 STEP 4
FOR pulses = 1 TO 10
PULSOUT 14, counter
PAUSE 20
NEXT
NEXT
FOR counter = 800 TO 700 STEP 4
FOR pulses = 1 TO 10
PULSOUT 14, counter
PAUSE 20
NEXT
NEXT
Er zijn vele mogelijkheden. We geven er hier slechts twee.
' What's a Microcontroller - Ch04Prj01Soln1__KillSwitch.bs2
' Send messages to the BASIC Stamp to control a servo using
' the Debug Terminal as long as kill switch is not being pressed.
' Contributed by: Professor Clark J. Radcliffe, Department
' of Mechanical Engineering, Michigan State University
' {$STAMP BS2}
' {$PBASIC 2.5}
counter VAR Word
pulses
VAR Word
duration VAR Word
DO
PAUSE 2000
IF (IN3 = 1) AND (IN4 = 0) THEN
DEBUG "Press Start switch to start machinery.
ELSEIF (IN3 = 0) AND (IN4 = 1) THEN
DEBUG CLS, "Enter number of pulses:", CR
DEBUGIN DEC pulses
", CR ,CRSRUP
DEBUG "Enter PULSOUT duration:", CR
DEBUGIN DEC duration
DEBUG "Servo is running...", CR
FOR counter = 1 TO pulses
PULSOUT 14, duration
PAUSE 20
NEXT
DEBUG "DONE"
PAUSE 2000
ENDIF
LOOP
Hieronder staat een variant, die op een knop reageert, terwijl het signaal naar de servo wordt gestuurd.
Dat is belangrijk voor machines, die ONMIDDELIJK MOETEN STOPPEN als de noodknop wordt
Pagina 92 · Wat is een Microcontroller? NL HJK
ingedrukt. Dit programma gebruikt een wachtmethode, die al eerder is geïntroduceerd in het
Reactietijd spel van Hoofdstuk 3, Opdracht #5 op drie verschillende plaatsen in het programma Je kunt
stoppen van het programma testen, door naar de LED te kijken die op P14 is aangesloten.
' What's a Microcontroller - Ch04Prj01Soln2__KillSwitch.bs2
' Send messages to the BASIC Stamp to control a servo using
' the Debug Terminal as long as kill switch is not being pressed.
' {$STAMP BS2}
' {$PBASIC 2.5}
counter
pulses
duration
VAR
VAR
VAR
Word
Word
Word
PAUSE 1000
DEBUG "Press Start switch (P4) to start machinery.", CR
DO:LOOP UNTIL IN4 = 1
DEBUG "Press Kill switch (P3) to stop machinery.", CR
DEBUG CR, CR, "Servo
" ~44
"Servo
" 350
Run Time:", CR,
pulses in 1 second", CR,
Position:", CR,
<= PULSOUT Duration <= 1150", CR, CR
DO
IF IN3 = 1 THEN
DEBUG "Press Start switch (P4) to start machinery.", CR
DO:LOOP UNTIL IN4 = 1
DEBUG "Press Kill switch (P3) to stop machinery.", CR
ENDIF
DEBUG "Enter run time as a ", CR,
"number of pulses: "
DEBUGIN DEC pulses
DEBUG "Enter position as a", CR,
"PULSOUT Duration: "
DEBUGIN DEC duration
duration = duration MIN 350 MAX 1150
DEBUG "Servo is running...", CR
FOR counter = 1 TO pulses
PULSOUT 14, duration
PAUSE 20
IF IN3 = 1 THEN
DEBUG "Press Start switch (P4) to start machinery.", CR
DO:LOOP UNTIL IN4 = 1
DEBUG "Press Kill switch (P3) to stop machinery.", CR
ENDIF
NEXT
DEBUG "DONE", CR, CR
PAUSE 1000
LOOP
Meten van beweging · Page 93
Hoofdstuk 5: Meten van beweging
DRAAIKNOPPEN CONTROLEREN MACHINES
Veel huishoudens hebben een lichtdimmer. Draai de schakelaar in de ene richting, en het licht wordt
helderder, in de andere richting dimt het licht. Moderne treinen gebruiken dezelfde techniek om de
motorbeweging te regelen. Vele machines hebben de functie voor bijvoorbeeld fijn positioneren van
messen, geleidende oppervlakken enz.
Draaiknoppen kunnen ook worden gevonden in audiocomponenten, waar ze gebruikt worden om het
volume aan te passen. Figuur 5-1 toont hiervan een voorbeeld. Door aan de knop te draaien, verandert
de schakeling binnenin de luidspreker en het volume van het geluid verandert. Gelijkaardige
schakelingen vind je in joysticks en zelfs binnenin de servo van Hoofdstuk 4.
Figuur 5-1
Volumeregeling van een
Luidspreker
DE VARIABLE WEERSTAND ONDER DE KNOP IS EEN POTENTIOMETER
Het apparaatje in een geluidsinstallatie of in joysticks en in servo's noemen we een potentiometer, ook
wel als een “pot” of “potmeter” aangeduid. Figuur 5-2 laat een aantal voorbeelden van potentiometers
zien. Merk op dat ze allemaal 3 pinnen hebben.
Figuur 5-2
Enkele Potentiometer
Voorbeelden
Figuur 5-3 toont de schematische symbolen en de onderdeeltekening van een potentiometer die in dit
hoofdstuk wordt gebruikt. De aansluitingen A en B worden verbonden met een 10 kΩ
weerstandselement. Aansluiting W noemt men de variabele of bewegende aansluiting en die is
verbonden met een draad die het weerstandselement ergens tussen de uiteinden aanraakt. Deze
aansluiting wordt ook wel het sleepcontact genoemd.
Figuur 5-3
Potentiometer Schemasymbool en
onderdeeltekening
Pagina 94 · Wat is een Microcontroller? NL HJK
Figuur 5-4 toont hoe het sleepcontact op de potentiometer werkt. Aangezien je de draaiknop van
boven op de potentiometer wordt verdraaid, kun je de middenaansluiting op elke positie zetten die je
wilt. Indien je de knop met de klok mee beweegt, zal de middenaansluiting dichter bij aansluiting A
komen. Indien de knop tegen de klok in draait komt de middenaansluiting dichter bij aansluiting B.
Figuur 5-4
Aanpassen van de positie van het
sleepcontact van de potentiometer
OPDRACHT #1: BOUWEN EN TESTEN VAN EEN POTENTIOMETER SCHAKELING
Door verschillende weerstanden in serie met een LED te plaatsen verander je de stroomsterkte in de
schakeling. Een grote weerstand in een LED schakeling zorgt ervoor dat er weinig stroom door de
LED vloeit en dit zal de LED zwakker laten branden. Kleine weerstanden in een LED schakeling
zorgen ervoor dat de LED feller brandt. Door de W en A terminal te verbinden, in serie met een LED
schakeling kun je de weerstand in de schakeling veranderen. Hierdoor kan de lichtsterkte van de LED
veranderen. In deze opdracht, heb je een potentiometer nodig als een variabele weerstand om de
lichtsterkte van de LED te veranderen.
Onderdelen voor de potmeterschakeling
(1) Potentiometer – 10 kΩ
(1) Weerstand– 220 Ω (rood-rood-bruin)
(1) LED – gelijk welke kleur
(1) Jumper draad
Bouwen van de Potentiometer testschakeling
Figuur 5-5 toont de schakeling die gebruikt kan worden om de lichtsterkte van de LED met een
potentiometer aan te passen.
√
Bouw de schakeling zoals in Figuur 5-5.
Tip: Als je problemen hebt met het plaatsen van de potmeter, kun je een tang gebruiken om
de geplooide potentiometer voetjes recht te trekken voordat je deze in het bord aanbrengt.
Indien de potentiometer benen recht zijn, hebben ze beter contact met het bord.
Figuur 5-5
Schakeling voor het
testen van de
Potentiometer en
LED
Meten van beweging · Page 95
Testen van de Potentiometer Schakeling
9 Draai de potentiometer met de klok mee totdat de mechanische grens wordt bereikt zoals in
Figuur 5-6 (a).
Druk de potmeter zachtjes tegen het breadboard aan als je de knop draait. Voor deze
opdracht moet de potentiometer stevig op het breadboard zitten. Als je niet voorzichtig aan
de knop draait, kan de potmeter losschieten en elektrisch geen contact meer maken met
breadboard contactstrippen. En dat kan weer leiden tot onjuiste metingen.
Voorzichtig behandelen: Indien de potentiometer niet verder meer wil draaien, probeer
deze dan niet te forceren. Draai niet verder als je enige weerstand voelt.
√
Draai de potmeter heel geleidelijk tegen de klok in zoals in Figuur 5-6 (b), (c), (d), (e), en
(f)en merk op hoe fel de LED brandt op elke positie.
(a)
(b)
(c)
(d)
(e)
(f)
Figuur 5-6
Potentiometer as
(a) tot (f) toont de
potentiometer
middenaansluiting op
verschillende posities.
Hoe schakeling met de potentiometer werkt
De totale weerstand in je testschakeling is 220 Ω plus de weerstand tussen de A en W aansluiting van
de potentiometer. Deze waarde kan elke waarde tussen 0 en 10 kΩ zijn. Indien je de knop van de
potentiometer verdraait tussen Terminal A en W, zal dit tot gevolg hebben, dat de stroom door de LED
schakeling verandert en daarmee de lichtsterkte.
OPDRACHT #2: METEN VAN WEERSTAND DOOR TIJDSMETING
In deze opdracht bespreken we een nieuw onderdeel, de condensator. Een condensator gedraagt zich
als een oplaadbare batterij. Het verschil is, dat een condensator zijn lading alleen voor een korte
periode kan vasthouden. In deze opdracht introduceren we ook het begrip RC-tijd, wat de afkorting is
voor weerstand condensator tijd. RC-tijd is een maat voor hoe lang het duurt voordat een condensator
een zekere opgeslagen lading verliest terwijl er stroom loopt door de weerstand. We gaan de tijd meten
die een condensator nodig heeft om te ontladen over verschillende weerstanden, waardoor je straks
goed met het begrip RC-tijd vertrouwd zult zijn. In deze opdracht gaan we de BASIC Stamp zo
programmeren, dat je de lading van een condensator en de tijd nodig voor ontlading met de weerstand
kunt meten.
Introductie van de Condensator
Figuur 5-7 toont het schemasymbool en de onderdeeltekening van het soort condensator, dat we in
deze opdracht gaan gebruiken. De capaciteit van een condensator wordt uitgedrukt in microfarad (μF)
en staat op de condensator gedrukt.
Het cilindrische deel van de condensator wordt huls of omhulling genoemd. We hebben hier te maken
met een zogenaamde elektrolytische condensator. Dit type moet met enige voorzichtigheid gebruikt
worden.
9 Lees de waarschuwing in het volgende blokje zorgvuldig!
Pagina 96 · Wat is een Microcontroller? NL HJK
LETOP: De condensator heeft een positieve (+) en negatieve (-) aansluiting. De
negatieve aansluiting is de draad die het dichtst bij het (-) teken uit de condenstor komt. Ga
altijd na dat de verbinding van de aansluitingen precies zo is gemaakt als in de schema’s en
aansluitschema’s. Verkeerd verbinden van dit type condensator kan schade veroorzaken. In
sommige schakelingen kan een verkeerde verbinding van de condensatoren leiden tot het
scheuren of zelfs explosie van de condensator!
LETOP: Zet niet meer spanning op de condensator, dan op de omhulling is
aangegeven. De toelaatbare spanning wordt op de omtrek van de condensator
aangegeven.
LETOP: Het gebruik van een veiligheidsbril is aan te raden.
3300 µ
F
3300 µF
+
-
Figuur 5-7
3300 μF Condensator
Schemasymbool en
onderdeeltekening
Let op hoe de draden verbonden zijn
met de positieve en negatieve
aansluitingen..
Weerstand en Tijd Onderdelen
(1) Condensator – 3300 μF
(1) Condensator – 1000 μF
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Weerstand – 470 Ω (geel-violet-bruin)
(1) Weerstand – 1 kΩ (bruin-zwart-rood)
(1) Weerstand – 2 kΩ (rood-zwart-rood)
(1) Weerstand – 10 kΩ (bruin-zwart-orange)
Bouwen en Testen van de schakeling met een Weerstand en Condensator (meting RC Tijd)
Figuur 5-8 toont schematisch de schakeling en Figuur 5-9 toont de aansluitingen voor deze opdracht.
Je zult tijdsopnames gaan uitvoeren voor verschillende weerstandswaarden door op de plaats waar Ri
staat verschillende weerstanden te plaatsen.
9 Lees deze veiligheidsmelding zorgvuldig door!!
Meten van beweging · Page 97
VEILIGHEID!
Ga altijd de polariteit na bij aansluiting van de 3300 μF condensator. Onthoud dat de
negatieve aansluiting de draad heeft die uit de metalen granaat komt het dichtst bij het
negatieve (–) teken. Gebruik Figuur 5-7 om de (+) en (-) aansluiting van elkaar te
onderscheiden.
Je 3300 μF condensator zal goed werken in het experiment indien de positieve (+) en
negatieve (-) aansluiting EXACT zijn verbonden zoals in Figuur 5-8 en Figuur 5-9.
Draai nooit de polariteit van de voeding om op de 3300 μF van de condensator of de
voeding. De spanning die je aansluit op de condensator (+) aansluiting moet altijd hoger
zijn dan die aan de (-) aansluiting. Vss is de laagste spanning (0 V) op het Board of
Education en het BASIC Stamp HomeWork Board. Door de negatieve pool van de
condensator op Vss aan te sluiten, ben je er zeker van dat de condensator altijd juist is
aangesloten.
Draag een veiligheidsbril tijdens de opdracht.
Koppel de voeding altijd af tijdens het aanpassen van de schakeling.
Houd je handen en gezicht weg van de condensator als de voeding is aangesloten.
9 Met de voeding afgekoppeld, bouw de schakeling zoals getoond. Start met een 470 Ω
weerstand op de plaats van de weerstand Ri
P7
220 Ω
R1 = 470 Ω
R2 = 1 kΩ
R3 = 2 kΩ
R4 = 10 kΩ
Ri
3300 µF
Figuur 5-8
Schematische
voorstelling van een RC
schakeling
Vss
Er zullen vier verschillende weerstanden gebruikt worden op de plaats van Ri . Het schema zal
gebouwd en getest worden met Ri = 470 Ω. De andere weerstanden Ri = 1 kΩ, etc. worden verderop
gebruikt.
R3
Vdd
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
R2
R1
Vin
Vss
-
0
33
+
R4
+
0µ
F
Figuur 5-9
Aansluitingen van de
schakeling voor de RCtijd
Ga na dat de negatieve
pool van de condensator
verbonden is met Vss
zoals in deze figuur.
Pagina 98 · Wat is een Microcontroller? NL HJK
9 Wees er zeker van, dat de negatieve pool van de condensator verbonden is met Vss zoals in de
figuur is te zien!
Meten van de RC-tijd met de BASIC Stamp
Je kunt eventueel een digitaal horloge of een stopwatch gebruiken om op te nemen hoelang het duurt
voordat de lading van de condensator naar een zekere waarde gezakt is. Maar de BASIC Stamp kan
ook geprogrammeerd worden om de tijdmeting voor jou te doen, bovendien doet de BASIC Stamp de
meting veel nauwkeuriger.
Voorbeeldprogramma: PolledRcTimer.bs2
9
9
9
9
Bekijk hoe de BASIC Stamp de condensator oplaadt en meet de ontlaadtijd op.
Schrijf de gemeten ontlaadtijd voor de 470 Ω weerstand op in Tabel 5-1.
Schakel de voeding uit.
Verwijder de 470 Ω weerstand en vervang deze door een 1 kΩ weerstand zoals in Figuur 5-8
en Figuur 5-9 op pagina 97.
9 Sluit de voeding weer aan op het bord.
9 Schrijf de gemeten ontlaadtijd op voor de 1kΩ weerstand.
9 Herhaal de stappen voor de volgende 2 weerstanden in vul in Tabel 5-1.
Tabel 5-1: Weerstand en RC-tijd voor C = 3300 μF
Weerstand (Ω)
470
1k
2k
10 k
Gemeten Tijd (s)
' What's a Microcontroller - PolledRcTimer.bs2
' Reaction timer program modified to track an RC-time voltage decay.
' {$STAMP BS2}
' {$PBASIC 2.5}
timeCounter
counter
PAUSE 1000
VAR
VAR
Word
Nib
DEBUG CLS
HIGH 7
DEBUG "Capacitor Charging...", CR
FOR counter = 5 TO 0
PAUSE 1000
DEBUG DEC2 counter, CR, CRSRUP
NEXT
DEBUG CR, CR, "Measure decay time now!", CR, CR
INPUT 7
DO
PAUSE 100
timeCounter = timeCounter + 1
DEBUG ? IN7
DEBUG DEC5 timeCounter, CR, CRSRUP, CRSRUP
LOOP UNTIL IN7 = 0
DEBUG CR, CR, CR, "The RC decay time was ",
DEC timeCounter, CR,
"tenths of a second.", CR, CR
END
Meten van beweging · Page 99
Hoe PolledRcTimer.bs2 Werkt
Er worden twee variabelen gedefinieerd (gedeclareerd). De timeCounter variabele wordt gebruikt om
na te gaan hoelang het duurt voordat de condensator zal ontladen door de weerstand Ri. De counter
variabele wordt gebruikt om af te tellen terwijl de condensator aan het opladen is.
timeCounter
counter
VAR
VAR
Word
Nib
Het commando DEBUG CLS (Clear screen: Wis het scherm) zorgt ervoor dat de Debug Terminal leeg
wordt gemaakt, zodat de opeenvolgende metingen niet het hele scherm vullen. HIGH 7 zet P7 hoog
waardoor de condensator begint op te laden. Op dat moment wordt het bericht” Capacitor
charging…” weergegeven. Daarna, telt een FOR…NEXT lus af terwijl de condensator wordt geladen.
Tijdens het laden stijgt de spanning over de condensator geladen en zal deze oplopen tot een waarde
tussen tussen 2.5 en 4.9 V (afhankelijk van de weerstandswaarde Ri).
DEBUG CLS
HIGH 7
DEBUG "Capacitor Charging...", CR
FOR counter = 5 TO 0
PAUSE 1000
DEBUG DEC2 counter, CR, CRSRUP
NEXT
Een melding laat zien wanneer de tijdsopname is gestart.
DEBUG CR, CR, "Measure decay time now!", CR, CR
Om de condensator op te laden door de weerstand Ri , dient de I/O pin te veranderen van HIGH naar
INPUT. Als ingang (input) heeft de I/O pin geen effect op de schakeling, maar kan wel lage of hoge
signalen waarnemen. Indien de condensator ontlaadt, zal de spanning op de ingang geleidelijk aan
lager worden.
INPUT 7
In het hoofdstuk over druktoetsen heb je geleerd, dat de BASIC Stamp hoge en lage signalen kan
detecteren door middel van IN3 en IN4. Toen werd een hoog signaal beschouwd als Vdd, en een laag
als Vss. Elk hoog signaal heeft een voltage van boven 1.4 V. Natuurlijk kan het 5 V zijn. Hetzelfde
geldt voor het lage signaal. Alle spanningen tussen 1.4 V en 0 V worden als een laag signaal gezien..
De DO…LOOP controleert elke 100 ms op pin P7 of de waarde van IN7 verandert van 1 naar 0. Als dat
gebeurt, betekent dat, dat de spanning op de condensator onder de 1.4 V grens is gekomen.
DO
PAUSE 100
timeCounter = timeCounter + 1
DEBUG ? IN7
DEBUG DEC5 timeCounter, CR, CRSRUP, CRSRUP
LOOP UNTIL IN7 = 0
. Het resultaat wordt getoond als het programma eindigt.
DEBUG CR, CR, CR, "The RC decay time was ",
DEC timeCounter, CR,
"tenths of a second.", CR, CR
END
Pagina 100 · Wat is een Microcontroller? NL HJK
Jouw beurt – Een snellere schakeling
Door een condensator te gebruiken met een waarde die ongeveer 1/3 is van de eerder gebruikte te,
terwijl we de weerstanden gelijk te houden, zal de ontlaadtijd ook ongeveer tot 1/3 afnemen. Later zul
je een condensator gebruiken die 33000 keer kleiner is en de BASIC Stamp zal de tijdsmetingen
uitvoeren via het ingebouwde commando RCTIME.
9 Schakel de spanning uit.
9 Vervang de 3300 μF condensator door een 1000 μF condensator.
9 Bevestig dat de polariteit en aansluiting juist is. De negatieve terminal dient verbonden met
de Vss.
9 Sluit de voeding terug aan.
9 Herhaal de stappen vanuit het PolledRcTimer.bs2 en schrijf de tijdsmetingen in de Tabel 5-2.
9 Vergelijk de tijdsmetingen met die van de eerder genomen in Tabel 5-2. Hoe dicht zijn ze bij
de 1/3 waarde gemeten met de 3300 μF condensator?
Tabel 5-2: Weerstand en RC-tijd voor C = 1000 μF
Gemeten Tijd (s)
Weerstand (Ω)
470
1k
2k
10 k
OPDRACHT #3: LEZEN VAN EEN POTMETER MET KNOP MET DE BASIC STAMP
In Opdracht #1, werd een potentiometer gebruikt als variabele weerstand. De weerstand in deze
schakeling varieerde met de positie van de draaiknop van de potentiometer. In Opdracht #2, werd een
RC-tijdschakeling gebouwd om met verschillende weerstanden te meten. In deze Activiteit zul je een
RC-tijdschakeling bouwen die de potentiometer inleest. De BASIC Stamp zal de tijdsmetingen
uitvoeren. De condensator die je zult gebruiken is zeer klein en de tijdsmetingen zullen over
milliseconden gaan. Ondanks dat de ontlaadtijd van de condensator heel kort is, zal de BASIC Stamp
je een nauwkeurige indicatie geven van wat de weerstandswaarde tussen de aansluitingen A en W van
de potentiometer.
Onderdelen voor het meten van de RC-tijd met de BASIC Stamp
(1) Potentiometer – 10 kΩ
(1) Weerstand– 220 Ω (rood-rood-bruin)
(2) Jumper draad
(1) Condensator – 0.1 μF
(1) Condensator – 0.01 μF
(2) Jumper draden
Deze condensatoren hebben geen + en – aansluiting. Je kunt ze inbouwen zonder je
zorgen te maken over de polariteit.
Figuur 5-10
Ceramisch Condensatoren
104
0.1 µF
0.01 µF
103
De 0.1 μF condensator (boven)
en de 0.01 μF condensator
(beneden) zijn beide niet polair.
Je hoeft je geen zorgen te
maken over de negatieve en
positieve polen voor de
aansluiting op de schakeling.
Meten van beweging · Page 101
Bouwen van een schakeling voor het meten van RC Tijd voor de BASIC Stamp
Figuur 5-11 toont een schematische voorstelling van de schakeling voor de RC-schakeling, en het
aansluitschema. Deze schakeling ga je gebruiken om de positie van de potentiometerdraaiknop te
bepalen met de BASIC Stamp en het PBASIC program.
9 Bouw de schakeling van Figuur 5-11.
Figuur 5-11
BASIC Stamp RCTIJD
schakeling met Potentiometer
Programmeren van een RC-Tijdmeting
Met het BASIC Stamp programma van Opdracht #2 werd de weerstand van de potentiometer gemeten
via de RC-tijd. Iedere 100 ms werd door het controleren van IN7 = 0. Bijgehouden of de condensator
al ontladen was. Als IN7 van 1 naar 0 veranderde, betekende dat, dat de spanning over de
condensator tot onder de 1,4 V gedaald was. Het resultaat van het periodiek controleren van de
variabele timeCounter was een getal, dat weergaf in 10-den van seconden, hoelang het had geduurd,
voordat de spanning over de condensator onder 1,4 V was gedaald.
Het volgende voorbeeldprogramma gebruikt een nieuw commando RCTIME. Dit commando laat de
BASIC Stamp zelf de tijd meten in eenheden van 2 μs (microseconden). Dus in plaats van een
resultaat in tienden van seconden, is het resultaat van het commando RCTIME 7, 1, time
beschikbaar in de variabele time in eenheden van twee miljoenste van een seconde, voordat de
spanning onder de 1,4 volt is gedaald. Omdat de tijdmeting zo snel en nauwkeurig is, kun je met veel
kleinere condensatoren werken. Een condensator van 0,1 μF of zelfs 0,01 μF werkt nog goed. Omdat
de weerstand van de potentiometer varieert, als je de knop draait, geeft de meting met RCTIME een
goede indicatie van de stand van de knop
Voorbeeld Programma: ReadPotWithRcTime.bs2
9 Type en start ReadPotWithRcTime.bs2
9 Draai aan de potentiometer terwijl je de waarde van de time variabele volgt op de Debug
Terminal.
Denk eraan, om een klein beetje op de potmeter te duwen als je eraan draait, om de
potmeter op het gaatjesbord te houden. Als je servo onverwacht begint te bewegen, dan
komt dat doordat de potmeter geen goed contact meer maakt.
Pagina 102 · Wat is een Microcontroller? NL HJK
' What's a Microcontroller - ReadPotWithRcTime.bs2
' Read potentiometer in RC-time circuit using RCTIME command.
' {$STAMP BS2}
' {$PBASIC 2.5}
time VAR Word
PAUSE 1000
DO
HIGH 7
PAUSE 100
RCTIME 7, 1, time
DEBUG HOME, "time = ", DEC5 time
LOOP
Jouw beurt – Tijd veranderen door Condensator te veranderen
9 Vervang de 0.1 μF condensator door een van 0.01 μF.
9 Probeer dezelfde posities van de potentiometerknop zoals je in de hoofdopdracht hebt gedaan.
9 Test en vergelijk de waarden van de Debug Terminal met de waarden van de 0.1 μF
condensator. Zijn de RCTIME metingen een tiende van de waarde?
9 Ga terug naar de 0.1 μF condensator.
9 Met de 0.1 μF condensator terug in de schakeling, en de 0.01 μF eruit, noteer je de hoogste en
laagste waarden voor de volgende opdracht.
Hoe ReadPotWithRcTime.bs2 Werkt
Figuur 5-12 laat zien hoe ReadPotWithRcTime.bs2’s HIGH, PAUSE en RCTIME commando’s
samenwerken met de schakeling van Figuur 5-11.
Figuur 5-12: Spanning op P7 via HIGH, PAUSE, en RCTIME
Links in de grafiek: Het HIGH 7 commando zorgt dat de BASIC Stamp de I/O pin P7 verbonden wordt
met de 5 V voeding (Vdd). De stroom loopt door de weerstand van de potmeter en laadt de
condensator op. Naarmate de condensator wordt opgeladen, stijgt de spanning tot 5V en neemt de
stroom af. Het PAUSE 100 commando is bedoeld, om de weergave van de meting op de Debug
display ongeveer 10 keer per seconde te verversen. Normaal gesproken is een PAUSE 1 commando
voldoende om de condensator op te laden. Rechts in de grafiek: Het RCTIME 7, 1, time commando
verandert de richting van de I/O pin richting (direction) van output naar input en start de tijdmeting in
Meten van beweging · Page 103
stappen van 2 μs. De input I/O pin stuurt niet langer stroom naar de condensator. Eigenlijk is de
ingangspin onzichtbaar voor de RC-schakeling. Daardoor begint de condensator lading te verliezen via
de weerstand van de potmeter. Naarmate de condensator meer lading verliest, zakt de spanning van de
condensator. Het RCTIME commando blijft tellen, totdat P7 een laag signaal meet, wat betekent, dat de
spanning onder de 1,4 volt is gedaald. Op dat moment slaat het commando de gemeten tijd op in de
variabele time.
Figuur 5-12 Laat in een grafiek de spanning over de condensator zien, gedurende de HIGH, PAUSE, en
RCTIME commando’s. Als gevolg van het HIGH 7 commando, dat de schakeling verbindt met 5 V,
laadt de condensator snel op. Daarna blijft de spanning gedurende de rest van de tijd van het PAUSE
100 commando, gelijk. Zodra het RCTIME 7, 1, time commando wordt uitgevoerd, verandert de
I/O pin van richting en wordt input. Intussen begint de condensator zich over de potmeter te ontladen.
Naarmate de condensator zich ontlaadt, daalt de spanning over P7. Als de spanning tot 1.4 V daalt
(bij de markering van 150 μs in dit voorbeeld), stopt het RCTIME commando met het meten van de tijd
en slaat het resultaat op in de variabele time. Omdat het RCTIME commando in eenheden van 2 μs telt,
is het opgeslagen resultaat voor een tijd van 150 μs de variabele time 75.
De drempelwaarde van een I/O Pin: 1.4 V wordt in een BASIC Stamp 2 de logica
drempelwaarde genoemd (of threshold). Als de spanning op de I/O pin die is ingesteld als
input, boven 1,4V komt, laat deze pen een waarde van 1 zien in zijn ingangsregister. Als de
spanning onder de 1,4 komt, wordt een 0 in het ingangsregister opgeslagen. In het eerste
voorbeeld met een drukknop in Hoofdstuk 3, Hoofdstuk 3Opdracht #2 werd een spanning van
5 V of 0 V op P3 gezet. Omdat 5 V boven 1.4 V is, , laat IN3 een 1 zien. En omdat 0 V onder
1.4 V is, laat IN3 dan een 0 zien.
RCTIME Status Argument: In ReadPotWithRcTime.bs2, daalt de spanning over de
condensator van bijna 5 V naar 0V. Als de spanning daalt tot 1.4 V, verandert de waarde van
het IN7 register van 1 naar 0. Op dat moment slaat het RCTIME commando zijn meting op in
het Duration argument, dat in dit voorbeeld, de time variabele bevat. Het RCTIME
commando’s State argument (status) is 1 in RCTIME 7, 1, time, wat het RCTIME
commando vertelt, dat het IN7 register een waarde van 1 opslaat als de meting start. Het
RCTIME commando meet hoe lang het duurt, voordat het IN7 register van 1 naar 0 verandert
wat gebeurt, als de spanning over de I/O-pin’s onder de 1.4 V logica drempelspanning zakt.
Voor meer informatie: Zoek het RCTIME commando in het BASIC Stamp handboek op of in
de BASIC Stamp Editor’s Help.
Figuur 5-13 laat zien hoe lang het duurt voor de spanning tot een bepaalde waarde daalt als je de
weerstand van de potentiometer in Figuur 5-11 verandert. Bij iedere positie van de knop van de
potmeter hoort een bepaalde weerstandswaarde. Als je de potmeter in de ene richting draait, wordt de
weerstand groter. Als je in de andere richting draait, wordt de weerstand kleiner. Als de weerstand
groter is, duurt het langer voordat de condensator is ontladen. Hierdoor meet het RCTIME commando
een langere tijd en slaat dus ook een grotere waarde op in de variabele time. Als de weerstand kleiner
is, ontlaadt de condensator sneller en meet het RCTIME commando een kortere tijd en slaat dus een
kleinere waarde op in de variabele time. Het DEBUG commando in ReadPotWithRcTime.bs2 laat de
gemeten tijd zien op de Debug Terminal. En omdat de ontlaadtijd varieert met de weerstand van de
potmeter, kunnen we de positie van de knop van de potmeter op de Debug Terminal aflezen.
Figuur 5-13
Hoe de weerstand van de
Potentiometer de ontlaadtijd
beïnvloedt
Pagina 104 · Wat is een Microcontroller? NL HJK
Waarom laadt de condensator op tot een lagere spanning, als de potmeter een
kleine weerstand heeft?
Kijk eens naar het schema links boven in Figuur 5-12 op pin 102. Zonder de weerstand
van 220 Ω, zou de, the I/O pin de condensator tot 5 V opladen. De weerstand van 220
Ω is nodig om de stroom door de I/O pin te beperken, als de condensator oplaadt tot
5V. Zonder die weerstand, zou er teveel stroom door de I/O pin kunnen gaan, waardoor
deze defect kan raken. De weerstand zorgt er ook voor, dat er teveel stroom door de
potmeter loopt, als de knop zo is gedraaid, dat de weerstand 0 Ω is terwijl de I/O pin een
5 V high signaal uit stuurt.
Als er 5 V over de serieschakeling van de 220 Ω weerstand en de potentiometer staat,
wordt de spanning op het knooppunt een waarde ergens tussen 5V en 0V in. Als twee
weerstanden in serie staan spreken we van een spanningsdeler . De 220 Ω weerstand
en de potentiometer vormen hier samen een spanningsdeler. Voor iedere stand van de
potmeter, kun je de spanning op het knooppunt tussen de weerstand en de potmeter
uitrekenen met de volgende formule (Vpot):
Vpot = 5 V × Rpot ÷ (Rpot + 220 Ω)
De waarde van Vpot bepaalt de maximale spanning die de condensator tijdens het
opladen kan bereiken. Met andere woorden de condensator kan nooit opgeladen
worden tot een spanning die hoger is dan Vpot. De meeste potentiometers hebben een
weerstandswaarde van enkele kΩ, en als je Vpot uitrekent voor Rpot waarden in de
buurt van kΩ’s, zul je zien, dat de maximale spanning nog steeds in de buurt van 5 V
komt. De 220 Ω weerstand wordt pas een beperking voor de te bereiken spanning
Vpot, bij een weerstandswaarde van de potmeter van 85.6 Ω, hetgeen minder dan 1%
van het hele bereik van de potmeter is. Bij een kleinere weerstand van de potmeter,
komt de spanning niet meer boven 1,4 V, waardoor de meting niet meer werkt. Zelfs
met de extra 220 Ω beveiligingsweerstand, die op het BASIC Stamp HomeWork board
ingebouwd is om de I/O pin te beveiligen, blijft de laagste 1,7% van de potmeter
ongebruikt. En ook dit zul je vrijwel niet opmerken bij gebruik van de potmeter.
De 220 Ω weerstand beschermt dus de I/O pin en heeft maar een minimaal effect op de
RC meting.
OPDRACHT #4: BESTUREN VAN SERVO MET EEN POTENTIOMETER
Mini joysticks zoals hieronder in Figuur 5-14 te zien is, vind je gewoonlijk op video gamecontrollers.
Iedere joystick heeft twee potentiometers waardoor de elektronica in de gamecontroller de positie kan
meten en doorgeven aan het videospel. Een potentiometer draait horizontal (links/rechts) en de andere
draait vertikaal (vooruit/achteruit).
Horizontale
potentiometer
Figuur 5-14
Potentiometers in de
Parallax Joystick module
Verticale
potentiometer
Een andere toepassing van een joystick vind je in de radiografische besturing van het modelvliegtuig
in Figuur 4-1 op pagina 63. De controller heeft twee joysticks
en iedere joystick heeft twee potentiometers. De positie van iedere potentiometer bestuurt een servo
in het modelvliegtuig.
In deze opdracht ga je een potentiometer op dezelfde manier gebruiken als die je vindt in een joystick
om Servoposities te besturen. Naarmate je de knop van de potmeter draait, zul je het kruis van de
servo op dezelfde manier zien bewegen. In deze opdracht bouw je twee schakelingen op. De
Meten van beweging · Page 105
schakeling van de potmeter van Opdracht #3 in dit hoofdstuk, en de servoschakeling van Hoofdstuk 4,
Opdracht #1. Het PBASIC programma van dit hoofdstuk meet voortdurend de positie van de
potentiometerpositie met het RCTIME commando, en stuurt dan na wat rekenwerk een nieuwe waarde
naar de servo via het PULSOUT commando.
De BASIC Stamp kan de positie van een joystick meten. Omdat er twee potmeters in een
joystick zitten, kan elk van deze twee de potmeter in de schakeling van Figuur 5-11 op pagina
101 vervangen. Met een RCTIME commando kun je de positie van de verticale potmeter meten
en met een ander commando kun je de positie van de horizontale potmeter meten.
Onderdelen voor de schakeling voor het bewegen van een servo met een potmeter
(1) Potentiometer – 10 kΩ
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Weerstand – 470 Ω (geel-violet-bruin)
(1) Condensator – 0.1 µF
(1) Parallax Standard Servo
(1) LED – willekeurige kleur
(2) Jumper draden
Gebruikers van het HomeWork Board hebben verder nodig:
(1) 3-pin male-male (mannetje of pin) header
(4) Jumper draden
Bouw van de schakeling met potmeter en servo
In deze Opdracht zul je twee schakelingen gebruiken die je al eerder apart hebt gebouwd: de
potentiometerschakeling van de laatste opdracht en de servoschakeling van het vorige hoofdstuk.
9 Laat de schakeling met de potentiometer en de RC-schakeling van de vorige Opdracht #3
staan. Indien je hem opnieuw moet opbouwen, kun je in Figuur 5-11 op pagina 101 kijken.
Zorg ervoor dat de 0.1 μF condensator geplaatst is en niet de 0.01 μF condensator.
9 Voeg de schakeling met de servo van Hoofdstuk 4, Opdracht #1 toe aan dit project. Denk
eraan, dat de opbouw van de servoschakeling verschilt met het type bordje, dat je gebruikt.
Hieronder staat waar je de aansluitingen vindt voor jouw bordje:
9 Pagina 65: Board of Education Servo Schakeling
9 Pagina 67: BASIC Stamp HomeWork Board Servo
Programmeren van de Potentiometer Servo Sturing
Je zult de kleinste en grootste waarde nodig hebben van de time variabele die je hebt opgeschreven bij
het testen van de schakeling met de RC-tijd waarbij je de 0.1 μF condensator hebt gebruikt.
9 Indien je nog niet volledig klaar bent met de opdracht in: Jouw beurt van de vorige opdracht,
dan moet je die eerst af maken.
Voor dit voorbeeld staan hieronder de waarden van de time variabele die gemeten zijn door de
Parallax technici. De waarden die je zelf hebt gemeten zullen waarschijnlijk een klein beetje afwijken:
•
•
Volledig met de klok mee gedraaid (rechtsom):
Volledig tegen de klok ingedraaid (linksom):
1
691
Hoe kunnen de inputwaarden van de potmeters zo veranderd worden dat we de waarden 500 en 1000
krijgen, die nodig zijn voor het servo PULSOUT commando? Het antwoord kan gevonden worden door
gebruik te maken van vermenigvuldigen en optellen. Vermenigvuldig de ingangswaarde van de
potmeter eerst met een getal, zodat het verschil tussen de waarde van de potmeter linksom gedraaid en
rechtsom gedraaid ongeveer 500 is in plaats van 700. Tel dan een constante op, zodat de uitkomst
Pagina 106 · Wat is een Microcontroller? NL HJK
tussen 500 en 100 komt in plaats van tussen 1 en 500. In de elektronica worden deze bewerkingen
schaal en verschuiving (Engels scaling en offset) genoemd.
Hier zie je hoe de vermenigvuldiging wordt gebruikt, om de waarde in het juiste bereik te schalen:
500
= 691× 0.724 = 500
691
500
time(minimum) = 1×
= 0.724
691
time(maximum) = 691 ×
Nadat de waarden zijn geschaald, tellen we er een waarde bij op, om de waarde te verschuiven:
time(maximum) = 500 + 500 = 1000
time(minimum) = 0.724 + 500 = 500
De */ operator die op pagina 57 is geïntroduceerd, wordt in PBASIC gebruikt voor het
vermenigvuldigen met een decimaal getal, zoals bijvoorbeeld 0,724. Hier volgen de stappen om */ te
gebruiken voor het getal 0,724:
Zet de waarde of variabele die je wilt vermenigvuldigen met het decimale getal voor de */ operator.
time = time */
Neem het decimale getal en vermenigvuldig het met 256.
new fractional value = 0.724 × 256 = 185 .344
Rond het getal af om van alle cijfers na de komma af te zijn.
new fractional value = 185
Plaats de waarde na de */ operator.
time = time */ 185
Dit was het verschalen, nu moeten we nog de offset van 500 optellen. Dit kan door een tweede
commando dat 500 optelt bij de time variabele:
time = time */ 185
time = time + 500
Nu is de variabele time klaar om gebruikt te worden in het PULSOUT commando Duration argument.
time = time */ 185
time = time + 500
PULSOUT 14, time
' Scale by 0.724.
' Offset by 500.
' Send pulse to servo.
Voorbeeldprogramma: ControlServoWithPot.bs2
√
Maak het programma en start het. Draai aan de potentiometerknop en ga na dat de servo een
beweging maakt iedere keer, als er aan de knop wordt gedraaid.
' What's a Microcontroller - ControlServoWithPot.bs2
' Read potentiometer in RC-time circuit using RCTIME command.
' Scale time by 0.724 and offset by 500 for the servo.
Meten van beweging · Page 107
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
DEBUG "Program Running!"
time
VAR
Word
DO
HIGH 7
PAUSE 10
RCTIME 7, 1, time
time = time */ 185
time = time + 500
PULSOUT 14, time
' Scale by 0.724 (X 256 for */).
' Offset by 500.
' Send pulse to servo.
LOOP
Jouw beurt – Schalen van de Servo’s ten opzichte van de knop
Je potentiometer en condensator zullen wellicht andere waarden geven voor de time variabele dan dat
er in deze opdracht gebruikt worden. Dit zijn de waarden die je hebt verzameld in de Jouw beurt
paragraaf van de vorige opdracht.
9 Herhaal de wiskunde van pagina 105 voor het bepalen van de maximum- en minimumwaarden.
9 Voeg de scale en offset waarden in ControlServoWithPot.bs2.
9 Voeg deze regel met code toe tussen het PULSOUT en LOOP commando zodat je de resultaten
kunt zien.
DEBUG HOME, DEC5 time
' Display adjusted time value.
9 Start het aangepaste programma en ga na dat de veranderingen werken. Omdat de waarden
afgerond zijn, kunnen de grenzen verschillen van de exacte waarden 500 en 1000, maar ze
zullen vrij dichtbij liggen.
Gebruik van Constanten en namen voor een Pin
In langere programma’s kan het zijn, dat voor het PULSOUT commando de waarden voor de
verschaling (die 185 was) en de offset (die 500 was), meerdere keren in het programma voorkomen.
We noemen deze waarden constanten. Deze waarden blijven constant tijdens de uitvoering van het
programma. Door namen te gebruiken voor een constante in plaats van de waarde zelf, verbeter je de
leesbaarheid van je programma Je kunt deze namen voor constanten definiëren via de CON operator:
ScaleFactor
Offset
delay
CON
CON
CON
185
500
10
Deze CON namen, worden bijna altijd aan het begin van het programma gedefinieerd
(gedeclareerd) om ze makkelijk terug te kunnen vinden.
Zodra je een constante via het CON directive, kun je ScaleFactor in je programma gebruiken in plaats
van 185. Hetzelfde geldt voor Offset in plaats van 500. bijvoorbeeld:
time = time */ scaleFactor
time = time + offset
' Scale by 0.724.
' Offset by 500.
We kunnen nu de namen voor de constanten in het programma gebruiken in plaats van de getallen:
time = time */ 185
time = time + 500
' Scale by 0.724.
' Offset by 500.
Een belangrijk voordeel van het gebruik van constante is, dat je maar een CON directive hoeft aan te
passen om dezelfde waarde in het hele programma aan te passen. Stel, dat je een groot programma
Pagina 108 · Wat is een Microcontroller? NL HJK
schrijft, dat de constante ScaleFactor constant op 11 verschillende plaatsen gebruikt. Als je nu de
waarde van Scale Factor CON… aanpast, worden alle waarden, waar ScaleFactor in je programma
wordt toegepast, automatisch aangepast als je het programma de volgende keer in de BasicStamp
laadt. Als je bijvoorbeeld de ScaleFactor CON 500 aanpast naar ScaleFactor CON 510, wordt in
elk commando, waar ScaleFactor staat, 510 gebruikt in plaats van 500.
Deze techniek kun je ook toepassen op de I/O pinnen door gebruik te maken van het PIN directive. Je
kunt bijvoorbeeld een constante aanroepen voor I/O pin P7 zoals in het volgende voorbeeld:
RcPin
PIN 7
Er zijn twee plaatsen in het vorige programma waar I/O pin P7 wordt opgeroepen. De eerste kan
geschreven worden als:
HIGH RcPin
De tweede als:
RCTIME RcPin, 1, time
Als je later de schakeling verandert, hoeft de software niet aangepast te worden. Je hoeft dan alleen
maar de definitie van de constante aan te passen. Op die manier worden het HIGH en RCTIME
commando automatisch in het hele programma aangepast. Ook het opnieuw kalibreren van de
schaalfactor en de offset kun je het CON commando eenvoudig in het begin van het programma
aaanpassen.
De PIN directive heeft extra functie: De PBASIC compiler kan vaststellen of een Pin
naam is gebruikt voor een ingang, of voor een uitgang. De compiler vervangt dan
automatisch het betreffende pinnummer door het bijbehorende nummer van de output, of
het bijbehorende input register bit. Je kunt bijvoorbeeld twee PIN-directives LedPin PIN
14 en ButtonPin PIN 3 definieren. In je programma kn dan een commando staan
als: IF ButtonPin = 1 THEN HIGH LedPin. De PBASIC compiler zet dit om in IF
IN3 = 1 THEN HIGH 14. Het IF ButtonPin = 1… commando voert een vergelijking
uit. En de PBASIC compiler weet dat je ButtonPin als een input gebruikt. Dus gebruikt
het input register bit IN3 in plaats van het getal 3. Op dezelfde manier weet de PBASIC
compiler dat HIGH LedPin de LedPin naam als constant waarde 14 gebruikt voor een
uitgang. Op deze manier wordt de naam in het commando vervangen door HIGH 14.
Voorbeeldprogramma: ControlServoWithPotUsingDirectives.bs2
Dit programma werkt hetzelfde als ControlServoWithPot.bs2 maar gebruikt constanten met namen
voor constante waarden en I/O pinnen.
9 Voer het programma ControlServoWithPotUsingDirectives.bs2 in en start het.
9 Kijk hoe de servo op de potentiometer reageert en stel vast, dat het programma hetzelfde werkt
als ControlServoWithPot.bs2.
' What's a Microcontroller - ControlServoWithPotUsingDirectives.bs2
' Read potentiometer in RC-time circuit using RCTIME command.
' Apply scale factor and offset, then send value to servo.
' {$STAMP BS2}
' {$PBASIC 2.5}
rcPin
servoPin
PIN
PIN
7
14
' I/O Pin Definitions
scaleFactor
offset
delay
CON
CON
CON
185
500
10
' Constant Declarations
time
VAR
Word
' Variable Declaration
Meten van beweging · Page 109
PAUSE 1000
' Initialization
DO
HIGH rcPin
PAUSE delay
RCTIME rcPin, 1, time
time = time */ scaleFactor
time = time + offset
PULSOUT servoPin, time
DEBUG HOME, DEC5 time
' Main Routine
' RC decay measurement
'
'
'
'
Scale scaleFactor.
Offset by offset.
Send pulse to servo.
Display adjusted time value.
LOOP
Jouw beurt – Aanpassen van een PIN Directive (definitie van een naam voor een constante)
Zoals eerder aangegeven, kun je de RC-schakeling op een andere I/O pin aansluiten en het programma
eenvoudig aanpassen door het aanpassen van het RcPin PIN directive. Hierdoor wordt het programma
automatisch aangepast, hetgeen invloed heeft op het HIGH RcPin en RCTIME RcPin, 1, time
commando.
9 Sla het voorbeeldprogramma op onder een andere naam.
9 Wijzig de scaleFactor en offset in de waarden, die je eerder had vastgesteld voor je eigen
RC schakeling in de voorgaande Your Turn opdracht.
9 Draai het aangepaste programma en controleer, of het goed werkt.
9 Pas je schakeling zodanig aan, dat de RC-tijdschakeling niet is aangesloten op I/O pin P7 maar
op I/O pin P8.
9 Pas de rcPin declaratie zo aan:
rcPin
PIN 8
9 Herstart het programma en stel vast, dat de commando’s HIGH en RCTIME nog steeds goed
werken op de nieuwe I/O pinnen, door enkel de RcPin PIN directive aan te passen.
SAMENVATTING
Dit hoofdstuk maakte je vertrouwd met de potentiometer, een onderdeel dat in veel knoppen en ronde
draaischakelaars zit. De potentiometer heeft een weerstandselement dat meestal drie aansluiting heeft,
waarvan een verbonden is met het verschuifbare punt. Het verschuifbare punt bepaalt de weerstand.
De potentiometer kan gebruikt worden als een variabele weerstand door gebruik te maken van de
verschuifbare aansluiting en van een van de vaste aansluitingen.
Verder leerde je wat een condensator is. Een condensator slaat lading op en geeft deze weer af. De
hoeveelheid lading en snelheid van ontlading is afhankelijk van de waarde van de condensator, die in
Farads, (F) wordt aangegeven. De μ is de notatie voor micro, en dat is een miljoenste. De
condensatoren die werden gebruikt lagen in het bereik van 0.01 tot 3300 μF.
Een weerstand en een condensator kunnen samen een schakeling vormen die in een bepaalde tijd de
lading kan opslaan en afgeven. Een dergelijke schakeling wordt ook wel RC-schakeling genoemd. De
R en C in RC-tijd staan voor weerstand en condensator. Indien een waarde (C in dit hoofdstuk)
constant wordt gehouden, is de tijd voor het op- en ontladen afhankelijk van de waarde van de
weerstand. De totale ontlaadtijd in een RC-schakeling kan door middel van de grootte van de
condensator geschaald worden.
Met de BASIC Stamp werden tijdmetingen gedaan om de ontlading van een condensator in een RCschakeling met een vrij grote waarde voor C te meten. Verschillende weerstanden werden gebruikt om
te laten zien hoe de ontlading in de tijd afhankelijk is van de waarde van de weerstand. Het RCTIME
commando werd gebruikt in combinatie met veel kleinere condensatoren in combinatie met een
potentiometer (variabele weerstand) in een RC-schakeling. Ondanks dat de condensatoren veel kleiner
waren en daardoor de ontlaadtijd veel korter werd in het bereik van 2 tot 1500 μs (miljoenste van een
seconde), had de BASIC Stamp daar geen enkel probleem mee. De I/O pin dient op HIGH te staan en
Pagina 110 · Wat is een Microcontroller? NL HJK
de condensator van de RC-schakeling moet eerst geladen worden met het commando PAUSE voordat
het RCTIME commando gebruikt kan worden.
De weerstand van een potentiometer kun je meten via een programma in PBASIC. Je kunt de waarde
zo schalen dat je deze waarde weer aan een ander apparaat zoals een servo kunt koppelen. Voor zo’n
koppeling was het nodig, om de gemeten waarden met enkele berekeningen aan te passen voordat deze
naar de servo gestuurd kon worden. In dit hoofdstuk leerde je, hoe je deze aanpassing kunt maken,
door vermenigvuldigen/delen en optellen/aftrekken. Verder leerde je, dat het commando CON gebruikt
kan worden aan het begin van een programma om namen aan getallen te geven. We gebruiken dit voor
variabelen, constanten enzovoort. Dit noemt men soms ook het declareren van een variabele. Nadat de
variabele is gedeclareerd kan de naam op iedere plaats in het programma gebruikt worden. Deze
manier geeft grote voordelen ten opzichte van het gebruiken van getallen in het programma, vooral als
het getal op verschillende plaatsen in het programma wordt gebruikt. Het programma is eenvoudig aan
te passen, door het CON commando aan te passen, waardoor het gehele programma ineens is
aangepast. Het gebruik van PIN commando’s maakt het mogelijk om namen te gebruiken voor een
I/O-pin. Het programma kan daardoor eenvoudig worden aangepast bij andere aansluitingen van de
schakeling op de pinnen. In conditionele commando’s, wordt het pinnummer automatisch aangepast
als de definitie is aangepast, wat veel eenvoudiger is als zelf de input registers aanpassen met IN2,
IN3, etc.
Vragen
1. Als je aan een knop van een geluidssysteem draait, welk onderdeel ben je dan aan het
aanpassen?
2. Is de weerstand van een potentiometer aanpasbaar tussen de twee buitenste aansluitingen?
3. Welke overeenkomst heeft een condensator met een oplaadbare batterij? Welke verschillen
zijn er?
4. Wat kun je met een RC-schakeling om de waarde van een variabele weerstand te meten?
5. Wat gebeurt er met de RC ontlaadtijd als de waarde van de weerstand groter of kleiner wordt?
6. Wat doet het CON commando? Leg uit met namen en getallen.
Oefening
1.
Je beschikt over een 0.5 μF condensator in een RC tijdsschakeling en je wilt metingen vinden
die 10 maal langer zijn. Bereken de waarde van de nodige condensator.
Project
1. Voeg een tweekleurig LED schakeling toe aan Opdracht #4.
Verander het
voorbeeldprogramma zodanig dat de tweekleurige LED rood wordt, als de servo in met de
klok mee draait en groen indien hij tegen de klok in draait. De LED is uit als de servo niet
draait.
2. Gebruik IF…THEN om het programma aan te passen van Opdracht #4 zodat de servo enkel
draait met PULSOUT waarden tussen 650 en 850.
Oplossingen
Q1. Een potentiometer.
Q2. Nee, de waarde tussen de aansluitingen is vast. De weerstand is verbonden met beide
aansluitingen aan het eind en het sleepcontact met de middelste pin.
Q3. Een condensator lijkt een beetje op een oplaadbare batterij aangezien een batterij ook kan
worden opgeladen en lading kan vasthouden. Het verschil is dat een condensator de lading
maar voor een korte tijd kan vasthouden.
Q4. Je kunt de tijd opmeten die de condensator nodig heeft om te ontladen en laden. De tijd is
afhankelijk van de weerstand en condensatorwaarde. Indien de condensator bekend is en de
weerstandswaarde variabel, dan is de ontlaadtijd een maat voor de weerstand.
Q5. Indien R groter wordt, zal de RC ontlaadtijd evenredig stijgen met de weerstandswaarde.
Indien de weerstand kleiner wordt, zal de RC ontlaadtijd dalen, evenzeer proportioneel met de
daling in R.
Q6. Het CON commando vervangt getallen door een naam.
Meten van beweging · Page 111
E1. nieuwe C= 10 x oude C waarde
= 10 x 0.5µF
= 5µF
P1. Opdracht #4 met een tweekleurige LED erbij.
P13
1
2
P12
Schema van de potentiometer van Figuur
5-11 op page 101, servo van Hoofdstuk 4,
Opdracht #1, en bicolor LED van Figuur
2-19 op pagina 36 met P15 en P14
veranderd in P13 en P12 zoals hier te zien.
470 Ω
'
'
'
'
'
'
'
What's a Microcontroller - Ch5Prj01_ControlServoWithPot.bs2
Read potentiometer in RC-time circuit using RCTIME command.
The time var ranges from 126 to 713, and an offset of 330 is needed.
Bicolor LED on P12, P13 tells direction of servo rotation:
green for CW, red for CCW, off when servo is holding position.
{$STAMP BS2}
{$PBASIC 2.5}
PAUSE 1000
DEBUG "Program Running!"
time
prevTime
VAR
VAR
Word
Word
' time reading from pot
' previous reading
DO
prevTime = time
HIGH 7
PAUSE 10
RCTIME 7, 1, time
time = time + 350
IF ( time > prevTime + 2) THEN
HIGH 13
LOW 12
ELSEIF ( time < prevTime - 2) THEN
LOW 13
HIGH 12
ELSE
LOW 13
LOW 12
ENDIF
' Store previous time reading
' Read pot using RCTIME
' Scale pot, match servo range
' increased, pot turned CCW
' Bicolor LED red
' value decreased, pot turned CW
' Bicolor LED green
' Servo holding position
' LED off
PULSOUT 14, time
LOOP
P2. De oplossing is om een IF…THEN blok toe te voegen; zoals hieronder. Het toevoegen van het
controleteken CLREOL is handig in combinatie met het DEBUG commando, omdat het aan de
terminal vertelt om vanaf de cursorpositie tot het eind van de regel, alle tekens te wissen
“clear to end of line.”
'
'
'
'
'
What's a Microcontroller - Ch5Prj02_ControlServoWithPot.bs2
Read potentiometer in RC-time circuit using RCTIME command.
Modify with IF…THEN so the servo only rotates from 650 to 850.
The time variable ranges from 1 to 691, so an offset of at least
649 is needed.
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
DEBUG "Program Running!"
Pagina 112 · Wat is een Microcontroller? NL HJK
time VAR Word
DO
HIGH 7
PAUSE 10
' Read pot with RCTIME
RCTIME 7, 1, time
time = time + 649
IF (time
time =
ENDIF
IF (time
time =
ENDIF
< 650) THEN
650
' Scale time to servo range
' Constrain range from 650 to 850
> 850) THEN
850
PULSOUT 14, time
DEBUG HOME, "time = ", DEC4 time, CLREOL
LOOP
Digitale Display · Page 113
Hoofdstuk 6: Digitale Display
DE ALLEDAAGSE DIGITALE DISPLAY
Figuur 6-1 toont een display van een oven zoals je die in de keuken gebruikt. Als de oven niet in
gebruik is, wordt de tijd weergegeven. Als de oven in gebruik is, wordt een tijdklok (timer)
weergegeven. Als het eten klaar is, gaat de display knipperen in combinatie met een alarmtoon. Een
microcontroller in de ovendeur leest de drukknoppen in en bestuurt de display. Het bestuurt ook
sensoren en andere schakelaars binnenin de oven om bijvoorbeeld het verwarmingselement aan en uit
te zetten.
Figuur 6-1
Digitale Klok met 7Segment Display op de
Oven Deur
Elk van de drie digitale cijfers in Figuur 6-1 noemt men een 7-segment display. In dit hoofdstuk, zul
je de BASIC Stamp zo leren programmeren dat er letters en cijfers op een 7-segment verschijnen.
WAT IS EEN 7-SEGMENT DISPLAY?
Een 7-segment display is een rechthoekig blok van 7 lijnen die even lang zijn die selectief kunnen
oplichten. Een veel voorkomende vorm van de 7-segment LED display is een reeks van de
rechthoekige 7 LED’s naast elkaar. Figuur 6-2 laat de onderdeeltekening van een 7-segment LED
display zien, die je in de volgende opdrachten gaat gebruiken. Het display heeft een extra LED in de
vorm van een punt die gebruikt kan worden als komma of decimale punt. Elk segment (A tot G) en de
punt bevat een aparte LED, die elk apart bediend kunnen worden. De meeste pinnen van zo’n 7segmentsdisplay hebben een nummer en een naam die overeenkomt met het LED segment. Pin 5 is De
DP, wat staat voor het decimaal punt. Pinnen 3 en 8 zijn de “common cathode”, en zullen verder
uitgelegd worden met een schema.
Common
Cathode
10 9 8 7 6
G F
A B
A
F
B
G
C
E
D
E D
Figuur 6-2
7-Segment LED Display
onderdeeltekening en namen van de
aansluitingen
C DP
1 2 3 4 5
Common
Cathode
Pin Map: Figuur 6-2 is een voorbeeld van een zogenaamde pinmap. Een pinmap bevat
handige informatie die helpt om stukken met andere schakelingen te verbinden. Pinmaps
tonen meestal een nummer, naam en referentie van elke pin. Bekijk Figuur 6-2. Elke pin is
genummerd, en elke naam van een pin heeft een segment letter naast de pin. De referentie
hier is pin 1 die het dichtste bij de linkerhoek zit. Andere stukken kunnen subtielere
referenties hebben, zoals een puntje op de rechthoekige LED omhulling.
Pagina 114 · Wat is een Microcontroller? NL HJK
Figuur 6-3 toont schematisch de binnenkant van een 7-segment LED display. Elke LED anode is
verbonden met een individuele pin. Alle kathodes zijn samen verbonden. Aangezien alle kathodes een
gemeenschappelijke verbinding hebben, kan het 7-segment LED display genoemd worden als een
“common cathode” display. Door ofwel pin 3 of pin 8 te verbinden met de Vss, zijn alle LED kathodes
met Vss verbinden.
1
4
6
7
9
10
5
E
C
B
A
F
G
DP
LED’s
3
Figuur 6-3
7-Segment Schema
8
OPDRACHT #1: BOUWEN EN TESTEN VAN EEN 7-SEGMENT LED DISPLAY
In deze opdracht bouw je een schakeling voor het testen van elk segment in de display
7-Segment LED Display Test Onderdelen
(1) 7-segment LED display
(5) Weerstand – 1 kΩ (bruin-zwart-rood)
(5) Jumper draden
7-Segment LED Display Testschakeling
9 Met de voeding afgekoppeld van het Board of Education of HomeWork Board, bouw je de
schakeling op zoals in Figuur 6-4 en Figuur 6-5.
9 Sluit de voeding aan en ga na dat segment A oplicht.
Wat is x met nc bovenaan in het schema? Nc staat voor niet- verbonden. Het duidt aan
dat een pin van de 7-segment LED display niet is aangesloten. De x op het einde van de pin
staat ook voor niet- verbonden. Sommige schema’s gebruiken x of nc.
Vdd
nc
X
X
X
nc
nc
nc
X
nc
X
nc
X
nc
X
1 kΩ
1
4
6
7
9
10
5
E
C
B
A
F
G
DP
LED’s
8
X
3
Vss
nc
Figuur 6-4
Testschakeling Schema
voor de ‘A’ Segment LED
Display.
Digitale Display · Page 115
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vdd
Vin
Vss
Figuur 6-5
Testschakeling
Bedradingschema voor
het ‘A’ Segment van de
LED Display
9 Koppel de voeding af en pas de schakeling aan door de weerstand met de B LED input te
verbinden zoals in Figuur 6-6 en Figuur 6-7.
Vdd
X
nc
nc
nc
X
X
nc
X
nc
X
nc
X
nc
X
1 kΩ
1
4
6
7
9
10
5
E
C
B
A
F
G
DP
Figuur 6-6
Testschakeling Schema
voor de ‘B’ Segment LED
Display.
LED’s
8
X
3
Vss
nc
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vdd
Vin
Vss
Figuur 6-7
Testschakeling
bedrading voor de ‘B’
Segment LED Display
9 Schakel de voeding weer in en ga na dat het B segment oplicht.
9 Gebruik de pinmap van Figuur 6-2 als leidraad en herhaal de vorige stappen voor segment C
tot G.
Pagina 116 · Wat is een Microcontroller? NL HJK
Jouw beurt – De Letter A en zichtbaar maken van het getal twee
Figuur 6-8 en Figuur 6-9 laten de aansluitingen zien voor het getal ‘3’ op de 7-segment LED display.
Vdd
Vdd
Vdd
Vdd
Vdd
1 kΩ (all)
Figuur 6-8
Getal ‘3’
X
nc
X
nc
X
nc
1
4
6
7
9
10
5
E
C
B
A
F
G
DP
LED’s
8
X
3
Met deze
schakeling. Laat je
het getal “3” op de
7-segment LED
display.
Vss
nc
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vdd
Vin
Figuur 6-9
Bedradingschema
voor Figuur 6-8
Vss
9 Bouw en test de schakeling zoals te zien in Figuur 6-8 en Figuur 6-9, ga na dat het getal 3 op
de display wordt getoond.
9 Teken een schema dat het nummer 2 zal weergeven op de 7-segment LED.
9 Bouw en test de schakeling. Los eventuele fouten op
9 Herhaal dit voor de letter ‘H’.
OPDRACHT #2: AANSTUREN VAN EEN 7-SEGMENT LED DISPLAY
In deze opdracht ga je de 7-segment LED display verbinden met de BASIC Stamp en een programma
schrijven om elke LED te testen zodat die correct werkt.
7-Segment LED Display Onderdelen
(1) 7-segment LED display
(8) Weerstanden– 1 kΩ (bruin-zwart-rood)
(5) Jumper draden
Aansluiten van een 7-Segment LED Display op de BASIC Stamp
Figuur 6-11 toont een schema en Figuur 6-12 toont het aansluitschema voor het 7-segment LED
display bestuurd door de BASIC Stamp.
9 Bouw de schakeling van Figuur 6-11 en Figuur 6-12.
Digitale Display · Page 117
Schema en pinmap: Indien je een schakeling opbouwt met behulp van het schema in
Figuur 6-11 zonder naar Figuur 6-12 te kijken, gebruik dan zeker de 7-segment LED display
pin map van Figuur 6-10
Common
Cathode
10 9 8 7 6
G F
A B
A
F
B
Figuur 6-10
7-Segment LED Display
onderdeeltekening en Pinmap
G
C
E
D
E D
C DP
1 2 3 4 5
Common
Cathode
1 kΩ
(All)
P15
P14
P13
P12
P11
P10
P9
P8
E
C
G
DP
F
A
B
Figuur 6-11
BASIC Stamp
gestuurde 7Segment
LED Display
Schema
LED’s
common
Vss
Wees voorzichtig met de weerstanden die verbonden zijn met P13 en P14. Kijk
aandachtig naar de verbindingen van de weerstanden met P13 en P14 zoals in Figuur 6-12.
Er is een opening tussen de twee weerstanden. De opening is er omdat pin 8 op de 7segment LED display niet aangesloten wordt. Een weerstand is enkel verbonden met I/O
pin P13 en 7-segment LED display pin 9. Een andere weerstand is verbonden met P14 en
7-segment LED display pin 7.
Pagina 118 · Wat is een Microcontroller? NL HJK
DP
EDC GFAB
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vdd
Figuur 6-12
Aansluitschema voor
Figuur 6-11
Vin
Gebruik de segment
letters boven het diagram
als referentie.
Vss
Parallelle onderdelen: De 7-segment LED display noemt men een parallel apparaat
aangezien het meer dan een I/O lijn nodig heeft om data naar toe te zenden. Voor de 7segment LED display zijn er 8 I/O pinnen nodig om het onderdeel aan te sturen.
Parallelle Bus: De draden die de HIGH/LOW signalen van de BASIC Stamp naar de 7segment LED display sturen noemen we een parallelle bus. Merk op dat deze draden in
parallel zijn getekend in Figuur 6-11. De term parallel is logisch gezien de geometrie van
het schema.
Programmeren van de test van het 7-Segment LED Display
De HIGH en LOW commando’s kunnen een variabele als pinargument bevatten. Om elk segment een
voor een te kunnen testen, kunnen we de HIGH en LOW commando’s in een FOR…NEXT lus zetten en de
index gebruiken om de I/O pin, high en dan weer low te zetten.
9 Maak en start SegmentTestWithHighLow.bs2.
9 Ga na dat elk segment van de 7-segement LED display kort oplicht.
9 Maak een lijstje van welk segment welke I/O pin bestuurt.
Voorbeeld Programma: SegmentTestWithHighLow.bs2
' What's a Microcontroller - SegmentTestWithHighLow.bs2
' Individually test each segment in a 7-Segment LED display.
'{$STAMP BS2}
'{$PBASIC 2.5}
pinCounter
VAR
Nib
PAUSE 1000
DEBUG "I/O Pin", CR,
"-------", CR
FOR pinCounter = 8 TO 15
DEBUG DEC2 pinCounter, CR
HIGH pinCounter
PAUSE 1000
LOW pinCounter
NEXT
Jouw beurt – Een Ander Patroon
Verwijderen van het commando LOW pinCounter heeft een interessant effect:
Digitale Display · Page 119
9 Zet een apostrof voor het LOW pinCounter commando zodat het commando commentaar
wordt.
9 Start het aangepaste programma en bekijk het effect.
OPDRACHT #3: DISPLAYING DIGITS
Als je de decimale punt meetelt, zijn er acht verschillende BASIC Stamp I/O pinnen die high/low
signalen naar de 7-segment LED display sturen. Er zijn dus acht verschillende HIGH or LOW
commando’s nodig om een enkel getal zichtbaar te maken. Als je van 0 tot 9 wilt tellen, zou je een
groot programma moeten schrijven. Gelukkig zijn er speciale variabelen die voor een groep van I/O
pinnen de signalen hoog en laag kunnen zetten.
In deze opdracht, ga je 8-digit binaire getallen gebruiken in plaats van HIGH en LOW commando’s om
de signalen van de BASIC Stamp te besturen. Door de speciale variabelen DIRH en OUTH gelijk aan
binaire getallen te maken, zul je in staat zijn om de high/low signalen, die naar de I/O pinnen worden
gestuurd , met één enkel PBASIC commando te verzenden.
8 bits: Een binair getal dat 8 cijfers tussen 0 en 1 heeft, is gelijk aan 8 bits. Elke bit is een
plaats waar je een 1 of een 0 kan opslaan.
is een variabele die 8 bits groot is. Er zijn 256 verschillende
combinaties van nullen en enen die je kunt gebruiken om te kunnen tellen
van 0 tot 255 met 8 bits. Dit is de reden, dat een byte nummers tussen 0 and
255 kan opslaan.
Een byte
Onderdelen en Schakeling voor Weergeven van Digits
Hetzelfde als de vorige opdracht
Programmeren van aan/uit (On/Off) Patronen door Binaire Getallen te gebruiken
In deze opdracht zul je experimenteren met de variabelen DIRH en OUTH. DIRH is een variabele, die
de richting (input of output) van de I/O pinnen P8 tot P15 stuurt. OUTH stuurt de hoge en lage signalen
van elke pin. Zoals je zult zien, is OUTH eenvoudig aangezien je high/low signalen voor acht
verschillende I/O pinnen in een keer met een commando kan sturen. Hier heb je een
voorbeeldprogramma dat toont, hoe deze twee variabelen gebruikt kunnen worden om te tellen van 0
tot 9 op de 7-segment LED display zonder gebruik te maken van HIGH en LOW commando’s:
Voorbeeldprogramma: DisplayDigits.bs2
Dit programma zal achtereenvolgens de getallen tussen 0 en 9 op de 7-Segment LED display laten
verschijnen.
9 Voer het programma in en start DisplayDigits.bs2.
9 Ga na dat 0 tot 9 worden weergegeven.
' What's a Microcontroller - DisplayDigits.bs2
' Display the digits 0 through 9 on a 7-segment LED display.
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "Program Running!"
OUTH = %00000000
DIRH = %11111111
'
BAFG.CDE
OUTH = %11100111
PAUSE 1000
OUTH = %10000100
PAUSE 1000
OUTH = %11010011
PAUSE 1000
OUTH = %11010110
PAUSE 1000
' OUTH initialized to low.
' Set P8-P15 to all output-low.
' Digit:
' 0
' 1
' 2
' 3
Pagina 120 · Wat is een Microcontroller? NL HJK
OUTH = %10110100
PAUSE 1000
OUTH = %01110110
PAUSE 1000
OUTH = %01110111
PAUSE 1000
OUTH = %11000100
PAUSE 1000
OUTH = %11110111
PAUSE 1000
OUTH = %11110110
PAUSE 1000
' 4
DIRH = %00000000
' I/O pins to input,
' segments off.
' 5
' 6
' 7
' 8
' 9
END
Hoe DisplayDigits.bs2 werkt
Vin
Vss
Figuur 6-13 laat zien, hoe de DIRH en OUTH variabelen de richting en status van de(high/low) signalen
op de I/O pinnen P8 tot P15 sturen.
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
X3
Vdd
Figuur 6-13
Gebruik van DIRH en
OUTH om alle I/O Pinnen
laag te sturen
OUTH = %00000000
DIRH = %11111111
Het eerste commando:
OUTH = %00000000
…zet alle I/O pinnen (P8 tot P15) als uitgang om lage signalen uit te kunnen zenden. Hierdoor wordt
de display uitgezet. Indien je alle I/O pinnen een hoog signaal wil sturen gebruik het OUTH =
%11111111 commando.
Het % wordt gebruikt om aan de BASIC Stamp Editor
te vertellen dat het volgende getal binair is. Als voorbeeld; het binaire getal
%00001100 is hetzelfde als het decimaal nummer 12. Zoals je in de volgende
opdracht zult zien, kunnen binaire codes het programmeren heel wat
makkelijker maken.
Wat doet het % teken?
Het laag (low) signaal zal worden vastgehouden totdat een volgend DIRH variabele commando wordt
uitgevoerd. Het commando:
DIRH = %11111111
..zet alle I/O pinnen van P8 tot P15 op output. Zodra dit commando is uitgevoerd, wordt er naar P8
tot P15 een laag signaal verzonden. Dit komt doordat het commando OUTH = %00000000 vlak voor
het DIRH commando is uitgevoerd. Je kunt ook DIRH = %00000000 gebruiken om alle I/O pinnen
weer input te maken.
Digitale Display · Page 121
Hoe I/O pinnen outputs worden: totdat de I/O pinnen veranderen van input naar output,
luisteren ze naar signalen en passen ze de waarde van de INH variabele aan, als er een
input verandert. Deze variabelen zijn bijvoorbeeld IN8, IN9, ent IN15. Deze variabelen
kunnen op dezelfde manier gebruikt worden als IN3 en IN4 die gebruikt werden met de
druktoetsen in Hoofdstuk 3.
Dit noemt men een “default”. Je
dient de BASIC Stamp I/O pin te vertellen dat de pin een output moet
worden voordat het signalen zal uitzenden. Zowel de HIGH en LOW
commando’s veranderen automatisch de BASIC Stamp I/O pinnen naar
output. Door het plaatsen van een 1 in de DIRH variabele wordt de I/O pin
een output.
Alle BASIC Stamp I/O pinnen starten als inputs.
Zet altijd eerst de juiste waarde in het OUT register voordat je de uitgang inschakelt in
het DIR register. Dit voorkomt, dat de uitgangen kortstondig ongedefinieerde signalen
verstuurt. In het volgende voorbeeld zetten we met DIR5 = 1 eerst de uitgangen aan, om
daarna met OUT5 = 1 de waarde van de uitgang in te stellen aan het begin van het
programma. Hierdoor zullen de uitgangen heel kort een ongewenst laag signaal laten zien,
omdat alle variabelen aan het begin van het programma op 0 staan. (De geheugenplaats
van alle PBASIC variabelen worden aan het begin van het programma op 0 gezet.) Als in
plaats daarvan eerst OUT5 = 1 wordt geprogrammeerd gevolgd door DIR5 = 1, dan
stuurt de uitgang netjes een hoog signaal uit als de uitgang wordt ingeschakeld.
Omdat de opgeslagen waarden altijd standaard op 0 staan als een programma start
is het commando OUTH = %00000000 eigenlijk niet nodig. Maar het is wel zorgvuldig, om
het toch te gebruiken, omdat andere programmeertalen soms niet zo werken..
Figuur 6-14 laat zien hoe de OUTH variabele gebruikt kan worden om selectief hoge en lage signalen
naar de pinnen P8 tot P15 te zenden. Een binaire 1 is gebruikt om een hoog signaal te zenden, een
binaire 0 wordt gebruikt om een laag signaal te zenden. Dit voorbeeld toont het nummer 3 op de 7segment LED display:
Vin
Vss
'
BAFG.CDE
OUTH = %11010110
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
X3
Vdd
Figuur 6-14
OUTH voor het besturen
van hoog/laag Signalen
op P8 t/m P15.
‘
BAFG.CDE
OUTH = %11010110
De display op de figuur is omgedraaid omdat het duidelijker laat zien hoe de waarden van het OUTH
commando overeenkomen en in lijn staan met de I/O pinnen. Het commando OUTH = %11010110
gebruikt nullen om de I/O pinnen P8, P11, en P13 laag te maken en het gebruikt binaire enen om P9,
P10, P12, P14 en P15 hoog te ,maken. De regel net voor het commando is commentaar dat aangeeft,
dat de segmenten in een lijn staan met de binaire waarde.
Pagina 122 · Wat is een Microcontroller? NL HJK
Binnenin de HIGH en LOW commando’s:
HIGH 15
...is exact hetzelfde:
OUT15 = 1
DIR15 = 1
Op dezelfde manier is het commando :
LOW 15
...hetzelfde als:
OUT15 = 0
DIR15 = 1
Indien je P15 opnieuw input wilt maken, dan gebruik je DIR15 = 0. Je kunt in
plaats hiervan ook IN15 gebruiken om hoog/laag-signalen te detecteren.
Jouw beurt – Weergeven van A tot F
9 Zoek uit wat het bit patroon is (combinatie van nullen en enen) Je dient de letters A, b, C, d, E,
en F weer te geven.
9 Pas SevenSegment0to9 aan zodat A, b, C, d, E, F worden weergegeven.
Decimaal vs. Hexadecimaal
De basisgetallen in het decimale (10-tallig)
getallenstelsel zijn:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
In het hexadecimaal (16-tallig) stelsel zijn dat:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F.
Base-16 wordt veel gebruikt voor computer- en microcontroller
programmering. Als je eenmaal hebt ontdekt hoe je de karakters A
tot F kunt weergeven, kun je het programma zelf aanpassen om
hexadecimaal van 0 tot F te tellen.
Maken van Lijsten met Aan/Uit Patronen
Het LOOKUP commando maakt het schrijven van programmacode voor een 7-segment LED display
patroon heel veel makkelijker. Het LOOKUP commando laat je elementen in de lijst “opzoeken”. Hier
heb je een voorbeeld van het gebruik van dit commando:
LOOKUP index, [7, 85, 19, 167, 28], value
Dit commando gebruikt twee variabelen; index en value. Indien de index 0 is, geeft value een 7
terug. Indien index 1 is, geeft value 85 terug. Indien index 2 is, dan wordt voor dit voorbeeld door
het LOOKUP commando een 19 in de value variabele gezet en dat is wat de Debug Terminal dan ook
laat zien.
Voorbeeldprogramma: SimpleLookup.bs2
9
9
9
9
Voer het programma in en start SimpleLookup.bs2.
Start het programma met de index variabele op 2.
Probeer de index variabele met waarden tussen 0 en 4.
Herstart het programma na elke verandering en merk op wat de waarden zijn die uit de rij
worden gekozen.
9 Optioneel: Pas het programma aan door het LOOKUP commando in een FOR…NEXT lus te
plaatsen die van 0 tot 4 telt.
Digitale Display · Page 123
' What's a Microcontroller - SimpleLookup.bs2
' Debug a value using an index and a lookup table.
' {$STAMP BS2}
' {$PBASIC 2.5}
value
index
VAR
VAR
Byte
Nib
index = 2
PAUSE 1000
DEBUG ? index
LOOKUP index, [7, 85, 19, 167, 28], value
DEBUG ? value, CR
DEBUG "Change the index variable to a ", CR,
"different number(between 0 and 4).", CR, CR,
"Run the modified program and ", CR,
"check to see what number the", CR,
"LOOKUP command places in the", CR,
"value variable."
END
Voorbeeldprogramma: DisplayDigitsWithLookup.bs2
Het voorbeeldprogramma laat zien hoe je het LOOKUP commando handig kunt gebruiken bij het
opslaan van bitpatronen die gebruik maken van de OUTH variabele. De index is opnieuw gebruikt met
binaire waarden in plaats van de OUTH variabele. Dit voorbeeldprogramma telt van 0 tot 9. Het verschil
tussen dit programma en DisplayDigits.bs2 is dat dit programma eenvoudig is aan te passen voor
andere toepassingen. Het is veel sneller en makkelijker om verschillende volgorden op te zoeken in
tabellen.
9 Voer in en start DisplayDigitsWithLookup.bs2.
9 Ga na dat het dezelfde acties doet als het vorige programma (met minder werk).
9 Kijk op de Debug Terminal terwijl het programma loopt. Het toont dat de waarde van index
gebruikt is door het LOOKUP commando om de juiste binaire waarden in te laden vanuit de list
naar OUTH.
' What's a Microcontroller - DisplayDigitsWithLookup.bs2
' Use a lookup table to store and display digits with a 7-segment LED display.
'{$STAMP BS2}
'{$PBASIC 2.5}
index
VAR
Nib
OUTH = %00000000
DIRH = %11111111
PAUSE 1000
DEBUG "index
"-----
OUTH
", CR,
--------", CR
FOR index = 0 TO 9
LOOKUP index, [ %11100111, %10000100, %11010011,
%11010110, %10110100, %01110110,
%01110111, %11000100, %11110111, %11110110 ], OUTH
DEBUG "
", DEC2 index, "
PAUSE 1000
NEXT
DIRH = %00000000
END
", BIN8 OUTH, CR
Pagina 124 · Wat is een Microcontroller? NL HJK
Jouw beurt – Opnieuw weergeven van 0 tot F
9 Pas DisplayDigitsWithLookup.bs2 zo aan dat het programma van 0 tot F in het hexadecimale
stelsel telt. Vergeet niet de start- en end waarden aan te passen van de FOR…NEXT lus.
OPDRACHT #4: WEERGEVEN VAN DE POSITIE VAN EEN DRAAIKNOP
In Hoofdstuk 5, Opdracht #4 heb je een potentiometer gebruikt om een servo te besturen. In deze
Opdracht, zul je de positie van de potentiometer gebruiken met de 7-segment LED display.
Onderdelen voor de schakeling met draaiknop en display
(1) 7-segment LED display
(8) Weerstanden– 1 kΩ (bruin-zwart-rood)
(1) Potentiometer – 10 kΩ
(1) Weerstand– 220 Ω (rood-rood-bruin)
(1) Condensator – 0.1 μF
(7) Jumper draden
Bouwen van de schakeling voor draaiknop en Display
Figuur 6-15 toont het schema van de schakeling met de potentiometer die voor deze opdracht moet
worden toegevoegd. Figuur 6-16 toont het bedradingschema van de schakeling van Figuur 6-15,
gecombineerd met de schakeling van Figuur 6-11 op Pagina 117.
9 Voeg de potentiometerschakeling toe aan de 7-segment LED displayschakeling zoals in Figuur
6-16.
Figuur 6-15
Schema van de
Potentiometer
Schakeling aan het
Project toegevoegd
Figuur 6-16
Bedradingschema voor
Figuur 6-15
Programmeren van de draaiknop en display
Er is nog een handig commando met de naam LOOKDOWN, en dit is het omgekeerde van het LOOKUP
commando. Zoals het LOOKUP commando je getal uit de rij geeft gebaseerd op een index, geeft het
LOOKDOWN commando de index gebaseerd op een getal.
Voorbeeldprogramma: SimpleLookdown.bs2
Dit voorbeeldprogramma toont hoe het LOOKDOWN commando werkt.
Digitale Display · Page 125
9 Voer in en start SimpleLookdown.bs2.
9 Start het programma met de waarde van de variabele value op 167 en kijk op de Debug
terminal naar de waarde van index.
9 Voer waarden in, die gelijk zijn aan die van het LOOKDOWN commando: 7, 85, 19, 28.
9 Herstart het programma telkens en kijk welke variabele uit de lijst in de index variabele wordt
gezet.
Strikvraag: Wat
zal er gebeuren indien de waarde groter is dan 167? Dit kleine
euvel kan in het LOOKDOWN commando voor problemen zorgen omdat het
LOOKDOWN commando in dat geval niets verandert aan de index.
' What's a Microcontroller - SimpleLookdown.bs2
' Debug an index using a value and a lookup table.
' {$STAMP BS2}
' {$PBASIC 2.5}
value
index
VAR
VAR
Byte
Nib
value = 167
PAUSE 1000
DEBUG ? value
LOOKDOWN value, [7, 85, 19, 167, 28], index
DEBUG ? index, CR
DEBUG "Change the value variable to a ", CR,
"different number in this list:", CR,
"7, 85, 19, 167, or 28.", CR, CR,
"Run the modified program and ", CR,
"check to see what number the ", CR,
"LOOKDOWN command places in the ", CR,
"index variable."
END
Het LOOKDOWN commando zoekt in de lijst naar een waarde die gelijk is aan een getal in de lijst. Je
kunt met dit commando ook controleren of een waarde groter is of kleiner is dan een getal in de lijst.
Als je bijvoorbeeld wilt zoeken naar een waarde in de lijst, die kleiner is dan de waarde van de
variabele, gebruik dan de <= operator net voor de eerste haken van de lijst.
9 Pas SimpleLookdown.bs2 aan door toevoegen van <= na de waarde in het LOOKDOWN statement
te plaatsen:
value = 35
LOOKDOWN value, <= [ 7, 19, 28, 85, 167 ], index
9 Pas het DEBUG commando zo aan:
DEBUG "Change the value variable to a ", CR,
"different number in this range:", CR,
"0 to 170.", CR, CR,
"Run the modified program and ", CR,
"check to see what number the ", CR,
"LOOKDOWN command places in the ", CR,
"index variable."
9 Experimenteer met verschillende waarden en ga na of de indexvariabele het resultaat oplevert
dat je verwacht.
Pagina 126 · Wat is een Microcontroller? NL HJK
Voorbeeldprogramma: DialDisplay.bs2
Dit voorbeeldprogramma geeft de positie van de knop van de potentiometer weer door de
overeenkomstige segmenten rond de 7-segment LED display op te laten lichten, zoals in Figuur 6-17.
Figuur 6-17
Weergeven van depositie van de
potentiometer met de 7-Segment
LED Display
9 Voer het programma DialDisplay.bs2 in en start het programma.
9 Draai aan de potentiometerknop en ga na of het programma werkt.
9 Als je het voorbeeldprogramma start, kan het zijn dat het er niet precies hetzelfde uitziet als in
Figuur 6-17. Pas de waarden aan in de lookdowntabel zodat de digitale display nauwkeuriger
wordt aangestuurd door de potentiometer.
' What's a Microcontroller - DialDisplay.bs2
' Display POT position using 7-segment LED display.
'{$STAMP BS2}
'{$PBASIC 2.5}
PAUSE 1000
DEBUG "Program Running!"
index
time
VAR
VAR
Nib
Word
OUTH = %00000000
DIRH = %11111111
DO
HIGH 5
PAUSE 100
RCTIME 5, 1, time
LOOKDOWN time, <= [40, 150, 275, 400, 550, 800], index
LOOKUP index, [ %11100101, %11100001, %01100001,
%00100001, %00000001, %00000000 ], OUTH
LOOP
Hoe DialDisplay.bs2 werkt
Dit voorbeeldprogramma voert een meting uit van de RC/tijd van de potmeter en condensator, met het
commando RCTIME en slaat de gemeten waarde op in de variabele time.
HIGH 5
PAUSE
RCTIME 5, 1, time
De time variabele wordt dan gebruikt in de LOOKDOWN tabel. De LOOKDOWN tabel beslist welk nummer
er in de lijst time kleiner is en laadt dan de nullen (in dit geval 0 tot 5 ) in de index variabele.
LOOKDOWN time, <= [40, 150, 275, 400, 550, 800], index
Daarna wordt de index variabele gebruikt in de LOOKUP tabel om te kiezen welke binaire waarde er
via de OUTH variabele naar de uitgangspennen gestuurd moet worden.
LOOKUP index, [ %11100101, %11100001, %01100001,
%00100001, %00000001, %00000000 ], OUTH
Digitale Display · Page 127
Jouw beurt – Toevoegen van een Segment
DialDisplay.bs2 zet vijf van de zes segmenten aan als je aan de knop draait. De volgorde van het
draaien van de LED's is in DialDisplay.bs2: E, F, A, B, C. Segment D wordt niet aangestuurd.
9 Sla DialDisplay.bs2 op onder een andere naam DialDisplayYourTurn.bs2.
9 Pas DialDisplayYourTurn.bs2 aan zodat het alle 6 buitenste LED's aanzet in de goede volgorde
tijdens het draaien van de potentiometer. De volgorde moet worden: E, F, A, B, C en D.
Tip: Laat de 7-segment LED schakeling op het bordje zitten. We gaan de 7-segment
LED display weer gebruiken in Hoofdstuk 7, Opdracht #4.
SAMENVATTING
Dit hoofdstuk introduceerde de 7-segment LED-display, en hoe je een pinmap kunt lezen. Verder
maakte dit hoofdstuk je vertrouwd met enkele technieken en schakelingen voor het aansluiten van
onderdelen die een parallelle input hebben. De variabelen DIRH en OUTH werden geïntroduceerd als
een middel om de waarden van de BASIC Stamp I/O pinnen P8 tot P15, te besturen. De LOOKUP en
LOOKDOWNcommando’s werden voorgesteld als een mogelijkheid om waarden op te zoeken in lijsten,
om bijvoorbeeld de letters en nummers weer te geven op de 7-segments LED-display.
Vragen
1. Welk principe zorgt ervoor dat een 7-segment LED display leesbaar wordt door een
microcontroller hoge en lage signalen te laten sturen?
2. Wat betekent “common cathode”? Wat denk je dat “common anode” betekent?
3. Hoe noemt men een groep van draden die een signaal doorgeven van en naar een parallel
toestel?
4. Wat zijn de namen van commando’s die in dit hoofdstuk gebruikt zijn om een lijst van
waarden te gebruiken?
Oefeningen
1. Schrijf een OUTH commando en zet P8, P10, P12 hoog en P9, P11, P13 laag. Ga ervan uit dat
alle I/O pinnen starten als input, schrijf een DIRH commando dat ervoor zorgt dat de
genoemde pennen als uitgang lage en hoge signalen uitzenden terwijl P14, P15 gebruikt
worden als inputs.
2. Schrijf de waarden in OUTH die nodig zijn voor de volgende letters op de display: a, C, d, F, H,
I, n, P, S.
Project
1. Schijf “FISH CHIPS And dIP” opnieuw en opnieuw op de 7-segment LED display. Laat elke
letter 400ms staan.
Oplossingen
Q1. Het actieve element is een LED.
Q2. “Common cathode” betekent dat alle kathodes met elkaar zijn verbonden met dezelfde
aansluiting. “Common anode“ zou betekenen dat de anodes allemaal met elkaar verbonden
zijn met een aansluiting.
Q3. Een parallelle bus.
Q4. LOOKUP en LOOKDOWN werken met lijsten met waarden.
E1. De eerste stap voor het configureren van OUTH is deze op "1" te zetten voor elke bitpositie,
gespecificeerd als HIGH. Dus bits 8, 10, en 12 zet je op "1". Verder moet er een "0" voor elk
LOW signaal geplaatst te worden, dus bits 9, 11, en 13 worden "0". Om DIRH, te kunnen
programmeren dienen alle pinnen 8, 10, 12, 9, 11, en 13 als outputs ingesteld te worden door
ze op "1" te zetten. 15 en14 blijven inputs door ze op “0” te zetten. De tweede stap is om het
voorgaande om te zetten in PBASIC code.
Pagina 128 · Wat is een Microcontroller? NL HJK
Bit 15 14 13 12 11 10 9 8
OUTH 0 0 0 1 0 1 0 1
OUTH = %00010101
Bit 15 14 13 12 11 10
DIRH 0 0 1 1 1 1
9
1
8
1
DIRH = %00111111
De sleutel voor de oplossing van de vraag is om elke letter uit te schrijven en om te bepalen welke
segmenten er dienen op te lichten. Plaats een 1 op elke plaats van segmenten die dienen op te lichten,
vertaal dit dan naar binaire code voor de OUTH waarde. De BAFG.CDE segmentlijst voor de bits in het
OUTH commando kwamen uit Figuur 6-14 op pagina 121
Letter
a
C
d
F
H
I
n
P
S
LED Segmenten
e, f, a, b, c, g
a, f, e, d
b, c, d, e, g
a, f, e, g
f, e, b, c, g
f, e
e, g, c
all but c and d
a, f, g, c, d
B A F G.C D E
11110101
01100011
10010111
01110001
10110101
00100001
00010101
11110001
01110110
OUTH Value =
%11110101
%01100011
%10010111
%01110001
%10110101
%00100001
%00010101
%11110001
%01110110
Common
Cathode
10 9 8 7 6
G F
A B
A
F
B
G
C
E
D
E D
C DP
1 2 3 4 5
From Figuur 6-2 on page 113.
Common
Cathode
P1. Gebruik het schema van Figuur 6-11 op pagina 117. Om dit probleem op te lossen, pas
DisplayDigitsWithLookup.bs2 aan, gebruik het letterpatroon in Oefening 2.
In de oplossing zijn de letters als constanten gezet om het programma meer intuïtief te benaderen.
Binaire waarden gebruiken is goed, maar geeft meer kans op programmafouten (errors).
' What's a Microcontroller - Ch6Prj01_FishAndChips.bs2
' Use a lookup table to store and display digits with
' a 7-segment display. Spell out the message: FISH CHIPS And dIP
'{$STAMP BS2}
'{$PBASIC 2.5}
' Patterns of 7-Segment Display to create letters
A
CON
%11110101
C
CON
%01100011
d
CON
%10010111
F
CON
%01110001
H
CON
%10110101
I
CON
%00100001
n
CON
%00010101
P
CON
%11110001
S
CON
%01110110
space
CON
%00000000
index
VAR
Byte
' 19 chars in message
OUTH = %00000000
DIRH = %11111111
' All off to start
' All LEDs must be outputs
PAUSE 1000
' 1 sec. before 1st message
DO
DEBUG "index
"-----
OUTH
", CR,
--------", CR
FOR index = 0 TO 18
' 19 chars in message
LOOKUP index, [ F, I, S, H, space, C, H, I, P, S, space,
A, n, d, space, d, I, P, space ], OUTH
DEBUG "
PAUSE 400
NEXT
LOOP
", DEC2 index, "
", BIN8 OUTH, CR
' 400 ms between letters
Meten van licht · Page 129
Hoofdstuk 7: Meten van licht
APPARATEN MET LICHTGEVOELIGE SENSOREN
In eerdere hoofdstukken heb je kennisgemaakt met drukknoppen als krachtsensoren en potmeters als
sensoren voor positie en hoeken. Beide onderdelen komen heel erg vaak voor in elektronische
apparaten. Bedenk, hoeveel apparaten er wel niet zijn, met drukknoppen en draaiknoppen? Een andere
veelgebruikte sensor is de lichtgevoelige opnemer. We geven je een aantal voorbeelden van
toepassingen, die zonder lichtgevoelige sensor niet zouden werken:
•
•
•
•
•
•
Koplampen van een auto, die automatisch inschakelen als het donker wordt
Straatverlichting die automatisch inschakelt, als het donker wordt
Een automatische buitenlamp, die alleen ‘s nachts aan gaat als er iemand voorbij loopt
Laptopschermen, die meer licht geven in een lichte omgeving en dimmen, als er weinig licht is.
Camera’s met automatische belichting
De sensors in TV’s en DVD speller, die reageren op het infrarode licht van de afstandsbediening.
De eerste drie voorbeelden in de lijst hebben te maken met automatische verlichting en zijn
afhankelijk van lichtgevoelige sensoren die het omgevingslicht meten en zo het verschil kunnen
maken tussen dag en nacht. De ingebouwde elektronica moet weten, of het licht of donker is. In deze
toepassingen gebruiken we de lichtgevoelige sensoren dus eigenlijk als een aan/uit knop. Bij de
display van een laptop en bij de belichtingsinstellingen van een camera, wordt de informatie van de
lichtgevoelige sensor gebruikt om de hoeveelheid licht in de omgeving te meten. Hier gebruiken we de
sensor als een analoge sensor, die in een getal aangeeft, hoe donker of hoe licht het is. Dit is
vergelijkbaar met de potmetervoorbeelden uit Hoofdstuk 5, waar een getal de positie van de potmeter
aangaf.
De lichtsensor in een TV of DVD speler detecteert infrarood licht (IR). Dit licht is niet zichtbaar voor
mensen, maar wordt wel herkend door veel elektronische apparaten. Als je naar de voorkant van een
afstandbediening kijkt, zie je alleen maar een heldere IR-LED. Maar als je op een knop van de
afstandsbediening drukt, lijkt het of er niets gebeurt, ondanks dat de afstandsbediening een gecodeerd
signaal uitzendt en de LED aan en uit knippert. Maar wij kunnen dat niet zien omdat onze ogen niet
gevoelig zijn voor infrarood licht. Als naar de LED kijkt via een digitale camera, zie je opeens een fel
witte vlek als je op een knop van de afstandsbediening drukt. Wit licht bevat alle kleuren van het
spectrum. Dat betekent, dat de rode, de groene en de blauwe sensor alle drie gevoelig zijn voor
infrarood licht. En zo komt het, dat we het infrarood van de LED als wit zien op de camera.
Meer over infrarood LED’s en ontvangers:
De Boe-Bot is een goed voorbeeld in de robotica, waar de BASIC Stamp, die de robot
controleert gebruik maakt van dezelfde IR LED als in de afstandsbediening van een TV en
de IR- ontvanger van een TV. De Boe-Bot gebruikt de LED als een soort zaklamp en met de
IR-ontvanger worden reflecties van objecten aan de voorkant gedetecteerd. In het hoofdstuk
IR Remote for the Boe-Bot wordt uitgelegd, hoe je de BASIC Stamp kunt programmeren,
om de signalen van een IR-afstandsbediening te decoderen. Daardoor kun je robot met de
afstandsbediening
besturen.
Het ontwerp van een apparaat, bepaalt welk soort het licht het apparaat kan waarnemen. Zo moeten
apparaten, die lichtsensoren gebruiken om zich aan te passen aan het omgevingslicht, zichtbaar licht
kunnen meten. De rode, groene en blauwe pixelsensoren in een digitale camera meten onafhankelijk
van elkaar de intensiteit van specifieke kleuren voor de digitale afbeelding. De IR-sensor in een TV
kijkt naar infrarood licht dat aan / uit knippert met een frequentie van ongeveer 40 kHz. En dit zijn
maar een paar voorbeelden want elke applicatie stelt zijn eigen eisen aan de gebruikte lichtsensor.
Figuur 7-1 Laat een paar voorbeelden zien van de vele beschikbare lichtsensoren voor verschillende
toepassingen. Van links naar rechts zie je een fototransistor, een cadmiumsulfide lichtgevoelige
Pagina 130 · Wat is een Microcontroller? NL HJK
weerstand, een lineaire lichtgevoelige sensor, een blauw verbeterde fotodiode, een licht naar
frequentieomzetter, een infrarood fototransistor en een infraroodontvanger, zoals die in een TV wordt
gebruikt.
Figuur 7-1 Voorbeelden van lichtgevoelige Sensors
Meer over de Cadmium Sulfide (CdS) Cel of lichtgevoelige weerstand of
fotoweerstand
De Cadmium Sulfide (CDS) cel of fotoweerstand was een van de meest voorkomende
omgevingslicht sensoren in automatische verlichtingen. Door de komst van nieuwe regels
van de Europese Unie om het gebruik van gevaarlijke stoffen (RoHS-richtlijn) te beperken,
kunnen de lichtgevoelige weerstanden van cadmium sulfide niet langer worden toegepast in
de meeste apparaten in Europa. De fotoweerstand is daardoor versneld vervangen door de
fototransistor en de lineaire lichtsensor. Als gevolg van deze veranderingen wordt in deze
uitgave nu een fototransistor gebruikt voor het opsporen van lichtniveaus in plaats van een
fotoweerstand.
De documentatie van iedere lichtsensor beschrijft voor wat voor licht de sensor gevoelig is. Hiervoor
wordt meestal het begrip golflengte gebruikt. De afstand tussen elkaar opvolgende golven wordt
golflengte genoemd. Stel je de golven in de zee voor. De afstand tussen elke piek (of schuimkop) van
golf tot golf wordt de golflengte genoemd. Van licht kan de golflengte op een vergelijkbare manier
worden gemeten. Maar we meten dan de afstand tussen twee pieken van de elektromagnetische
trillingen van licht. Elke kleur licht heeft zijn eigen golflengte. We noemen licht zichtbaar, als een
menselijk oog het kan waarnemen. Figuur 7-2 toont golflengten van zichtbaar licht, maar ook voor
sommige soorten licht die het menselijk oog niet kan zien. Mensen kunnen geen ultraviolet en
infrarood licht zien. Golflengten worden gemeten in nanometer, afgekort nm. Een nanometer is een
miljardste meter (1/1000.000.000).
Figuur 7-2 Kleuren en de golflengte van licht
Wavelength (nm) 10…380
Color
Ultraviolet
450
Violet
495
Blue
570 590 620
Green
Orange
Yellow
750…100,000
Infrared
Red
NOOT: Als je dit plaatje in een zwart-wit gedrukt boek leest, kun je ook de PDF downloaden,
waarin de plaatjes in kleur zijn te zien. Kijk daarvoor op www.parallax.com/go/WAM.
Meten van licht · Page 131
INTRODUCTIE VAN DE FOTOTRANSISTOR
Een transistor is net een klep waar een bepaalde hoeveelheid elektrische stroom van aansluiting C naar
aansluiting E stroomt. De derde aansluiting van de transistor (B) bepaalt hoeveel stroom er door de
transistor stroomt. Afhankelijk van het type transistor, kan de stroom worden gecontroleerd door
spanning, stroom, of in het geval van de PHOTOTRANSISTOR, door licht. Figuur 7-3 laat het
symbool zien, dat we in een schema gebruiken. Rechts staat de afbeelding van de fototransistor die in
een Wat in een Microcontroller kit aanwezig is. Hoe meer licht er op de basis van de fototransistor (B)
valt, hoe meer stroom er van de collector (C) aansluiting, naar de emitter (E) stroomt. Omgekeerd
geldt ook, dat er bij minder licht ook minder stroom loopt.
B
C
Figuur 7-3
fototransistor schemasymbool en
tekening
B
E
E
C
Deze fototransistor is het gevoeligst voor infrarood licht met een golflengte van 850 nm, (Figuur 7 2).
De transistor reageert ook op zichtbaar licht, maar is iets minder gevoelig voor golflengten met een
golflengte van minder dan 450 nm. Dat is links van blauw in Figuur 7 2. Licht van halogeenlampen en
gloeilampen, maar vooral zonlicht, geven naast zichtbaar licht, ook heel veel infrarood licht. TLlampen geven bijna geen infrarood af. Eigenlijk is infrarood licht hetzelfde als warmte. Je voelt, dat
een TL-lamp veel minder warm is dan een gloeilamp. Een infrarood transistor reageert goed op al deze
bronnen van licht en is het meest gevoelig voor zonlicht, daarna voor halogeenlicht en gloeilampen en
iets minder gevoelig voor fluorescentielampen (TL en spaarlamp).
Bij het ontwerpen van schakelingen met lichtgevoelige transistoren moet je rekening houden met het
soort licht. In dit hoofdstuk wordt de schakeling ontworpen voor gebruik binnenshuis. Er is ook een
toepassing, waarbij licht buitenshuis wordt gemeten. Maar daar wordt geen transistor gebruikt, maar
verrassend genoeg een licht- emitterende diode (LED).
OPDRACHT #1: BOUWEN EN TESTEN VAN EEN LICHTMETER
In Hoofdstuk 5 werd uitgelegd, hoe je de tijd van de spanningsval over een weerstand en condensator
(RC-tijd) kunt meten met de RCTIME opdracht. Je meet dan feitelijk de tijd, die nodig was om een
condensator zijn lading te laten verliezen over de variabele weerstand binnen een potentiometer. Bij
een grotere weerstand (voor elektrische stroom), vertraagde de potentiometer het tempo, waarmee de
condensator zijn lading verloor. Een kleinere weerstanden versnelde het ontladen juist. De meting van
de RC-tijd was een indicatie voor de weerstand van de potentiometer. En die op zijn beurt maakte het
mogelijk om met de BASIC Stamp de positie van de potmeter te meten.
Wanneer een FOTOTRANSISTOR in een RC-schakeling geplaatst wordt, waarbij de transistor meer
of minder stroom doorlaat, als er meer of minder licht op de transistor schijnt, dan gedraagt de
transistor zich net als de potentiometer. Wanneer er meer licht op de fototransistor schijnt, voert deze
meer stroom en verliest de condensator zijn lading sneller. Met minder licht voert de fototransistor
minder stroom en verliest de condensator zijn lading minder snel. Dus kan dezelfde RCTIME meting,
die ons een indicatie gaf van de positie van de wijzerplaat met een potentiometer uit Chapter 5, nu
worden gebruikt voor het meten van lichtniveaus met een fototransistor.
In de volgende activiteit ga je een RC-schakeling bouwen en testen een schakeling waarmee we de
ontlaadtijd meten van een condensator waarbij de stroom wordt afgevoerd via een fototransistor. De
meting van de RC-tijd geeft je een idee van de hoeveelheid licht die op het gevoelige oppervlak van
fototransistor valt. Net als bij de oefening met de potentiometer wordt de RC-tijd gemeten met het
RCTIME commando. Het resultaat zal worden weergegeven in de Debug Terminal.
Pagina 132 · Wat is een Microcontroller? NL HJK
Onderdelen voor de lichtmeter
(1) fototransistor
(1) weerstand – 220 Ω (rood-rood-bruin)
(2) Condensator – 0.01 µF (gemerkt met 103)
(1) Condensator – 0.1 µF (gemerkt met 104)
(1) Jumper wire
Bouw een RC schakeling met een fototransistor
Figuur 7-4 laat de schakeling en de schematische opbouw zien van de RC-schakeling, die je gaat
gebruiken in dit hoofdstuk. Deze schakeling wijkt op een tweetal punten af van de
potentiometerschakeling van Hoofdstuk 5, Opdracht #3. Ten eerste gebruiken we nu P2 als I / O-pin
om de tijd te meten. Ten tweede is de potentiometer vervangen door een fototransistor.
Tip: Laat het 7-segment LED display aangesloten zitten en zet de schakeling van de
fototransistor erbij. We zullen het 7-segment LED display gaan gebruiken samen met de
fototransistor in Opdracht #4.
9 Bouw de schakeling op als in Figuur 7-4.
9 Zorg ervoor, dat aansluitingen van collector en emitter (C and E) van de fototransitor precies
zo zijn aangesloten als in de opstelling is getekend.
Vdd
Vin
Figuur 7-4
fototransistor RC-tijd
Schema en bedrading
Vss
X3
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Start met de 0.01 µF
condensator, 103
gemerkt.
Langere pin (C)
aansluitingl
Vlakke kant
(E) aansluitingl
Programmeren van de test van de fototransistor
Het eerste voorbeeldprogramma (TestPhototransistor.bs2) is eigenlijk alleen maar een licht aangepaste
versie van ReadPotWithRcTime.bs2 uit Hoofdstuk 5, Opdracht #3. De potentiometerschakeling van
Hoofdstuk 5 is aangesloten op I / O pin P7. De schakeling in deze activiteit is aangesloten op P2.
Daarom zijn twee commando's aangepast. De HIGH 7 opdracht uit het vorige voorbeeldprogramma is
nu HIGH 2, aangezien de fototransistorschakeling is aangesloten op P2 en niet op P7. Om dezelfde
reden is het commando RCTIME 7, 1, time veranderd in RCTIME 2, 1, time.
Meten van licht · Page 133
Voorbeeldprogramma: TestPhototransistor.bs2
Een fototransistor verzamelt licht aan de bovenkant van de doorzichtige plastic koepel. Dit is tevens de
basis (B) aansluiting, weergegeven in Figuur 7-3. Het kleine zwarte vierkantje ,dat zichtbaar is door
de koepel, is de eigenlijke fototransistor. De echte transistor is dus eigenlijk alleen het heel kleine
stukje silicium. De rest is verpakking inclusief plastic behuizing en aansluiting.
We draaien nu dus niet aan een knop, zoals we dat in Hoofdstuk 5 deden In deze schakeling is de
potmeter vervangen door de fototransistor, waarbij de stroom afhankelijk is van de hoeveelheid licht,
die op het lichtgevoelige oppervlak valt. Als het voorbeeldprogramma loopt, laat de Debug
Aansluiting een kleine waarde zien als er veel licht op de transistor valt en een grote waarde, als er
weinig licht op de transistor valt.
Vermijd direct zonlicht ! De schakeling en de onderdelen zijn bedoeld, om variaties in licht
binnenshuis te meten. Werk daarom ook binnenshuis. Sluit eventueel gordijnen, om inval
van direct zonlicht te voorkomen.
9 Laad en start TestPhototransistor.bs2.
9 Schrijf de waarde van de time variabele op, die in de Debug Terminal te zien is bij normaal
licht.
9 Maak met je hand een schaduw boven de schakeling en controleer de time variabele opnieuw.
Het getal zou nu groter moeten zijn.
9 Scherm nu met je hand de hele transistor zoveel mogelijk af van licht. De Debug Terminal
moet nu voor time. een flink grotere waarde laten zien.
' What's a Microcontroller - TestPhototransistor.bs2
' Read phototransistor in RC-time circuit using RCTIME command.
' {$STAMP BS2}
' {$PBASIC 2.5}
time
PAUSE 1000
VAR
Word
DO
HIGH 2
PAUSE 100
RCTIME 2, 1, time
DEBUG HOME, "time =
LOOP
", DEC5 time
Jouw beurt – gebruik een andere condensator voor andere lichtomstandigheden
Tijdmetingen met een 0.1 μF condensator zullen tien keer zo lang duren als een meting met een 0.01
μF condensator. De waarde van de timevariabele op de Debug Aansluiting zou dus ook tien keer zo
groot moeten worden. Het vervangen van de 0.01 μF condensator door een 0.1 μF condensator kan
nuttig zijn in een helder verlichte kamer. Als er meer licht op de transistor valt, loopt er meer stroom.
Daardoor wordt de condensator sneller ontladen en wordt de RC-tijd korter. Door het vergroten van de
condensator wordt de tijd bij dezelfde stroom (lichtinval) 10x zo groot. Stel, de lichtomstandigheden
zijn erg helder en de metingen variëren slechts van 1 tot 13 met de 0,01 μF condensator. Als je deze
dan vervangt door een 0.1 μF condensator, zullen je metingen opeens variëren van 1 tot 130 en
hierdoor is je toepassing gevoelig voor licht variaties binnen deze kamer met deze
lichtomstandigheden.
9 Pas de schakeling aan door de 0.01 μF condensator te vervangen door de 0.1 μF condensator
(gemerkt 104).
9 Herstart het programma TestPhototransistor.bs2 en controleer, of de meting van de RC-tijd
ongeveer 10 keer zo lang is als bij de vorige meting.
Het langste tijdsinterval, dat met het RCTIME commando kan worden gemeten, is 65535 eenheden van
elk 2 microseconden. Dit komt overeen met een tijdsinterval van: 65535 × 2 microseconden = 131 ms
Pagina 134 · Wat is een Microcontroller? NL HJK
= 0,131 s. Als de RC-tijd langer wordt dan 0,131 seconde, geeft het de RCTIME commando 0 aan om
aan te geven dat de maximale tijd werd overschreden.
9 Kun je de schaduw over de transistor zo donker maken, dat de maximale meettijd van 65535
wordt overschreden en het RCTIME commando een 0 geeft?
9
In de volgende activiteit gaan we weer met de kleine condensator verder.
9 Maar voordat je met de volgende opdracht doorgaat, moet je de condensator van 0.1 μF
vervangen door die van 0.01 μF.
OPDRACHT #2: HET VOLGEN VAN VERANDERINGEN VAN LICHT
Een van de handige functies van de BASIC Stamp module is, dat je spanning kunt uitschakelen zonder
dat het programma uit het geheugen verdwijnt. Zodra de stroom weer wordt ingeschakeld, start het
programma weer. Aangezien het programma meestal niet het hele geheugen van de BASIC Stamp
module vult, is er een gedeelte dat niet wordt gebruikt. Dat kan worden gebruikt om gegevens op te
slaan. Dit geheugen is vooral handig om gegevens op te slaan, die je niet wilt verliezen als de spanning
wordt uitgeschakeld. De waarden van gewone variabelen worden wel gewist wanneer de stroom wordt
uitgeschakeld.
Wat is datalogging? Als je een waarde, bijvoorbeeld de buitentemperatuur, over langere
tijd zou willen volgen, zou je iemand buiten periodieke metingen kunnen laten doen en deze
waarden iedere minuut kunnen laten opschrijven. Sinds lange tijd bestaat er automatische
apparatuur, die dergelijke metingen uitvoert en opslaat. Bij een weerstation moest een
wetenschapper regelmatig de waarden gaan ophalen. Maar tegenwoordig kunnen deze
gegevens op afstand uitgelezen worden, bijvoorbeeld met een mobiele telefoon. Als je deze
periodieke metingen met een microcontroller zou willen meten, dan wil je die waarde vaak
een tijdje bewaren. Een dergelijke meetwaarde zou bijvoorbeeld de omgevingstemperatuur
of de hoeveelheid licht kunnen zijn. Je meet de gegevens met een vast interval in tijd en
slaat de waarde telkens op, om die later weer uit te lezen. Dat noemen we Datalogging
(letterlijk, opschrijven van gegevens
De geheugenchip op de BASIC Stamp, die programma en gegevens (data) opslaat, is weergegeven in
Figuur 7-5. Deze chip wordt een EEPROM genoemd, wat staat voor Electrically Erasable
Programmable Read-Only Memory. Dat is nogal een mondvol, en het uitspreken van elk van de eerste
letters in EEPROM is nog veel werk. Dus, wanneer mensen praten over een EEPROM, zeggen ze
meestal: "EE-Prom".
2 KB EEPROM
opslag voor je
PBASIC
programma
Figuur 7-5
EEPROM Chip op de
BASIC Stamp Module
Deze EEPROM is de
opslag van je
programmageheugen en
gegevens. Het
programma blijft bewaard
wanneer de spanning is
uitgeschakeld.
Figuur 7-5 laat het geheugen van de BASIC Stamp in een venster zien. Je kunt in een oogopslag
meerdere geheugenplaatsen tegelijk zien. We noemen dit een memory map (letterlijk: kaart van het
geheugen). Je kunt dit venster bekijken door te klikken op de BASIC Stamp Editor's Run-menu en de
selectie Memory Map.
De Memory Map (Geheugenkaart) maakt gebruik van verschillende kleuren om aan te geven hoe de
geheugenplaatsen voor variabelen in het werkgeheugen in de BASIC Stamp module (RAM: variabelen
in random access memory) en EEPROM (programma geheugen) worden gebruikt. Het rode vierkant
Meten van licht · Page 135
in de schuifbalk helemaal links geeft aan, welk deel van de EEPROM zichtbaar is in de EEPROM
Map. Door op dit vierkant te klikken en te slepen kun je door de verschillende delen van het
EEPROM-geheugen heen bladeren. Door het rode vierkant naar beneden te slepen kun je zien, hoeveel
EEPROM-geheugen wordt gebruikt door TestPhototransistor.bs2 van Activiteit # 1. De
geheugenplaatsen die programmainstructies (tokens) bevatten, zijn in blauw gemarkeerd. Je kunt hier
zien, dat dit programma slechts 35 bytes van de 2.048 byte EEPROM gebruikt. De resterende 2013
bytes zijn vrij om gegevens op te slaan.
Figuur 7-6
Memory Map
Om deze
window te
kunnen zien,
moet je eerst
Run klikken en
dan Memory
Map kiezen.
De EEPROM Map laat de adressen zien als hexadecimale waarden, die kort werden besproken in het
kader over Decimaal versus Hexadecimaal op pagina 122. De waarden aan de linkerkant laten het
startadres van elke rij bytes zien. De getallen langs de bovenkant laten het byteadres binnen die rij
zien in hexadecimaal. Zoals je nog weet, komt hexadecimaal van 0 tot en met F overeen met
decimaal van 0 tot 15. Bijvoorbeeld in Figuur 7-6, is de hexadecimale waarde C1 opgeslagen op het
adres 7E0. CC is opgeslagen op het adres 7E1, 6D is opgeslagen op het adres 7E2, en zo verder, tot
E8, die is opgeslagen op het adres 7EF. Als je omhoog en omlaag beweegt met de schuifbalk, zie je
dat het hoogste geheugenadres aan de onderkant van de EEPROM map staat en het kleinste adres aan
de bovenkant, waarbij de bovenste rij begint bij 000.
PBASIC programma's worden altijd opgeslagen op de hoogste adressen in EEPROM, die zichtbaar
zijn aan de onderkant van de EEPROM map. Als je dus een programma gaat maken om gegevens in
EEPROM op te slaan, moet het beginnen bij de laagste adressen, te beginnen bij adres 0. Hierdoor
wordt voorkomen, dat je gegevens opslaat in het gebied van het PBASIC programma, wat meestal
resulteert in een programma crash. In het geval van de EEPROM map van Figuur 7-6, is het PBASIC
programma opgeslagen op adres 7FF tot 7DD. Je eigen gegevens kan je dus opslaan op adres van 000
tot 7DC (Decimaal 0 tot en met 2012).
Als je van plan bent gegevens op te slaan in EEPROM, is het handig, als je getallen kunt omzetten van
hexadecimaal naar decimaal en omgekeerd, om het hoogst bruikbare adres te kunnen berekenen.
Hieronder staat de wiskunde voor het omzetten van het getal 7DC van hexadecimaal naar decimaal.
Hexadecimaal is een numeriek systeem met een basis van 16. In dit getallensysteem, wordt gebruik
gemaakt van 16 verschillende cijfers om de getallen aan te geven. De cijfers 0 tot 9 vertegenwoordigen
de eerste 10 waarden, en de letters A tot F- vertegenwoordigen de waarde 10 tot 15. Bij conversie
vanaf hexadecimaal naar decimaal, vertegenwoordigt elk cijfer aan de rechterzijde een macht van
zestien. Het meest rechtse cijfer is het aantal keren 160 (=1). Het volgende cijfer geeft het aantal keren
161 (=16). Het derde cijfer is het aantal keer 162s (=256).
Hexadecimaal 7DC
=
=
=
=
=
(7 × 162) + (D × 161) + (C × 160)
(7 × 162) + (13 × 161) + (12 × 160)
(7 × 256) + (13 × 16) + (12 × 1)
1792 + 208 + 12
2012 (decimale waarde)
Pagina 136 · Wat is een Microcontroller? NL HJK
Deze conversieaanpak werkt hetzelfde in andere bases, zoals bij decimale waarden:
2102 = (2 × 103) + (1 × 102) + (0 × 101) + (2 × 100)
= (2 × 1000) + (1 × 100) + (0 × 10) + (2 × 1)
2048 bytes = 2 KB.
Hoewel zowel de hoofdletter "K" als de kleine "k" "worden aangeduid met" kilo, " is de
betekenis niet helemaal gelijk. In de elektronica en informatica wordt de hoofdletter K
gebruikt voor een binaire kilobyte, dat is 1 × 210 = 1024 bytes. Bij de vermelding van precies
3
1000 bytes, gebruik je de kleine k, die staat voor kilo en is 1 x 10 = 1000 in het metrieke
stelsel.
De hoofdletter "B" staat ook voor bytes, terwijl de kleine letters "b" staan voor bits. Dit kan
een groot verschil maken, want 2 Kb is 2048 bits, wat 2048 verschillende getallen zijn, maar
elk nummer heeft een waarde van 0 of 1. In tegenstelling hiermee, is 2 KB 2048 bytes, die
elk een waarde kunnen bevatten in de reeks 0-255.
Het gebruik van de EEPROM voor dataopslag kan heel nuttig zijn voor toepassingen, die op afstand
werken. Een voorbeeld van een externe applicatie is een temperatuurmonitor die op een vrachtwagen
is geplaatst die diepgevroren goederen vervoert. Het zou het temperatuurverloop tijdens de gehele reis
kunnen opnemen, om te controleren of de lading onderweg niet is ontdooid. Een tweede voorbeeld is
een weermeetstation. In het weerstation wil je bijvoorbeeld het verloop van lichtniveaus vastleggen om
die later op te halen. De hoeveelheid licht kan bijvoorbeeld een indicatie geven van de bewolking
gedurende de dag en sommige studies gebruiken deze meetwaarden om te bepalen, wat het effect is
van luchtvervuiling en van condensatiesporen van vliegtuigen (con trails).
In de volgende opdracht leer je om gemeten lichtwaarden op te slaan in EEprom, om ze later weer op
te halen. Hierdoor wordt het mogelijk, om veranderingen van lichtintensiteit op te slaan en te volgen.
In deze activiteit gebruik je eerst een PBASIC programma dat een reeks van licht metingen opslaat in
EEPROM van de BASIC Stamp module. Nadat het programma klaar is, start je een tweede
programma, dat de waarden weer uit EEPROM leest en in de Debug Aansluiting weergeeft.
Een programma om gegevens voor langere tijd op te slaan
Het WRITE commando wordt hier gebruikt, om waarden in de EEPROM op te slaan. Het READ
commando wordt gebruikt om de waarden weer terug te lezen.
Je kunt het WRITE commando op de volgende manier gebruiken (We noemen dat de syntax van een
commando):
WRITE Location, {WORD} Value
Als je bijvoorbeeld de waarde van 195 wilt opslaan in adres 7 van de EEPROM, kun je het volgende
commando gebruiken:
WRITE 7, 195
Getallen van het type word kunnen iedere waarde aannemen tussen 0 en 65565, terwijl getallen van
het type byte waarden kunnen bevatten tussen 0 en 255. Een getal van het type word neemt de ruimte
van twee bytes. Als je een getal van het type word naar EEPROM wilt schrijven, moet je gebruik
maken van de optionele Word aanduiding, die er voor zorgt, dat je het getal opslaat in twee bytes.Let
dus op, als je getallen van het type word opslaat. Aangezien een woord twee bytes bezet, moet je het
volgende byteadres in EEPROM overslaan als je het volgende word wilt schrijven. Veronderstel, dat
we twee word waarden in EEPROM willen opslaan: 659 en 50012. De eerste waarde willen we
opslaan op adres 8. Het tweede word moet dan op adres 10 geschreven worden.
WRITE 8, Word 659
WRITE 10, Word 50012
Meten van licht · Page 137
Is het om gegevens over je programma te schrijven? Jazeker. En als dat gebeurt, loop
je het risico, dat je programma zich vreemd gaat gedragen, of helemaal stopt. Een PBASIC
program bevind zich op de hoogste EEPROM adressen, Je kunt het beste je gegevens
opslaan, beginnend op het laagst mogelijke adres in Location van het commando WRITE
Hoe weet ik, of het adres, dat ik wil gebruiken voor opslag, niet te groot is? In de
Memory map kun je zien, waar je PBASIC programma begint. De uitleg na Figuur 7-6 op
pagina 135 legt uit, hoe je kunt uitrekenen hoeveel geheugenadressen je beschikbaar hebt.
Om zelf geen adressen om te hoeven rekenen van hexadecimaal naar decimaal en
omgekeerd, kun je de hexadecimale formatteerinstructie $ gebruiken in het DEBUG
commando:
DEBUG DEC $7DC
Je programma zal nu een hexadecimaal getal weergeven als een decimale waarde. De
hexadecimale waarde 7DC wordt door het $ teken (hexadecimale formatteerinstructie)
gebruikt als een hexadecimaal getal in het DEBUG commando. Vervolgens zorgt de DEC
formatteerinstructie om het getal via het DEBUG commando als decimale waarde te laten
zien.
Voorbeeld Programma: StoreLightMeasurementsInEeprom.bs2
Dit voorbeeldprogramma laat zien, hoe je iedere 5 seconden en gedurende de 2 ½ minuut gemeten
lichtintensiteiten kunt opslaan in EEPROM. Net als in het vorige programma kun je de waarden op
de Debug Terminal zien, maar tegelijkertijd, wordt iedere waarde opgeslagen in EEPROM om ze later
weer uit te lezen met het tweede programma, dat het READ commando gebruikt.
9 Laad en start LightMeasurementsInEeprom.bs2.
9 Noteer de metingen, die je in de Debug Terminal ziet, zodat je ze later kunt vergelijken met de
waarden ,die uit de EEPROM worden opgehaald.
9 Laat gedurende de meting van 2 ½ minuut geleidelijk een schaduw over de sensor vallen om
de gegevens te variëren.
Als je een USB-bordje hebt kan het zijn, dat je BASIC Stamp een reset krijgt, waardoor het
programma opnieuw start. In dat geval zou je daarna met een nieuwe set van metingen starten.
9 Nadat je de metingen met StoreLightMeasurementsInEeprom.bs2 hebt afgerond, schakel je de
spanning van het bordje uit en laat je het uit, tot je de gegevens wilt gaan uitlezen met het
volgende programma: ReadLightMeasurementsFromEeprom.bs2.
Je kunt de wachttijd in de FOR…NEXT loop aanpassen. In dit voorbeeldprogramma wordt
steeds 5 seconden gewacht tot de volgende meting. Misschien is dat voor jouw toepassing
te lang. Je kunt dan het commando PAUSE 5000 aanpassen naar PAUSE 500 waardoor er
iedere ½ seconde een meting gedaan wordt. Het programma loopt dan 10 keer zo snel. Het
regelmatig meten met een vast interval en het opslaan van de gegevens is een typisch
kenmerk van datalogging
' What's a Microcontroller - StoreLightMeasurementsInEeprom.bs2
' Write light measurements to EEPROM.
' {$STAMP BS2}
' {$PBASIC 2.5}
time
eepromAddress
VAR
VAR
Word
Byte
PAUSE 1000
DEBUG "Starting measurements...", CR, CR
"Measurement
Value", CR,
"---------------", CR
FOR eepromAddress = 0 TO 58 STEP 2
HIGH 2
PAUSE 5000
RCTIME 2, 1, time
DEBUG DEC2 eepromAddress,
"
", DEC time, CR
Pagina 138 · Wat is een Microcontroller? NL HJK
WRITE eepromAddress, Word time
NEXT
DEBUG "All done. Now, run:", CR,
"ReadLightMeasurementsFromEeprom.bs2"
END
Hoe het programma StoreLightMeasurementsInEeprom.bs2 werkt
De FOR...NEXT loop, die de meting van de RC-tijd uitvoert, slaat de gemeten waarden op in de
EEPROM , waarbij het adres voor de waarde in stappen van 2 telt, omdat er word waarden in de
EEPROM worden geschreven.
FOR eepromAddress = 0 to 58 STEP 2
Het RCTIME commando slaat de waarde van de meting van de RC-tijd op in de word variabele time.
RCTIME 2, 1, time
De waarde van de variabele time wordt in de EEPROM op het adres geschreven, dat in de variabele
eepromAddress staat. En dit gebeurt iedere keer, dat de lus wordt doorlopen Je weet nog, dat het
address voor een WRITE commando altijd wordt uitgedrukt in bytes. Daarom wordt de variabele met
het eepromAddress variable tijdens iedere uitvoering van de lus met 2 opgehoogd. Want een Word
variabele neemt de plaats in van twee bytes.
WRITE eepromAddress, Word time
NEXT
Programmeren van het teruglezen van de gegevens
Om de gegevens, die je net hebt opgeslagen in de EEPROM weer terug te lezen, kun je het READ
commando gebruiken. De syntax (schrijfwijze) van het READ commando is:
READ Location, {WORD} Variable
Terwijl het WRITE commando waarden en constanten naar EEPROM kan schrijven, doet het READ
commando precies het omgekeerde. Dit commando kopieert de waarde van een adres in EEPROM
naar een variabele. Dus zoals de naam variabele al aangeeft, moet het Variable argument een variabele
naam krijgen.
Houd in gedachten, dat variabelen in de BASIC Stamp worden opgeslagen in RAMgeheugen. Waarden die in RAM zijn opgeslagen, verliezen hun waarde, zodra de spanning
is afgeschakeld, of als de resetknop wordt ingedrukt.
De BASIC Stamp 2 heeft 26 bytes in RAM. Die zijn zichtbaar aan de rechterzijde in de
Memory Map van Figuur 7-6 op page 135. Als je een word variabele declareert, gebruik je
twee bytes. Een byte variabele declaratie gebruikt een byte. Een Nibble gebruikt een halve
byte. Een bit gebruikt 1/8 van een byte.
Laten we aannemen, dat eepromValueA en eepromValueB Word variabelen zijn en littleEE een
Byte variabele.
Deze variabelen worden aan het begin van het programma gedefinieerd
(gedeclareerd) met behulp van de VAR variabele declaratie. Hier volgen een paar commando’s om de
opgeslagen waarden weer teruglezen die eerder in bepaalde EEPROM adressen waren opgeslagen met
een WRITE commando, misschien wel met een ander programma.
READ 7, littleEE
READ 8, Word eepromValueA
READ 10, Word eepromValueB
Het eerste commando haalt een bytewaarde op uit de EEPROM van adres 7 en slaat de waarde op in
de variabele genaamd littleEE. Het volgende commando haalt een word van 2 bytes op uit
EEPROM van de byte adressen 8 en 9 en slaat de waarde op in de word variabele eepromValueA. Het
Meten van licht · Page 139
laatste commando van de drie leest het woord van de EEPROM byte adressen 10 en 11 en slaat de
waarde op in de variabele eepromValueB.
Voorbeeldprogramma: ReadLightMeasurementsFromEeprom.bs2
Het volgende voorbeeldprogramma laat zien, hoe je het READ commando kunt gebruiken om de
lichtmetingen, die eerder waren opgeslagen, uit de EEPROM te lezen met behulp van het programma
StoreLightMeasurementsInEeprom.bs2.
9 Schakel de spanning van het bordje weer in.
9 Laad binnen 5 seconden na het inschakelen van de spanning het programma
ReadLightMeasurementsFromEeprom.bs2 in de BASIC Stamp Editor.
9 Klik de Run button in de BASIC Stamp Editor.
Wacht niet langer dan 6 seconden tussen het inschakelen en het laden van het
programma ReadLightMeasurementsFromEeprom.bs2 in de BASIC Stamp. Anders start het
nog aanwezige programma (StoreLightMeasurementsInEeprom.bs2) opnieuw en begint het
met het opslaan van een reeks nieuwe metingen. Als je de tijd hebt aangepast in het
PAUSE commando’s Duration argument, dan heb je maar 1,5 seconde!
9 Vergelijk de tabel, die het programma StoreLightMeasurementsInEeprom.bs2 je laat zien in de
Debug Terminal, met de waarden die je eerder hebt opgeschreven.
' What's a Microcontroller - ReadLightMeasurementsFromEeprom.bs2
' Read light measurements from EEPROM.
' {$STAMP BS2}
' {$PBASIC 2.5}
time
eepromAddress
VAR
VAR
Word
Byte
PAUSE 1000
DEBUG "Retrieving measurements", CR, CR,
"Measurement
Value", CR,
"--------------", CR
FOR eepromAddress = 0 TO 58 STEP 2
READ eepromAddress, Word time
DEBUG DEC2 eepromAddress, "
", DEC time, CR
NEXT
END
Hoe ReadLightMeasurementsFromEeprom.bs2 werkt
Net als bij het WRITE commando, werkt het READ commando op byte-adressen. En omdat we
wordwaarden uit de EEPROM willen lezen, moet de variabele eepromAddress telkens met 2
opgehoogd worden voor iedere keer, dat de FOR...NEXT loop wordt uitgevoerd.
FOR eepromAddress = 0 to 58 STEP 2
Het READ commando leest de waarde van het word van adres eepromAddress uit de EEPROM en
slaat de waarde op in de variabele time.
READ eepromAddress, Word time
De waarde van beide variabelen time en eepromAddress worden naast elkaar in een tabel op de
Debug Aansluiting getoond.
DEBUG DEC2 eepromAddress, "
NEXT
", DEC time, CR
Pagina 140 · Wat is een Microcontroller? NL HJK
Jouw beurt- Meer metingen
9 Pas het programma StoreLightMeasurementsInEeprom.bs2 zo aan, dat er twee keer zoveel
metingen worden opgeslagen in dezelfde tijd.
9 Pas ReadLightMeasurementsFromEeprom.bs2 zo aan, dat het alle metingen van het zojuist
aangepaste StoreLightMeasurementsInEeprom.bs2 laat zien.
OPDRACHT #3: GRAFIEKEN MAKEN VAN DE METINGEN (OPTIONEEL)
Het verwerken en analyseren van lijsten met metingen ,zoals in Opdracht #2, kunnen heel saai en
vervelend zijn. Stel dat je in de honderden getallen op zoek bent naar het moment, dat de zon onder
ging. Of misschien ben je op zoek naar het moment, dat de lichtsensor kort was bedekt. Misschien ben
je op zoek naar een patroon in de keren, dat de lichtsensor was bedekt. Deze informatie kan
bijvoorbeeld nuttig zijn, als de lichtsensor in een gebied is geplaatst waar mensen of dieren lopen. Of
misschien moet je analyseren, hoe vaak voorwerpen op een transportband voorbijkomen. In alle
gevallen probeer je in een lange lijst van getallen gebeurtenissen en patronen te vinden. En dat kan een
lastige en tijdrovende taak zijn.
Als je nu eens een grafiek van de lijst met metingen kon maken, zou dat het vinden van
gebeurtenissen en patronen een stuk eenvoudiger maken. De persoon, het dier of het voorwerp op de
lopende band , die de sensor passeren, zouden worden weergegeven als een punt of een hoge piek in
de metingen. Figuur 7-7 toont een voorbeeld van zo’n grafiek, waaruit je kunt opmaken, met welke
snelheid de voorwerpen op de lopende band de sensor passeren. De pieken in de grafiek ontstaan, als
de meetwaarde groot is. In het geval van de lopende band geeft dit aan, dat er een voorwerp voorbij de
sensor is gegaan en daardoor het licht heeft afgeschermd van de sensor. De grafiek maakt in een
oogopslag duidelijk, dat er iedere 7 seconden een object langs de sensor, maar dat het object we
hadden verwacht rond 28 seconden niet is gekomen.
Figuur 7-7 Grafiek van fototransistor lichtmetingen
Decay Time Vs. Time
for Phototransistor RC Circuit
9000
8000
Decay Time (2 us)
7000
6000
5000
4000
3000
2000
1000
0
0
"Decay Time"
10
20
30
40
50
60
Tim e (s)
De grafiek van Figuur 7-7 is gemaakt, door de waarden uit de Debug Terminal te kopiëren en
vervolgens in een tekstfile te plakken, die vervolgens weer is ingelezen in een Microsoft Excel
spreadsheet. In de Debug Terminal zijn ook mogelijkheden om grafieken te maken, in plaats van eerst
een lijst met getallen af te drukken. Figuur 7-8 laat een voorbeeld zien van een van de beschikbare
programma´s, dat StampPlot LITE heet.
Meten van licht · Page 141
Figuur 7-8 StampPlot LITE
Om deze extra opdracht uit te voeren, kun je naar www.parallax.com / go / WAM gaan en dan de
link volgen bij Data Plotten. Je kunt daar een aantal opdrachten proberen, waarin gegevens
grafisch worden weergegeven )geplot’ met behulp van diverse spreadsheets en grafische utility
software pakketten.
OPDRACHT #4: EEN EENVOUDIGE LICHTMETER
Informatie van de Lichtsensor kan op verschillende manieren worden uitgewisseld. De lichtmeter
in dit voorbeeld zal een display laten knipperen afhankelijk van de intensiteit van de hoeveelheid
licht op de sensor
Onderdelen voor de lichtmeter
(1) fototransistor
(1) Weerstand – 220 Ω (rood-rood-bruin)
(2) Condensatoren – 0.01 μF (gemerkt met 103)
(1) Condensator – 0.1 μF (gemerkt met 104)
(1) 7-segment LED display
(8) Weerstand – 1 kΩ (bruin-zwart-rood)
(6) Jumper wires
Bouw de schakeling van de Lichtmeter
Figuur 7-9 laat een 7-segment LED display zien en de schakeling van de fototransistor die we zullen
gebruiken om de lichtmeter te maken. Figuur 7-10 toon de schakeling. De schakeling van de
fototransistor is dezelfde als je hebt gebruikt in de laatste twee opdrachten. De schakeling van de 7segment LED display is dezelfde als in Figuur 6-11 op pagina 117.
9 Bouw de schakeling van Figuur 7-9 en Figuur 7-10.
9 Test de 7-segment LED display om er zeker van te zijn, dat de aansluiting klopt. Gebruik het
programma SegmentTestWithHighLow.bs2 uit Hoofdstuk 6, Opdracht #2 dat begint op pagina
116.
Pagina 142 · Wat is een Microcontroller? NL HJK
Figuur 7-9
Schema van de
lichtmeter
schakeling
Figuur 7-10
Bedrading voor
Figuur 7-9
Het gebruik van Subroutines
Het merendeel van de programma's ,die je tot nu toe hebt geschreven, werken binnen een DO ...
LOOP. Aangezien alle activiteit in de programma's binnen de DO ... LOOP gebeurt, noemen we dat
meestal het hoofdprogramma. Als je meer schakelingen en meer handige functies aan je programma
wilt toe voegen, wordt het heel moeilijk om precies bij te houden, wat elke code in het
hoofdprogramma precies doet. Je programma zal veel overzichtelijker worden, als je de code in kleine
segmenten organiseert. Ieder segment voert een specifieke taak uit. PBASIC heeft een paar
commando’s, die je kunt gebruiken om vanuit het hoofdprogramma een andere opdracht uit te voeren,
om daarna weer netjes op dezelfde plaats in het hoofdprogramma verder te gaan. Hierdoor kun je dat
stukje code, dat bij die bepaalde taak hoort, in een ander deel van je programma plaatsen, waardoor het
programma veel overzichtelijker wordt. Elke keer als het programma zo’n bepaalde taak moet
uitvoeren, geef je een commando in het hoofdprogramma, waardoor het programma naar die taak
springt, de taak uitvoert en dan weer netjes terugkomt in het hoofdprogramma op de plaats, waar je de
aanroep voor de taak had geplaatst. Deze taken worden subroutines genoemd en de handeling noemen
we het aanroepen van een subroutine (calling a subroutine).
Figuur 7-11 geeft een voorbeeld van een subroutine en hoe die gebruikt wordt. Het commando
GOSUB Subroutine_Name zorgt ervoor, dat het programma naar het label springt met
Meten van licht · Page 143
Subroutine_Name. Wanneer het programma bij dat label aankomt, loopt het programma door en voert
opdrachten uit, totdat het een RETURNcommando tegenkomt. Dan gaat het programma terug naar het
commando na het GOSUB commando. In het geval van het voorbeeld in Figuur 7-11, is de volgende
opdracht: DEBUG "Next command".
DO
GOSUB Subroutine_Name
DEBUG "Next command"
LOOP
Subroutine_Name:
Figuur 7-11
Hoe Subroutines werken
DEBUG "This is a subroutine..."
PAUSE 3000
RETURN
Wat is een label? Een label is een naam, die gebruikt kan worden als een vervanging van
een bepaalde plaats (coderegel) in een programma. GOSUB is een commando, dat ervoor
zorgt, dat er naar het label wordt versprongen. Enkele anderen zijn GOTO, ON GOTO, en
ON GOSUB. Je kunt deze commando’s gebruiken om naar labels te springen. Een label
dient te eindigen met een dubbele punt en voor de stijl worden de verschillende woorden
geschreven met een underscore. Bij het kiezen van een naam dien je erop te letten, dat je
geen gereserveerd woord neemt. De andere regels voor naamgeving zijn dezelfde als die
voor variabelen, zoals in de vorige informatiebox van bladzijde 29 is weergegeven
Voorbeeldprogramma: SimpleSubroutines.bs2
Dit voorbeeldprogramma toont hoe subroutines werken door berichten naar de Debug Terminal te
sturen.
9 Bekijk SimpleSubroutines.bs2 en probeer te raden in welke volgorde de DEBUG commando’s
zullen worden uitgevoerd.
9 Geef het programma in en start het.
9 Vergelijk de programma afloop met je voorspellingen.
' What's a Microcontroller - SimpleSubroutines.bs2
' Demonstrate how subroutines work.
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
DO
DEBUG
PAUSE
GOSUB
DEBUG
PAUSE
GOSUB
DEBUG
PAUSE
CLS, "Start main routine.", CR
2000
First_Subroutine
"Back in main.", CR
2000
Second_Subroutine
"Repeat main...", CR
2000
LOOP
First_Subroutine:
DEBUG " Executing first "
DEBUG "subroutine.", CR
PAUSE 3000
RETURN
Pagina 144 · Wat is een Microcontroller? NL HJK
Second_Subroutine:
DEBUG " Executing second "
DEBUG "subroutine.", CR
PAUSE 3000
RETURN
Hoe SimpleSubroutines.bs2 werkt
Figuur 7-12 toont hoe de First_Subroutine-oproep in de hoofdroutine (the DO…LOOP) werkt. Het
commando GOSUB First_Subroutine zendt het programma naar het First_Subroutine: label. De
drie commando’s binnenin de subroutine worden uitgevoerd. Indien het programma aan het RETURN
statement komt, springt het terug naar het commando vanwaar het komt, vlak achter het GOSUB
commando: DEBUG "Back in Main.", CR.
Wat is een subroutine-aanroep? Indien je het GOSUB commando gebruikt om het
programma verder te laten gaan met de programmaregels in een subroutine, dan noemt
men dit een subroutine- oproep.
PAUSE 2000
GOSUB First_Subroutine
DEBUG "Back in main.", CR
Figuur 7-12
Je eerste Subroutineaanroep
First_Subroutine:
DEBUG "
Executing first "
DEBUG "subroutine.", CR
PAUSE 3000
RETURN
Figuur
7-13
toont
een
tweede
voorbeeld
van
een
tweede
subroutineaanroep
(GOSUB
Second_Subroutine).
PAUSE 2000
GOSUB Second_Subroutine
DEBUG "Repeat main...", CR
Second_Subroutine:
DEBUG "
Executing second "
Figuur 7-13
Je tweede Subroutine
aanroep
DEBUG "subroutine", CR
PAUSE 3000
RETURN
Jouw beurt – Bijvoegen en Nesten van Subroutines
Je kunt meer subroutines toevoegen achter de twee die al in het programma zijn, roep ze op vanuit de
hoofdroutine.
9 Voeg het subroutine programma in Figuur 7-11 toe aan SimpleSubroutines.bs2.
9 Maak alle nodige aanpassingen aan de DEBUG commando’s zodat de display er goed uitziet
voor alle drie de subroutines.
Meten van licht · Page 145
Je kunt ook een subroutine oproepen binnenin een andere, dit noemt men nesting subroutines.
9 Probeer het GOSUB commando, dat de Subroutine_Name oproept, in een of andere subroutines
te plaatsen en bekijk hoe het werkt.
Bij het nesten van subroutines is de regel om niet verder dan 4 niveaus diep te gaan. Zie
de BASIC Stamp Handleiding voor meer details. Zoek op GOSUB en RETURN.
Licht Meter gebruik van Subroutines
Het volgende programma, LightMeter.bs2 gebruikt subroutines om de weergave van de 7-Segment
LED afhankelijk te maken van het lichtniveau, dat door de fototransistor wordt gemeten. De
segmenten van de display gaan aan en uit. Als er meer licht op de fototransistor valt, gaat de display
sneller knipperen. Als er minder licht is, gaat het display langzamer knipperen. Het
voorbeeldprogramma LightMeter.bs2 maakt gebruik van een subroutine Update_Display voor het
besturen van de volgorde, waarin de segmenten oplichten.
Het programma voor deze lichtmeter heeft drie verschillende taken:
•
•
•
Lezen van de lichtgevoelige weerstand.
Berekenen van hoelang er dient gewacht te worden voordat er een nieuwe waarde in de 7segment LED display zichtbaar wordt.
Opnieuw weergeven van een waarde op de 7-segment LED display.
Elke handeling bevat zijn eigen subroutine en de hoofd DO…LOOP routine zal ronddraaien en elke
sequentie oproepen en herhalen tot in het oneindige.
Voorbeeldprogramma: LightMeter.bs2
Gecontroleerde lichtcondities maken een groot verschil. Voor het beste resultaat, voer
deze test uit in een lokaal met lichten waar er geen direct zonlicht is (sluit de gordijnen).
Voor informatie hoe de meter dient gekalibreerd te worden, zie de Jouw beurt sectie.
9 Voer in en start LightMeter.bs2.
9 Ga het circulair patroon na dat op de 7-segment LED display tevoorschijn komt. Doe dit door
een schaduw te creëren met je hand of een stuk papier.
' What's a Microcontroller - LightMeter.bs2
' Indicate light level using 7-segment display.
' {$STAMP BS2}
' {$PBASIC 2.5}
PAUSE 1000
DEBUG "Program Running!"
index
time
VAR
VAR
OUTH = %00000000
DIRH = %11111111
Nib
Word
' Variable declarations.
' Initialize 7-segment display.
Pagina 146 · Wat is een Microcontroller? NL HJK
DO
' Main routine.
GOSUB Get_Rc_Time
GOSUB Delay
GOSUB Update_Display
LOOP
' Subroutines
Get_Rc_Time:
' RC-time subroutine
HIGH 2
PAUSE 3
RCTIME 2, 1, time
RETURN
Delay:
' Delay subroutine.
PAUSE time / 3
RETURN
Update_Display:
' Display updating subroutine.
IF index = 6 THEN index = 0
'
BAFG.CDE
LOOKUP index, [ %01000000,
%10000000,
%00000100,
%00000010,
%00000001,
%00100000 ], OUTH
index = index + 1
RETURN
Hoe LightMeter.bs2 werkt
De eerste twee regels van het programma definiëren (declareren) variabelen. Het maakt niet uit of deze
variabelen worden gebruikt in subroutines of in het hoofdprogramma. Het is het beste om declaratie
van variabelen (en constanten) aan het begin van het programma te doen.
Dit deel van de code wordt daarom "Variabele declaraties." genoemd. Deze term wordt in het
commentaar aan de rechterkant weergegeven rechts van de eerste variabelendeclaratie.
index VAR Nib
time VAR Word
' Variable declarations.
In veel programma's moet aan het begin van het programma een keer iets gebeuren, om het in de de
juiste beginsituatie te brengen. Een voorbeeld is het instellen van de 7-segment I/O pinnen. Die
moeten eerst laag gemaakt worden om ze daarna pas als uitgang in te stellen. Dit gedeelte van een
PBASIC programma noemen we ook wel, "Initialisatie."
OUTH = %00000000
DIRH = %11111111
' Initialize 7-segment display.
Het volgende stuk code noemen we de hoofdroutine of “main routine”. Deze roept eerst de subroutine
Get_Rc_Time op. Daarna roept het de Delay subroutine op en daarachter de Update_Display
subroutine.
DO
GOSUB Get_Rc_Time
GOSUB Delay
GOSUB Update_Display
LOOP
' Main routine.
In de meeste gevallen worden de subroutines na het hoofdprogramma gezet. De eerste
subroutinenaam is Get_Rc_Time en deze meet de RC-tijd van de fototransistor. Deze subroutine heeft
Meten van licht · Page 147
een PAUSEcommando dat de condensator oplaadt. Het Duration argument van dit commando bevat
een kleine waarde, om de condensator op te laden. Merk op, dat het RCTIME commando de waarde van
de time variabele meegeeft. Deze variabele zal gebruikt worden in de tweede subroutine.
Get_Rc_Time:
HIGH 2
PAUSE 3
RCTIME 2, 1, time
RETURN
' Subroutines
' RC-time subroutine
De tweede subroutine is Delay, en bevat enkel een PAUSE commando. Indien je wat extra
berekeningen wilt doen, bijvoorbeeld aan de variabele time voor het pauzecommando, kan dat hier
gebeuren.
Het PAUSEcommando maakt het mogelijk, om op basis van de gemeten RC- tijd (in feite meten we hoe
helder het licht is) de segmenten van de 7-segments LED’ aan te sturen.. De waarde aan de
rechterzijde van het deelteken ( / ) kan groter worden gemaakt voor een snellere rotatie, indien er
weinig licht is. Je kunt de waarde ook kleiner maken, om het display te vertragen bij fel licht. Je kunt
ook het teken voor vermenigvuldigen gebruiken ( * ) om de time variabele te vermenigvuldigen met
een waarde in plaats van deze te delen om het display langzamer te maken. Voor meer nauwkeurige
controle van de snelheid moet je de * / bewerking niet vergeten. Meer informatie over deze
bewerkingen vind je in de Your Turn sectie.
Delay:
PAUSE time / 3
RETURN
De derde subroutine heet Update_Display. Het LOOKUPcommando in deze subroutine bevat een tabel
met een zes bit patroon, dat wordt gebruikt om een circulair patroon rond de 7-segment LED display te
tonen. Door 1 bij de indexvariabele op te tellen. Telekens als de subroutine opgeroepen wordt, komt
het volgende patroon op de OUTH. Er zijn enkel ingangen in het LOOKUP commando voor index
waarden van 0 tot 5. Wat gebeurt er als de waarde van index 6 wordt? Het lookupcommando weet
niet, dat het dan direct terug naar de eerste regel dient te gaan, maar dit kan opgelost worden met een
IF…THENstatement. Het commando IF index = 6 THEN index = 0 reset de waarde van de index
naar 0 iedere keer dat de tijd 6 is. Dit geeft ook de sequentie van het bitpatroon in de OUTH om telkens
opnieuw herhaald te worden. Dit zal er dan voor zorgen, dat er op de 7-segment LED display een
circulair patroon opnieuw en opnieuw tevoorschijn komt.
Update_Display:
IF index = 6 THEN index = 0
'
BAFG.CDE
LOOKUP index, [ %01000000,
%10000000,
%00000100,
%00000010,
%00000001,
%00100000 ], OUTH
index = index + 1
RETURN
Jouw beurt – Aanpassen van de Meter Hardware en Software
Er zijn twee mogelijkheden om de gevoeligheid van de meter aan te passen. In de eerste plaats via de
software in het PBASIC-programma Zoals eerder genoemd, kun je de variabele time delen in de regel
PAUSE time / 3 van de Delay subroutine, waardoor het display sneller loopt. Getallen groter dan 3
maken, dat de display sneller gaat. Om de display echt langzaam te maken, gebruik je de */ operator.
Wanneer je twee condensatoren parallel verbindt, moet je hun waarden optellen. Dus, als je een
tweede 0.01 μF condensator vlak naast de eerste op het bordje plaatst, zoals weergegeven in Figuur
7-14 en Figuur 7-15, wordt de capaciteit 0,02 μF. Met een twee keer zo grote capaciteit zal de
ontlaadcurve bij hetzelfde lichtniveau twee keer zo lang duren.
Pagina 148 · Wat is een Microcontroller? NL HJK
9 Verbind een tweede 0.01 μF condensator direct naast de eerste van de schakeling van Figuur
7-14 en Figuur 7-15.
9 Start LightMeter.bs2 en bekijk het resultaat.
Figuur 7-14
Twee 0.01 μF
condensatoren parallel
= 0.02 μF
Figuur 7-15
Licht Meter schakeling
met twee 0.01 μF
condensatoren parallel
Wat denk je ervan om niet twee keer zo langzaam te meten, maar tien keer zo langzaam? Je kunt dit
doen door de twee 0,01 μF condensatoren te vervangen door een condensator van 0.1 μF, 10 keer zo
groot dus. Dit zal goed werken in een helder verlichte kamer. Maar bij normale verlichting werkt het
waarschijnlijk een beetje traag. Onthoud, dat wanneer je een condensator tien keer zo groot maakt, de
meting van de RC-tijd ook tien keer zo lang duurt.
9 Vervang de 0.01 μF condensator door een 0.1 μF condensator.
9 Draai het programma en kijk of je het gewenste effect ziet..
9 Voordat je verder gaat, herstel de schakeling dan eerst, door alleen de 0,01 μF te plaatsen,
zoals te zien is in Figuur 7-9 en Figuur 7-10, op pagina 142
Wat is er beter, software of hardware aanpassen? Je moet altijd proberen om het beste
van beide werelden te gebruiken. Kies om te beginnen de waarde van de condensator zo,
dat je een correcte meting krijgt voor je toepassing. Als de hardware is geïnstalleerd,
gebruik dan de software om de lichtmeting automatisch aan te passen zodat een en ander
goed werkt. Dit werk zal wel enige tijd in beslag nemen, om alles te testen en af te stellen.
Maar dat is allemaal een onderdeel van het ontwerpproces.
OPDRACHT #5: ON/OFF PHOTOTRANSISTOR OUTPUT
Voordat er microcontrollers werden gebruikt, werden er in schakelingen, die moesten reageren op
licht, vooral fotoweerstanden gebruikt. Tijdens de nacht daalde de spanning over de weerstand
beneden een bepaalde drempelwaarde, waardoor bijvoorbeeld de straatverlichting kon inschakelen.
Overdag, kwam de spanning weer boven die drempel, waardoor de lichten weer werden uitgeschakeld.
Dit binaire lichtschakelaargedrag gaan we nabootsten met de BASIC Stamp en de RC schakeling door
een paar eenvoudige wijzigingen in het PBASIC programma. We gaan ook nog naar een alternatief
kijken, waarbij de schakeling een 1 of 0 naar een I/O-pin stuurt, afhankelijk van de hoeveelheid licht.
Dit is vergelijkbaar met de manier, waarop een drukknop werkt. In deze opdracht gaan we beide
manieren uittesten.
Meten van licht · Page 149
Aanpassen van het Program voor de aan/uit-toestand
PhototransistorAnalogToBinary.bs2 neemt een reeks van metingen aan de fototransistor en vergelijkt
die met de helft van de grootste en kleinste metingen. Als de meting boven de middelste waarde ligt,
laat het programma een melding "Turn light on", zien en anders laat het programma de melding "Turn
light of." zien. Het programma maakt gebruik van constante definitie om het midden tussen de grootste
en de kleinste meting vast te leggen op een waarde, die past bij de opzet van de schakeling rond de
fototransistor.
valMax
valMin
CON
CON
4000
100
Het programma maakt gebruik van de MIN- en MAX functies om ervoor te zorgen, dat de waarden
binnen instelbare grenzen blijven, voordat ze gebruikt worden voor eventuele beslissingen. Als de
gemeten RC- tijd groter is dan valMax (4000 in het voorbeeld programma), dan wordt tijd valMax =
4000. Als de gemeten RC-tijd minder is dan valMin (100 in het voorbeeld programma), dan wordt tijd
valMin = 100.
time = time MAX valMax MIN valMin
Het IF...THEN...ELSE statement zet de gedigitaliseerde analoge waarden om in een binair
uitgangssignaal, dat leidt tot de melding licht uit (Turn light off) of licht aan (Turn light on).
IF time > (valMax - valMin) / 2 THEN
DEBUG CR, "Turn light on "
ELSE
DEBUG CR, "Turn light off"
ENDIF
Voordat je het programma kunt gebruiken, moet je de verlichting kalibreren:
9 Controleer de schakeling met de fototransistor om er zeker van te zijn, dat er maar een
condensator van 0.01 μF is gebruikt (gemerkt met 103).
9 Voer PhototransistorAnalogToBinary.bs2 in de BASIC Stamp Editor. Zorg ervoor, dat je een
extra spatie toevoegt na de "n" in de melding "Turn liht on", anders blijft er een spook- "f" van
de vorige "Turn light off" melding staan, die een teken meer heeft.
9 Laad het programma in de BASIC Stamp.
9 Bekijk de Debug Terminal bij fel licht en bij weinig licht en noteer de tijdswaarden bij beide
lichtomstandigheden.
9 Voer de waarden voor valMax en valMin in bij constant (CON) definitie.
Nu is je programma klaar om te testen.
9 Start het aangepaste programma
9 Test bij weinig licht, of de melding “Turn Light on” verschijnt en bij veel licht, of de melding
“Turn light off” verschijnt
' What's a Microcontroller - PhototransistorAnalogToBinary.bs2
' Change digitized analog phototransistor measurement to a binary result.
' {$STAMP BS2}
' {$PBASIC 2.5}
valMax
valMin
CON
CON
4000
100
time
VAR
Word
PAUSE 1000
DO
HIGH 2
PAUSE 100
Pagina 150 · Wat is een Microcontroller? NL HJK
RCTIME 2, 1, time
time = time MAX valMax MIN valMin
DEBUG HOME, "time
IF time > (valMax
DEBUG CR, "Turn
ELSE
DEBUG CR, "Turn
ENDIF
= ", DEC5 time
- valMin) / 2 THEN
light on "
light off"
LOOP
Jouw beurt – Verschillende waarden voor het omschakelen van licht naar donker
Als je het programma PhototransistorAnalogToBinary.bs2 als een automatische besturing voor
verlichting zou willen gebruiken, heeft de schakeling een probleem. Stel, dat het buiten donker genoeg
is om de waarde van tijdmeting groter te laten worden dan (valMax – valMin) / 2, dan gaat het licht
aan. Als de sensor kort daarna vaststelt, dat er weer voldoende licht is en de gemeten waarde weer
kleiner is dan (valMax – valMin) / 2, wordt het licht weer uitgeschakeld. De lampen zouden daardoor
de hele nacht kunnen blijven knipperen! .
Figuur 7-16 laat in een grafiek zien hoe dit zou kunnen werken. Zodra de lichtintensiteit afneemt,
neemt de waarde van de gemeten tijd toe, passeert de ingestelde grenswaard en schakelt de verlichting
in. Aangezien de fototransistor de als lichtsensor, alleen inschakel als de gemeten tijd weer onder de
drempel zakt schakelt de verlichting weer uit. Als daarna de gemeten tijd weer toeneemt, waardoor de
drempelwaarde weer wordt overschreden en de lichten weer uit gaan. Na een tijdje zakt de waarde
weer, als het licht afneemt en gaan de lichten weer aan, enzovoort ...
valMax
"Turn light on "
(valMax - valMin) / 2
"Turn light off"
valMin
Figuur 7-16
De gemeten hoeveelheid
licht varieert steeds
onder en boven de
grenswaarde
Een mogelijke oplossing voor dit probleem is het toevoegen van een tweede grenswaarde (ook
drempelwaarde genoemd) zoals je in Figuur 7-17 kunt zien. De drempel voor het inschakelen van het
licht ligt zo laag, dat het echt donker moet zijn, voor de lampen inschakelen. En het moet behoorlijk
licht zijn, voordat de lampen weer uitschakelen. Stel, dat het licht zoveel afneemt, dat de gemeten tijd
de bovenste grenswaarde passeert en het licht aan gaat. Als het licht nu een klein beetje feller wordt en
de gemeten waarde kleiner wordt, komt de gemeten waarde nog steeds niet onder de onderste
grenswaarde, waar het licht weer zou worden uitgeschakeld. Het licht blijft dus gewoon aan. Als we
een aparte grenswaarde gebruiken voor het inschakelen en een voor het uitschakelen, dan voorkomen
we, dat het licht voortdurend in- en uitschakelt. Het verschil in waarde tussen de onderste en de
bovenste drempelwaarde noemen we hysterese.
valMax
"Turn light on "
(valMax - valMin) / 4 * 3
Geen verandering
(valMax - valMin) / 4
"Turn light off"
valMin
Figuur 7-17
Verschillende
drempelwaarden voor
inschakelen en
uitschakelen, voorkomt
voortdurend in- en
uitschakelen
Meten van licht · Page 151
Pas
het
PBASIC-programma
PhotransistorAnalogToBinary.bs2’s
zo
aan
met
een
nieuw
IF...THEN...ELSEIF statement, dat er met twee drempelwaarden wordt gewerkt..
IF time > (valMax - valMin) / 4 * 3 THEN
DEBUG CR, "Turn light on "
ELSEIF time < (valMax - valMin ) / 4 THEN
DEBUG CR, "Turn light off"
ENDIF
Het eerste IF...THEN codeblok geeft de melding "Turn lights on" wanneer de gemeten tijd groter
wordt dan ¾ van het verschil tussen de grootste en kleinste waarde (weinig licht). Het ELISIF
codeblok laat alleen een "Turn lights off" melding zien, wanneer de gemeten tijd kleiner is dan ¼ van
het verschil tussen de grootste en de kleinste waarde (veel licht).
9 Sla het programma PhototransistorAnalogToBinary.bs2 als PhotransistorHysteresis.bs2.
9 Vordat je PhotransistorHysteresis.bs2, aanpast, test het programma eerst, om er zeker van te
zijn dat de ingestelde drempel ook werkt. Als de verlichting is veranderd moet je eerst valMin
en valMax opnieuw instellen volgens de eerdergenoemde stappen (voorafgaand aan het
voorbeeld met PhototransistorAnalogToBinary.bs2).
9 Vervang in PhotransistorHysteresis.bs2’s het IF...ELSE...ENDIF statement door het net
besproken IF...ELSEIF...ENDIF statement.
9 Laad het PhotransistorHysteresis.bs2 programma in de BASIC Stamp.
9 Controleer of het programma “Turn light on” inderdaad in- en uitschakelt bij de juiste
grenswaarden.
Als je nu een LED toevoegt en de code zo aanpast, dat de LED in- en uitgeschakeld wordt, kan er iets
interessants gebeuren. Vooral als je de LED vlakbij de fototransistor plaatst, kun je nog steeds dat
ongewenste aan/uit knipperen zien, zelfs als het donker is. Hoever moet je de LED van de
fototransistor af plaatsen, voordat het geknipper ophoudt? Stel, dat je de ingestelde waarden voor
valMin en valMax in beide programma’s hetzelfde houdt, hoe groot moet de afstand tussen LED en
de fototransistor dan zijn bij een niet aangepast programma PhototransistorAnalogToBinary.bs2,
voordat het systeem goed werkt?
TTL en Schmitt Trigger vergeleken
De I/O-pinnen van de BASIC Stamp versturen en ontvangen signalen via zogenaamde
transistor-transistor logica (TTL). Als de pen als uitgang is geschakeld, stuurt deze 5V als
hoog signaal en 0V als laag signaal. De linkerzijde Figuur 7-18 laat zien, hoe de I/O-pin
reageert als ingang. Het IN register (IN0, IN1, IN2, enz.) slaat een 1 op, als de
spanning boven de 1,4 V komt en een 0, als de spanning onder de 1,4 V komt. In de
figuur zijn deze waarden als een logische 1 en een logische 0 weergegeven.
Het symbool van een zogenaamde Schmidt trigger-schakeling is in het midden van
Figuur 7-18 te zien. Rechts ervan zie je, hoe een I/O-pin op ingangssignalen reageert als
er een Schmitttrigger schakeling ingebouwd zou zijn. Eigenlijk werkt dit hetzelfde als de
PBASIC-code van het vorige programma, waarbij met twee drempelwaarden werd
gewerkt. Dee waarde van het INx- register verandert pas van 0 naar 1, als de spanning
boven 4,75V komt. Er wordt pas een 0 opgeslagen, als de spanning onder de 0,75V
komt. De BASIC Stamp 2x heeft een speciaal PBASIC-commando, waarbij de ingangen
naar keus als Schmitt-trigger kunnen werken.
Figuur 7-18 TTL en Schmitt Trigger vergeleken
TTL
Threshold
5V
Schmitt Trigger
Symbol
Schmitt Trigger
Threshold
5V
≈4.25 V
Logic 1
Logic 1
No Change
≈1.4 V
Logic 0
0V
≈0.75 V
0V
Logic 0
Pagina 152 · Wat is een Microcontroller? NL HJK
Aanpassen van de schakeling met Aan/Uit toestanden
Zoals vermeld in hoofdstuk 5, Opdracht #2, is de spanningsdrempel voor een BASIC Stamp I / O-pin
1,4 V. Als een I / O pin is ingesteld als input, wordt een spanning op de I/O-pin boven 1,4 V gezien als
een binaire 1 weergegeven en een spanning lager dan 1,4 V als een binaire 0. Het knooppunt Vo van
de schakeling in Figuur 7-19 varieert in spanning als de hoeveelheid licht varieert. Als deze schakeling
wordt aangesloten op de I/O-pin van een BASIC Stamp, zal de spanning groter worden dan 1,4 bij
veel licht, waardoor de BASIC Stamp een 1 opslaat in het I/O- register van de betreffende pin.. Bij
weinig licht gebeurt het omgekeerde. De transistor laat minder stroom door, waardoor de spanning op
het knooppunt Vo onder 1,4 V daalt en het I/O-register van de betreffende pin een 0 op zal slaan..
+
V
–
=R
Figuur 7-19
Schakeling waarbij de
uitgangsspanning
afhankelijk is van het
licht
I
De reden is, dat de spanning op Vo verandert met het lichtniveau door de wet van Ohm waarin staat,
dat de spanning over een weerstand (V in Figuur 7-19) gelijk is aan de stroom, die door die weerstand
(I) loopt, vermenigvuldigd met de waarde van de weerstand ( R).
V=I×R
Denk eraan, dat een fototransistor meer stroom doorlaat als er meer licht op valt en minder stroom
doorlaat als er minder licht op valt. Laten we eens een kijkje nemen in de schakeling van Figuur 7-19
en berekenen hoeveel stroom er zou moeten passeren, voordat we over de weerstand een daling van
1,4 V veroorzaken. In de eerste plaats weten we, dat de waarde van de weerstand 10 k Ω is, ofwel
10.000 Ω. We weten ook, dat de spanning over de weerstand gelijk moet zijn aan 1,4 V. We kunnen
nu de Wet van Ohm gebruiken om de stroom (I) door de weerstand te berekenen. Daarvoor delen we
aan beide zijden van het = teken door R in de vergelijking V = I × R waardoor we I = V ÷ R krijgen..
Daarna vervangen we de R, door de bekende waarde van de weerstand (V = 1,4 V en R = 10 kW), en
bereken zo I:
I
=
=
=
=
=
=
V÷R
1.4 V ÷ 10 kΩ
1.4 V ÷ 10,000 Ω
0.00014 V/Ω
0.00014 A
0.14 mA
Stel, dat er door de transistor twee keer zo veel stroom loopt, omdat er veel licht is, wat wordt dan de
spanning over de weerstand? Met twee keer de huidige stroom, I = 0,28 mA en een weerstand die nog
steeds 10 kΩ is, kunnen we nu de spanning over de weerstand uit de vergelijking V = I × R met I =
0,28 mA en R = 10 kΩ:
V
=
=
=
=
=
I×R
0.28 mA × 10 kΩ
0.00028 A × 10,000 Ω
2.8 AΩ
2.8 V
Meten van licht · Page 153
Met 2.8 V op een I/O pin slaat het ingangsregister een 1 op, omdat de spanning van 2.8 V hoger is dan
de drempelwaarde van 1,4V van de I/O-pin.
Jouw beurt – Meer berekeningen
Wat gebeurt er als de fototransistor een stroom levert van 0,07 mA? Wat zou de spanning over de
weerstand dan worden? En wat zou het ingangsregister van de I/O-pin laten zien?
Test van de binaire lichtsensor
Het testen van deze tweestanden (binaire) lichtgevoelige schakeling lijkt veel op het testen van de
schakeling met de drukknop van Hoofdstuk 3. Als de schakeling met een I/O-pin is verbonden, zal de
spanning boven of onder de 1,4 V drempelwaarde van de BASIC Stamp zijn, waardoor een 1 of een 0
op de Debug Terminal is te zien.
Onderdelen voor de Analoog naar Binaire Lichtsensor
(1) fototransistor
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Weerstand – 10 kΩ (bruin-zwart-oranje)
(1) Weerstand – 2 kΩ (rood-zwart-rood)
(1) Weerstand – 4.7 kΩ (geel-violet-rood)
(1) Weerstand – 100 kΩ (bruin-zwart-geel)
(2) Jumper wires
Schakeling van de Analoog naar Binaire Licht Sensor
Met de schakeling van Figuur 7-20, gedraagt de schakeling zich als een drukknop, die op licht
reageert..Schaduw resulteert in IN2 = 0. Fel licht resulteert in IN2 = 1. Houd in gedachten, dat een
I/O pin, die is ingesteld als input, geen invloed heeft op de schakeling waarin wordt gemeten, omdat er
geen stroom door de I/O-pin loopt. Het maakt daardoor ook geen verschil, of de 220 Ω weerstand wel
of niet wordt toegepast. Zowel de weerstand als de I/O-pin zijn onzichtbaar voor de schakeling, omdat
er geen stroom door loopt. De eerdere berekeningen worden daardoor ook niet beïnvloed en de
spanningen zullen hetzelfde zijn bij een wel- of niet aangesloten pin.
9 Bouw de schakeling van Figuur 7-20.
Figuur 7-20: Schema en bedrading voor de Analoog naar Binaire Licht sensorschakeling
verbonden met een I/O pin
Analoog naar Binaire Lichtsensor testprogramma
TestBinaryPhototransistor.bs2 is een aangepaste versie van ReadPushbuttonState.bs2 uit Hoofdstuk 3,
Opdracht #2. Naast aanpassing van het commentaar is de enige wijziging van het programma het
aanpassen van de regel met DEBUG ? IN2 van DEBUG ? IN3 uit het oorspronkelijke
voorbeeldprogramma met de drukknop. Deze wijziging was nodig, omdat de drukknop nu is
aangesloten op P2 in plaats van P3.
Pagina 154 · Wat is een Microcontroller? NL HJK
9 Bekijk opnieuw Hoofdstuk 3, Opdracht #2 (pagina 44).
9 Gebruik TestBinaryPhototransistor.bs2 hieronder om te controleren, dat fel licht op de
fototransistor een 1 laat zien, terwijl weinig licht een 0 laat zien. Je zult behoorlijk fel licht
nodig hebben. Als licht binnen nog steeds een 0 laat zien, probeer het dan met zonlicht of een
flitslamp. De oplossing is, om de weerstand van 10 kΩ te vervangen door een 100 kΩ
weerstand, waardoor de gevoeligheid bij weinig licht veel beter wordt.
' What's a Microcontroller - TestBinaryPhototransistor.bs2
' Check the phototransistor circuit's binary output state every 1/4 second.
' {$STAMP BS2}
' {$PBASIC 2.5}
DO
DEBUG ? IN2
PAUSE 250
LOOP
Testen met weerstanden in serie
Kijk nog eens naar de berekeningen met de formule V = I × R die we eerder zagen in dit hoofdstuk.
Als de serieweerstand 1/5 van de oorspronkelijke waarde heeft, zal de spanning over de weerstand ook
maar 1/5de zijn bij dezelfde lichtomstandigheden. Op dezelfde manier, zal de spanning over een
weerstand, die 10 keer zo groot is, ook 10 keer zo hoog zijn.
Wat betekent dit voor jouw schakeling? Als je een weerstand van 100 kΩ gebruikt in plaats van een
10 kΩ weerstand: hoeft de fototransistor ook maar 1/10de stroom te leveren en 1/10de licht te
ontvangen, om de spanning I/O-pin van de BASIC Stamp boven de drempelwaarde van1,4V te
krijgen..Dit is hetzelfde effect, alsof er een 10 keer zo sterke lamp op de sensor schijnt. Tegelijkertijd
is de schakeling 10 keer gevoeliger geworden voor opvallend licht, waardoor deze nog goed werkt bij
weinig licht. Stel, dat we de schakeling juist ongevoeliger willen maken, omdat we onder
omstandigheden willen werken, waar veel zonlicht is, dan zouden we de schakeling misschien 5 keer
zo ongevoelig willen maken. Door de weerstand nu juist 5 keer zo klein te maken, moet de
fototransistor ook 5 keer zoveel stroom leveren en dus ook 5 keer zoveel licht ontvangen, voordat de
spanning weer boven de drempelwaarde van 1,4V komt van de betreffende I/O-pin van de BASIC
Stamp waardoor er een 1 wordt opgeslagen in het ingangsregister van de betreffende pin.
9 Experimenteer met weerstanden van 2 kΩ, 4.7 kΩ, 10 kΩ, en100 kΩ en vergelijk voor iedere
weerstand de verandering in gevoeligheid voor licht.
Jouw beurt – Een indicator voor weinig licht
9 Kies een weerstand, die in jouw omgeving het beste een 0/1 overgang laat zien
9 Voeg de LED uit Hoofdstuk 3, Opdracht #3 aan jouw schakeling met de fototransistor toe.
9 Zet een stukje karton, of iets anders tussen de LED en de fototransistor zo, dat de fototransistor
de LED niet kan zien. Dit voorkomt, dat de LED en de fototransistor elkaar beïnvloeden
9 Pas het programma zo aan, dat de LED gaat knipperen, als je de fototransistor met je hand
afschermt.
OPDRACHT #6: NOG EEN LEUKE OPDRACHT – BUITENSHUIS LICHT METEN MET
EEN LED
Zoals eerder verteld, is de schakeling van, Opdracht #1 ontworpen voor het meten van licht
binnenshuis. Wat kan je doen, als je toepassing buitenshuis zou willen gebruiken? Je zou kunnen
zoeken naar een ander type fototransistor, die minder stroom levert bij dezelfde hoeveelheid licht. Het
gebruik van een heel andere lichtgevoelige sensor uit de What’s a Microcontroller kit, zou een andere
mogelijkheid kunnen zijn. Deze sensoren zijn vermomd als LED's, en ze doen het erg goed voor het
meten van fel licht.
Als er een elektrische stroom door de LED loopt, dan straalt deze licht uit. Wat denk je dat er gebeurt,
als er licht op een LED schijnt? Dit kan inderdaad tot gevolg hebben, dat er een elektrische stroom
door de schakeling gaat lopen. Figuur 7-21 laat een LED schakeling zien, die je binnenshuis kunt
Meten van licht · Page 155
gebruiken, of op plaatsen waar veel licht is. Terwijl de fototransistor, afhankelijk van de hoeveelheid
licht meer of minder stroom doorlaat, werkt de LED meer als een klein zonnepaneel. Een LED levert
zijn eigen spanning, waardoor de stroom gaat lopen. Hoe werkt een schakeling voor het meten van de
RC-tijd werkt de schakeling met een LED? De LED geleidt meer of minder stroom, afhankelijk van de
hoeveelheid licht, waardoor de condensator sneller, of minder snel oplaadt.
Yellow
Figuur 7-21
Schema voor een
lichtgevoelige RC-tijd
schakeling met een LED
Waarom is de LED omgekeerd aangesloten? In Hoofdstuk 2 was de anode van de LED's
aangesloten op de 220 Ω weerstand, en de kathode verbonden aan de massa. In die
schakeling moest de LED licht uitzenden als gevolg van een elektrische stroom, die door de
LED stroomde als er spanning op de schakeling werd gezet. Met deze schakeling willen we
de LED juist geen licht laten uitzenden. Wanneer er licht op de LED schijnt, zal deze een
kleine spanning opwekken, waardoor er een tegenovergestelde spanning op de LED
ontstaat en er minder stroom door de schakeling loopt. De LED genereert als het ware een
kleine stroom in de tegenovergestelde richting. De LED moet dus tegenovergesteld worden
aangesloten zodat de stroom door de LED de condensator kan ontladen en de tijd met de
meting van de RC-tijd bepaald kan worden.
Onderdelen voor de LED Lichtsensor
(1) LED – geel
(1) LED – groen
(1) LED – rood
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Jumper wire
Schakeling voor de LED Lichtsensor
Een belangrijk verschil tussen de LED en fototransistor is dat de LED veel minder geleidt bij dezelfde
hoeveelheid licht. Je hebt dus heel fel licht nodig om de LED voldoende stroom te laten leveren, om de
condensator snel genoeg te ontladen om de RCTIME meting uit te voeren. Vergeet niet dat de
maximum tijd die gemeten kan worden met het RCTIME- commando 65535 × 2 microseconden ≈
131 ms is. Dus voor een goede meting van de RC-tijd met de BASIC Stamp, heb je een veel kleinere
condensator nodig. In feite werkt de schakeling beter zonder condensator. De LED heeft van zichzelf
een kleine capaciteit. We noemen dit ook wel de knooppunt capaciteit (junction capacity). De metalen
aansluiting van de LED hebben ook een capaciteit. In feite is een condensator niets anders dan twee
metalen platen die gescheiden zijn door een isolator. Zo’n isolator noemen we met een moeilijk woord
diëlektricum. Dus twee metalen klemmen die in het breadboard zijn gestoken en die zijn gescheiden
door plastic en lucht vormen samen een condensator. De combinatie van knooppuntcapaciteit van de
LED en de pennen van de LED op het breadboard vormt een capaciteit die je zo kunt gebruiken zonder
externe condensator. In Figuur 7-22 is de schakeling voor de LED te zien.
9 Bouw de schakeling van Figuur 7-22 en Figuur 7-23. Maak gebruik van de gele LED. Wees er
zeker van, dat de polariteit van de LED klopt met het schema!
Pagina 156 · Wat is een Microcontroller? NL HJK
Figuur 7-22
Schema van de LED
schakeling om de RCtijd te meten
Flat
spot
and
shorter cathode pin
Figuur 7-23
Bedradingdiagram van
de LED schakeling voor
de RC-tijd meting
Longer anode pin
Testen van de LED Lichtsensor met code
We kunnen nu de schakeling met de LED om licht te meten testen in een helder verlichte kamer of
overdag buiten. In een slecht verlichte kamer levert de tijdmeting waarschijnlijk een grotere waarde
dan 65.535 op, waardoor het RCTIME-commando nul in de resultaatvariabele opslaat. Voor de meeste
situaties, is de programmacode hetzelfde als in Opdracht #1, TestPhototransistor.bs2.
Als je in een ruimte met veel licht bent, probeer dan dit:
9 Start TestPhototransistor.bs2 van Opdracht #1.
9 Richt de LED op het punt met het meeste licht, door het bordje er naar toe te richten.
9 Draai het bordje geleidelijk weg van de lichtbron. De getallen op de Debug Terminal moeten
geleidelijk aan groter worden, naarmate het licht zwakker wordt
Als je een felle zaklamp hebt, probeer dan het volgende:
9 Start TestPhototransistor.bs2 van Opdracht #1.
9 Probeer alle felle lichtbronnen, zoals zonlicht van de ramen af te schermen.
9 Schijn met de ingeschakelde zaklamp direct op de bovenkant van de LED op een afstand van
ongeveer 10 centimeter. Schakel al het mogelijke omgevingslicht uit, zodat er heel weinig
omgevingslicht is.
9 Kijk naar de waarden op de Debug Terminal, terwijl je de zaklamp geleidelijk aan verder van
de LED afhoudt. Op deze manier kun je eigenlijk meten hoever je de lamp van de LED afhoudt
Als je in een ruimte bent, met alleen TL-buizen en geen zonlicht:
9
9
9
9
Start TestPhototransistor.bs2 van Opdracht #1.
Probeer alle felle lichtbronnen, zoals zonlicht van de ramen af te schermen.
Schakel al het omgevingslicht, zodat er heel weinig omgevingslicht is
Houd de LED pal tegen de computermonitor aan, zodat de LED het scherm bijna raakt. Kijk
naar de metingen en probeer te zien, of de meting anders is bij verschillende kleuren op het
scherm.
Meten van licht · Page 157
Test buiten de deur:
9
9
9
9
9
9
9
Start StoreLightMeasurementsInEeprom.bs2 van Opdracht #2.
Ontkoppel de programmeerkabel en neem je bordje mee naar buiten.
Richt de LED direct op de zon.
Druk kort op de resetknop, waardoor de datalogger wordt gestart.
Draai het bordje heel langzaam in 2 ½ minuut van de zon weg.
Neem het bord mee naar binnen en verbind het weer met de PC.
Start ReadLightMeasurementsFromEeprom.bs2, en controleer de lichtmetingen. Omdat je
geleidelijk van de zon bent weggedraaid, zouden de gemeten waarden steeds groter moeten
worden.
Jouw beurt – Kan je BASIC Stamp het verschil zien tussen rood en groen?
In Figuur 7-2, is de kleur groen het midden van het kleurenspectrum. Rood zit aan de rechterkant. Als
je de kleurenversie van dit boek download van uit www.parallax.com, kun je eerst de groene LED
tegen het scherm houden en daarna de rode LED. Door dan de laagste metingen van elke LED te
vergelijken, kun je vaststellen of de LED tegen een groen of rood vlak op het scherm was geplaatst.
9
9
9
9
Begin met de groene LED in de lichtgevoelige schakeling van Figuur 7-22 en Figuur 7-23.
Download de PDF versie van What’s a Microcontroller? van www.parallax.com/go/WAM.
Zet het kleurenspectrum van Figuur 7-2 (pagina 130) op je monitor, en zoom in op het plaatje.
Terwijl het programma TestPhototransistor.bs2 voortdurend metingen laat zien op de Debug
Terminal, houd je je bordje zo voor het scherm, dat de LED recht voor het kleurenspectrum is
geplaatst. Voor het beste resultaat moet de LED het scherm van de monitor net niet raken.
Verder moet er niet teveel omgevingslicht zijn.
9 Beweeg de groene LED langzaam langs de balk met verschillende kleuren, bepaal, welke kleur
de laagste waarde laat zien.
9 Herhaal dit met de rode LED. Liet de rode LED de laagste waarde zien bij de kleur rood en de
groene LED bij de kleur groen?
De laagst gemeten waarde met de rode LED moet inderdaad optreden bij de kleur rood. Voor de
groene LED moet de laagste waarde optreden bij de kleur groen.
SAMENVATTING
Dit hoofdstuk introduceerde lichtsensoren en beschreef hoe deze in allerlei verschillende producten
gebruikt worden. De diverse typen lichtsensoren detecteren verschillende soorten licht. In de
datasheets kun je vinden, hoe gevoelig de sensoren zijn bij verschillende golflengtes van licht. In dit
hoofdstuk keken we verder vooral naar de fototransistor. Dit is een onderdeel dat afhankelijk van de
hoeveelheid opvallend licht op de basis van de transistor, de hoeveelheid stroom regelt, die van de
collector- naar de emitteraansluiting loopt. Omdat de hoeveelheid stroom die de fototransistor
doorlaat, bepaald wordt door de hoeveelheid licht, kunnen we voor het meten van licht dezelfde
techniek gebruiken die we gebruikten bij het meten van de positie van de potmeter van Hoofdstuk 5.
De toegepaste RC- schakeling werkt ook voor het meten van licht dat op de fototransistor schijnt. Met
het RCTIME-commando kunnen we meten hoe lang het duurt voordat de condensator is ontladen,
waardoor we een getal krijgen, dat overeenkomt met de hoeveelheid licht op de fototransistor.
We gebruikten ook datalogging, om gemeten waarden op te slaan in een ongebruikt deel van het
EEPROM programmageheugen van de BASIC Stamp module. Met behulp van de WRITE en READ
commando’s werden waarden in de EEPROM van de BASIC Stamp module opgeslagen en weer
teruggelezen. Het grote aantal opgeslagen waarden maakt het lastig, om de gegevens te analyseren.
Maar door het gebruik van de grafieken (grafische tools) werd het een stuk makkelijker om de trends
en patronen in de gegevens waar te nemen. De opgeslagen gegevens kunnen worden overgedragen
naar conventionele spreadsheets voor weergave in een grafiek. Er is ook nog een lichtmetertoepassing
ontwikkeld, waarbij de hoeveelheid licht gebruikt werd om een ander proces te besturen. In dit geval
was dat de snelheid, waarmee een cirkelvormig patroon werd weergegeven op een 7-segment LEDdisplay. Deze lichtmeter toepassing gebruikte drie subroutines die om de verschillende taken uit te
voeren.
Pagina 158 · Wat is een Microcontroller? NL HJK
De BASIC Stamp kan zo worden geprogrammeerd dat je een meting van de RC-tijd kunt omzetten
naar een binaire waarde met IF ... THEN statements. Daarnaast kan het programma een hele reeks
van metingen van de RC-tijd uitvoeren en de eerder genoemde hysterese gebruiken, met aparte
drempelwaarden voor het inschakelen van het licht als het donker wordt en als het weer lichter is voor
het weer uitschakelen. Dit voorkomt dat de verlichting voortdurend aan- en uitknippert. Als het licht
wordt ingeschakeld, meet de sensor niet voldoende licht om de lampen weer uit te schakelen. Zonder
hysterese zouden de lampen steeds blijven knipperen.
Er werd nog een andere aanpak voorgesteld, waarbij een serieweerstand werd gebruikt om met
hardware licht te detecteren. In overeenstemming met de wet van Ohm, varieerde de spanning over de
fototransistor met de hoeveelheid opvallend licht. Deze variërende spanning kan worden aangesloten
op een I / O pin, en dit resulteert in een binaire 1 als de spanning boven de drempel van de I/O-pin van
1,4V komt of een binaire 0 als de spanning onder de drempel blijft.
De LED (light emitting diode), die licht afgeeft als er stroom door gaat, gedraagt zich als een klein
zonnepaneel. Als er licht op de LED schijnt, genereert deze een kleine spanning die in een schakeling
een kleine stroom kan opwekken. De stroom die de LED genereert is zo klein dat de gecombineerde
capaciteit van de LED zelf (junction capacity) en van de aansluitdraden groot genoeg is om een meting
van de RC-tijd te doen zonder externe condensator. Terwijl de fototransistor in de What's a
Microcontroller kit beter presteert binnenshuis, is de LED ideaal voor meting buiten de deur en voor
het meten van heel fel licht
Vragen
1. Kun je een paar voorbeelden geven van toepassingen, waarbij licht automatisch wordt
bediend door sensoren die het omgevingslicht meten?
2. Kun je een paar voorbeelden noemen van apparaten die op omgevingslicht reageren?
3. Welke reeks van golflengten heeft zichtbaar licht?
4. Welke namen hebben de aansluitingen van een fototransistor en welke aansluiting bepaalt,
hoeveel stroom er door de transistor stroomt?
5. Wat betekent EEPROM?
6. Hoeveel bytes kan de BASIC Stamp module in zijn EEPROM opslaan? Hoeveel bits kun je
dan opslaan?
7. Welk commando gebruik je om een waarde in de EEPROM op te slaan? Welk commando
gebruik je om de waarden weer uit de EEPROM op te halen? Welk commando van de twee
gebruikt een variabele?
8. Wat is een label?
9. Wat is een subroutine?
10. Welk commando gebruik je om een subroutine aan te roepen? Met welk commando beëindig
je een subroutine?
Oefeningen
1. Teken het schema van een RC-schakeling met een fototransistor die verbonden is met P5.
2. Pas het programma TestPhototransistor.bs2 zo aan, dat het werkt met een schakeling
aangesloten op P5 in plaats van P2.
3. Leg uit hoe je LightMeter.bs2 zo kunt aanpassen, dat het ronddraaiende patroon op de 7segment LED display in de andere richting draait.
Projecten
1. Maak een klein prototype van een systeem dat automatisch de zonwering sluit als de zon te fel
wordt en ze weer opent wanneer de zon minder helder wordt. Gebruik de servo voor de
mechanische aandrijving. Tip: Je kunt twee servo- besturingscommando’s toevoegen aan
PhototransistorAnalogToBinary.bs2, het commando PAUSE 100 vervangen door PAUSE 1.
Zorg ervoor dat je de instructies van de tekst volgt voor het kalibreren van lichtcondities
voordat je gaat testen.
2. Voor extra punten kun je de oplossing van Project 1 verbeteren, door het toevoegen van
hysterese zoals besproken in Opdracht #5.
Meten van licht · Page 159
Oplossingen
Q1. Autokoplampen, straatverlichting, beveiliging en buitenlampen die automatisch
inschakelen als het donker is. Camera’s met automatisch belichting van de opname.
Q2. 380 nm to 750 nm volgens Figuur 7-2 op pagina 130.
Q3. Collector, basis, en emitter. De basis regelt hoeveel licht er via de collector naar de emitter
loopt.
Q4. Electrically Erasable Programmable Read-Only Memory.
Q5. 2048 bytes. 2048 x 8 = 16,384 bits.
Q6. Om een waarde op te slaan – WRITE ; om een waarde op te halen – READ; Het READ
commando heeft een variabele nodig.
Q7. Een label is een naam die in een PBASIC program gebruikt wordt als een plaats om naar toe
te springen.
Q8. Een subroutine is a klein stukje programma dat een bepaalde taak uitvoert.
Q9. Een subroutine is een klein segment van de code dat een bepaald werk doet.
Q10. Aanroepen met: GOSUB; eindigen met: RETURN
E1. Schema gebaseerd op Figuur 7-4 van pagina 132, met P2 veranderd in P5.
Schema gebaseerd op Figuur 7-4 van pagina 132,
met P2 veranderd in P5.
E2. De noodzakelijke aanpassing is vergelijkbaar met die, uitgelegd op pagina 132.
DO
HIGH 5
PAUSE 100
RCTIME 5, 1, time
DEBUG HOME, "time =
LOOP
", DEC5 time
E3. Om in tegenovergestelde richting te bewegen, moet het patroon in omgekeerde richting
bewegen. Dit kun je bereiken, door de in het LOOKUP statement opgeslagen patronen om te
keren, of door de volgorde, waarmee het commando werkt om te keren. Hier volgen twee
oplossingen met een Update_Display subroutines.
Oplossing 1
Oplossing 2
Update_Display:
IF index = 6 THEN index = 0
'
BAFG.CDE
LOOKUP index, [ %01000000,
%10000000,
%00000100,
%00000010,
%00000001,
%00100000
],
OUTH
index = index + 1
RETURN
Index = 5 '<<Add after Index variable
Update_Display:
'
BAFG.CDE
LOOKUP index, [ %01000000,
%10000000,
%00000100,
%00000010,
%00000001,
%00100000 ], OUTH
IF (index = 0) THEN
index = 5
ELSE
index = index - 1
ENDIF
RETURN
Pagina 160 · Wat is een Microcontroller? NL HJK
P1. De fototransistor van Figuur 7-4 op pagina 132, het servo- schema voor jouw board uit
Hoofdstuk 4, Opdracht #1.
' What's a Microcontroller - Ch07Prj01_Blinds_Control.bs2
' Control servo position with light.
' {$STAMP BS2}
' {$PBASIC 2.5}
valMax
valMin
time
CON
CON
VAR
4000
100
Word
PAUSE 1000
DO
HIGH 2
PAUSE 1
RCTIME 2, 1, time
DEBUG HOME, "time =
' PAUSE 100 -> PAUSE 1
", DEC5 time
time = time MAX valMax MIN valMin
IF time > (valMax - valMin) / 2 THEN
DEBUG CR, "Open blinds "
PULSOUT 14, 500
ELSE
DEBUG CR, "Close blinds"
PULSOUT 14, 1000
ENDIF
' Modify
' Add
' Modify
' Add
LOOP
P2. De hystere functie toegevoegd, voor extra punten
' What's a Microcontroller - Ch07Prj02_Blinds_Control_Extra.bs2
' Control servo position with light including hysteresis.
' {$STAMP BS2}
' {$PBASIC 2.5}
valMax
valMin
CON
CON
4000
100
time
VAR
Word
PAUSE 1000
DO
HIGH 2
PAUSE 1
RCTIME 2, 1, time
DEBUG HOME, "time =
' PAUSE 100 -> PAUSE 1
", DEC5 time
time = time MAX valMax MIN valMin
IF time > (valMax - valMin) / 4 * 3 THEN
DEBUG CR, "Open blinds "
PULSOUT 14, 500
ELSEIF time < (valMax - valMin ) / 4 THEN
DEBUG CR, "Close blinds"
PULSOUT 14, 1000
ENDIF
LOOP
' Modify
' Add
' Modify
' Add
Geluid en Frequentie · Page 161
Hoofdstuk 8: Geluid en Frequentie
HOEVEEL ELEKTRONISCHE PIEPJES HOOR JE OP EEN DAG?
Hier volgen een paar voorbeelden van piepjes (beeps) die je zoal op een dag kunt horen: Als je eten in
de magnetron klaar is. Je mobieltje dat een melodie speelt totdat er opgenomen wordt. De
geldautomaat die piept om te voorkomen dat je je kaart niet vergeet. Een kassascanner die piept als er
een barcode wordt gescand. En laten we de piepjes van je wekker niet vergeten waarmee je de dag
misschien wel bent begonnen.
MICROCONTROLLERS, LUIDSPREKERS, BEEPS AAN/UIT SIGNALEN
Ongeveer alle elektronische beeps die je hoort worden opgewekt door een microcontroller die met een
luidsprekertje is verbonden. De microcontroller zorgt voor de beeps door heel snel achterelkaar hoge
en lage signalen te sturen naar een of meer luidsprekers. De snelheid waarmee de hoge en lage
signalen elkaar afwisselen, wordt de frequentie genoemd. En die frequentie bepaalt de toonhoogte.
Iedere keer als een hoog/laag signaal wordt herhaald, spreken we van een cyclus . Als eenheid voor
frequentie gebruiken we de eenheid Hertz, afgekort Hz. 1 Hz betekent, dat de frequentie van het hoog
laag-signaal een complete cyclus per seconde doorloopt. Veel van de pieptoontjes die je hoort hebben
een frequentie van 2 kHz. Dit betekent dat het de microcontroller in het apparaat 2000 keer per
seconde een hoog/laag signaal geeft
Introductie van de Piëzoluidspreker
In deze opdracht ga je experimenteren met een reeks signalen die naar een kleine goedkope
piëzoluidspreker, of piëzobuzzer, worden gestuurd. Het schemasymbool en de onderdeeltekening zie
je in Figuur 8-1.
Figuur 8-1
Symbool voor de Piëzoluidspreker en
de onderdeeltekening
OPDRACHT #1: BOUWEN EN TESTEN VAN EEN LUIDSPREKER
In deze Opdracht, ga je een schakeling bouwen met een piëzoluidspreker.
Onderdelen voor de luidsprekerschakeling
(1) Piëzoluidspreker
(2) Jumper draden
Bouw van de schakeling voor de Piezoluidspreker
De negatieve aansluiting van de luidspreker wordt verbonden met Vss, de positieve terminal met een
I/O pin van de BASIC stamp. We gaan de BASIC Stamp zo programmeren dat deze een hoog/laag
signaal naar de positieve aansluiting van de luidspreker stuurt.
9 Als er een sticker op de piëzoluidspreker zit, kun je die er eenvoudig afhalen.
9 Bouw de schakeling van Figuur 8-2.
Pagina 162 · Wat is een Microcontroller? NL HJK
Vdd
Vin
Vss
X3
P9
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
+
Figuur 8-2
Schakeling voor
Piëzoluidspreker en
het aansluitschema
Hoe de schakeling met de Piëzoluidspreker werkt
Als de snaar van een gitaar trilt, wordt eigenlijk de lucht in trilling gebracht. De verandering in
luchtdruk wordt door je oren waargenomen als een geluid, een toon. Hoe sneller de veranderingen, hoe
hoger de toon, hoe trager de luchtdrukveranderingen, hoe lager de toon. Het element binnen in het
plastic huisje van de luidspreker is een piëzo-elektrisch element. Indien er een hoog/laag signaal naar
de positieve terminal van de luidspreker wordt gestuurd, zal dit element gaan trillen en een
verandering van luchtdruk geven, net als bij de snaar van een gitaar.
Programmeren van de Luidspreker
Het FREQOUT commando is de meest gebruikelijke manier om een hoog/laag signaal naar de
luidspreker te zenden om geluid te maken. De BASIC Stamp Manual geeft de volgende syntax voor het
commando:
FREQOUT Pin, Duration, Freq1 {, Freq2}
Zoals met de meeste commando’s in dit boek, krijgt de parameter Pin een waarde van een vrij te
kiezen I/O-pin van de BASIC Stamp. De waarde van het Duration argument geeft aan hoe lang de
toon van het FREQOUT commando moet zijn in milliseconden (in 1000-sten van een seconde). Het
Freq1 argument wordt gebruikt om de frequentie van het geluid aan te geven en wordt uitgedrukt in
Hertz (trillingen per seconde). Er is een optioneel Freq2 argument dat gebruikt kan worden om
frequenties te mixen.
In het voorbeeld hieronder stuur je een toon naar I/O pin P9 die 1.5 seconden lang duurt met een
frequentie van 2 kHz:
FREQOUT 9, 1500, 2000
Voorbeeldprogramma: TestPiezoWithFreqout.bs2
Dit voorbeeldprogramma stuurt een 2 kHz toon naar de luidspreker op I/O pin P9 gedurende 1.5
seconden. Je kunt de Debug terminal gebruiken om te zien wanneer de luidspreker piept en wanneer
het geluid stopt.
9 Voer het programma in en start TestPiezoWithFreqout.bs2.
9 Ga na dat de luidspreker een heldere toon voortbrengt gedurende de tijd dat op de Debug
Terminal display de melding “Tone sending…” te zien is.
' What's a Microcontroller - TestPiezoWithFreqout.bs2
' Send a tone to the piezo speaker using the FREQOUT command.
'{$STAMP BS2}
'{$PBASIC 2.5}
PAUSE 1000
DEBUG "Tone sending...", CR
FREQOUT 9, 1500, 2000
DEBUG "Tone done."
Geluid en Frequentie · Page 163
Jouw beurt – Aanpassen van frequentie en tijdsduur
9
9
9
9
Sla TestPiezoWithFreqout.bs2 op onder een andere naam.
Probeer verschillende waarden voor het Duration en Freq1 argument.
Start na elke verandering het programma opnieuw en schrijf op wat je hoort.
Indien het Freq1 argument groter wordt, wordt de toon dan hoger of lager? Experimenteer met
waarden 1500, 2000, 2500 en 3000 voor Freq1 argument om deze vraag te antwoorden.
OPDRACHT #2: ACTIEGELUIDEN
Veel speelgoed bezit een microcontroller die actiegeluiden maakt. Actiegeluiden zijn eigenlijk
opeenvolgende toontjes met verschillende frequenties die naar de luidspreker worden gestuurd. Je kunt
ook een interessant effect krijgen door frequenties te gaan mixen door gebruik van het optionele Freq2
argument van het FREQOUT commando. In deze opdracht probeer je deze twee technieken uit.
Programmeren van Actiegeluiden
Actie- en toepassingsgeluiden hebben drie verschillende componenten:
1. Pauze
2. Duration (Tijdsduur)
3. Frequentie
De pauze is de tijd tussen 2 tonen, je kunt het PAUSE commando gebruiken om stiltes in te lassen. De
Tijdsduur is de tijd dat de toon wordt gespeeld en wordt bepaald door het FREQOUT commando
Duration argument. De frequentie bepaalt de toonhoogte. Hoe groter de waarde van de frequentie,
hoe hoger de toon, hoe kleiner de waarde van het Freq1 argument in het FREQOUT commando, hoe
lager de toon.
Voorbeeldprogramma: ActionTones.bs2
ActionTones.bs2 demonstreert enkele combinaties van pauze, lengte en frequentie. De eerste serie van
tonen lijkt op die van een elektronische alarmklok. De tweede reeks klinkt meer als het geluid van een
pratende robot uit een science-fictionfilm. De derde reeks is het geluidseffect zoals je dat hoort in oude
videospelletjes.
9 Voer het onderstaande programma in en start ActionTones.bs2.
' What's a Microcontroller - ActionTones.bs2
' Demonstrate how different combinations of pause, duration, and frequency
' can be used to make sound effects.
'{$STAMP BS2}
'{$PBASIC 2.5}
duration
frequency
VAR
VAR
Word
Word
PAUSE 1000
DEBUG "Alarm...", CR
PAUSE 100
FREQOUT 9, 500, 1500
PAUSE 500
FREQOUT 9, 500, 1500
PAUSE 500
FREQOUT 9, 500, 1500
PAUSE 500
FREQOUT 9, 500, 1500
PAUSE 500
DEBUG "Robot reply...", CR
PAUSE 100
FREQOUT 9, 100, 2800
FREQOUT 9, 200, 2400
FREQOUT 9, 140, 4200
FREQOUT 9, 30, 2000
Pagina 164 · Wat is een Microcontroller? NL HJK
PAUSE 500
DEBUG "Hyperspace...", CR
PAUSE 100
FOR duration = 15 TO 1 STEP 1
FOR frequency = 2000 TO 2500 STEP 20
FREQOUT 9, duration, frequency
NEXT
NEXT
DEBUG "Done", CR
END
Hoe ActionTones.bs2 werkt
De “Alarm” routine klinkt als een alarmklok. Deze routine maakt een toon op een vaste frequentie van
1.5 kHz gedurende 0.5 s met een vaste pauze tussen de tonen van 0.5. De “Robot reply” routine
gebruikt verschillende frequenties met kortere lengtes.
De “Hyperspace” routine gebruikt geen vertraging, maar varieert zowel tijdsduur als frequentie. Door
het gebruik van de FOR…NEXT lus, verandert de frequentie en tijdsduur en kun je enkele interessante
geluidseffecten horen. In dit voorbeeld zie je, dat er binnen een FOR…NEXT lus nog een andere lus
wordt uitgevoerd. We noemen dit een geneste lus. We gaan kijken, hoe dit werkt met een geneste
FOR…NEXT lus. De duration variabele start in de buitenste lus op 15, daarna neemt de binnenlus met
frequency de controle over en stuurt achtereenvolgens een frequentie naar de luidspreker van 2000,
2020 2040 en zo voort tot 2500. Indien de frequentielus klaar is, is de duration lus die van 1 naar 15
loopt nog maar een stap gemaakt Er wordt 1 van de waarde van het duration argument afgetrokken
waarna de frequency lus wordt weer herhaald.
FOR duration = 15 TO 1
FOR frequency = 2000 TO 2500 STEP 15
FREQOUT 9, duration, frequency
NEXT
NEXT
Voorbeeldprogramma: NestedLoops.bs2
Om beter te begrijpen hoe een geneste FOR…NEXT lus werkt, gebruikt NestedLoops.bs2 het DEBUG
commando om te laten zien hoe de waarden veranderen. Dit voorbeeld is een minder ingewikkelde
versie van de geneste lus in ActionTones.bs2.
9 Voer in en start NestedLoops.bs2.
9 Ga na wat de Debug Terminal output is, evenals het lengte- en frequentie-argument telkens als
de lus wordt doorlopen.
' What's a Microcontroller - NestedLoops.bs2
' Demonstrate how the nested loop in ActionTones.bs2 works.
'{$STAMP BS2}
'{$PBASIC 2.5}
duration
frequency
VAR
VAR
Word
Word
PAUSE 1000
DEBUG "Duration
"--------
Frequency", CR,
---------", CR
FOR duration = 4000 TO 1000 STEP 1000
FOR frequency = 1000 TO 3000 STEP 500
DEBUG "
" , DEC5 duration,
"
", DEC5 frequency, CR
FREQOUT 9, duration, frequency
NEXT
DEBUG CR
NEXT
END
Geluid en Frequentie · Page 165
Jouw beurt – Meer Geluidseffecten
Er zijn een oneindig aantal geluidscombinaties te maken, door het aanpassen van ActionTones.bs2 om.
Hier zie je een aanpassing van de “Hyperspace” routine:
DEBUG "Hyperspace jump...", CR
FOR duration = 15 TO 1 STEP 3
FOR frequency = 2000 TO 2500 STEP 15
FREQOUT 9, duration, frequency
NEXT
NEXT
FOR duration = 1 TO 36 STEP 3
FOR frequency = 2500 TO 2000 STEP 15
FREQOUT 9, duration, frequency
NEXT
NEXT
9 Sla het voorbeeldprogramma op onder de naam ActionTonesYourTurn.bs2.
9 Amuseer je met dit en andere aanpassingen voor je eigen systeem.
Twee Frequenties tegelijk
Je kunt ook twee frequenties tegelijk versturen. In de audiowereld noemt men dit mixen van tonen.
Denk nog een keer aan het commando FREQOUT van Opdracht #1
FREQOUT Pin, Duration, Freq1 {, Freq2}
Je kunt het optionele Freq2 argument gebruiken om een tweede frequentie uit te sturen met het
FREQOUT commando. In het volgende voorbeeld, kun je een toon van 2kHz en een van 3 kHz als volgt
samenvoegen:
FREQOUT 9, 1000, 2000, 3000
De piepjes die je hoort tijdens het kiezen van een telefoonnummer zijn een goed
voorbeeld van twee frequenties door elkaar. In de telecommunicatie noemt men dit DTMF
(Dual Tone Multi Frequency = twee tonige meervoudige frequentie). Er bestaat ook een
PBASIC commando DTMFOUT dat bedoeld is om telefoontonen te maken. In de BASIC
Stamp Handleiding zie je een voorbeeldproject waar telefoonnummers worden gedraaid
met het DTMFOUT commando.
Voorbeeldprogramma: PairsOfTones.bs2
Dit voorbeeldprogramma laat je het verschil horen, als je tonen van 2 en 3 kHz mengt. Het laat ook
een ander interessant verschijnsel horen, als je twee tonen mixt die maar een heel klein beetje
verschillen. Als je bijvoorbeeld een toon van 2000 Hz en 2001 Hz mengt, dan zal de toon iedere
seconde luider en zachter worden (dit komt door het frequentieverschil van 1 Hz). Dus indien je 2000
Hz met 2002 Hz mengt, zal dit geluid twee keer per seconde zachter en harder worden (2 Hz) en zo
voort.
Interferentie is een term, die men gebruikt indien twee frequenties gemengd worden met
een klein frequentieverschil. De tonen versterken en verzwakken elkaar voortdurend. Het
frequentieverschil bepaalt hoe vaak dit versterken/verzwakken per seconde voorkomt
Indien het verschil 1 Hz is, zal het geluid een keer per seconde versterkt en verzwakt
worden. En 2 keer per seconde indien het verschil 2 Hz is en zo voort.
De variaties in luchtdrukken, die door de piëzo- elektrische luidspreker worden uitgestuurd,
noemen we geluidsgolven. Indien het geluid het luidste is, dan versterken de luchtdrukken
van de twee frequenties elkaar. (superpositie). Als het geluid zacht is, dan heffen de twee
frequenties elkaar op. ( interferentie).
9 Voer in en start MixingTones.bs2.
Pagina 166 · Wat is een Microcontroller? NL HJK
9 Kijk op de Debug Terminal en schrijf op, welk verschil je hoort tijdens het mengen van de
verschillende tonen.
' What's a Microcontroller - PairsOfTones.bs2
' Demonstrate some of the things that happen when you mix two tones.
'{$STAMP BS2}
'{$PBASIC 2.5}
PAUSE 1000
DEBUG "Frequency = 2000", CR
FREQOUT 9, 4000, 2000
DEBUG "Frequency = 3000", CR
FREQOUT 9, 4000, 3000
DEBUG "Frequency = 2000 + 3000", CR
FREQOUT 9, 4000, 2000, 3000
DEBUG "Frequency = 2000 + 2001", CR
FREQOUT 9, 4000, 2000, 2001
DEBUG "Frequency = 2000 + 2002", CR
FREQOUT 9, 4000, 2000, 2002
DEBUG "Frequency = 2000 + 2003", CR
FREQOUT 9, 4000, 2000, 2003
DEBUG "Frequency = 2000 + 2005", CR
FREQOUT 9, 4000, 2000, 2005
DEBUG "Frequency = 2000 + 2010", CR
FREQOUT 9, 4000, 2000, 2010
DEBUG "Done", CR
END
Jouw beurt – Inkorten van de Code
Het programma MixingTones.bs2 is geschreven om te laten zien dat er bij het mengen van twee
frequenties via het commando Freq2 argument. interessante dingen kunnen gebeuren. Jammer genoeg
is deze manier om gemengde tonen op te wekken, niet erg handig.
9 Pas MixingTones.bs2 aan zodat de cyclus van het Freq2 argument van 2001 naar 2005 gaat
door het toevoegen van variabele in de lus.
OPDRACHT #3: MUZIEKNOTEN EN SIMPELE LIEDJES
Figuur 8-3 laat je de 25 de toetsen van de rechterkant van het klavier van een piano zien. Het laat ook
de frequenties zien van de snaren in de piano die met de toets zijn verbonden.
Verder staan op de toetsen de overeenkomende muzieknoten van C6 tot C8. Deze toetsen zijn
onderverdeeld in groepen van 12. Elke groep heet een octaaf en bevat acht witte toetsen en 4 zwarte
toetsen. Deze volgorde herhaalt zich na elke 12 toetsen. In iedere hogere octaaf, hebben tonen met
dezelfde letter een dubbele frequentie. Een voorbeeld: C7 heeft een tweemaal hogere frequentie dan
C6, en C8 heeft tweemaal de frequentie van C7. Evenzo heeft de frequentie van een lager gelegen
octaaf de halve frequentie. Een voorbeeld: A6 heeft de halve frequentie van A7.
Geluid en Frequentie · Page 167
Figuur 8-3: Rechtse pianotoetsen en hun frequenties
Indien je een zanger hoort die zingt: “Do Re Mi Fa Sol La Ti Do”, dan oefent de zanger om de
toonhoogte van de noten overeen te laten komen met die van de pianotoetsen. De witte toetsen worden
de natuurlijke toetsen genoemd. De zwarte toetsen zijn kruisen of mollen. Als voorbeeld, de zwarte
toets tussen de toetsen C en D noemt men C-kruis (C#) of D-mol (Db). Waarom en wanneer een noot
een kruis of een mol wordt genoemd, leer je in de muzieklessen.
Zoek op Internetnaar – “toonladders”: Door de woorden "toonladder"
in een
zoekmachine te gebruiken, kun je veel interessante informatie vinden over de historie van
muziek en geluid maar ook over de natuurkunde en psychologie van dit onderwerp. De 12
noten per octaaf zijn de basis van de westerse muziek. Sommige andere culturen gebruiken
een andere toonladder, die soms 2 maar soms ook wel tot 35 noten per octaaf bevat.
Manier om te stemmen: In het toetsenbord van Figuur 8-3 worden de volgende tonen als
volgt gestemd: De frequenties liggen vast aan een zogenaamde referentienoot. Voor elke
(n/12)
volgende toon wordt de frequentie van de vorige toon vermenigvuldigd met 2
waarbij n =
1, 2, 3,... de waarde heeft van het nummer van de toets (toon) We nemen als voorbeeld de
(1/12)
frequentie van A6, vermenigvuldigen deze met 2
om de frequentie van A6# te vinden.
(2/12)
We vermenigvuldigen met
om de frequentie van B6 te berekenen enzovoort. Hieronder
zie je een voorbeeld van de berekening van de frequentie van B6 met A6 als referentie noot:
De frequentie van A6 is 1760
2
(2/12)
= 1.1224
1760 X 1.224 = 1975.5
1975.5 is de frequentie van B6
Programmeren van muzieknoten
Het FREQOUT commando wordt ook gebruikt voor het opwekken van muzieknoten. Programmeren van
de BASIC Stamp om muziek te spelen via de luidspreker betekent wel, dat er nogal wat regels
gevolgd moeten worden, net als bij andere muziekinstrumenten het geval is. De regels helpen bij het
maken van geluidseffecten, frequenties, lengte van de noten en pauzes. Het volgende
voorbeeldprogramma speelt muzieknoten op de luidspreker af met een lengte van een halve seconde.
Voorbeeldprogramma: DoReMiFaSolLaTiDo.bs2
9 Voer in en start DoReMiFaSolLaTiDo.bs2
Pagina 168 · Wat is een Microcontroller? NL HJK
' What's a Microcontroller - DoReMiFaSolLaTiDo.bs2
' Send an octave of half second notes using a piezoelectric speaker.
'{$STAMP BS2}
'{$PBASIC 2.5}
PAUSE 1000
'Solfege
Tone
Note
DEBUG "Do...", CR:
FREQOUT 9,500,1047
' C6
DEBUG "Re...", CR:
FREQOUT 9,500,1175
' D6
DEBUG "Mi...", CR:
FREQOUT 9,500,1319
' E6
DEBUG "Fa...", CR:
FREQOUT 9,500,1396
' F6
DEBUG "Sol..", CR:
FREQOUT 9,500,1568
' G6
DEBUG "La...", CR:
FREQOUT 9,500,1760
' A6
DEBUG "Ti...", CR:
FREQOUT 9,500,1976
' B6
DEBUG "Do...", CR:
FREQOUT 9,500,2093
' C7
END
Jouw beurt – scherpe en vlakke tonen
9 Gebruik de frequenties die in Figuur 8-3 te zien zijn, om een kruis- en moltoon toe te voegen
aan DoReMiFaSolLaTiDo.bs2
9 Pas het programma aan, zodat het de volgende octaaf speelt. Hint: Bespaar typewerk door de *
2 operatie na het Freq1 argument te plaatsen. Als je bijvoorbeeld: FREQOUT 9, 500, 1175 *
e
2 gebruikt, om D7 te maken, krijg je de D noot in de 7 octaaf.
Opslaan en Opvragen van Muziek
Je kunt muzieknoten met de BASIC Stamp module opslaan in EEPROM. Je zou hiervoor een
heleboel WRITE commando’s kunnen gebruiken. Door het DATA commando te gebruiken kun je dit veel
makkelijker doen. De syntax voor DATA is:
{Symbol} DATA {Word} DataItem {, {Word} DataItem, … }}
Hier volgt een voorbeeld hoe je het DATA commando kunt gebruiken om de letter op te slaan die
overeen komt met de muzieknoten:
Notes DATA "C","C","G","G","A","A","G"
Je kunt het READ commando gebruiken om de letters weer op te vragen. De letter ‘C’ is te vinden in
het adres Notes + 0, de tweede letter ‘C’ staat in Notes + 1. dan komt de eerste ‘G’ die op de
plaats Notes + 2,staat en zo verder. Als je bijvoorbeeld de laatste letter ‘G’ op wilt roepen uit de
bytevariabele noteLetter, gebruik dan het volgende commando:
READ Notes + 6, noteLetter
Je kunt ook een lijst van getallen opslaan met het DATA commando. We kunnen zo bijvoorbeeld de
frequentie en de tijdsduur, die de BASIC Stamp weer gebruikt voor muzieknoten , opslaan in
woordvariabelen. We moeten in dit geval woordvariabelen gebruiken en geen bytevariabelen, omdat
de waarden groter dan 255 kunnen zijn. Hieronder zie je hoe dit gedaan kan worden:
Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136,
Word 3520, Word 3520, Word 3136
Omdat iedere waarde twee bytes bezet, is het aanroepen met het read commando anders dan bij het
oproepen van letters, die in een byte zouden passen. Het eerste getal 2093 is op plaats Frequencies +
0 opgeslagen, Het tweede getal 2093 op Frequencies + 2. Het eerste getal 3136 staat op de plaats
Frequencies + 4, de tweede getal 3136 op Frequencies + 6.
Geluid en Frequentie · Page 169
De waarden in het
Frekwenties
DATA commando komen overeen met
muzieknoten in de Notes DATA .
Hieronder staat een FOR…NEXT lus die de Notes DATA in een variabele schrijft met de naam
noteLetter, daarna plaatst het de Frequencies DATA in de variabele noteFreq.
FOR index = 0 to 6
READ Notes + index, noteLetter
READ Frequencies + (index * 2), Word noteFreq
DEBUG noteLetter, " ", DEC noteFreq, CR
NEXT
Wat doet (index * 2)? Elke waarde die opgeslagen wordt in Frequencies DATA neemt
een woord in beslag (twee bytes), terwijl elk karakter in Notes DATA enkel een byte
inneemt. De waarde van index neemt telkens met een toe als er FOR…NEXT lus wordt
uitgevoerd. Dit is handig om letters op te vragen met het commando READ Notes +
index, noteLetter. Het probleem bij het gebruik van een woord (word) als
gegevenselement is, dat in Notes, de index variabele tweemaal opgeteld moet worden
om de juiste gegevens uit de Frequencies lijst terug te halen. Met het commando READ
Frequencies + (index * 2), Word noteFreq, los je dit op.
Het volgende programma slaat de tijdsduur op door middel van DATA en gebruikt deze waarde in het
FREQOUT commando om elke noot met een specifieke tijdsduur af te laten spelen. Het resultaat zijn de
eerste noten van het liedje Twinkle Twinkle Little Star.
dat door kinderen gebruikt wordt om hun “ABC…” te
onthouden heeft dezelfde noten als het liedje Twinkle Twinkle Little Star.
Het Alfabet Lied
Voorbeeldprogramma: TwinkleTwinkle.bs2
Dit voorbeeld laat zien hoe je de DATA op kunt slaan en hoe het READ commando is te gebruiken om
waarden uit de lijst op te halen.
9 Voer in en start TwinkleTwinkle.bs2
9 Ga na dat het klinkt als het lied Twinkle Twinkle Little Star.
9 Gebruik de Debug Terminal om zien of alles werkt zoals verwacht.
' What's a Microcontroller - TwinkleTwinkle.bs2
' Play the first seven notes from Twinkle Twinkle Little Star.
'{$STAMP BS2}
'{$PBASIC 2.5}
Notes
DATA
"C","C","G","G","A","A","G"
Frequencies
DATA
Word 2093, Word 2093, Word 3136, Word 3136,
Word 3520, Word 3520, Word 3136
Durations
DATA
Word 500, Word 500, Word 500, Word 500,
Word 500, Word 500, Word 1000
index
noteLetter
noteFreq
noteDuration
VAR
VAR
VAR
VAR
Nib
Byte
Word
Word
PAUSE 1000
DEBUG
"Note
"----
Duration
--------
Frequency", CR,
---------", CR
Pagina 170 · Wat is een Microcontroller? NL HJK
FOR index = 0 TO 6
READ Notes + index, noteLetter
DEBUG "
", noteLetter
READ Durations + (index * 2), Word noteDuration
DEBUG "
", DEC4 noteDuration
READ Frequencies + (index * 2), Word noteFreq
DEBUG "
", DEC4 noteFreq, CR
FREQOUT 9, noteDuration, noteFreq
NEXT
END
Jouw beurt – Toevoegen en spelen van meer noten
Dit programma speelde de eerste zeven noten van Twinkle Twinkle Little Star. De eerste zin luidt:
“Twin-kle twin-kle lit-tle star”. De volgende is “How I won-der what you are”, en de noten zijn F, F,
E, E, D, D, C. Net als bij de eerste zin, wordt de laatste noot tweemaal zolang aangehouden als de
anderen. Om deze functie toe te voegen aan het liedje TwinkleTwinkle.bs2, moet je de DATA structuur
op de juiste manier aanpassen. Vergeet niet de FOR…NEXT lus aan te passen zodat deze van 0 tot 13 telt
in plaats van 0 tot 6.
9 Pas TwinkleTwinkle.bs2 aan zodat de twee eerste zinnen worden gespeeld in plaats van enkel
de eerste.
OPDRACHT #4: MUZIEK MAKEN MET EEN MICROCONTROLLER
De tijdsduur van een muzieknoot wordt op de partituur niet aangegeven in milliseconden. De tijdsduur
of de lengte van een noot wordt aangegeven als een hele, halve, kwart, achtste, zestiende,
tweeëndertigste noot. Hoe lang een hele noot duurt, hangt af van het stuk muziek dat gespeeld wordt.
Het tempo van het ene stuk kan hoger zijn dan het tempo van een ander. Een noot kan in het ene stuk
een paar seconden duren en in een ander stuk kan dit evengoed maar 1 seconde zijn.
Rusten zijn de tijden tussen de noten, evenals bij noten worden deze niet in milliseconden uitgedrukt
maar in hele, halve, kwart, achtste, zestiende, tweeëndertigste noten of rust.
Nadat je deze opdracht hebt afgerond, weet je, hoe je met het PBASIC programma om
noten te spelen, ook bladmuziek kunt afspelen. Kijk daarvoor op www.parallax.com/go/WAM
naar de video en kijk op tutorial “Playing Sheet Music with the Piezospeaker tutorial “.
Een beter systeem voor opslag en afspelen van muziek
Je kunt programma’s schrijven die tweemaal zoveel muziek bevatten op de BASIC Stamp door bytes
te gebruiken in plaats van woorden in de DATA lijst. Je kunt je programma ook zo aanpassen dat de
noten makkelijker te lezen zijn door muzikale conventies (afspraken) te gebruiken voor de noten en de
lengte ervan. Deze Opdracht zal starten met een inleiding, hoe je noten kunt gebruiken op de manier,
die ook in de muziekwereld gangbaar is. In de volgende opdracht wordt ook het begrip tempo
uitgelegd.
Hieronder staat een voorbeeld van opslag met DATA van noten en lengtes voor het volgende
programma. Als dit wordt gespeeld, zul je het liedje “Vader Jacob” herkennen. Alleen de noten en
lengte ervan zijn in de Notes DATA opgeslagen omdat er gewerkt wordt met het LOOKUP en LOOKDOWN
commando om de juiste frequentie te vinden.
Notes
DATA
Durations
DATA
WholeNote
CON
"C","D","E","C","C","D","E","C","E","F",
"G","E","F","G","Q"
4,
2,
2000
4,
4,
4,
4,
4,
2
4,
4,
4,
4,
4,
4,
Geluid en Frequentie · Page 171
Het eerste getal in het argument Durations DATA commando bepaalt, hoelang het programma de
eerste noot uit de Notes Data laat duren. Het tweede getal is de nootlengte voor de tweede noot
enzovoort. De lengtes zijn niet meer in milliseconden maar veel kleinere getallen zodat ze in bytes
kunnen worden opgeslagen. Er is nu dus geen Word voorvoegsel in DATA. Vergeleken met de eerder
gebruikte opgeslagen waarden in milliseconden, zijn de nu gebruikte getallen meer in
overeenstemming met muziekpartituren.
Hieronder staat een lijst met de betekenis van de lengtes:
•
•
•
•
•
•
1 – hele noot
2 – halve noot
4 – kwart noot
8 – achtste noot
16 – zestiende noot
32 – tweeëndertigste noot
Nadat elke waarde uit DATA is gelezen, wordt het getal gedeeld door de WholeNote waarde om de
lengte te krijgen die gebruikt wordt in het FREQOUT commando argument duration. De duur van elke
noot hangt af van het tempo van het lied. Een sneller lied heeft een sneller temp en daarbij duurt de
noot minder lang dan bij een trager tempo. Aangezien de tijdsduur van de noten een gedeelte is van
een hele noot, kun je het tempo bepalen door de lengte van de volledige noot.
Wat doet de "Q" in de Notes DATA ? "Q" staat voor quit, weggaan, stoppen, en een DO
WHILE…LOOP kijkt altijd naar de "Q" in de lus.
Hoe speel ik een rust? Je kunt een rust tussen twee noten plaatsen door een "P" te
plaatsen. De Jouw beurt paragraaf geeft de eerste noten van de 5de Symfonie van
Beethoven, die een rust bevatten.
Hoe speel ik een kruis- of molnoot? NotesAndDurations.bs2 heeft waarden van mollen en
kruisen in de opzoek tabel. Indien je de kleine- letterversie gebruikt van de noot, zal er een
kruisnoot gespeeld worden. Als voorbeeld, indien je een B-mol wil spelen, gebruik een “b” in
plaats van een “B”. Onthoud dat dit dezelfde frequentie is als een A kruis.
Voorbeeldprogramma: NotesAndDurations.bs2
9 Voer in en start NotesAndDurations.bs2.
9 Hoe klinkt dit?
' What's a Microcontroller - NotesAndDurations.bs2
' Play the first few notes from Frere Jacques.
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "Program Running!"
Notes
DATA
"C","D","E","C","C","D","E","C","E","F",
"G","E","F","G","Q"
Durations
DATA
WholeNote
CON
2000
index
offset
VAR
VAR
Byte
Nib
noteLetter
noteFreq
noteDuration
VAR
VAR
VAR
Byte
Word
Word
4,
2,
4,
4,
4,
4,
4,
2
4,
4,
4,
4,
4,
4,
Pagina 172 · Wat is een Microcontroller? NL HJK
DO UNTIL noteLetter = "Q"
READ Notes + index, noteLetter
LOOKDOWN noteLetter, [
LOOKUP offset,
"A",
"D",
"G",
"b",
"e",
"a",
"B",
"E",
"P",
"C",
"F",
"Q"
"d",
"g",
], offset
[ 1760, 1865, 1976, 2093, 2217,
2349, 2489, 2637, 2794, 2960,
3136, 3322,
0,
0
], noteFreq
READ Durations + index, noteDuration
noteDuration = WholeNote / noteDuration
FREQOUT 9, noteDuration, noteFreq
index = index + 1
LOOP
END
Hoe NotesAndDurations.bs2 werkt
De Notes en Durations DATA zijn voor dit programma al eerder besproken. Deze gegevens,
gecombineerd met de WholeNote constante, worden gebruikt om alle noten op te slaan in het
programma.
Hieronder staan de verklaringen van alle vijf de variabelen van dit programma. Aangezien een
FOR…NEXT lus niet langer gebruikt wordt om data op te roepen, dient er nog steeds een variabele
(index) te zijn die onthoudt welke DATA regel wordt ingelezen voor Notes en Durations. De
offsetvariabele is gebruikt in het LOOKDOWN- en LOOKUP commando om een bepaalde waarde te
selecteren.
De noteLettervariabele slaat een karakter op dat opgeroepen is door het
READcommando. LOOKUP- en LOOKDOWN commando’s worden gebruikt om karakters te converteren in
een frequentiewaarde. Deze waarde wordt opgeslagen in de noteFreq variabele en wordt gebruikt
door het FREQOUT commando Freq1 argument. De noteDuration variabele wordt gebruikt in een
READ commando om een waarde te ontvangen vanuit de Durations DATA. Deze wordt ook gebruikt
om Duration te berekenen.
index
offset
VAR
VAR
Byte
Nib
noteLetter
noteFreq
noteDuration
VAR
VAR
VAR
Byte
Word
Word
De hoofdlus wordt uitgevoerd totdat de letter ‘Q’ in de Notes DATA wordt gelezen.
DO UNTIL noteLetter = "Q"
Een READ commando leest tekens een letterteken uit de Notes DATA, en slaat het op in de
noteLettervariabele. De noteLettervariabele wordt dan gebruikt in het LOOKDOWNcommando om
de waarde van de offsetvariabele te bepalen. Onthoud dat de offset een 1 is indien “b” , en een 2
indien “B” is gedetecteerd, een 3 indien “C” is gebruikt, enzovoort. Deze offsetwaarde wordt dan in
het LOOKUPcommando gebruikt om te bepalen, welke waarde de noteFreqvariabele moet krijgen.
Indien offset een 1 is, zal noteFreq 1865 zijn, indien offset een 2 is, zal noteFreq 1976 zijn,
indien offset een 3 is, zal noteFreq 2093 zijn,...
READ Notes + index, noteLetter
LOOKDOWN noteLetter, [
"A",
"D",
"G",
"b",
"e",
"a",
"B",
"E",
"P",
"C", "d",
"F", "g",
"Q" ], offset
Geluid en Frequentie · Page 173
LOOKUP offset,
[ 1760, 1865, 1976, 2093, 2217,
2349, 2489, 2637, 2794, 2960,
3136, 3322,
0,
0 ], noteFreq
De frequentie van de noot is nu bekend, maar de lengte van de toon moet nog wel worden uitgezocht.
Het READcommando gebruikt de waarde van index om een waarde in de Durations DATA in
noteDuration te halen.
READ Durations + index, noteDuration
De waarde van noteDuration wordt uitgerekend door de WholeNote constante te delen door de
noteDuration. Indien die lengte 4 is, dan wordt de waarde 2000 ÷ 4 = 500. Indien noteDuration 8
is, wordt de waarde 1500 ÷ 8 = 250.
noteDuration = WholeNote / noteDuration
Aangezien nu zowel noteDuration als noteFreq bekend zijn, kan het FREQOUT commando de noot
spelen.
FREQOUT 9, noteDuration, noteFreq
Elke keer als de hoofdlus wordt doorlopen, wordt de indexwaarde met 1 verhoogd. Als de hoofdlus
terugkeert naar het begin, is het eerste wat het programma doet, de index weer met een verhogen:
index = index + 1
LOOP
Jouw beurt – Experimenteren met Tempo en een verschillende Toon
De tijd die elke noot duurt, hangt vast aan het tempo. Je kunt het tempo veranderen door de
WholeNoteconstante aan te passen. Indien je deze verhoogt tot 2250, zal het tempo afnemen en wordt
het liedje trager afgespeeld. Indien je de constante instelt op 1750, zal het tempo stijgen en wordt het
liedje sneller afgespeeld.
9 Sla NotesAndDurations.bs2 op onder de naam NotesAndDurationsYourTurn.bs2.
9 Pas het tempo aan van NotesAndDurationsYourTurn.bs2 door de waarde van WholeNote te
veranderen. Probeer de waarden 1500, 1750, 2000 en 2250.
9 Herstart het programma na elke aanpassing en beslis welke versie het beste klinkt.
Ingeven van muziek is veel makkelijker indien je enkel noten en lengtes hoeft op te geven. Hier volgen
de eerste noten van de 5de symfonie van Beethoven.
Notes
DATA "G","G","G","e","P","F","F","F","D","Q"
Durations DATA
8,
WholeNote CON
2000
8,
8,
2,
8,
8,
8,
8,
2
9 Sla je aanpassingen op.
9 Vervang de Notes en Durations DATA en de WholeNote constante verklaring met
bovenstaande code.
9 Start het programma. Ken je dit liedje?
Toevoegen van Muzikale Kenmerken
Het voorbeeldprogramma dat je net hebt gemaakt, heeft je leren werken met noten, tijden en rusten.
Ook het tempo van de gehele noot werd uitgelegd. Mobieltjes die een geluid afspelen hebben minstens
drie extra mogelijkheden om geluiden af te spelen in vergelijking met het vorige programma:
Pagina 174 · Wat is een Microcontroller? NL HJK
•
•
•
Ze spelen “gepunte” noten.
Ze bepalen de gehele nootlengte vanuit een tempowaarde.
Ze spelen noten van meer dan een octaaf.
De term “gepunt” verwijst naar een punt, gebruikt om de noot 1 ½ maal langer dient te worden
gespeeld dan de normale lengte om deze zo een karakteristiek mee te geven in de muziek. Als
bijvoorbeeld een gepunte kwart noot gespeeld moet worden, dient deze zo lang te zijn als een kwart
noot met een achtste erbij. Een gepunte halve noot wordt zo lang als een halve noot en een kwart erbij.
Je kunt een extra tabel toevoegen die dit opslaat. In dit voorbeeld betekent een nul dat er geen punt op
de noot staat, een betekent dat er wel een één staat:
Dots
DATA
0,
0,
0,
0,
0,
0,
0,
1,
0,
0
0,
1,
0,
0,
0,
0,
Bij mobiele telefoons wordt het tempo vaak aangeduid met het aantal slagen per minuut voor het
tempo van een liedje. Dit komt overeen met het aantal kwart noten per minuut.
BeatsPerMin
CON
200
Figuur 8-4 is een herhaling van Figuur 8-3 op pagina 167. Het toont de 6e en 7e octaaf van een
pianotoetsenbord. Deze twee octaven worden door de piëzoluidspreker het beste weergegeven. Hier
volgt een voorbeeld van de DATA die je zult gebruiken in de komende paragraaf, waarin je meer dan
een octaaf zult spelen met de Notes DATA.
Octaves
DATA
6,
6,
7,
6,
6,
6
6,
6,
6,
6,
6,
6,
7,
6,
Figuur 8-4: Meest rechtse deel van de pianotoetsen en hun frequentie
Voorbeeldprogramma: MusicWithMoreFeatures.bs2
Dit voorbeeld programma speelt de eerste noten van het lied “For He’s a Jolly Good Fellow”. Alle
noten komen voor in eenzelfde octaaf (7e) , maar enkele noten zijn gepunt. In de Jouw beurt paragraaf
ga je gepunte noten en verschillende octaven uitproberen in hetzelfde programma.
9 Voer in en start MusicWithMoreFeatures.bs2.
9 Tel het aantal gepunte noten (1 ½ lengte).
9 Luister ook naar noten in het 7e octaaf. Probeer een van de noten naar het 6e octaaf te
veranderen. Deze verandering zal vrij dramatisch zijn voor de muziek.
Geluid en Frequentie · Page 175
' What's a Microcontroller - MusicWithMoreFeatures.bs2
' Play the beginning of For He's a Jolly Good Fellow.
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "Program Running!"
Notes
DATA
"C","E","E","E","D","E","F","E","E","D","D",
"D","C","D","E","C","Q"
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7
4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4,
4, 4, 4, 2, 2
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 0
Octaves
DATA
Durations
DATA
Dots
DATA
BeatsPerMin
CON
320
index
offset
VAR
VAR
Byte
Nib
noteLetter
noteFreq
noteDuration
noteOctave
noteDot
VAR
VAR
VAR
VAR
VAR
Byte
Word
Word
Nib
Bit
wholeNote
VAR
Word
wholeNote = 60000 / BeatsPerMin * 4
DO UNTIL noteLetter = "Q"
READ Notes + index, noteLetter
LOOKDOWN noteLetter,
LOOKUP offset,
[ "C",
"F",
"b",
"d",
"g",
"B",
"D",
"G",
"P",
"e",
"a",
"Q"
"E",
"A",
], offset
[ 4186, 4435, 4699, 4978, 5274,
5588, 5920, 6272, 6645, 7040,
7459, 7902,
0,
0
], noteFreq
READ Octaves + index, noteOctave
noteOctave = 8 - noteOctave
noteFreq = noteFreq / (DCD noteOctave)
READ Durations + index, noteDuration
noteDuration = WholeNote / noteDuration
READ Dots + index, noteDot
IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2
FREQOUT 9, noteDuration, noteFreq
index = index + 1
LOOP
END
Hoe MusicWithMoreFeatures.bs2 werkt
Hieronder staan de muziekgegevens van het hele liedje. Voor elke noot in de Notes DATA , is er een
overeenkomstig ingegeven waarde naar Octaves, Durations, en Dots DATA. Als voorbeeld, de
eerste noot is een C in het 7e octaaf; het is een kwart noot en gepunt. Hier heb je een ander voorbeeld:
de voorlaatste noot (zonder “Q”) is een E noot in het 7e octaaf. Het is een halve gepunte noot. Er is
ook een BeatsPerMin constante die het tempo van het lied aangeeft.
Notes
DATA
Octaves
DATA
Durations
DATA
"C","E","E","E","D","E","F","E","E","D","D",
"D","C","D","E","C","Q"
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7
4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4,
Pagina 176 · Wat is een Microcontroller? NL HJK
Dots
DATA
BeatsPerMin
CON
4,
0,
0,
4,
0,
0,
4,
0,
0,
2,
0,
1,
2
0,
0
0,
1,
0,
0,
0,
0,
320
In vorige voorbeelden was WholeNote een constante. Deze keer is het een variabele die de lengte van
de noot in milliseconden bevat. Nadat deze waarde is berekend, zal WholeNote gebruikt worden om
uit te maken wat de lengte is van alle andere noten net zoals in het vorige programma. De index,
offset, noteLetter, en noteDurationvariabelen zijn ook weer gebruikt zoals in het vorige
voorbeeld. De noteFreqvariabele is iets anders gebruikt, aangezien er nu een aanpassing moet komen
voor de octaaf waarin de noot wordt gespeeld. De noteOctave en noteDotvariabelen worden
toegevoegd om de punt- en octaafwensen te kunnen integreren.
wholeNote
VAR
Word
index
offset
VAR
VAR
Byte
Nib
noteLetter
noteFreq
noteDuration
noteOctave
noteDot
VAR
VAR
VAR
VAR
VAR
Byte
Word
Word
Nib
Bit
De wholeNotevariabele is berekend met BeatsPerMin. Het tempo van het lied is uitgedrukt in slagen
per minuut, en het programma deelt de BeatsPerMin door 60000 ms, en vermenigvuldigt dan met 4.
Het resultaat is de juiste waarde van een gehele noot.
wholeNote = 60000 / BeatsPerMin * 4
Rekensommen worden in een programma van links naar rechts uitgevoerd. In de
berekening van wholeNote = 60000 / beatsPerMin * 4, berekent de BASIC
Stamp eerst 60000 / beatsPerMin. En dan pas wordt dat resultaat met 4
vermenigvuldigd.
Als je beatsPerMin
eerst door 4 wil verdelen, dan moet je haken gebruiken: wholeNote =
60000 / (beatsPerMin * 4).
Haakjes kunnen gebruikt worden om operaties te groeperen.
Dit werkt precies hetzelfde als in het vorige programma:
DO UNTIL noteLetter = "Q"
READ Notes + index, noteLetter
LOOKDOWN noteLetter,
[ "C",
"F",
"b",
"d",
"g",
"B",
"D",
"G",
"P",
"e",
"a",
"Q"
"E",
"A",
], offset
Het deel van de code dat de frequentie bepaalt is nu aangepast. We kunnen nu de octaven veranderen.
De tabellen voor het LOOKUPcommando bevatten nu frequentiewaarden van noten die van het 8e octaaf
zijn. Deze waarden kunnen gedeeld worden door 1 indien je in het 8e octaaf wil spelen, door 2 voor het
7eh octaaf, door 4 voor het 6e octaaf en door 8 indien je de noten in het 5e octaaf wilt laten horen Het
enige wat het LOOKUPcommando doet, is een noot van het 8e octaaf in de noteFreq variabele plaatsen.
LOOKUP offset,
[ 4186, 4435, 4699, 4978, 5274,
5588, 5920, 6272, 6645, 7040,
7459, 7902,
0,
0
], noteFreq
Hier zie je hoe de noteFreq variabele wordt aangepast naar het juiste octaaf. Eerst haalt het
READcommando de octaafwaarde die is opgeslagen, uit Octaves DATA. Dit kan een waarde tussen 5
en 8 zijn.
Geluid en Frequentie · Page 177
READ Octaves + index, noteOctave
Afhankelijk van de octaaf, willen we noteFreq delen door 1, 2, 4, of 8. Dit betekent dat we moeten
delen door 20 = 1, 21 = 2, 22 = 4, of 23 = 8. De programmaregel hieronder (Programmaregel noemen
we ook wel statement) gebruikt een waarde voor noteOctave, die tussen 5 en 8 kan liggen, en trekt
deze waarde van 8 af. Als noteOctave 8 is, dan is het resultaat 0. Indien noteOctave een 7 is,wordt
het resultaat 1. Als noteOctave 6 was, is het resultaat 2. enzovoort
noteOctave = 8 - noteOctave
NoteOctave is een waarde die gebruikt kan worden als een exponent van 2. Maar hoe kun je in
PBASIC machtsverheffen met een macht van 2? Hiervoor kun je de DCD operator gebruiken. Als DCD
0 is het resultaat 1, als DCD 1 is het resultaat 2. DCD 2 geeft 4 en DCD 3 geeft 8. Delen van noteFreq
door DCD noteOctave betekent dat je deelt door 1, 2, 4, of 8, waardoor je precies de juiste waarde
voor noteFreq kunt uitrekenen. Het resultaat is dat noteFreq de noot precies in de juiste octaaf
afspeelt. Je kunt de Debug Terminal gebruiken in de Jouw beurt paragraaf om in meer detail te zien
hoe dit werkt.
noteFreq = noteFreq / (DCD noteOctave)
Hoe kan ik weten dat ik een DCD operator moet gebruiken? Blijf vooral leren en ervaring
opdoen. Elke keer als je kennismaakt met een nieuw commando , of een nieuwe operator
leert gebruiken, of een nieuw sleutelwoord in een voorbeeld leest, kun je dit het best in de
BASIC Stamp handleiding opzoeken (Engels). Probeer de uitleg goed te begrijpen en
probeer het commando op de juiste manier in je project toe te passen. Maak er een
gewoonte van om af en toe eens de BASIC Stamp Handleiding te lezen en probeer in
enkele korte voorbeelden te begrijpen, hoe een commando werkt. Dit is de beste manier om
alle verschillende commando’s en operatoren onder de knie te krijgen. Door dingen te
proberen, zul je een ervaring ontwikkelen en je ervaring met het oplossen van problemen zal
toenemen.
De eerste twee regels code die gebruikt worden voor het bepalen van de lengte van de noot zijn
ongeveer hetzelfde als die in het vorige voorbeeld. Met die uitzondering dat nu elke noot gepunt kan
zijn. Dit betekent dat de lengte met 1.5 zou kunnen worden vermenigvuldigd. Er wordt een READ
commando gebruikt om de waarden uit de EEPROM op te halen uit de Dots DATA. Een IF…THEN lus
wordt gebruikt om te vermenigvuldigen met 3 en te delen door 2 telkens als de noteDotvariabele 1 is.
READ Durations + index, noteDuration
noteDuration = WholeNote / noteDuration
READ Dots + index, noteDot
IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2
Integer ( Gehele getallen) wiskunde De BASIC Stamp herkent niet automatisch een getal
zoals 1.5. In i sommen wordt gewerkt met gehele getallen:: …, -5, -4, -3, -2, -1, 0, 1, 2, 3, …
De beste oplossing om een getal met 1.5 te vermenigvuldigen is door het eerst te
vermenigvuldigen met 3 en dan te delen door 2.
Er zijn verschillende manieren om een BASIC Stamp zo te programmeren dat deze met
kommagetallen kan rekenen. In de eerste plaats heb je de mogelijk om eerst te
vermenigvuldigen en daarna te delen, zoals hierboven uitgelegd. Dit wordt ook
beschreven in de Basic Analog and Digital Studenten Gids. Een andere eenvoudige
manier is om met gebroken getallen te werken via de operatoren: ** en */. Deze worden
in detail uitgelegd in de Applied Sensors Studenten Gids en in de BASIC Stamp
Handleiding
De rest van dit voorbeeldprogramma werkt zoals in het vorige voorbeeld:
FREQOUT 9, noteDuration, noteFreq
index = index + 1
LOOP
END
Pagina 178 · Wat is een Microcontroller? NL HJK
Jouw beurt – Spelen van een liedje met meer dan een octaaf
MusicWithMoreFeatures.bs2 maakte gebruik van pauzes, maar speelde in dezelfde octaaf. Het lied
“Take Me Out to the Ball Game” hieronder, heeft de meeste noten in de 6e octaaf. Maar er zijn ook
twee noten in de 7e octaaf en hierdoor klinkt het liedje veel beter
9 Sla het programma op onder de naam MusicWithMoreFeaturesYourTurn.bs2.
9 Pas het aan door het verplaatsen van de vier datasturingen en een constante verklaring zoals
hier:
Notes
DATA
Octaves
DATA
Durations
DATA
Dots
DATA
BeatsPerMin
CON
"C","C","A","G","E","G","D","P","C","C","A",
"G","E","G","Q"
6, 7, 6, 6, 6, 6, 6, 6, 6, 7, 6,
6, 6, 6
2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4,
4, 4, 2
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 1
240
9 Start het programma en ga na dat het geluid juist is.
Deze twee noten in de 7e octaaf zijn belangrijk om het liedje juist te laten klinken. Het is interessant
om te horen wat het verschil wordt als je de octaaf van 7 naar 6 veranderd.
9 Probeer de twee getallen 7 in Octaves DATA naar 6 te veranderen. Houd er rekening mee dat
hierdoor het liedje “Take Me out to the Ball Game” raar zal klinken.
9 Start het programma en luister naar het verkeerde effect.
9 Verander de Octaves DATA terug naar de originele staat.
9 Start het programma en luister of het juist klinkt of niet.
OPDRACHT #5: MOBIELE TELEFOON RINGTONEN MET RTTL
Vele oudere mobiele telefoons spelen een liedje via een piëzoluidspreker. De ringtonen zijn eerst van
het Internet op je computer gedownload en daarna van je computer naar de microcontroller van je
telefoon gestuurd. Een paar jaar geleden was het maken van ringtones met een tekst een populaire
manier om ringtones op te nemen en te verspreiden. Iedere letter beschreef een noot in het liedje. Hier
volgt een voorbeeld van de eerste noten van de 5e symfonie van Beethoven.
Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d
Deze manier van opslaan van muziek noemt men RTTTL, wat staat voor “Ringing Tone Text Transfer
Language”. Het leuke van RTTTL bestanden is dat ze via het internet gedeeld kunnen worden. Vele
sites hebben een RTTTL bestand ter beschikking om gratis te downloaden. Er zijn ook gratis
softwarepakketten om ringtonen te maken, om te zetten en vooral uit te proberen, ook downloaden
naar de mobiele telefoon is mogelijk. De RTTTL specificatie is ook verschenen op het World Wide
Web. Appendix C vat samen hoe een RTTTL bestand noten, lengte, pauzes, tempo en gepunte noten
opslaat.
De volgende Opdracht introduceert enkele PBASIC programmatechnieken die gebruikt kunnen
worden om verschillende tekstelementen te herkennen. De mogelijkheid van het herkennen van
verschillende karakters of groepen van karakters en het nemen van beslissingen, gebaseerd op wat de
karakters bevatten, is extreem handig. Het is eigenlijk een programma om het RTTTL
ringtone0formaat (zoals Beethoven 5 ) te kunnen converteren naar muziek. Aan het einde van deze
Opdracht, is er een applicatieprogramma dat je kunt gebruiken om RTTTL formaat ringtones af te
laten spelen.
Selecteren welk Code Blok uitgevoerd moet worden, via het Case-statement
Als je een programma maakt, zul je vaak meerdere keuzes tegelijk moeten kunnen programmeren. Het
lezen van een tekst, van bijvoorbeeld RTTL is zo’n voorbeeld waarbij voortdurend keuzes moeten
Geluid en Frequentie · Page 179
worden gemaakt. Het SELECT…CASE statement is een handige methode voor het herkennen van
karakters of waarden. Onthoud maar, dat dit commando een van de meest gebruikte statements zal zijn
voor het converteren van een RTTTL ringtone naar muziek. In het algemeen wordt, SELECT…CASE
gebruikt in de volgende gevallen:
•
•
•
Selecteren van een variabele of expressie.
Evalueren van de variabele of expressie afhankelijk per toepassing.
Uitvoeren van verschillende codeblokken afhankelijk van waaraan de variabele voldoet.
Hier volgt de syntax voor SELECT…CASE:
SELECT expression
CASE condition(s)
statement(s)
{ CASE ELSE
statement(s) }
ENDSELECT
In de twee volgende voorbeeldprogramma’s ga je met SELECT…CASE werken.
SelectCaseWithValues.bs2 ontvangt de getallen die je in de Debug Terminal invoert en geeft de
minimale lengte aan van een variabele om deze waarde in op te slaan. SelectCaseWithCharacters.bs2
vertelt je of het karakter ,dat je ingaf op de Debug Terminal een kleine of grote letter was of een ander
teken.
Onthoud dat je het bovenste venster in de Debug Terminal gebruikt om karakters in te tikken om naar
de BASIC Stamp te versturen. De Zend en Ontvang vensters zie je in Figuur 8-5.
Windowpanes
Transmit →
Receive →
Figuur 8-5
Sturen van
berichten naar de
BASIC Stamp
Klik op het Zend(bovenste) venster
en geef de waarde
of karakter in die je
naar BASIC Stamp
wilt verzenden.
Voorbeeldprogramma: SelectCaseWithValues.bs2
9
9
9
9
Voer in en start SelectCaseWithValues.bs2.
Klik op de Debug Terminal Transmit/ zend Venster.
Controleer of de Echo Off checkbox uit staat (geen kruisje)
Voer een waarde tussen 0 en 65535 in, en druk Enter .
Wat gebeurt er als je een groter getal dan 65535 ingeeft? Indien je het getal 65536 ingeeft, zal de
BASIC Stamp een 0 weergeven. Indien je het getal 65537 ingeeft, zal de BASIC Stamp het nummer 1
weergeven en zo voort. Indien een getal te groot is, dan noemt men dit een overflow en er kunnen
onverwachte dingen in je programma gebeuren als dit optreedt.
9 Gebruik Tabel 8-1 om na te gaan of het voorbeeldprogramma de juiste beslissing neemt over
de grootte van de getallen die je in de Debug Terminal hebt ingegeven.
Tabel 8-1: Typen en de reeks die kan worden
opgeslagen
Variabele type
Reeks van waarden
Bit
0 to 1
Nibble
0 to 15
Byte
0 to 255
Word
0 to 65535
Pagina 180 · Wat is een Microcontroller? NL HJK
' What's a Microcontroller - SelectCaseWithValues.bs2
' Enter a value and see the minimum variable size required to hold it.
'{$STAMP BS2}
'{$PBASIC 2.5}
value
PAUSE 1000
VAR
Word
DEBUG "Enter a value from", CR,
"0 to 65535: "
DO
DEBUGIN DEC value
SELECT value
CASE 0, 1
DEBUG "Bit", CR
PAUSE 100
CASE 2 TO 15
DEBUG "Nib (Nibble)", CR
PAUSE 200
CASE 16 TO 255
DEBUG "Byte", CR
PAUSE 300
CASE 256 TO 65535
DEBUG "Word", CR
PAUSE 400
ENDSELECT
DEBUG CR, "Enter another value: "
LOOP
Hoe SelectCaseWithValues.bs2 werkt
In dit voorbeeld is een woordvariabele (word) gedeclareerd om de waarden, die je via de Debug
Terminal hebt ingegeven, vast te houden.
value VAR Word
Het DEBUGIN-commando ontvangt de ingetypte getallen en plaatst ze in de value van de variabele.
DEBUGIN DEC value
Het SELECTstatement kiest de waarde van de variabele om deze te verwerken.
SELECT value
In het eerste geval moet de valuevariabele gelijk zijn aan 0 of 1. Indien value gelijk is aan een van
deze getallen, dan worden de erop volgende DEBUG- en PAUSEcommando’s uitgevoerd.
CASE 0, 1
DEBUG "BIT", CR
PAUSE 100
In het tweede geval moet de value gelijk zijn aan een getal tussen 2 en 15. Als dat zo is, dan worden
de DEBUG- en PAUSEcommando’s uitgevoerd.
CASE 2 to 15
DEBUG "NIB (Nibble)", CR
PAUSE 200
Geluid en Frequentie · Page 181
Als de “cases” zijn uitgevoerd, komt het ENDSELECTsleutelwoord om het SELECT..CASEstatement af
te sluiten.
ENDSELECT
Voorbeeldprogramma: SelectCaseWithCharacters.bs2
Dit voorbeeldprogramma bekijkt elk karakter dat je in het Debug Terminal Transmit Venster hebt
ingegeven. Het herkent grote en kleine letters, cijfers, en sommige andere karakters. Indien je een
letter hebt ingegeven die het programma niet kent, krijg je een melding om de waarde opnieuw in te
voeren (vanzelfsprekend een ander karakter).
9 Voer in en start SelectCaseWithCharacters.bs2.
9 Controleer of de Echo Off checkbox uit staat (geen kruisje)
9 Klik het Debug Terminal Transmit Venster, geef de karakters in en kijk naar het resultaat.
' What's a Microcontroller - SelectCaseWithCharacters.bs2
' Program that can identify some characters: case, digit, punctuation.
'{$STAMP BS2}
'{$PBASIC 2.5}
character
PAUSE 1000
VAR
Byte
DEBUG "Enter a character: ", CR
DO
DEBUGIN character
SELECT character
CASE "A" TO "Z"
DEBUG CR, "Upper case", CR
CASE "a" TO "z"
DEBUG CR, "Lower case", CR
CASE "0" TO "9"
DEBUG CR, "Digit", CR
CASE "!", "?", ".", ","
DEBUG CR, "Punctuation", CR
CASE ELSE
DEBUG CR, "Character not known.", CR,
"Try a different one."
ENDSELECT
DEBUG CR, "Enter another character", CR
LOOP
Hoe SelectCaseWithCharacters.bs2 werkt
Als je het voorgaande vergelijkt met SelectCaseWithValues.bs2, dan heeft dit programma enkele
kleine aan;passingen ondergaan. De naam van de valuevariabele is gewijzigd naar het type
character, en de lengte is veranderd van Word naar Byte. Dit is gedaan omdat alle karakters in
PBASIC de grootte van een byte hebben. Het SELECTstatement werkt nu met de charactervariabele
omdat character het Engelse woord is voor letter of letterteken.
SELECT character
De aanhalingstekens vertellen de BASIC Stamp Editor dat je lettertekens (of karakters) gebruikt in
plaats van getallen. Je kunt groepen van letters op dezelfde manier gebruiken als een reeks getallen. De
BASIS Stamp herkent de letters als zogenaamde ASCII tekens. Dit is een internationaal gebruikte
definitie hoe getallen intern gebruikt worden als lettertekens. Kijk in de ASCII-tabel van de BASIC
Stamp Editor Help.
Pagina 182 · Wat is een Microcontroller? NL HJK
SELECT character
CASE "A" TO "Z"
DEBUG CR, "Upper case", CR
CASE "a" TO "z"
DEBUG CR, "Lower case", CR
CASE "0" TO "9"
DEBUG CR, "Digit", CR
CASE "!", "?", ".", ","
DEBUG CR, "Punctuation", CR
Er is ook nog een ander type CASEstatement dat niet gebruikt werd in vorig voorbeeld:
CASE ELSE
DEBUG CR, "Character not known.", CR,
"Try a different one."
Dit CASEstatement laat zien, dat er geen enkele keuze in het SELECTcodeblok gevonden is. Je kunt dit
testen door bijvoorbeeld een karakter in te geven als % of $.
Jouw beurt – Kiezen van speciale lettertekens
9 Pas het SELECT…CASEstatement zo aan in SelectCaseWithCharacters.bs2 dat er op de display
“Special character” getoond wordt als je een van onderstaande tekens ingeeft: @, #, $, %, ’^’ ,
&, *, (, ), _, of +.
Programma voor het afspelen van RTTTL Ringtones
Hieronder zie je een RTTTL bestand dat de muziek bevat die in het volgende voorbeeld zal worden
gebruikt. Er zijn nog vijf voorbeelden met RTTTL_File DATA die je kunt proberen in de Jouw beurt
paragraaf. Dit programma speelt het liedje getiteld ”Reveille”, wat door een bugel gespeeld werd op
militaire kampen vroeg in de ochtend. Je zult het wellicht herkennen van films of van de televisie.
RTTTL_File
DATA "Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,",
"8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,",
"8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,",
"16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,",
"e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c."
Voorbeeldprogramma: MicroMusicWithRtttl.bs2
Dit applicatieprogramma is vrij lang en het is een goed idee om de laatste versie te downloaden van de
www.parallax.com → Downloads → Educational Curriculum pagina. Zoek naar een link met de
naam Selected Example Programs nabij de “What’s a Microcontroller” PDF downloadbestanden.
Download het programma en open het met de BASIC Stamp Editor. Je kunt zo heel wat tijd besparen.
Het alternatief is natuurlijk om het met de hand in te tikken en alle fouten uit de 4 pagina’s code te
halen.
9 Gebruik de BASIC Stamp Editor om het MicroMusicWithRtttl.bs2 bestand te openen of geef
het met de hand in.
9 Start het program en luister naar het herkenbare lied “Reveille” .
9 Ga naar de Jouw beurt sectie en probeer enkele andere liedjes (RTTTL_File DATA directives).
' What's a Microcontroller - MicroMusicWithRtttl.bs2
' Play Nokia RTTTL format ringtones using DATA.
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "Program Running!"
' -----[ I/O Definitions ]------------------------------------------------SpeakerPin
PIN
9
' Piezospeaker connected to P9.
Geluid en Frequentie · Page 183
' -----[ Variables ]------------------------------------------------------counter
char
index
VAR
VAR
VAR
Word
Byte
Word
' General purpose counter.
' Variable stores characters.
' Index for pointing at data.
noteLetter
noteFreq
noteOctave
VAR
VAR
VAR
Byte
Word
Word
' Stores note character.
' Stores note frequency.
' Stores note octave.
duration
tempo
VAR
VAR
Word
Word
' Stores note duration.
' Stores tempo.
default_d
default_o
default_b
VAR
VAR
VAR
Byte
Byte
Word
' Stores default duration.
' Stores default octave.
' Stores default beats/min.
' -----[ EEPROM Data ]----------------------------------------------------RTTTL_File
DATA
"Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,",
"8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,",
"8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,",
"16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,",
"e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c."
Done
DATA
",q,"
Notes
DATA
Octave8
DATA
"p",
"a",
"#",
"b",
"c",
"#",
"d",
"#",
"e",
"f",
"#",
"g",
"#"
Word 0,
Word 3520, Word 3729, Word 3951,
Word 4186, Word 4435, Word 4699, Word 4978,
Word 5274, Word 5588, Word 5920, Word 6272,
Word 6645
' -----[ Initialization ]-------------------------------------------------counter = 0
' Initialize counter.
GOSUB
GOSUB
GOSUB
GOSUB
GOSUB
GOSUB
'
'
'
'
'
'
FindEquals
ProcessDuration
FindEquals
ProcessOctave
FindEquals
GetTempo
Find first '=' in file.
Get default duration.
Find next '='.
Get default octave.
Find last '='.
Get default tempo.
' -----[ Program Code ]---------------------------------------------------DO UNTIL char = "q"
GOSUB ProcessDuration
GOSUB ProcessNote
GOSUB CheckForDot
GOSUB ProcessOctave
GOSUB PlayNote
LOOP
'
'
'
'
'
'
'
Loop until 'q' in DATA.
Get note duration.
Get index value of note.
If dot, 3/2 duration.
Get octave.
Get freq, play note, next.
End of main loop.
END
' End of program.
' -----[ Subroutine - Find Equals Character ]----------------------------FindEquals:
DO
READ RTTTL_File + counter, char
counter = counter + 1
LOOP UNTIL char = "="
'
'
'
'
'
Go through characters in
RTTTL file looking for
'='. Increment counter
until '=' is found, then
return.
RETURN
'
'
'
'
'
'
-----[ Subroutine - Read Tempo from RTTTL Header ]---------------------Each keyboard character has a unique number called an ASCII value.
The characters 0, 1, 2,...9 have ASCII values of 48, 49, 50,...57.
You can always convert from the character representing a digit to
to its value by subtracting 48 from the variable storing the digit.
You can examine this by comparing DEBUG DEC 49 and DEBUG 49.
Pagina 184 · Wat is een Microcontroller? NL HJK
GetTempo:
default_b = 0
DO
READ RTTTL_File + counter, char
IF char = ":" THEN
default_b = default_b / 10
counter = counter + 1
EXIT
ENDIF
default_b = default_b + char - 48
counter = counter + 1
default_b = default_b * 10
LOOP UNTIL char = ":"
RETURN
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
Parse RTTTL file for Tempo.
Convert characters to
digits by subtracting 48
from each character's ASCII
value. Iteratively multiply
each digit by 10 if there
is another digit, then add
the most recent digit to
one's column.
For example, the string
"120" is (1 X 10 X 10)
+ (2 X 10) + 0. The '1'
is converted first, then
multiplied by 10. The '2'
is then converted/added.
0 is converted/added, done.
' -----[ Subroutine - Look up Octave ]-----------------------------------ProcessOctave:
READ RTTTL_File + counter, char
SELECT char
CASE "5" TO "8"
noteOctave = char - "0"
counter = counter + 1
CASE ELSE
noteOctave = default_o
ENDSELECT
IF default_o = 0 THEN
default_o = noteOctave
ENDIF
RETURN
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
Octave may or may not be
included in a given note
because any note that is
played in the default
octave does not specify
the octave. If a char
from '5' to '8' then use
it, else use default_o.
Characters are converted
to digits by subtracting
'0', which is the same as
subtracting 48. The first
time this subroutine is
called, default_o is 0.
If 0, then set default_o.
' -----[ Subroutine - Find Index of Note ]-------------------------------ProcessNote:
READ RTTTL_File + counter, char
SELECT char
CASE "p"
index = 0
counter = counter + 1
CASE "a" TO "g"
FOR index = 1 TO 12
READ Notes + index, noteLetter
IF noteLetter = char THEN EXIT
NEXT
counter = counter + 1
READ RTTTL_File + counter, char
SELECT char
CASE "#"
index = index + 1
counter = counter + 1
ENDSELECT
ENDSELECT
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
Set index value for lookup
of note frequency based on
note character. If 'p',
index is 0. If 'a' to 'g',
read character values in
DATA table and find match.
Record index value when
match is found. If next
char is a sharp (#), add
1 to the index value to
increase the index (and
frequency) by 1 notch.
As with other subroutines,
increment counter for each
character that is processed.
RETURN
' -----[ Subroutine - Determine Note Duration ]--------------------------ProcessDuration:
READ RTTTL_File + counter, char
'
'
'
'
'
'
'
'
Check to see if characters
form 1, 2, 4, 8, 16 or 32.
If yes, then convert from
ASCII character to a value
by subtracting 48. In the
case of 16 or 32, multiply
by 10 and add the next
digit to the ones column.
SELECT char
CASE "1", "2", "3", "4", "8"
duration = char - 48
counter = counter + 1
READ RTTTL_File + counter, char
SELECT char
CASE "6", "2"
duration = duration * 10 + char - 48
counter = counter + 1
ENDSELECT
Geluid en Frequentie · Page 185
CASE ELSE
duration = default_d
ENDSELECT
' If no duration, use
' use default.
IF default_d <> 0 THEN
duration = 60000/default_b/duration*3
ELSE
default_d = duration
ENDIF
'
'
'
'
If default_d not defined
(if default_d = 0), then
set default_d = to the
duration from the d=#.
RETURN
' -----[ Subroutine - Check For '.' Indicating 1.5 Duration ]------------CheckForDot:
READ RTTTL_File + counter, char
SELECT char
CASE "."
duration = duration * 3 / 2
counter = counter + 1
ENDSELECT
'
'
'
'
'
'
Check for dot indicating
multiply duration by 3/2.
If dot found, multiply by
3/2 and increment counter,
else, do nothing and
return.
RETURN
' -----[ Subroutine - Find Comma and Play Note/Duration ]----------------PlayNote:
'
'
'
'
'
Find last comma in the
current note entry. Then,
fetch the note frequency
from data, and play it, or
pause if frequency = 0.
READ RTTTL_File + counter, char
SELECT char
CASE ","
counter = counter + 1
READ Octave8 + (index * 2), Word noteFreq
noteOctave = 8 - noteOctave
noteFreq = noteFreq / (DCD noteOctave)
IF noteFreq = 0 THEN
PAUSE duration
ELSE
FREQOUT SpeakerPin, duration, noteFreq
ENDIF
ENDSELECT
RETURN
Hoe MicroMusicWithRtttl.bs2 werkt
Je vindt dit vast een aardig programma, omdat het laat zien, wat voor programma;s je zou kunnen
schrijven, als je een beetje ervaring hebt. Het programma is vooral opgenomen als leuk voorbeeld.
Maar als je in het programma kijkt, zul je zien, dat je al een heleboel commando’s in het programma
herkent, op een na!
•
•
•
•
•
•
•
•
•
•
•
•
Commentaar om te helpen je programma uit te leggen
Constante en variabele declaraties
DATAdeclaraties
READcommando’s
IF...ELSE...ENDIF blokken
DO...LOOP beide met en zonder WHILE en UNTIL
Subroutines met GOSUB, labels, en RETURN
FOR...NEXT loops
LOOKUP and LOOKDOWNcommando’s
The FREQOUT en PAUSEcommando’s
The SELECT...CASEcommando’s
EXIT is nieuw, maar geeft alleen maar aan, dat het programma een loop kan verlaten, voordat die
klaar is. Wordt vaak gebruikt in IF...THENstatements.
Pagina 186 · Wat is een Microcontroller? NL HJK
Jouw beurt – Verschillende Tonen
9 Probeer het RTTTL_File DATA in MicroMusicWithRTTTL.bs2 te vervangen door een van de
vijf onderstaande muziekfiles.
Wees er zeker van, dat je steeds maar een RTTTL_File DATA gebruikt! Zorg ervoor
dat de DATA-blokken vervangen worden en niet toegevoegd!
9 Start MicroMusicWithRTTTL.bs2 en test elk RTTTL bestand.
RTTTL_File
DATA
"TwinkleTwinkle:d=4,o=7,b=120:c,c,g,g,a,a,2g,f,",
"f,e,e,d,d,2c,g,g,f,f,e,e,2d,g,g,f,f,e,e,2d,c,c,",
"g,g,a,a,2g,f,f,e,e,d,d,1c"
RTTTL_File
DATA
"FrereJacques:d=4,o=7,b=125:c,d,e,c,c,d,e,c,e,f",
",2g,e,f,2g,8g,8a,8g,8f,e,c,8g,8a,8g,8f,e,c,c,g6",
",2c,c,g6,2c"
RTTTL_File
DATA
"Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d"
RTTTL_File
DATA
"ForHe'sAJollyGoodFellow:d=4,o=7,b=320:c,2e,e,e,",
"d,e,2f.,2e,e,2d,d,d,c,d,2e.,2c,d,2e,e,e,d,e,2f,",
"g,2a,a,g,g,g,2f,d,2c"
RTTTL_File
DATA
"TakeMeOutToTheBallgame:d=4,o=7,b=225:2c6,c,a6,",
"g6,e6,2g.6,2d6,p,2c6,c,a6,g6,e6,2g.6,g6,p,p,a6",
",g#6,a6,e6,f6,g6,a6,p,f6,2d6,p,2a6,a6,a6,b6,c,",
"d,b6,a6,g6"
Downloaden van RTTTL Bestanden: Er zijn op internet heel veel RTTTLbestanden
beschikbaar op de verschillende sites. Deze bestanden worden verspreid door beltoon
enthousiastelingen, die geen muzikale expertise hebben. Sommige files klinken dan ook erg
goed, andere zijn nauwelijks herkenbaar. Indien je meer RTTTLbestanden wilt downloaden,
zorg er dan voor dat alle spaties verwijderd zijn tussen de karakters en dat de tekst tussen
aanhalingstekens staat.
SAMENVATTING
Dit hoofdstuk introduceerde technieken voor het maken van geluiden en liedjes met de BASIC Stamp
en de piëzoluidspreker. Het FREQOUTcommando kan gebruikt worden om hoog/laag signalen naar de
piëzoluidspreker te sturen die ervoor zorgen dat er geluidseffecten en/of liedjes te horen zijn. Het
FREQOUTcommando heeft een argument dat de I/O Pin bestuurt en waar het signaal naartoe gestuurd
wordt, de lengte van de noot, het Duration argument, de frequentie argument(Freq1). Het optionele
argument Freq2 kan gebruikt worden om tonen te mixen.
We kunnen geluidseffecten maken door de frequentie en de lengte van de noot aan te passen. De
waarde van de frequentie kan over een gehele breedte aangeboden worden of gemixt worden om een
variëteit aan effecten te krijgen.
Het maken van noten hangt ook af van de frequentie, lengte en pauzes. De waarde van het halve,
kwart,...). De Freq1 waarde van de noot wordt bepaald door het FREQOUTcommando. het Duration
argument wordt bepaald door het tempo van het liedje en de lengte van de noot (De frekwentie wordt
bepaald door de letter en het octaaf. Voor de rusten tussen noten worden door pauzecommando’s
gemaakt.
Het spelen van simpele liedjes met de BASIC Stamp kan gebeuren met een sequentie van
FREQOUTcommando’s, maar er zijn betere manieren om muziek op te slaan en op te halen.
DATAdirectives met de optionele Symbol labels worden gebruikt om de bytewaarde zonder prefix en
woordwaarden. Het READcommando werd gebruikt om DATA op te halen. Het READcommando
Addressargument gebruikt altijd het optionele argument Symbol van DATA. Enkele symbolen die
gebruikt werden zijn Notes, Durations, Dots en Octaves.
Geluid en Frequentie · Page 187
Muziekgegevens kunnen opgeslagen worden in formaten die beter geschikt zijn om bladmuziek te
vertalen. De gegevens over de muziekstijl worden omgezet in frequenties via het LOOKUP- en
LOOKDOWNcommando. We kunnen wiskundige bewerkingen uitvoeren om de lengte en het tempo van
de gehele noot te bepalen. En we kunnen de octaaf bepalen, door de frequentie te delen door een macht
van twee.
SELECT…CASE werd gebruikt voor het evalueren van de variabelen en om via een case-commando er
een beslissing aan te koppelen. De SELECT…CASE is het erg geschikt om te bepalen uit welke
keuzemogelijkheden gekozen moet worden op basis van karakters of getallen. Een programma dat
zinnen met karakters bevat voor het beschrijven van de muziek (RTTTLbestand genoemd) werd
geïntroduceerd in een wat langer programma. In dat programma werden ook verschillende
programmeertechnieken gedemonstreerd. De SELECT…CASE speelt een belangrijke rol in dit
programma omdat het gebruikt wordt om karakters uit het RTTTLbestand te lezen, die dan per geval
(CASE) een specifiek commando uitvoeren.
Vragen
1. Wat zorgt ervoor dat een noot hoog klinkt? Wat voor een lage noot?
2. Wat doet FREQOUT 15, 1000, 3000? Welk effect heeft elke nummer?
3. Hoe kan je het FREQOUTcommando veranderen van Vraag 2 zodat er twee frequenties tegelijk
verzonden worden?
4. Indien je op een piano noot B6 aanraakt, welke frequentie wordt er dan gezonden?
5. Hoe verander je een DATA of een READcommando indien je een waarde uit een woord wil
opslaan of ophalen?
6. Kan er meer dan een DATAdirective gebruikt worden? Indien ja, hoe kan een READ commando
vaststellen welke DATAdirective er dient gekozen te worden?
7. Wat is een octaaf? Indien je de frequentie weet van een noot in een octaaf, wat dien je dan te
doen om de noot in het volgende octaaf af te laten spelen?
8. Wat doet de SELECT…CASE?
Oefeningen
1. Pas de “Alarm…” toon aan van ActionTones.bs2 zodat de frequentie van de toon met telkens
500 wordt verhoogd.
2. Leg uit hoe MusicWithMoreFeatures.bs2 dient veranderd te worden om telkens een bericht in
de Debug Terminal te plaatsen, als er een gepunte noot wordt gespeeld.
Project
1. Bouw een druktoets gecontroleerde toongenerator. Indien een toets wordt ingedrukt, dient de
luidspreker een 2 kHz geluid te maken gedurende 1/5 van een seconde. Indien de andere toets
wordt ingedrukt, dient er een 3 kHz beep te klinken gedurende 1/10 van een seconde.
Oplossingen
Q1. Onze oren detecteren een verandering in luchtdruk per toon. Een hoge toon komt van een
snellere drukwisseling. Een lagere toon van langere drukvariaties.
Q2. FREQOUT 15, 1000, 3000 zendt een 3000 Hz signaal uit naar pin 15 gedurende een seconde
(1000 ms).
Het effect van elke nummer is:
15 – pin nummer 15.
1000 – lengte van de toon die gelijk is aan 1000 ms of een seconde.
3000 – de frequentie van de toon, in Hertz, een 3000 Hz toon.
Q3. Gebruik het optionele Freq2 argument. Om de 3000 Hz en bvb, 2000 Hz te mixen, voegen
we een tweede frequentiewaarde na de komma in:
Pagina 188 · Wat is een Microcontroller? NL HJK
FREQOUT 15, 1000, 3000, 2000
Q4. 1975.5 Hz, zie Figuur 8-3 op pagina 167.
Q5. Gebruik het optionele Word voor elk data- item.
Q6. Ja, Elke DATAdirective heeft een andere symboolparameter. Om te specificeren welke
DATAdirective er dient genomen te worden, wordt er een symboolparameter na het
READsleutelwoord geplaatst. Als voorbeeld: READ Notes, noteLetter. In dit voorbeeld is
Notes de symboolparameter.
Q7. Een octaafgroep van 8 hele en 4 halve noten. Om een gegeven noot van de volgende octaaf te
laten klinken dient de frequentie met 2 vermenigvuldigd te worden.
Q8. SELECT...CASE selecteert een variabele of een expressie, evalueert van geval tot geval en
voert de verschillende blokkencode uit, afhankelijk van het geval dat gekozen is.
E1. Dit probleem kan opgelost worden door ofwel handmatig elke noot met 500 te verhogen, of
door gebruik te maken van de FOR...NEXT lus met stappen van 500.
Gebruik van de FOR...NEXT loop:
De toon handmatig hoger maken:
DEBUG "Increasing Alarm...",CR
DEBUG "Increasing alarm...", CR
PAUSE 100
PAUSE 100
FREQOUT 9, 500, 1500
FOR frequency = 1500 TO 3000 STEP 500
PAUSE 500
FREQOUT 9, 500, frequency
FREQOUT 9, 500, 2000
PAUSE 500
PAUSE 500
NEXT
FREQOUT 9, 500, 2500
PAUSE 500
FREQOUT 9, 500, 3000
PAUSE 500
Pas het programma aan om gepunte noten te kunnen lezen:
READ Dots + index, noteDot
IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2
Voeg een DEBUGcommando toe aan het IF...THEN commando. Vergeet de ENDIF niet.
READ Dots + index, noteDot
IF noteDot = 1 THEN
noteDuration = noteDuration * 3 / 2
DEBUG "Dotted Note!", CR
ENDIF
P1. Gebruik de luidsprekerschakeling van Figuur 8-2, p. 162; en de drukknopschakeling van
Figuur 4-26, p. 87.
' What's a Microcontroller - Ch8Prj01_PushButtonToneGenerator.bs2
' P4 Pressed: 2 kHz beep for 1/5 second. 2 kHz = 2000 Hz.
'
1/5 s = 1000 / 5 ms = 200 ms
' P3 Pressed: 3 kHz beep for 1/10 second. 3 kHz = 3000 Hz.
'
1/10 s = 1000 / 10 ms = 100 ms
'{$STAMP BS2}
'{$PBASIC 2.5}
DEBUG "Program Running!"
DO
IF (IN4 = 1) THEN
FREQOUT 9, 200, 2000
ELSEIF (IN3 = 1) THEN
FREQOUT 9, 100, 3000
ENDIF
LOOP
' 2000 Hz for 200 ms
' 3000 Hz for 100 ms
Elektronische Bouwstenen · Page 189
Hoofdstuk 9: Elektronische Bouwstenen
DIE KLEINE ZWARTE CHIPS
Je hoeft niet verder te kijken dan naar de BASIC Stamp (zie Figuur 9-1) om voorbeelden te zien van
“die kleine zwarte chips”. De chip rechts boven bijvoorbeeld is een spanningsregelaar. Deze chip
bevat een complete schakeling, die de aangeboden batterijspanning omzet naar exact 5.0 V. Deze
spanning is nodig voor de andere onderdelen (componenten) om die goed te laten functioneren. De
chip links boven is de BASIC Stampmodule EEPROM. PBASIC programma’s worden omgezet naar
getallen (zogenaamde tokens), die in de BASIC Stamp worden uitgevoerd. Deze tokens worden
opgeslagen in de EEPROM. Je kunt de inhoud van de EEPROM zien door op Run te klikken en dan
Memory Map in the BASIC Stamp Editor te selecteren. De grootste chip noemt men de “Interpreter
chip”. Deze chip ontvangt de tokens van de EEPROM en vertaalt ze naar de PBASICcommando’s
voor de tokens en voert het commando uit. Nadat het commando is uitgevoerd, krijgt de chip de
volgende token en zo voort. Dit proces noemt men het “ophalen en uitvoeren”.
2K EEPROM opslag
voor PBASIC code en
gegevensopslag
→
5V
Spannings
regelaar,
die de
voedingss
panning
omzet in
een stabiel
spanning
van 5 volt
←
Figuur 9-1
Geïntegreerde
schakeling op
de BASIC
Stamp 2
PBASIC Interpreter chip
(een
voorgeprogrammeerde
microcontroller)
→
De meeste mensen gebruiken de term “integrated circuit” (IC) om te praten over de kleine zwarte
chips. De geïntegreerde schakeling bevat een kleine silicium chip binnenin het zwarte plastic of in de
keramische verpakking. Afhankelijk van de chip, kan deze ergens tussen de honderd en de miljoenen
transistors bevatten. Een transistor is een bouwsteen, die de basis vormt voor geïntegreerde
schakelingen. Je zal in dit hoofdstuk zelf een experiment met een transistor doen. Andere bekende
onderdelen die in silicium zijn uitgevoerd, zijn diodes. Dioden en weerstanden en condensators
worden ten onrechte ook chips genoemd, omdat ze zo klein zijn, maar die zijn meestal niet van
silicium gemaakt.
Neem eens even de tijd om na te denken over de opdrachten die je in dit boek al geprobeerd hebt. De
lijst omvat bijvoorbeeld het schakelen met LEDs, inlezen van druktoetsen, het aansturen van
servomotoren, inlezen van potentiometers, meten van licht, aansturen van displays en het maken van
geluid. Hoewel dit nog maar een begin is, is de lijst toch al indrukwekkend. Vooral als je rekening
houdt met het feit, dat de afzonderlijke opdrachten gecombineerd kunnen worden om complexere
schakelingen te gaan bouwen. Het hart van het systeem dat al deze zaken mogelijk maakt zijn de drie
geïntegreerde schakelingen van Figuur 9-1 en nog enkele andere onderdelen. Het laat zien hoe
krachtig onderdelen samen kunnen zijn als ze samen werken.
Pagina 190 · Wat is een Microcontroller? NL HJK
GEINTEGREERDE
SCHAKELINGEN
RANDAPPARATUUR
VOOR
HET
AANSLUITEN
VAN
Er zijn duizenden ontwerpen van geïntegreerde schakelingen die met microcontrollers werken. Soms
maken verschillende ontwerpers verschillende schakelingen die hetzelfde functioneren. Soms
verschillen de chipeigenschappen heel weinig en soms zijn de chips identiek. De ene schakeling kan
iets minder kosten dan de andere. Er zijn duizenden verschillende geïntegreerde schakelingen die
gebruikt kunnen worden als bouwsteen voor een ontwerp. Bedrijven publiceren informatie over de
werking van elke geïntegreerde schakeling en publiceren datasheets. Ze beschrijven ook hoe de
geïntegreerde schakeling gebruikt kan worden voor allerhande toepassingen (application notes). De
producenten maken deze informatie gratis toegankelijk, in de hoop dat ontwikkelingsingenieurs hun
componenten gebruiken in nieuwe applicaties. Indien er duizenden van het product verkocht worden,
betekent dit dat deze producent duizenden chips heeft verkocht.
In dit hoofdstuk, zul je experimenteren met een transistor in een speciale toepassing met een digitale
potentiometer. Zoals al eerder ter sprake is gekomen, is de transistor de basis van elk blok van
geïntegreerde schakelingen. De digitale potentiometer wordt ook voor verschillende toepassingen
gebruikt. Onthoud dat voor elke opdracht die je straks hebt uitgevoerd, er waarschijnlijk minstens
honderd variaties te bedenken zijn.
OPDRACHT #1: STROOMSTURING MET EEN TRANSISTOR
In deze Opdracht zul je een transistor gebruiken om de stroom door een LED te regelen en te sturen.
Je kunt de LED gebruiken om stroom zichtbaar te maken. Als de LED meer licht geeft, dan loopt er
meer stroom. Een minder fel brandende LED duidt op minder stroom door de schakeling.
Introductie van de Transistor
Figuur 9-2 toont het schemasymbool en onderdeeltekening van de 2N3904 transistor. Er zijn heel veel
verschillende types transistoren. Deze transistor noemt men een NPN-transistor. NPN verwijst naar
het type materiaal dat de fabrikant heeft gebruikt voor de opbouw van de transistor. De beste manier
om een transistor voor te stellen, is door aan een klep te denken, die een vloeistofdoorgang regelt.
Verschillende transistors kunnen verschillende hoeveelheden stroom sturen. Bij iedere transistor loopt
de stroom via C (collector) en naar E (emitter). De hoeveelheid stroom die door de transistor loopt,
wordt geregeld door de B (base). Een kleine stroom op B, veroorzaakt een stroom tussen C en E die
voor dit type, 416 maal groter is dan de stroom in B.
C
C
B
E
Figuur 9-2
2N3904 Transistor
B
2N3904
E
De datasheet van de 2N3904: Een transistorfabrikant publiceert deze (datasheet)
gegevens voor alle transistoren die ze maken. Deze datasheets bevatten informatie die
ingenieurs kunnen gebruiken bij het ontwerp van hun product. Indien je een voorbeeld van
de datasheet van de 2N3904 transistor wil zien: Ga naar www.fairchildsemi.com. Geef
2N3904 in op het zoek veld en klik zoek. Een van de gevonden resultaten zal de 2N3904
Product datafolder zijn. Volg de link naar die folder en download deze sheet. De meeste
webbrowsers kunnen ook de datasheet openen door middel van de plug-in die Adobe
Acrobat Reader gebruikt.
Onderdelen voor de Transistor schakeling
(1) Transistor – 2N3904
(2) Weerstanden – 100 kΩ (bruin-zwart-geel)
(1) LED – gelijk welke kleur
(1) Potentiometer – 10 kΩ
(3) Jumperdraden
Elektronische Bouwstenen · Page 191
Bouwen en Testen van de Transistorschakeling
Figuur 9-3 toont een schakeling die je kunt gebruiken om handmatig te controleren hoeveel stroom er
door de transistor wordt doorgelaten naar de LED. Door het draaien aan de knop van de
potentiometer, zal de schakeling verschillende hoeveelheden stroom geven aan de Basis (B) van de
transistor. Hierdoor zal de hoeveelheid stroom, die door de transistor wordt doorgelaten van collector
naar emitter, ook veranderen. De LED wordt gebruikt om de hoeveelheid stroom zichtbaar te maken,
door meer of minder op te lichten.
9 Bouw de schakeling van Figuur 9-3.
9 Wees er zeker van, dat de anode van de LED (de lange pin) is aangesloten op Vdd.
9 Controleer de transistorschakeling minstens twee keer. Let erop, dat de platte kant van de
transistor in het bedradingschema naar rechts staat.
9 Draai aan de knop van de potentiometer en controleer of de LED meer of minder oplicht naar
gelang de stand van de potentiometer.
Vdd
Vdd
LED
100 kΩ
POT
10 kΩ
100 kΩ
Vss
Figuur 9-3
Handmatig
e besturing
van de
potentiome
ter van
een
transistors
chakeling
Vss
Jouw beurt – Aan/Uit schakelen van de Transistor
Indien je enkel een transistor aan of uit wilt zetten, kun je de schakeling van Figuur 9-4. Gebruiken.
Als de BASIC Stamp een hoog signaal naar deze schakeling stuurt, zal de transistor zoveel stroom
doorlaten als er maximum is ingesteld door de potentiometer en zal de LED het meeste licht geven.
Indien de BASIC Stamp een laag signaal geeft, zal de transistor geen stroom door laten en zal de LED
niet oplichten.
Wat is het verschil tussen de LED aangesloten op een transistor en aangesloten op
een I/O pin?
BASIC Stamp I/O pinnen kunnen maar een beperkte stroom leveren.
Transistoren hebben ook grenzen aan de te leveren stroom, maar die liggen veel hoger. In
de Industrial Control Student Guide, wordt een transistor gebruikt om een kleine
gelijkstroommotor (DC motor) aan te sturen. De transistor wordt ook gebruikt om grote
stromen te leveren aan een kleine weerstand, die als verwarmingselement wordt gebruikt.
Deze twee applicaties zouden zoveel stroom trekken dat de BASIC Stamp snel beschadigd
zou zijn. Maar met een transistor is er geen enkel probleem, mits die op de juiste manier
gekozen wordt op grond van de gegevens van de fabrikant.
9 Bouw de schakeling van Figuur 9-4.
9 Schrijf een programma dat elke twee seconden een hoog en laag signaal naar P8 stuurt. HINT:
LedOnOff.bs2 van Hoofdstuk 2 dient alleen maar aangepast te worden om een hoog/laag
signaal te sturen naar P8 in plaats van. P3. Denk eraan dit programma onder een andere naam
op te slaan.
9 Start het programma en ga na dat de LED aan en uit gaat.
Pagina 192 · Wat is een Microcontroller? NL HJK
Vdd
Vdd
LED
P8
Vin
Vss
X3
100 kΩ
100 kΩ
Vss
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Figuur 9-4
Schakeling
waarbij een
BASIC
Stamp de
transistor
Aan/Uit zet
OPDRACHT #2: INTRODUCTIE VAN DE DIGITALE POTENTIOMETER
In deze opdracht zul je de handmatig bediende potentiometer ombouwen naar een potentiometer met
een geïntegreerde schakeling, die digitaal wordt aangestuurd. Je zult daarna de BASIC Stamp zo
programmeren dat je het digitale potentiometersignaal en daarmee de lichtsterkte van de LED kunt
besturen zoals in de vorige opdracht.
Introductie van de Digitale Potentiometer
Figuur 9-5 toont een pinmap van de digitale potentiometer die je gaat gebruiken in deze opdracht.
Deze chip heeft 8 pinnen, vier aan elke kant, die zo gebogen zijn, dat ze eenvoudig in een bord zijn te
pluggen. (De afstand van die pinnen is gestandaardiseerd op 1/10 inch van elkaar, waarbij 1 inch
overeenkomt met 25,4 mm). De fabrikanten plaatsten een referentiemarkering, ook wel pin1markering genoemd, op de plastic omhulling zodat je makkelijk het verschil kunt zien tussen pin 1 en
pin 5. Deze referentiemarkering is een smalle halve cirkel in de verpakking van de chip. Je kunt dit
punt gebruiken als referentie voor de pin nummers op de chip. De pinnummers op de chip tellen op
tegen de wijzers van de klok in vanaf het referentiepunt.
Andere Onderdelen in de kit: Soms kan Parallax andere maar vergelijkbare onderdelen in
de kit leveren. Het onderdeel zal dezelfde functies hebben, maar een ander label. Indien de
digitale potentiometer die meegegeven is in de “What’s a Microcontroller Parts Kit” niet het
labelAD5220 heeft, maak je dan geen zorgen want het aanwezige onderdeel heeft dezelfde
functionaliteit..
Referentie
markering
1 CLK
Vdd 8
2 U/D
CS 7
3 A1
B1 6
4 GND
W1 5
Figuur 9-5
AD5220 Pin Map
Gebruik de pin1- markering om er
zeker van te zijn dat de AD5220
correct op het bord is geplaatst
AD5220
Hieronder volgt een samenvatting van de AD5220’s pinnen en hun functies:
1. CLK – De pin die de klokpulsen ontvangt (laag-hoog-laag signaal) om de instelbare
aansluiting van de potmeter te verplaatsen.
2. U/D – De pin die een hoog signaal ontvangt om de (W1) middenaansluiting naar A1 te
verplaatsen, of een laag signaal om deze naar B1 te verplaatsen. Het signaal op de pin
Elektronische Bouwstenen · Page 193
3.
4.
5.
6.
7.
8.
bepaalt de richting van bewegen. De middenaansluiting beweegt eigenlijk niet totdat een puls
(laag-hoog-laag signaal) verzonden is door de CLK pin.
A1 – De potentiometers A (vaste) aansluiting..
GND – De aansluiting met de massa van de schakeling. De massa op het Board of Education
en de BASIC Stamp HomeWork Board wordt de Vss aansluiting genoemd.
W1 – De potentiometers variabele middenaansluiting (W).
B1 – De potentiometers vaste B aansluiting.
CS – De chip selectie pin. Een hoog signaal op deze pin zal ervoor zorgen dat de chip alle
sturingssignalen negeert naar de CLK en U/D. Een laag signaal zal dit onderdeel vrijgeven en
naar de stuursignalen laten luisteren..
Vdd – Aansluiting voor de +5 V., Wordt ook aangeduid met Vdd op het Board of Education
en het BASIC Stamp HomeWork Bord.
De Datasheet van de AD5220: Om de datasheet van de AD5220 te bekijken ga je naar
www.analog.com. Geef AD5220 in het zoekveld in en klik op search of find. Klik op de Data
Sheetlink AD5220: “Increment/Decrement Digital Potentiometer Datasheet”.
Onderdelen voor de schakeling met de digitale potmeter en transistor
(1) Transistor – 2N3904
(2) Weerstand – 100 kΩ (bruin-zwart-geel)
(1) LED – gelijk welke kleur
(1) Digitale potentiometer – AD5220
(10) Jumper wires
Bouwen van de schakeling voor de Digitale Potentiometer
Figuur 9-6 laat de schakeling van de digitale potentiometer zien, zoals die in plaats van een manuele
potentiometer gebruikt wordt. Figuur 9-7 laat de aansluitingen zien. De BASIC Stamp kan de digitale
potentiometer besturen met de signalen van P5 en P6.
9 Bouw de schakeling van Figuur 9-6 en Figuur 9-7.
Vdd
Vdd
Vdd
AD5220
P6
1
CLK
Vdd 8
P5
2
U/D
CS 7
3
A1
B1 6
4
GND
W1 5
Figuur 9-6
Schema van de
transistor, die via de
digitale
potentiometer wordt
bestuurd
100 kΩ
100 kΩ
Vss
Vss
Pagina 194 · Wat is een Microcontroller? NL HJK
Vdd
Vin
Vss
X3
Figuur 9-7
Aansluitschema van
de transistor die door
de digitale potmeter
wordt bestuurd voor
Figuur 9-6.
AD5220
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Programmeren van de Digitale Potentiometer Sturing
Stel je voor, dat de knop van de potentiometer van de vorige oefening, die je met de hand moest
draaien, 128 posities heeft. Als zo’n potentiometer in het midden staat, zou dit betekenen dat de knop
op positie 63 staat en in elke richting dus nog 64 stappen kan maken.
Laten we ervan uit gaan dat de potentiometerknop een stapje met de klok mee wordt gedraaid. De
LED zal dan iets meer licht geven. Hetzelfde effect krijg je, als er een hoog signaal op de AD5220’s
U/D pin wordt gezet, terwijl er een puls naar de CLK pin wordt gestuurd.
HIGH 5
PULSOUT 6, 1
Laten we nu eens veronderstellen, dat de potentiometerknop drie stappen tegen de klok in wordt
gedraaid. De LED zal dan wat minder licht geven. Hetzelfde effect bereik je als er een laag signaal op
de AD5220’s U/D pin staat, terwijl je die drie pulsen naar de CLK pin stuurt. De LED moet nu
zwakker branden.
LOW 5
FOR counter = 1 TO 3
PULSOUT 6, 1
PAUSE 1
NEXT
We willen nu, dat de potentiometerknop volledig met de wijzers van de klok mee wordt gedraaid. De
LED zal maximaal licht geven. Hetzelfde effect krijg je als er een hoog signaal op de AD5220’s U/D
pin staat, terwijl je 65 pulsen naar de CLK pin stuurt. De LED moet nu feller branden.
HIGH 5
FOR counter = 1 TO 65
PULSOUT 6, 1
PAUSE 1
NEXT
Tenslotte willen we de potentiometerknop volledig tegen de klok in draaien. De LED zal volledig uit
zijn. En hetzelfde effect krijg je door een laag signaal op de AD5220’s U/D pin te zetten, terwijl je
128 pulsen naar de CLK pin stuurt.
LOW 5
FOR counter = 0 TO 127
PULSOUT 6, 1
PAUSE 1
NEXT
Elektronische Bouwstenen · Page 195
Voorbeeldprogramma: DigitalPotUpDown.bs2
Dit voorbeeld programma laat de potentiometer naar boven en beneden bewegen, zodat de LED
geleidelijk meer licht geeft en daarna geleidelijk aan volledig dooft.
√
Voer in en start DigitalPotUpDown.bs2.
' What's a Microcontroller - DigitalPotUpDown.bs2
' Sweep digital pot through values.
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!"
counter
VAR
Byte
DO
LOW 5
FOR counter = 0 TO 127
PULSOUT 6, 1
PAUSE 10
NEXT
HIGH 5
FOR counter = 0 TO 127
PULSOUT 6, 1
PAUSE 10
NEXT
LOOP
Jouw beurt – Aanpassen van de hoeveelheid code
Je kunt de snelheid waarmee het licht van de LED toe- of
commando Duration argument aan te passen.
afneemt, instellen door het PAUSE
9 Pas het programma aan en herstart het programma met een PAUSE 20 commando. Merk het
verschil op.
9 Herhaal dit met PAUSE 5.
Als je het programma eenvoudiger wilt maken, kun je ook het commando TOGGLE gebruiken. TOGGLE
verandert de status van de BASIC Stamp I/O pin. Indien de I/O pin een hoog signaal stuurde, maakt
TOGGLE er een laag signaal van. Indien de I/O pin een laag signaal stuurde, maakt het TOGGLE nu een
hoog signaal.
9
9
9
9
9
Sla DigitalPotUpDown.bs2 en DigitalPotUpDownWithToggle.bs2 op.
Pas het programma aan zoals hieronder in het voorbeeld.
Start het programma en pas de functies aan zoals in DigitalPotUpDown.bs2.
Vergelijk het aantal regels code.
Merk op, dat het programma hetzelfde werkt als DigitalPotUpDown.bs2.
Te weinig geheugen voor een programma is iets dat veel mensen tegenkomen met hun
BASIC Stamp projecten, naarmate die moeilijker en groter worden. Het gebruik van het
commando TOGGLE in plaats van de twee FOR…NEXT lussen is een goed voorbeeld hoe je
met verschillende technieken hetzelfde kunt doen met minder code.
' What's a Microcontroller - DigitalPotUpDownWithToggle.bs2
' Sweep digital pot through values.
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!"
counter
VAR
Byte
Pagina 196 · Wat is een Microcontroller? NL HJK
LOW 5
DO
FOR counter = 0 TO 127
PULSOUT 6,5
PAUSE 10
NEXT
TOGGLE 5
LOOP
Een kijkje in de Digitale Potentiometer
Figuur 9-8 toont een diagram van een potentiometer binnenin de AD5220. De AD5220 heeft 128
weerstandselementen, van elk 78.125 Ω (nominale waarde). Alle 128 weerstanden in serie geeft
precies 10,000 Ω of 10 kΩ.
3
A1
Ad5220
78 Ω
pos. 127
1 CLK
2 U/D
5
7 CS
78 Ω
pos. 126
W1
40 Ω
78 Ω
pos. 125
…
Figuur 9-8
Binnen in de AD5220
…
78 Ω
pos. 1
78 Ω
B1
pos. 0
6
Een nominale waarde is ander woord voor een waarde die in de praktijk wel eens een
beetje kan variëren. Onderdelen zoals weerstanden en condensators hebben een nominale
waarde en een tolerantie, wat betekent, dat de echte waarde altijd iets kan afwijken van de
nominale waarde, maar binnen de tolerantiegrenzen blijft. Elk weerstandselement in de
AD5220 heeft een waarde van 78.125 Ω, met een toegelaten afwijking van 30% Dit komt
overeen met (23.438 Ω) onder of boven de nominale waarde. De weerstandswaarde kan in
de praktijk dus variëren tussen 55 Ω en 101 Ω.
Alle weerstanden zijn verbonden met een schakelaar, die ook wel een aftakking of tap wordt
genoemd. Elke schakelaar (switch) aan een aftakking is eigenlijk een groep transistoren die aan- of uit
worden gezet om stroom door te laten of te onderbreken. Er kan telkens maar een schakelaar per
tijdseenheid gesloten worden. Indien een van de bovenste schakelaars wordt gesloten (zoals
bijvoorbeeld positie. 125, 126 of 127), lijkt het alsof de loper helemaal met de klok is meegedraaid
Bedenk dat Positie. 126 is gesloten. Als de tap op 125 wordt ingeschakeld, (open pos. 126 en sluit
pos. 125), zet dan U/D laag, en zorg dan voor een puls naar CLK. Indien je de loper omhoog wilt
zetten, bijvoorbeeld op Pos 127, dan zet je het signaal op de aansluiting U/D hoog en dan stuur je een
klokpuls.
Het volgende voorbeeldprogramma gebruikt de Debug Terminal om je te vragen welke tap je wilt
instellen. Dan wordt er beslist of de U/D pin hoog of laag moet worden en wordt het juiste aantal
pulsen op de klokingang gegeven om de tap naar de nieuwe positie te laten bewegen.
Met uitzondering van de EEPROM Data, heeft het volgende voorbeeld programma alle secties die je
normaal in een applicatieprogramma kunt vinden:
•
•
•
Titel – commentaar met de bestandsnaam van het programma, de beschrijving, werking van het
programma.
EEPROM Data – The DATA declaraties
I/O Definities – constante declaraties die de I/O pin nummers zijn.
Elektronische Bouwstenen · Page 197
•
•
•
•
•
Constanten – constante declaraties.
Variabelen – variabele declaraties.
Initialisatie – een routine die het programma laat starten vanaf het juiste punt. In het volgende
programma dient de potentiometertap eerst op nul gezet te worden.
Hoofdroutine – die de hoofdtaken van het programma uitvoert.
Subroutines – segmenten van code die een specifieke taak uitvoeren voor zichzelf, of voor de
hoofdroutine, zoals hier het geval is.
Voorbeeldprogramma: Aansluiting ControlledDigtialPot.bs2
In dit voorbeeldprogramma ga je met behulp van de Debug Terminal de digitale potmeter instellen.
Door het veranderen van de tapinstellingen op de digitale potmeter, verander je de helderheid van de
LED die verbonden is met een transistor die wordt gestuurd door de digitale potmeter. Figuur 9-9
toont een voorbeeld van het ingeven van de waarde 120 op het Debug Terminal Zend Venster
(Transmit Windowpane) terwijl het programma aan het lopen is. Aangezien de oude tapinstelling 65
was, wordt de LED ongeveer tweemaal zo helder door de potmeter naar 120 aan te passen.
Panelen in window
Figuur 9-9
Sturen van
berichten naar de
BASIC Stamp
zenden →
Klik op het
bovenste venster
en geef getallen in.
ontvangen →
9 Geef in en start TerminalControlledDigtialPot.bs2.
9 Controleer of de Echo Off checkbox uit staat (geen kruisje)
9 Klik op de Debug Terminals verzendpaneel, om er zeker van te zijn, dat je de waarden op de
goede plaats typt.
9 Voer waarden in tussen 0 en 127 op de Debug Terminal. Druk telkens op de enter-toets na het
ingeven van een waarde.
' -----[ Title ]----------------------------------------------------------' What's a Microcontroller - AansluitingControlledDigitalPot.bs2
' Update digital pot's tap based on Debug Aansluiting user input.
' {$STAMP BS2}
' {$PBASIC 2.5}
' -----[ EEPROM Data ]-----------------------------------------------------
' -----[ I/O Definitions ]------------------------------------------------UdPin
ClkPin
PIN
PIN
5
6
' Set values of I/O pins
' connected to CLK and U/D.
' -----[ Constants ]------------------------------------------------------DelayPulses
DelayReader
CON
CON
10
2000
' Delay to observe LED fade.
' -----[ Variables ]------------------------------------------------------counter
oldTapSetting
newTapSetting
VAR
VAR
VAR
Byte
Byte
Byte
' Counter for FOR...NEXT.
' Previous tap setting.
' New tap setting.
' -----[ Initialization ]-------------------------------------------------oldTapSetting = 0
newTapSetting = 0
' Initialize new and old
' tap settings to zero.
Pagina 198 · Wat is een Microcontroller? NL HJK
LOW UdPin
FOR counter = 0 TO 127
PULSOUT 6,5
PAUSE 1
NEXT
PAUSE 1000
' Set U/D pin for Down.
' Set tap to lowest position.
' Wait 1 s before 1st message
' -----[ Main Routine ]---------------------------------------------------DO
GOSUB Get_New_Tap_Setting
GOSUB Set_Ud_Pin
GOSUB Pulse_Clk_pin
' User display and get input.
' Set U/D pin for up/down.
' Deliver pulses.
LOOP
' -----[ Subroutines ]----------------------------------------------------Get_New_Tap_Setting:
' Display instructions and
' get user input for new
' tap setting value.
DEBUG CLS, "Tap setting is: ",
DEC newTapSetting, CR, CR
DEBUG "Enter new tap", CR, "setting (0 TO 127): "
DEBUGIN DEC newTapSetting
RETURN
Set_Ud_Pin:
IF newTapSetting > oldTapSetting THEN
HIGH UdPin
oldTapSetting = oldTapSetting + 1
ELSEIF newTapSetting < oldTapSetting THEN
LOW UdPin
oldTapSetting = oldTapSetting - 1
ELSE
DEBUG CR, "New and old settings", CR,
"are the same, try ", CR,
"again...", CR
PAUSE DelayReader
ENDIF
'
'
'
'
'
Examine new and old tap values
to decide value of U/D pin.
Notify user if values are
equal.
Increment for Pulse_Clk_pin.
' Decrement for Pulse_Clk_pin.
' Give reader time to view
' Message.
RETURN
Pulse_Clk_pin:
' Deliver pulses from old to new values. Keep in mind that Set_Ud_Pin
' adjusted the value of oldTapSetting toward newTapSetting by one.
' This keeps the FOR...NEXT loop from executing one too many times.
FOR counter = oldTapSetting TO newTapSetting
PULSOUT ClkPin, 1
PAUSE DelayPulses
NEXT
oldTapSetting = newTapSetting
' Keep track of new and old
' tapSetting values.
RETURN
SAMENVATTING
Dit hoofdstuk introduceerde de geïntegreerde schakelingen en hun werking samen met BASIC Stamp.
Er werd een transistor gebruikt als stroomregelaar aangesloten op een LED. Er werd ook gebruik
gemaakt van een digitale potentiometer om de hoeveelheid stroom door de transistor en de LED te
besturen. Van de digitale potentiometer werden het begrip referentiemarkering en de pinmap
uitgelegd. De functie van elke digitale potentiometer pin werd besproken, evenals de inwendige
opbouw. Je weet nu, dat iedere chip een referentiemarkering heeft en hoe je de informatie kunt
opzoeken over de aansluitingen en functies van een chip op de site van de fabrikant. Het PBASIC
commando TOGGLE werd geïntroduceerd als een middel om programmageheugen te sparen.
Elektronische Bouwstenen · Page 199
Vragen
1. Wat zijn de namen van de aansluitingen op de transistor die je hebt gebruikt in dit hoofdstuk?
2. Welke aansluiting stuurt de stroom die door de transistor loopt?
3. Wat kun je doen om de stroom door de transistor te laten toe- of afnemen?
Oefeningen
1. Schrijf een programma dat de tap van de digitale potmeter naar positie 0 stuurt ongeacht zijn
huidige positie
Project – Extra opdracht!
1. Voeg een fototransistor aan het project toe en schrijf een programma, dat de helderheid van de
LED aangepast aan de hoeveelheid licht die de fototransistor ontvangt.
Oplossingen
Q1. Emitter, basis en collector.
Q2. De basis bestuurt de stroom die door de transistor vloeit.
Q3. Toenemen of afnemen van de stroom van stuurstroom door de basis.
E1. Om deze oefening op te lossen, bekijk TerminalControlledDigitalPot.bs2. Het eerste dat wordt
uitgevoerd, de initialisatie, is om de tap op de laagste positie te plaatsen. De exacte code is in
onderstaande oplossing gebruikt:
' What's a Microcontroller - Ch9Ex01_SetTapToZero.bs2
' Turn tap on digital pot all the way down to zero
' {$STAMP BS2}
' {$PBASIC 2.5}
DEBUG "Program Running!"
UdPin
ClkPin
counter
PIN
PIN
VAR
5
6
Byte
' Set values of I/O pins
' connected to CLK and U/D.
' Counter for FOR...NEXT.
LOW UdPin
FOR counter = 0 TO 128
PULSOUT ClkPin,5
PAUSE 1
NEXT
' Set U/D pin for Down.
' Set tap to lowest position.
P1. Gebruikt de schakeling met de digitale potentiometer van Figuur 9-6, p. 193 en de schakeling
met de fototransistor van Figuur 7-4, p. 132.
Vdd
Vdd
Vdd
AD5220
CLK
Vdd 8
U/D
CS 7
A1
B1 6
4 GND
W1 5
P6
1
P5
2
3
220 Ω
0.01 µF
100 kΩ
100 kΩ
Vss
P2
Vss
Vss
Deze oplossing is gebaseerd op het programma TerminalControlledDigitalPot.bs2 en gebruikt
delen van PhototransistorAnalogToBinary.bs2. Er wordt ook wat rekenwerk toegevoegd om
de gemeten waarden van de fototransistor RCTIME –meting te schalen naar een getal tussen 0
en 128 voor de digitale potmeter. Houd in gedachten, dat de oplossing in dit programma, maar
een van de vele mogelijke oplossingen is.
De GOSUB Get_New_Tap_Setting subroutine-aanroep vanuit het hoofdprogramma
AansluitingControlledDigitalPot.bs2 is vervangen door twee andere aanroepen van
Pagina 200 · Wat is een Microcontroller? NL HJK
subroutines: GOSUB Read_Phototransistor en GOSUB Scale_Phototransistor. Op
Get_New_Tap_Setting
subroutine
vervangen
door
dezelfde
wijze
is
de
Read_Phototransistor
en
de
Scale_Phototransistor
subroutine.
Read_Phototransistor is een subroutineversie om een meting te doen aan de fototransistor
met RCIME. De gemeten waarde wordt begrensd op een waarde die past in
PhototransistorAnalogToBinary.bs2. De definities van pinnamen, namen voor constanten en
namen voor variabelen zijn aangepast. En het PAUSE 100 commando, om 10 keer per seconde
een waarde te laten zien is veranderd in PAUSE 1. Dit is voldoende om de condensator op te
laden voordat de RCTIME meting wordt uitgevoerd. Na deze subroutine wordt de gemeten
waarde opgeslagen in de lightReadingvariabele. Deze waarde zal ergens tussen ValMin
Pas deze grenswaarden eventueel aan aan de
(100) en ValMax (4000) liggen.
lichtomstandigheden in jouw omgeving.
Het probleem dat we nu nog hebben, is om de 128 mogelijke stappen van de potmeter aan te
passen aan de 3900 mogelijke gemeten waarden van de fototransistor. Om dit op te lossen,
delen we de waarde die met RCTIME van de fototransistor door een zodanige waarde, dat het
resultaat past in het bereik van 0 tot 127. We weten dus, dat we moeten delen door een
waarde, waardoor de uitkomst past binnen 128 We hebben daarvoor de volgende vergelijking
nodig:
Range of Possible Phototransistor Measurements
= 128 Possible Tap Settings
Scale Divisor
Omdat we niet met gebroken getallen willen werken en toch de nauwkeurigheid willen
bewaren, vermenigvuldigen we beide zijden van de vergelijking met een schaalfactor die als
volgt wordt berekend:
Scale Divisor =
Range of Possible Phototransistor Measurements
128 Possible Tap Settings
In de code zijn de grenswaarden ValMax – ValMin van de gemeten waarde van de
fototransistor variabel. De scaleDivisor is ook een variabele. Maar 128 is een constante.
De code van de Declaraties en de Initializatiesectie definieert een scaleDivisor op de
volgende manier:
scaleDivisor = (valMax – valMin) / 128
Na iedere RCTIMEmeting van de fototransistor trekt de subroutine Scale_Phototransistor
de waarde van valMin af van lightReading en deelt het resultaat door de scaleDivisor.
Het resultaat is, dat de gemeten waarden in de reeks van 100 tot 4000 passen in een reeks van
0 to 127, wat overeenkomst met het bereik van de potmeter.
Scale_Phototransistor:
lightReading = (lightReading – valMin) / scaleDivisor
RETURN
In de veronderstelling, dat ValMin 100 is en ValMax 4000 is, kan de variabele lightReading
3900 mogelijke waarden opslaan. Wat zou er gebeuren, als de gemeten waarden in een bereik
vielen van: ValMin = 10,000 tot ValMax = 13,900? Als je ValMin = 10,000 aftrekt, zijn
er nog steeds 3900 mogelijke waarde, en na deling door scaleDivisor zullen de metingen
nog steeds netjes passen op het bereik van de potmeter. Let op: Als je in jouw programma niet
eerst ValMin aftrekt, zal het resultaat heel ver buiten het gebied van 0 to 128 van de digitale
potmeter vallen.
Elektronische Bouwstenen · Page 201
'
'
'
'
What's a Microcontroller - Ch9Prj01_PhotoControlledDigitalPot.bs2
Update digital pot's tap based on phototransistor reading
{$STAMP BS2}
{$PBASIC 2.5}
' -----[ Declarations and Initialization]-----------------------------UdPin
PIN
5
' Set values of I/O pins
ClkPin
PIN
6
' connected to CLK and U/D.
PhotoPin
PIN
2
' Phototransistor on pin P2
DelayPulses
CON
10
' Delay to observe LED fade.
DelayReader
CON
2000
valMax
CON
4000
' Max phototransistor val
valMin
CON
100
' Min phototransistor val
counter
oldTapSetting
newTapSetting
lightReading
scaleDivisor
VAR
VAR
VAR
VAR
VAR
Byte
Byte
Byte
Word
Word
'
'
'
'
'
Counter for FOR...NEXT.
Previous tap setting.
New tap setting.
reading from phototransistor
For scaling values
' Set up a value that can be divided into the phototransistor RCTIME
' measurement to scale it to a range of 0 to 128
scaleDivisor = (valMax - valMin) / 128
oldTapSetting = 0
newTapSetting = 0
' Initialize new and old
' tap settings to zero.
LOW UdPin
FOR counter = 0 TO 127
PULSOUT ClkPin,5
PAUSE 1
NEXT
' Set U/D pin for Down.
' Set tap to lowest position.
PAUSE 1000
' 1 sec. before 1st message
' -----[ Main Routine ]-----------------------------------------------DO
GOSUB Read_Phototransistor
GOSUB Scale_Phototransistor
newTapSetting = lightReading MIN 1 MAX 127
DEBUG HOME, DEC5 lightReading
GOSUB Set_Ud_Pin
' Set U/D pin for up/down.
GOSUB Pulse_Clk_pin
' Deliver pulses.
LOOP
' -----[ Subroutines ]------------------------------------------------Set_Ud_Pin:
' Examine old and new
IF newTapSetting > oldTapSetting THEN
' tap values to decide
HIGH UdPin
ELSEIF newTapSetting < oldTapSetting THEN
' value of UdPin. Notify
LOW UdPin
' user if values are
ENDIF
' equal.
RETURN
Pulse_Clk_pin:
' Deliver pulses
FOR counter = oldTapSetting TO newTapSetting ' from old to new
PULSOUT ClkPin, 1
' values.
PAUSE DelayPulses
NEXT
oldTapSetting = newTapSetting
' Keep track of new and old
RETURN
' tapSetting values.
Read_Phototransistor:
HIGH PhotoPin
PAUSE 1
RCTIME PhotoPin, 1, lightReading
lightReading = lightReading MAX valMax MIN valMin
RETURN
Scale_Phototransistor:
lightReading = (lightReading - valMin) / scaleDivisor
RETURN
Pagina 202 · Wat is een Microcontroller? NL HJK
Hoofdstuk 10: Je eigen uitvinding bouwen
Dit boek heeft je vertrouwd gemaakt met het gebruik van een ingebouwde computer in projecten en
uitvindingen. Je hebt nu ervaring met LED’s, knoppen, servo’s, digitale displays, lichtsensoren,
luidsprekers, transitoren en geïntegreerde schakelingen. Je hebt verder geleerd, deze onderdelen met
de BasicStamp microcontroller te verbinden en om programma’s te schrijven, om de onderdelen in een
eenvoudige toepassing bij elkaar te brengen.
Misschien heb je interesse om nog wat bij te leren of iets uit te vinden, of misschien wel allebei. Wat
je in dit boek hebt geleerd, zal je helpen, om prototypen te maken voor tal van uitvindingen. In dit
hoofdstuk gaan we bijvoorbeeld een microalarm maken, als voorbeeld van een vertrouwd apparaat.
Terwijl we bouwen, zul je een aantal interessante technieken en handigheidjes leren, inclusief:
•
•
•
•
•
•
•
Suggesties, hoe je uitvindingen en ontwerpideeën in een vroeg stadium kan ontwikkelen
Een voorbeeld hoe je ieder deelsysteem van het prototype kunt bouwen en testen.
Voorbeelden hoe je testprogramma’s in het programma voor je project kunt invoegen.
Aanwijzingen hoe je programmacode leesbaar maakt met commentaar en suggesties voor
filenamen voor programma’s
Het gebruik van onderdelen, die tijdens de ontwikkeling gebruikt worden en die wat betreft de
interface gelijk zijn aan de definitieve apparaten
Tips en opmerkingen om bekende ontwerpproblemen op te lossen
Waar je nog meer projecten (in het Engels) kunt vinden voor Stamps in Class projecten, met
allerhande interessante onderdelen.
PAS ALLES WAT JE WEET TOE OP NIEUWE ONDERDELEN EN TOEPASSINGEN
De drukknopschakeling van Hoofdstuk 3 is een voorbeeld van een eenvoudige manier om een ingang
te bouwen, waarmee jouw BasicStamp een externe fysische grootheid kan signaleren. In dit geval weet
de BASICStamp, of iemand een knop heeft ingedrukt of niet.. Je hebt ook knoppen gebruikt om
lampjes the laten knipperen, servo’s te laten bewegen en om een luidspreker geluid te laten maken.
Maar er zijn veel sensoren, die veel meer kunnen dan alleen maar vaststellen, of er een knop is
ingedrukt. Er zijn sensoren voor temperatuur, voor geluid, voor licht, voor het vaststellen van
bewegende voorwerpen, etc. En al deze sensoren hebben de eigenschap, dat ze hoog/laag-signalen
kunnen uitzenden, die je met de BASICStamp eenvoudig op een aansluitpen kunt meten. Omdat je
hebt geleerd hoe je de BASICStamp een drukknop kunt laten bewaken zul je zien, dat het aansluiten
van een sensor die beweging meet of een die geluid meet vergelijkbaar is en niet al te ingewikkeld zal
zijn.
Een andere techniek die je in dit boek hebt geleerd, is het gebruik van de vertraging van een RCnetwerk, met het RCTIME commando, om de stand van een potmeter te meten. Op dezelfde manier heb
je ook lichtintensiteit kunnen meten in combinatie met een fototransistor en een LED. Deze
voorbeelden zijn nog maar het begin, wat betreft het meten met een RC-schakeling. Er zijn sensoren
die de vochtigheid van de lucht kunnen meten of temperatuur. Er zijn er ook, die druk kunnen meten.
Ze zijn allemaal op dezelfde manier zijn aan te sluiten. Een LED-schakeling is zo’n voorbeeld van de
vele mogelijkheden, hoe je iets via een I/O-pin kunt besturen. Met wat extra onderdelen kun je met
hoog/laag-signalen van alles besturen, inclusief motoren, lampen, verwarmingselementen, enzovoorts.
Denk nog eens terug aan alle opdrachten in dit boek waarmee je hebt gewerkt. Ook dit waren alleen
maar eerste voorbeelden van een waslijst aan sensoren en onderdelen die op een vergelijkbare manier
te gebruiken zijn en die je kunt gebruiken bij het bouwen van je eigen prototype.
EEN PROTOTYPE BOUWEN VAN EEN EENVOUDIG BEWAKINGS SYSTEEM
In dit hoofdstuk gaan we met onderdelen uit de kit What’s a Microcontroller een heel eenvoudig
bewakingssysteem bouwen, dat je zou kunnen gebruiken om je kast of bureau te kunnen bewaken. Het
zou handig kunnen zijn in gevallen, waarin mensen zonder te vragen spullen van je lenen. In dit
prototype zullen we ook kijken, hoe je onderdelen van je bewakingssysteem zou kunnen vervangen
door andere onderdelen, die hetzelfde werken, maar die het system nog veel beter zouden maken. We
Je eigen uitvinding bouwen · Page 203
gaan je leren, hoe je kunt uitzoeken hoe je andere onderdelen, waarmee je nooit hebt gewerkt, toch
kunt testen en in je system kunt inbouwen.
OPDRACHT #1: VAN IDEE TOT HAALBAARHEID ( PROOF OF CONCEPT)
Veel producten starten als een idee en in sommige gevallen is zo’n idee echt te gek. In andere gevallen
is het gewoon een oplossing voor een probleem. Zo’n idee kun je verder ontwikkelen, door er een
tekening en een uitwerking in de eigenschappen (specificatie) van te maken, om zo tot een eerste
ontwerp te komen. De volgende stap is dan vaak om een werkend prototype te maken. Het hoeft er niet
mooi uit te zien, maar je zou de werking van het idee met een redelijke mate van betrouwbaarheid
moeten kunnen aantonen. Bedrijven die producten ontwikkelen werken op dezelfde manier, om de
haalbaarheid van een idee aan te tonen (proof of concept). Alleen op die manier is de directie vaak
bereid om geld beschikbaar te stellen voor de verdere ontwikkeling van een product.
Idee, Concept, en functionele beschrijving
Laten we veronderstellen, dat jouw kast een deur heeft met scharnieren en een lade. En je wilt een heel
klein alarm hebben. Je zou natuurlijk ook een speciale kast met ingebouwde beveiliging kunnen
maken, zoals Figuur 10-1 laat zien. Met een potmeter aan de klep of deur en een drukknop aan de lade
kun je eenvoudig vaststellen wat er open staat. De onderstaande schets geeft het idee in concept goed
weer en helpt jou en anderen om het idee beter te begrijpen.
Figuur 10-1
Concept
tekening van
een Micro
bewakingssyst
eem van je
kast
De beschrijving van de eigenschappen van het idee is heel belangrijk. Het helpt je om in een vroeg
stadium goed na te denken over wat je wilt ontwerpen. En daarmee voorkom dat je later bedenkt, dat
het helemaal anders opgezet had moeten worden. En dat voorkomt weer, dat je het ontwerp helemaal
opnieuw moet maken, omdat je iets belangrijks was vergeten. Bedrijven en ontwerpers die speciale
apparaten ontwerpen voor klanten werken op dezelfde manier. Ze moeten de wensen van de klant eerst
heel goed begrijpen . Door de gewenste eigenschappen (specificaties) op te schrijven en door de klant
te laten lezen, voorkomen ze dat er onnodig tijd en geld wordt verspild aan het ontwikkelen van een
apparaat met de verkeerde eigenschappen.
Functionele beschrijving
We gaan nu de eigenschappen van ons system opschrijven:
Ontwikkel een schakeling en een prototype voor een microbewakingssysteem, dat een kleine deur en
een lade kan bewaken. Als het alarm geactiveerd is, moet er geluid gemaakt worden als de deur of lade
worden geopend. Er moet een LED groen branden, als het alarm niet geactiveerd is en de LED moet
rood branden als het alarm is geactiveerd. In het prototype mag het alarm worden in- en uitgeschakeld
via een computer. Als het alarm wordt aangezet, moet er even gewacht worden, voordat het alarm echt
Pagina 204 · Wat is een Microcontroller? NL HJK
geactiveerd is om de gebruiker de gelegenheid te geven om de kast te sluiten nadat het alarm is
aangezet.
Specificaties
We moeten behalve een functionele beschrijving, ook een specificatie opstellen. In zo’n specificatie
staat bijvoorbeeld, hoeveel sensoren en van welk type toegepast gaan worden, maar ook de
afmetingen, het gewicht, het luidsprekervolume, enzovoorts.
Eerste ontwerp
In een vroeg stadium van het ontwerp zullen vaak meerdere mensen samen nadenken over mogelijke
oplossingen voor lastige ontwerpproblemen (Denk eraan, dat er geen problemen bestaan, maar alleen
maar uitdagingen!). Ze proberen samen zoveel mogelijk ideeën te bedenken en vast te stellen, welke
ideeën goed te bouwen zijn en een oplossing leveren. We noemen dit brainstormen. Veel vragen in een
ontwerp zijn eenvoudig op te lossen met standaardoplossingen en –onderdelen. Ons microalarm valt in
deze laatste categorie. Met een drukknop aan de lade kunnen we vaststellen, of deze is geopend. Met
een potmeter aan de deur kun je de positie van de deur meten en vaststellen of die open staat. Een
tweekleurige LED zorgt voor het lichtsignaal en geluid maken we met een piëzoluidsprekertje.
Nu weten we wat we willen maken, hoe we dat gaan doen en met welke onderdelen we het prototype
willen bouwen: Tweekleuren LED, een drukknop, een potmeter en een piëzoluidspreker. In het
volgende overzicht zie je, met welke onderdelen je eerder hebt gewerkt.
•
•
•
•
Tweekleuren LED: Hoofdstuk 2, Opdracht #5
Drukknop: Hoofdstuk 3, Opdracht #2
Potentiometer: Hoofdstuk 5, Opdracht #3
Piëzoluidspreker: Hoofdstuk 8, Opdracht #1
Kastalarm onderdelenlijst:
Door in de betreffende hoofdstukken te kijken, zie je, dat je nog wat meer onderdelen nodig hebt om
de schakeling op te bouwen. We hebben nodig:
(3) Weerstanden – 220 Ω (rood-rood-bruin)
(1) Weerstanden – 10 kΩ (bruin=zwart=oranje)
(1) LED – tweekleurig
(1) Drukknop – normaal open
(1) Piëzoluidspreker
(1) Condensator – 0.01 µF
(1) Potentiometer – 10 kΩ
(4) Jumper wires
Schema van het Kastalarm
Het schema van Figuur 10-2 is zo opgezet, dat er voldoende ruimte is rond de onderdelen op het
breadboard. De aansluitingen op de I/O-pennen zijn hetzelfde als in de voorgaande hoofdstukken.
Hierdoor kunnen we programma’s uit eerdere projecten gebruiken om ieder deel van de schakeling
afzonderlijk te testen
Je eigen uitvinding bouwen · Page 205
Figuur 10-2: Alarm System Prototype Schema
OPDRACHT #2: IEDER DEEL VAN DE SCHAKELING AFZONDERLIJK TESTEN
Voordat je een ingewikkelde schakeling in elkaar zet, is het verstandig eerst altijd de afzonderlijke
delen te testen. Hierdoor zullen je projecten veel soepeler verlopen en verlies je veel minder tijd aan
het oplossen van fouten. Stel, dat je de hele schakeling in een keer opbouwt en het hele programma in
een keer voor de hele toepassing schrijft, dan bestaat het risico, dat je heel veel tijd besteedt aan het
oplossen van fouten in je programma, terwijl de schakeling niet goed werkt. Controleer daarom altijd
eerst of de schakeling goed werkt, voordat je de conclusie trekt, dat je programma niet goed is! De
grootste tijdsbesparing bereik je dus, door eerst de schakeling te controleren en te testen,
eventueel met een klein testprogramma!
Bouwen en testen van iedere schakeling
We gaan nu eerst de afzonderlijke deelsystemen bouwen en testen. We beginnen met de schakeling
van de drukknop. Als die gebouwd en getest is, maken en testen we de schakeling met de luidspreker.
Tenslotte doen we hetzelfde voor de LED en de potmeter, zodat we zeker weten, dat alle deelsystemen
gereed zijn voor gebruik in het programma voor deze toepassing.
9 Maak een directory aan met de naam: WAM H10.
9 Zorg ervoor, dat je telkens het testprogramma opslaat onder een andere naam en bij voorkeur
in de nieuwe folder voor dit project.
9 Zoek naar het testprogramma in Hoofdstuk 3, Opdracht #2 dat je kunt aanpassen om de
drukknop te testen van de schakeling in Figuur 10-2.
9 Wijzig de verwijzing naar I/O pin zodat het programma werkt met de schakeling van Figuur
10-2.
9 Test de code en pas fouten in bedrading en programma aan, voordat je verder gaat.
9 Herhaal dit voor:
o De piëzoluidsprekerschakeling van Hoofdstuk 8, Opdracht #1
Pagina 206 · Wat is een Microcontroller? NL HJK
o
o
De potentiometerschakeling van Hoofdstuk 5, Opdracht #3
De schakeling voor de tweekleuren LED van Hoofdstuk 2, Opdracht #5.
Jouw beurt – Testen van het systeem
Nu je alle schakelingen afzonderlijk hebt getest en de testprogramma’s apart hebt opgeslagen in de
projectfolder, wordt het tijd om een stukje programma te maken, dat op de Debug aansluiting laat zien,
welke schakeling getest wordt. In de praktijk is dat heel nuttig, omdat ieder alarmsysteem een
zogenaamde zelftest heeft. En al deze functies staan straks bij elkaar in een routine.
Voeg de elementen uit je testprogramma zodanig in een nieuw programma samen, dat het:
9 De kleur van de tweekleuren LED in de Debug Aansluiting laat zien, als de kleur verandert.
9 Een boodschap laat zien als de luidspreker geluid maakt..
9 Uiteindelijk in een loop belandt, waar een boodschap naar de Debug Aansluiting wordt
gestuurd met de stand van de knop en de potmeter.
9 Zorg dat dit stukje programma foutloos loopt, voor je verder gaat.
OPDRACHT #3: ORGANISEER JE PROGRAMMA IN KLEINE STUKJES
Zoals iedere schakeling steeds eerst wordt gebouwd en getest, voordat je ze samenvoegt moet je de
stukjes programma op precies dezelfde wijze ontwikkelen. Kleine stukjes afzonderlijk schrijven en
testen, voordat je ze samenvoegt in een groter programma. Het programma MicroAlarmProto(Dev009).bs2 is zo´n voorbeeld van een toepassing in aanbouw. De Debug Aansluiting user interface is
grotendeels klaar, het alarmsysteem loopt goed door verschillende stappen en condities, inclusief het
aanzetten van het alarm, het activeren en de/activeren en het afgaan van het alarm, als iemand de deur
opent.
Maar de subroutine Alarm_Arming is nog niet helemaal klaar. Er zijn al programmaregels, die de
knop van de lade bewaken. Maar de potmeter voor de deur moet nog worden toegevoegd in de
Check_Sensors subroutine, die positie meet. Als de waarde van de potmeter beneden een bepaalde
waarde van 15 komt in dit voorbeeld, dan moet de statusvariabele state worden veranderd in
Triggered. Verder moeten de twee taken, om de LED rood en groen te laten worden nog worden
toegevoegd. De taken zijn al wel in de vorm van commentaar in de code gezet en dat ziet er uit als:
' To-do: bicolor LED green
...
' To-do: bicolor LED red
...
' To-do: Check if Potentiometer is over threshold
value. If yes, then, trigger alarm
9 Tik het programma MicroAlarmProto(Dev-009).bs2 in de BASIC Stamp Editor in
(aanbevolen), of download het van www.parallax.com/go/WAM en open het in de BASIC
Stamp Editor.
9 Bekijk het programma en kijk hoe ieder onderprogramma (subroutine) een specifieke taak
uitvoert. Dit is de beste manier om taken in je programma in kleine overzichtelijke stukken
code te organiseren.
9 Als je niet meer weet, hoe je de vensters van de Debug Termina moet gebruiken, om
ontvangen boodschappen te zien en zelf boodschappen te kunnen versturen, kijk je in Figuur
9-9 op pagina 197.
9 Laad MicroAlarmProto(Dev-009).bs2 in de BASIC Stamp en gebruik de Debug Terminal
Transmit window om de letter A in te tikken, waarmee alarm wordt aangezet. Tik D om het
alarm uit te zetten. Het systeem wacht even na het aanzetten, voordat het geactiveerd wordt.
Zorg ervoor, dat je de drukknop indrukt als je het alarm aanzet.
9 Als het alarm is geactiveerd laat je de knop los. Nu gaat de alarmtoon. Je kunt het system daar
weer uitschakelen.
9 Activeer het alarm opnieuw. Deze keer type je “D” om het alarm uit te schakelen, voordat je
de knop loslaat
.
Je eigen uitvinding bouwen · Page 207
' -----[ Title ]----------------------------------------------------------'What's a Microcontroller - MicroAlarmProto(Dev-009).bs2
'Test cabinet alarm system.
' {$STAMP BS2}
' {$PBASIC 2.5}
' Target = BASIC Stamp 2
' Language = PBASIC 2.5
' -----[ Constants ]------------------------------------------------------NotArmed
CON 0
' Alarm system states
Arming
CON 1
Armed
CON 3
Triggered CON 4
' -----[ Variables ]------------------------------------------------------seconds
VAR Word
' Stores second count
counter
VAR Byte
' For counting
char
VAR Byte
' Stores characters
state
VAR Nib
' Stores alarm system state
' -----[ Initialization ]-------------------------------------------------PAUSE 1000
' Wait 1 second
DEBUG "Program running..."
' Display running message
state = NotArmed
' Initialize alarm state
' -----[ Main Routine ]---------------------------------------------------DO
' Main loop
SELECT state
' Evaluate state case by case
CASE NotArmed
' If state = not armed
' To-do: bicolor LED green
GOSUB Prompt_to_Arm
'
call Prompt_to_Arm
CASE Arming
' If state = Arming
GOSUB Alarm_Arming
'
call Alarm_Arming
CASE Armed
' If state = Armed
' To-do: bicolor LED red
GOSUB Check_Sensors
'
Call Check_Sensors
GOSUB Prompt_to_Disarm
'
Call Prompt_to_Disarm
CASE Triggered
' If state = Triggered
GOSUB Alarm_Triggered
'
Call Alarm_Triggered
ENDSELECT
' Done evaluating char
LOOP
' Repeat main loop
' =====[ Subroutines ]=====================================================
' -----[ Subroutine - Prompt_To_Arm ]-------------------------------------Prompt_to_Arm:
DEBUG CLS, "Type A to arm", CR, ">"
' Display message
GOSUB Get_User_Input
' Call Get_User_Input
RETURN
' Return from Prompt_to_Arm
' -----[ Subroutine - Prompt_to_Disarm ]----------------------------------Prompt_to_Disarm:
DEBUG CLS, "Type D to disarm", CR, ">"
' Display message
GOSUB Get_User_Input
' Call Get_User_Input
RETURN
' Return from Prompt_to_Disarm
' -----[ Subroutine - Alarm_Arming ]--------------------------------------Alarm_Arming:
DEBUG CLS, "Close the cabinet.",
' Warn user to secure cabinet
CR, "You have"
FOR seconds = 8 TO 0
' Count down seconds links
DEBUG CRSRX, 9, DEC seconds, CLREOL,
' Display time remaining
" seconds links..."
PAUSE 1000
' Wait 1 second
NEXT
' Repeat count down
state = Armed
' Set state variable to Armed
RETURN
' Return from Alarm_Arming
' -----[ Subroutine - Alarm_Armed ]---------------------------------------Alarm_Armed:
DO
' Armed loop
GOSUB Prompt_To_disarm
' Check for user input
GOSUB Check_Sensors
' Check sensors
LOOP UNTIL state <> Armed
' Repeat until state not armed
RETURN
' Return from Alarm_Armed
' -----[ Subroutine - Alarm_Triggered ]-----------------------------------Alarm_Triggered:
Pagina 208 · Wat is een Microcontroller? NL HJK
DO
DEBUG CLS, "Alarm triggered!!!"
FOR counter = 1 TO 15
FREQOUT 6, 100, 4500
PAUSE 100
NEXT
FOR seconds = 1 TO 6
IF state <> triggered THEN EXIT
GOSUB Prompt_to_Disarm
NEXT
LOOP UNTIL state <> triggered
' Alarm triggered loop
' Display warning
' Sound 15 alarm tones
' 3 sec. for user to disarm
' Repeat until disarmed
' -----[ Subroutine - Get_User_Input ]------------------------------------Get_User_Input:
char = 0
' Clear char variable
SERIN 16, 84, 500, Timeout_Label, [char] ' Wait 0.5 sec. for key press
GOSUB Process_Char
' If key, call Process_Char
Timeout_Label:
' If no key, skip call
RETURN
' Return from Get_User_Input
' -----[ Subroutine - Process_Char ]--------------------------------------Process_Char:
SELECT char
' Evaluate char case by case
CASE "A", "a"
' If "A" or "a"
state = Arming
'
Change state var to Arming
CASE "D", "d"
' Else if "D" or "d"
state = NotArmed
'
Change state var to NotArmed
CASE ELSE
' else if no "A", "a", "D", "d"
DEBUG "Wrong character, try again"
'
Display error message
PAUSE 2000
'
Give user 2 sec. to read
ENDSELECT
' Done with evaluating char
RETURN
' Return from Process_Char
' -----[ Subroutine - Check_Sensors ]-------------------------------------Check_Sensors:
' To-do: Check if Potentiometer is over threshold value.
' If yes, then, trigger alarm
IF IN0 = 0 THEN state = Triggered
' Btn released? Trigger alarm.
RETURN
' Return from Check_Sensors
Een nieuwe manier van programmeren in het voorbeeldprogramma
Kijk eens goed naar de tweede FOR...NEXT loop in de Alarm_Triggered subroutine:
FOR seconds = 1 TO 6
IF state <> triggered THEN EXIT
GOSUB Prompt_to_Disarm
NEXT
Als een aanroep naar Prompt_to_Disarm subroutine leidt tot een verandering van de state
variabele, dan gebruikt het IF...THEN statement het commando EXIT om uit de FOR...NEXT loop te
ontsnappen voordat de 6 herhalingen gereed zijn.
Verder wordt een nieuw commando SERIN gebruikt in de Get_User_Input subroutine. De
commando’s DEBUG and DEBUGIN zijn speciale versies van de meer algemene commando’s SEROUT en
SERIN. Om het verschil te testen, vervang je het commando DEBUG "Program running..." door
SEROUT 16, 84, ["Program running..."]. Het verschil is, dat DEBUG en DEBUGIN commando’s
alleen maar op pen 16 kunnen communiceren, terwijl SEROUT en SERIN op iedere I/O-pin kunnen
communiceren met de Debug Terminal. Verder hebben deze nieuwe commando’s een instelling voor
de zogenaamde baudrate. Dit is de snelheid waarmee gecommuniceerd wordt. Deze codes worden
beschreven in de tabel van het BASIC Stamp Manual.
Get_User_Input:
char = 0
SERIN 16, 84, 500, Timeout_Label, [char]
GOSUB Process_Char
Timeout_Label:
RETURN
Je eigen uitvinding bouwen · Page 209
De Get_User_Input subroutine start met het op nul zetten van de char variabele om te voorkomen,
dat oude waarden gebruikt worden. Dan wordt het SERINcommando uitgevoerd, met een optionele
Timeoutwaarde op 500 ms (een halve seconde), en een optioneel timeout label dat wijst naar het
punt Timeout_Label in het programma twee regels lager. Als het SERINcommando binnen 500 ms
een teken ontvangt, wordt het resultaat opgeslagen in de variabele char en gaat door met de volgende
regel, die de subroutine Process_Char aanroept. Wordt er binnen 500 ms niets ontvangen, dan wordt
er naar het label Timeout_Label gesprongen, waardoor de aanroep van de subroutine wordt
overgeslagen.
Jouw beurt – De volgende stap naar aantonen van de haalbaarheid
Het wordt tijd, om het programma te gaan gebruiken om de haalbaarheid van ons project te bewijzen.
9 Sla een kopie op van MicroAlarmProto(Dev-009).bs2 als MicroAlarmProto(Dev-010).bs2
9 Gebruik delen van je geteste code van Opdracht #2 om de drie “To-do” items op te lossen.
9 Test je aangepaste code, en als het goed werkt sla je het programma op in je projectfolder
onder MicroAlarmProto(Dev-011).bs2
OPDRACHT #4: DOCUMENTEER JE CODE!
Het programma MicroAlarmProto(Dev-011).bs2 is nog niet echt af, omdat er nog steeds wat
commentaar voor documentatie moet worden toegevoegd. Door het toevoegen van commentaar maak
je het eenvoudiger om een programma te onderhouden en aan te passen. Neem als voorbeeld de
Alarm_Triggeredsubroutine. Het commando FREQOUT 6, 100, 4500 heeft een aantal waarden, die
anderen niet direct zullen begrijpen. We noemen dit soort getallen ook wel “mystery numbers.”
Mystery numbers zijn getallen, die voor een gewoon mens geen betekenis hebben. Je zou je code
kunnen herschrijven door de getallen te vervangen door een naam die iets zegt over de betekenis van
het getal zoals: FREQOUT SpeakerPin, BeepTime, AlarmTone. Bovenin de subroutine definieer je
dan een nieuw gedeelte, waarin deze constante een waarde krijgen. Bijvoorbeeld: SpeakerPin PIN 6.
BeepTime CON 100 en AlarmTone CON 4500.
Niet iedere constante in een programma hoeft een naam te hebben. Maar vraag je wel steeds af of
iemand zonder voorkennis van het programma begrijpt, wat de getallen betekenen.
Een ander voorbeeld dat te zien is in de Alarm_Triggered subroutine is:
FOR seconds = 1 TO 6
' 3 sec. for user to disarm.
De getallen 1 tot 6 zijn geen mystery numbers omdat duidelijk is, dat de FOR...NEXT loop zes keer
wordt uitgevoerd en het commentaar rechts geeft aan, dat 6 keer herhalen 3 seconden vertraging
oplevert. Hoewel niet iedere ervaren programmeur het met dit laatste voorbeeld eens zal zijn en zelfs
verhit zou kunnen opmerken, dat 1 en 6 op zich al mystery numbers zijn, zul je in de praktijk te
maken hebben met geldende regels in een bedrijf, hoe code geschreven moet worden. Je kunt je dan
maar het beste hieraan aanpassen, omdat die regels vaak uit de praktijk van dat bedrijf stammen.
9 Ga door het MicroAlarmProto(Dev-011).bs2 programma heen en documenteer alle mystery
numbers door een constante met een zinnige naam te maken en de getallen te vervangen door
de naam
9 Een uitzondering om vormt PINconstante in het SERIN commando’s Pin argument. Deze moet
gedeclareerd zijn als een constante en niet als een pin. Pin argumenten zijn bedoeld voor I/O
pennen en lopen van P0 tot P15. Een Pin argument van 16 maakt dat het SERINcommando
naar de BASIC Stamp modules SIN pin luistert. En die is verbonden met de
programmeeringang van het bordje.
Een andere plaats in MicroAlarmProto(Dev-011).bs2 waar de documentatie nog zwak is in het
commentaar met de uitleg van iedere subroutine en subroutine. Iedere subroutine moet tenminste
commentaar hebben, met uitleg over de functie van de routine, de variabelen, waarvan de routine
afhankelijk is en variabelen, waarin waarden worden opgeslagen voordat het RETURN wordt
Pagina 210 · Wat is een Microcontroller? NL HJK
uitgevoerd. Hier komt een voorbeeld van een stukje goede documentatie bij de Process_Char
subroutine.
'
'
'
'
'
'
'
-----[ Subroutine - Process_Char ]--------------------------Updates the state variable based on the contents of the
char variable. If char contains "A" or "a", the Armed
constant gets stored in state. If char contains "D" or "d",
the NotArmed constant gets stored in state.
Process_Char:
'... code omitted here
RETURN
' Return from...
9 Voeg commentaar toe voor de subroutine, de gebruikte labels en voor het centrale deel van de
routine.
9 Als je klaar bent, sla je een kopie op met de naam MicroAlarmProofOfConcept(v1.0).bs2.
Opslaan van kopieën en het ophogen van versienummers na iedere kleine wijziging
Zorg, dat je voortdurend kopieën blijft maken van je programma bij iedere kleine wijziging. Dat maakt
het makkelijker om eventueel een stap terug te gaan, als je wijzigingen fouten opleveren.
Bijvoorbeeld, bij de eerstvolgende wijziging , sla je het programma op als
MicroAlarmProofOfConcept(v1.01).bs2, of misschien als v1.01a. Als je voorgenomen wijziging
helemaal klaar en getest is, pas je de versie met een grotere stap aan. Bij een kleine aanpassing
wellicht v1.1; Bij een grotere stap v2.0.
OPDRACHT #5: GEEF JE TOEPASSING NIEUWE INTERESSANTE FUNCTIES
Zoals eerder genoemd, zijn alle schakelingen, waarmee je hebt gewerkt, maar een voorbeeld van de
grote groep van componenten (onderdelen) die met de BASIC Stamp gecombineerd kunnen worden.
Figuur 10-3 laat zien, hoe je onderdelen in je huidige mini-alarmsysteem kunt vervangen door
functies, die een object buiten de deur kunnen beschermen. Zo’n systeem kan bijvoorbeeld bewaken of
iemand het voorwerp optilt, of dat er iemand door een kamer loopt:
•
•
De drukknop: high-low output → vervangen door een PIR bewegingssensor
Potentiometer: variabele weerstand → vervangen door een FlexiForce krachtopnemer
De PIR sensor detecteert veranderende patronen in passief infrarood licht (warmtestraling) in de
omgeving en stuurt een hoog/laag-signaal om aan te geven, dat er een beweging is waargenomen. Een
hoog signaal betekent beweging. Een laag signaal betekent geen beweging. De FlexiForce
krachtopnemer heeft een weerstand, die varieert met de kracht op de sensor. De ronde plek is het
gedeelte dat gevoelig is voor kracht. De weerstand varieert dus als er een object op staat. De weerstand
kan gemeten worden met een RC-schakeling en het RCTIME commando.
Figuur 10-3: Sensors om je Mini Alarm Systeem op te waarderen
PIR Motion
Sensor
FlexiForce Sensor
9 Ga naar www.parallax.com en type “motion detection” in het zoekveld (Search field),en klik
dan op de Go knop.
Je eigen uitvinding bouwen · Page 211
9 Zoek naar de PIR Sensor in zoekresultaten en ga naar de productpagina.
9 Download de PIR Sensor Documentatie (.pdf), en kijk eventueel naar PIR Sensor video clip.
The PDF staat in de Downloads sectie van de webpagina.
9 Lees de documentatie en de uitleg bij het schema en het voorbeeldprogramma PIR_Simple.bs2.
Zou je deze sensor kunnen gebruiken als vervanging van de drukknop?
9 Ga terug naar je zoekresultaten (of terug naar de Parallax home page) en type pressure in het
Search veld Volg dan de FlexiForce sensor link.
9 Zoek de documentatie en un-zip de FlexiForce Source Code (.zip).
9 In de un-zipped folder open je en lees je de Engelstalige documentatie, schema en FlexiForce
Simple.bs2 programmacode. Zou je de potmeter kunnen vervangen door deze sensor?
Voor een stap-voor-stap voorbeeld, dat laat zien, hoe dit voorbeeld en de volgende
activiteit in je alarmtoepassing kunnen worden opgenomen kun je kijken op de:
Stamps in Class “Mini Projects” link at: www.parallax.com/Education.
OPDRACHT #6 : HOE VERMIJD JE ONTWERPPROBLEMEN?
Nu je ongeveer klaar bent met What’s a Microcontroller? blijft er nog een stap over. Namelijk hoe
vind je oplossingen in toepassingen en situaties, die je nog niet gezien hebt? Gebruik dan de volgende
aanwijzingen:
Stap 1: Zoek naar onderdelen of schakelingen die je probleem kunnen oplossen.
Stap 2: Lees hoe de onderdelen werken en besteed vooral aandacht aan de manier, waarop de
BASICStamp met dit onderdeel of schakeling verbonden zou kunnen worden.
Stap 3: Kijk, of er voorbeeldprogramma’s zijn te vinden voor het betreffende onderdeel. Dat maakt
het een stuk eenvoudiger om dit nieuwe onderdeel in je toepassing op te nemen
Laten we zeggen, dat de volgende opdracht wordt, om een LCD display op het systeem aan te sluiten,
waarop de statusinformatie verschijnt. Hier is een voorbeeld, hoe je het betreffende onderdeel kunt
vinden en hoe je kunt vaststellen, of het onderdeel geschikt is om in je toepassing te worden
opgenomen.
9 (St1p 1) Ga naar www.parallax.com en probeer de zoekterm “display” in het Search veld. Klik
op de Go button of druk op Enter. Ga naar de productpagina van de verschillende
zoekresultaten en kijk of je een betaalbaar display kunt vinden dat een paar regels tekst kan
weergeven..
Als je de Parallax Serial 2x16 LCD van Figuur 10-4 hebt gevonden, dan is dat een goede kandidaat en
ben je op het juiste spoor. Maar in principe is ieder display bruikbaar te maken.
Figuur 10-4
Parallax 2x16 Serial LCD
9 (Stap 2) Ga naar de Parallax Serial 2x16 LCD productpagina. Lees de productbeschrijving
(Engels). Zoek de link naar de Parallax Serial 2x16 LCD’s PDF Documentatie Je vindt die in
Downloads & Resources onderaan de pagina met de naam “Parallax Serial 2x16 LCD
Documentation v2.0 (pdf).” Het versienummer moet 2.0 of hoger zijn, tegen de tijd dat je dit
zoekt.
9 (Stap 3) Kijk naar de voorbeeldcode in de Parallax Serial 2x16 LCD’s PDF documentatie maar
ook bij de linkjes op de webpagina’s Downloads & Resources section. Zoek een mooi kort
simpel voorbeeldprogramma dat alleen maar een testboodschap laat zien. Zo’n eenvoudig
programma is vaak een goed begin.
Pagina 212 · Wat is een Microcontroller? NL HJK
Na de korte introductie van SERIN en SEROUT onder het voorbeeldprogramma van dit hoofdstuk zal
het stukje programmacode van het testprogramma voor de Parallax Serial LCD, dat gebruik maakt van
SEROUT, je niet onbekend voorkomen.
Als je de link volgt naar Smart Sensors and Applications , kun je het boek Smart
Sensors and Applications (Engels) downloaden. Hierin is een hoofdstuk gewijd aan het
besturen van dit LCD-display met de BASIC Stamp 2.
Drie voorbeelden uit velen
De voorbeelden met de PIR bewegingsmelder en de FlexiForce krachtopnemer en de Parallax Seriële
LCD zijn maar drie voorbeelden van onderdelen, die bijdragen aan de functionaliteit van je prototype.
Figuur 10-5 laat nog een paar modules en voorbeelden van apparaten zien. En ook dit is nog steeds een
bescheiden keus uit de enorme hoeveelheid mogelijkheden. De voorbeelden in de figuur zijn
achtereenvolgens: (a) RF module voor draadloze communicatie (wireless), (b) gyro verdraaiingen om
te meten, (c) een kompas om richting te meten (compass), (d) Een trillingssensor (vibration sensor), (e)
een accelerometer waarmee scheefstand en veranderingen van snelheid kunnen worden gemeten, (f)
een ultrasone sensor waarmee afstand kan worden gemeten (ultra sonic sensor), (g) een lichtgevoelige
sensor (light sensitive sensor), (h) een servo, (i) een besturing voor een gelijkstroommotor (DC motor
control), (j) een Darlington array om een stappenmotor (k) aan te sturen (stepper motor). Al deze
apparaten vind je op de www.parallax.com website, als je gaat zoeken op de Engelstalige woorden.
Om bijvoorbeeld meer te weten over (f), type je als zoekwoord ultrasone sensor
.
Figuur 10-5: Meer voorbeelden van module en sensoren
Motor Control
Sensors
Communication
b
e
h
j
a
c
f
k
i
d
g
Jouw beurt – Zoek nog meer informatie
Als je een project in gedachten hebt en je hebt hulp nodig voor de componenten, een schakeling en
programmacode, dan kun je behalve op www.parallax.com ook op vele andere plaatsen terecht zoals:
•
•
•
•
•
Stamps in Class PDF textbooks
Parallax PDF product documentation
Nuts and Volts of BASIC Stamps columns
Answers to questions and articles at forums.parallax.com
BASIC Stamp articles published on the Internet
Als je op zoek bent naar informatie over onderdelen en hoe deze te gebruiken zijn met een BASIC
Stamp, dan ben je op zoek naar zogenaamde “application information.” Je moet het Engels een beetje
machtig zijn om langs deze weg informatie te vinden Je kunt voor de informatie vaak het beste
beginnen te zoeken op de website van de leverancier. Mocht je geen oplossing vinden, dan zou je op
Je eigen uitvinding bouwen · Page 213
een zogenaamd forum kunnen kijken (Engels) of met een zoekmachine als Google. Het mooie van een
internetzoekmachine is, dat deze ook in PDF-documenten kan zoeken. Figuur 10-6 laat je een
voorbeeld van Google zien
Figuur 10-6
Google Search op de site
van www.parallax.com
Je kunt de zoekopdracht aanpassen naar bijvoorbeeld:
infrarode remote site:forums.parallax.com
Hierdoor zoekt de zoekmachine naar alle vragen en antwoorden inclusief artikelen, die woorden
bevatten als “infrared” en “remote” op een forums.parallax.com. Als je meer specifiek zoekt naar
programmavoorbeelden voor een BASIC Stamp, verander dan je zoekterm in “BASIC Stamp” infrared
remote met het word Basic Stamp tussen haakjes, om alle postzegelcollecties (Een postzegel heet een
stamp in het Engels) uit te sluiten:
9
9
9
9
9
9
infrared remote site:www.parallax.com
Zoek naar de term “infrared” en “remote” in PDF en productpagina’s op www.parallax.com
Forum voor infrarood afstandsbedieningforums.parallax.com
Zoek naar de term “infrared” en “remote” in discussiegroepen op forums.parallax.com
“BASIC Stamp” infrared remote
Zoek op het web naar woorden als “infrared” en “remote” in dezelfde pagina’s of PDF met de
term “BASIC Stamp.”
Stel dat de volgende opdracht is, om een toetsenbordje aan je Micro- alarmproject toe te voegen, maar
een zoektocht naar voorbeelden en informatie over een mogelijk simpel toetsenbord heb je niet op de
website van Parallax kunnen vinden. Je zou dan een poging kunnen doen via Google. Bedenk, dat
Google ook alle PDF documenten doorzoekt.
9 Ga naar www.google.com.
9 Type “keypad site:www.parallax.com” in het Search field druk op Enter.
Met enig geduld zul je je door de vele informatie moeten heen werken, maar dan vind je waarschijnlijk
wat je zoekt Door de samenvatting van iedere link te lezen, kun je vrij snel de links vinden die het
meest interessant kunnen zijn. Na een paar pagina’s zou je de volgende Infrarood afstandsbediening
kunnen tegenkomen uit Figuur 10-7. Hoewel dit niet de oplossing is voor wat je zocht. Maar als je de
mogelijkheden leest en de prijs ziet, zou het ook een heel interessante oplossing kunnen zijn voor je
toetsenbord.
Figuur 10-7: IR Remote Parts Kit
Stel dat je toch niets hebt gevonden, dan wordt het tijd om in het Engels een vraag te stellen op
bijvoorbeeld een forum van Parallax. Als je hier een vraag stelt, komt die een reeks van experts,
hobbyisten en docenten onder ogen. En er zijn vast een paar mensen die op je vraag willen reageren.
De expertise van alle mensen, die met dit soort vragen bezig zijn is enorm en die kun op deze
eenvoudige manier gebruiken om lastige vragen in je project op te lossen!
Pagina 214 · Wat is een Microcontroller? NL HJK
Processor geheugen (Memory) en de beperkingen van de processorsnelheid
In veel gevallen, wordt een klein project al gauw een groter project. Ook projecten voor een
BASICStamp 2 kunnen zo groot worden, dat ze niet meer in het geheugen passen. Soms lukt het, om
een programma geheel of gedeeltelijk te herschrijven, waardoor het wel gaat passen. Maar dat betekent
een paar flinke stappen terug in de ontwikkeling van je project. Je zou ook een ander type
BASICStamp kunnen kopen, met meer programmageheugen. Een ander ontwerpprobleem kan
ontstaan, als de toepassing meer variabelen moet opslaan, dan waarvoor de BASICStamp plaats heeft
in zijn geheugen. Er zijn BASICStamp's, die meer ruimte voor variabelen hebben. Er kan ook een
probleem ontstaan tijdens je project, doordat er teveel taken in te weinig tijd moeten gebeuren, dan
waarvoor de BASICStamp geschikt is. Er zijn BASICStamps die sneller zijn.
Figuur 10-8 laat alle BASIC Stamp modellen nog een keer zien. Voor meer informatie kun je kijken
op de “Compare BASIC Stamp Modules” link op www.parallax.com/basicstamp.
Figuur 10-8: De Complete reeks van BASIC Stamp Modellen
From links: BS1, BS2, BS2e, BS2sx, BS2p24, BS2p40, BS2pe, BS2px
BS1: Betaalbaar, maar krachtig, perfect voor kleine projecten of kleine ruimtes.
BS2: Ideaal voor beginners met een uitgebreide set voorbeeldprogramma’s. Wordt ook gebruikt in
het Stamps in Class programma.
BS2e: Perfect voor BS2 gebruikers die meer ruimte nodig hebben voor programma en variabelen.
BS2sx: Ondersteunt de BS2 commandoset met meer variabelen en programmaruimte en is meer dan
tweemaal zo snel.
BS2p24: In aanvulling op het voorgaande, heeft deze versie speciale commando’s voor I/O polling,
LCD displays en I2C- en 1-wire protocollen.
BS2p40: Alle mogelijkheden van de BS2p24 maar met 16 extra I/O pennen.
BS2pe: Ondersteunt de BS2p24 commandoset maar gebruikt minder stroom en heeft meer geheugen.
Geschikt voor bijvoorbeeld dataloggingtoepassingen.
BS2px: Dit snelste BASIC Stamp model ondersteunt alle BS2p24 commando’s, plus speciale I/O
functies
.
Als je overstapt naar een sneller type BASIC Stamp moet je in gedachten houden, dat er verschillen
zijn in de BASIC-commando’s, die met tijd werken, zoals RCTIME en FREQOUT. Dat komt, omdat de
processoren op verschillende snelheden lopen, waardoor de tijdseenheid in de argument voor Duration
en Frequency verschillend kunnen zijn. Als de BS2 het commando FREQOUT 6, 100, 4500 uitvoert,
stuurt hij gedurende 100 ms (1/10th van een seconde) een alarmtoon naar P6 op een frequentie van
4500 Hz. Hetzelfde commando op een BS2px stuurt een toon van 27,135 kHz die maar 16.6 ms duurt
op een frequency van 27,135 Hz. Die toon kun je niet eens horen. Voor meer tips en suggesties over
hoe je met de verschillende type kunt werken, kun je het beste in de (Engelstalige) helpschermen
kijken. Hier vind je tips, hoe je een programma van een BS@ naar een ander type kunt overzetten.
Krachtige Parallelle Processing
Sommige toepassingen hebben veel meer rekenkracht en geheugen nodig, dan enige BASICStamp
processor beschikbaar heeft. Voor dat soort projecten is de Propeller microcontroller special
ontworpen. Deze unieke krachtige microcontroller heeft acht snelle processoren op een chip. Er zijn
32 I/O pennen , een veel groter programmageheugen en ruimte voor variabelen. De processoren
werken allemaal tegelijk, onafhankelijk en tegelijk ook samen. Ze delen het gemeenschappelijke
geheugen en de systeemklok. Daarnaast hoeft iedere processor zijn eigen geheugen en speciale
Je eigen uitvinding bouwen · Page 215
hardware (elektronica) om allerhande ingewikkelde taken uit te voeren zoals het opwekken van een
beeld voor een computerdisplay of een TV.
De Propeller Education Kit die in Figuur 10-9 is te zien is een uitstekende manier om met deze
processor vertrouwd te raken. Deze kit is echter niet de beste stap na deze cursus What’s a
Microcontroller? Er zijn verschillende boeken en kits, die we als volgende stap zouden kunnen
aanbevelen Maar als je al weet, dat je volgende project nog ambitieuzer en uitdagender wordt, moet je
wellicht toch eens nadenken over het aanschaffen van een Propeller Education Kit.
Figuur 10-9
Propeller Education Kit
(links)
PE Platform (rechts)
OPDRACHT #7: HOE VERDER?
Je bent bijna klaar met deze cursus What’s a Microcontroller? Het is tijd om na te denken wat je nu
wilt.Voordat je verder gaat, raden we je aan, om even stil te staan bij de vraag, wat je nu eigenlijk het
meeste interesseert. We geven je een aantal suggesties:
•
•
•
•
•
•
Robotica
Elektronica
Sensors
Automatisering
Hobby projecten
Aardwetenschappen en klimaatwetenschappen
Deze activiteit helpt je bij het vinden van informatie om in deze categorieën verder te gaan.
De bronnen, kits, en onderdelen die in dit artikel worden besproken representeren de
situatie in de herfst van 2009. Er zullen nieuwere en betere versies van kits, componenten
en informatiebronnen beschikbaar komen. Kijk op www.parallax.com voor de laatste
informatie.
What’s a Microcontroller, het vervolg
Figuur 10-10 laat een aantal kits en boeken zien, die goed aansluiten op dit boek. Robotica with the
Boe-Bot geeft veel plezier en is erg leerzaam, omdat je allerlei technieken uit dit boek gaat toepassen
op de rijdende Boe-Bot® robot. Smart Sensors and Applications was eigenlijk geschreven als een deel
2 van “What’s a Microcontroller, Part 2.” De naam is uiteindelijk veranderd, omdat alle slimme
sensoren en de LCD bijna allemaal een eigen coprocessor hebben, die met de BASICStamp
communiceert. De coprocessoren maken daarmee van de sensors “slimme” sensors of “smart” sensors.
Het boek Understanding Signals is ook een goede keus, omdat het je leert op de Parallax oscilloscoop
te zien, hoe de BASIC Stamp communiceert met de andere onderdelen. De Parallax oscilloscoop kun
je in de USB poort van je computer verbinden.
Pagina 216 · Wat is een Microcontroller? NL HJK
Figuur 10-10: Interessante mogelijkheden na What’s a Microcontroller?
Boe-Bot Robot Kit
Smart Sensors
and Applications
Parts and Text
Understanding
Signals Parts
and Text
Meer Stamps in Class Kits en boeken
Figuur 10-11 laat een flowchart zien met alle Stamps in Class kits en de bijbehorende boeken. Het
overzicht is te vinden via de Stamps in Class Program Overviews and Flowchart link op
www.parallax.com/Education. Je kunt ieder plaatje aanklikken, waarna je vanzelf op de betreffende
productpagina belandt. Daar vind je informatie over het boek en bijbehorende kits. De kit What’s a
Microcontroller? staat linksboven. Vandaar kun je verder met Robotics with the Boe-Bo) of een andere
kit in de Sensors or Signals serie.
NOOT vertaler: Hoewel alleen de Engelstalige boeken getoond worden op de website, zijn een aantal
boeken ook in het Nederlands vertaald.
PDF Download van de boeken: Ieder boek kan in full color als PDF worden gedownload
Klik op een willekeurig plaatje van een boek, om op de Text + Kit pagina te komen. Daar
vind je dan een link naar de PDF.
Je eigen uitvinding bouwen · Page 217
Figuur 10-11
Stamps in Class
Flowchart
Als je Engels beheerst en geïnteresseerd bent in:
•
•
•
•
•
Robotica, dan is een logische volgende stap Robotics with the Boe-Bot.
Sensors, uitvindingen of hobbyprojecten, dan is het boek Smart Sensors and Applications een
logische keuze.
Elektronica (signalen), dan zou je kunnen kiezen voor Understanding Signals.
Automatisering, dan zou het boek Process Control een goede keuze zijn.
Aardwetenschappen en klimaatwetenschappen dan, is het boek Applied Sensors
(oorspronkelijk Earth Measurements genaamd) een leuke keuze.
Nog meer Stamps In Class bronnen
Naast de Stamps in Class boeken, zijn er Stamps in Class “Mini Projects” met een link aan
www.parallax.com/Education. Sommige projecten gebruiken precies de standaardonderdelen, die in
een bepaalde kit aanwezig zijn en laten een nieuwe manier zien om ze te gebruiken. Veel van die
projecten zijn net als de Stamps in Class boeken, opgezet met activiteiten, schema’s bedrading en
programmacode. En alles kan gedownload worden. Sommige hebben zelfs een videotutorial . Figuur
10-12 is een voorbeeld van zo’n project: “Build Your Own Mini Timer”. Het kan met een paar
onderdelen uit dit boek gebouwd worden. Of je zoekt naar ideeën of creatieve inspiratie, je vindt het er
allemaal.
Pagina 218 · Wat is een Microcontroller? NL HJK
Figuur 10-12:Voorbeeld van een Stamps in Class “Mini Project”
SAMENVATTING
In dit boek maakte je kennis met een verscheidenheid aan schakelingen en technieken die onderdeel
kunnen vormen van gewone alledaagse toepassingen of van een van jouw uitvindingen. Dit boek
leerde je ook, hoe je bij een BASICStamp alle losse onderdelen aan het werk krijgt en hoe je ze tot een
toepassing aan elkaar smeedt. Dit hoofdstuk liet je een aantal nieuwe technieken zien hoe je alles bij
elkaar kunt voegen tot een werkend prototype. En er zijn suggesties gedaan, hoe je na dit boek verder
kunt gaan met toepassingen die je bijzondere belangstelling hebben.
De benadering, hoe een BASICStamp te combineren is met een bepaalde schakeling kan ook toegepast
worden om een reeks van andere schakelingen en modules, zodat er nog meer toepassingen bereikbaar
worden. Er zijn twee voorbeelden uitgewerkt, waaronder het micro kast- alarm met een knop en een
potmeter en het alarm met een bewegingsdetector en een drukgevoelige sensor.
Terwijl je code schrijft voor je toepassing, moet je het programma geregeld opslaan onder een naam
met een ingebouwd revisienummer. Het revisienummer moet regelmatig worden opgehoogd. Verder
hebben we gezien, dat het heel handig is in verband met de leesbaarheid van het programma, om
constanten te gebruiken voor bijvoorbeeld I/O-pinnen en getallen met PIN en CON parameters. Voeg
vooral ook veel commentaar aan je programma toe, waarin je uitlegt, wat het programma of de
subroutine doet, inclusief het gebruik van variabelen en het resultaat, als de subroutine klaar is.
Dit hoofdstuk heeft je verder wegwijs gemaakt in een aantal onderzoeksmethoden en om nieuwe
onderdelen aan je prototype toe te voegen. Zelfs als je geen idee hebt hoe iets werkt, kun je toch
verder komen, door het gebruik van de juiste zoektermen op internet over onderdelen, schakelingen en
programma’s. Het Stamps in Class boek en de bijbehorende kits leveren eveneens een schat aan
informatie op en nieuwe ontwerptechnieken. Ze zijn een prima start om nog meer te leren van
robotica, sensoren, elektronica, automatisering, aardwetenschappen en nog veel meer. Alle boeken, die
bij de Stamps in Class kits geleverd worden, zijn gratis te downloaden.
We zijn aan het einde van dit boek. Denk daarom nog een keer terug, aan wat je allemaal hebt geleerd:
(1) de technieken die je hebt geleerd, (2) je volgende uitvinding, project of prototype, (3) hoe je
datgene, dat je leerde hierin kunt toepassen en (4) wat je nu wilt gaan leren..
9 Het is tijd om over je volgende project na te gaan denken
9 Zorg ervoor, dat je blijft leren, terwijl je met nieuwe technieken in aanraking komt.
9 Veel plezier en succes!
Appendix A: Onderdelenlijst en Kit opties · Page 219
Appendix A: Onderdelenlijst en Kit opties
What’s a Microcontroller Parts & Text Kit #28152, Parts Only #28122
Parts and quantities subject to change without notice
Parallax Part #
Description
Quantity
150-01020
Resistor, 5%, 1/4W, 1 kΩ
10
150-01030
Resistor, 5%, 1/4W, 10 kΩ
4
150-01040
Resistor, 5%, 1/4W, 100 kΩ
2
150-02020
Resistor, 5%, 1/4W, 2 kΩ
2
150-02210
Resistor, 5%, 1/4W, 220 Ω
6
150-04710
Resistor, 5%, 1/4W, 470 Ω
6
152-01031
Potentiometer - 10 kΩ
1
200-01031
Capacitor, 0.01 μF
2
200-01040
Capacitor, 0.1 μF
2
201-01080
Capacitor, 1000 μF
1
201-03080
Capacitor 3300 μF
1
28123
What’s a Microcontroller? text (in #28152 only)
1
350-00001
LED - Green - T1 3/4
2
350-00005
LED - Bicolor - T1 3/4
1
350-00006
LED - Red - T1 3/4
2
350-00007
LED - Yellow - T1 3/4
2
350-00027
7-segment LED Display
1
350-00029
Phototransistor, 850 nm, T1 3/4
1
400-00002
Pushbutton – Normally Open
2
451-00303
3 Pin Header – Male/Male
1
500-00001
Transistor – 2N3904
1
604-00010
1
10 kΩ digital potentiometer
800-00016
3” Jumper Wires – Bag of 10
2
900-00001
Piezo Speaker
1
900-00005
Parallax Standard Servo
1
COMPLETE KIT OPTIES
Er zijn verschillende opties beschikbaar. Allemaal bevatten ze een BASIC Stamp 2 microcontroller
development board en allemaal bevatten ze de onderdelen, die nodig zijn om de oefeningen uit dit
boek te maken:
•
BASIC Stamp Opdracht Kit (#90005) bevat:
o BASIC Stamp HomeWork Board met BS2 in SMD (Surface Mount) versie
o USB to Serial Adapter met USB A naar Mini-B kabel (#28031)
o What’s a Microcontroller? Onderdelen en boek (#28153)
•
BASIC Stamp ontdekkingskit (Serial #27207 or USB #27807) bevat:
o Board of Education (Serial #28150 or USB #28850)
o BASIC Stamp 2 microcontroller module (#BS2-IC)
o Programmeerkabel (Serial #800-00003 or USB A to Mini-B #805-00006)
o What’s a Microcontroller? Parts and Text (#28152)
o BASIC Stamp handboek (#27218)
•
What’s a Microcontroller onderdelen en boek (#28152).
o Board of Education volledige kit (Serial #28103 or USB #28803) bevat:
o Board of Education (Serial #28150 or USB #28850)
o BASIC Stamp 2 microcontroller module (#BS2-IC)
o Programmeerkabel (Serial #800-00003 of USB A naar Mini-B #805-00006)
o Jumper Wires (1 set van 10)
Een opmerking voor de docenten: Op alle kits worden kwantumkortingen gegeven. Voor meer
informatie kun je kijken op www.parallax.com. Verder wordt de BASIC Stamp HomeWork Board
apart verkocht per 10, om een voordelige oplossing te bieden voor klassikaal gebruik. Dit is
aanzienlijk goedkoper dan een Board of Education + BASIC Stamp 2 module (#28158) kit. Voor
verdere informatie kan je contact opnemen met het Parallax verkoopteam voor volumeprijzen.
Pagina 220 · Wat is een Microcontroller? NL HJK
Appendix B: Meer over elektriciteit
Wat is een Elektron? Een elektron is een van de drie fundamentele onderdelen van het atoom;
de andere twee delen zijn een proton en een neutron. Een of meerdere protonen en neutronen
vormen samen het binnenste van een molecule in een gebied dat we de nucleus noemen.
Elektronen zijn kleine deeltjes in vergelijking met protonen en neutronen en ze cirkelen rond de
nucleus. Elektronen stoten elkaar af, elektronen en protonen trekken elkaar aan.
Wat is een Lading? Het gegeven dat elektronen elkaar afstoten en dat ze protonen aantrekken,
noemen we negatieve lading. Het gegeven dat protonen andere protonen afstoten en elektronen
aantrekken noemen we positieve lading. Indien een molecule meer elektronen dan protonen heeft,
zegt men dat deze negatief geladen is. Indien een molecule minder elektronen heeft dan
protonen, zegt men dat het positief geladen is. Indien er evenveel protonen als elektronen zijn, is
het geheel neutraal.
Wat is Voltage? Voltage is vergelijkebaar met elektrische druk. Indien een negatieve lading
moleculen dichtbij een positieve molecule komt, kan het zijn dat de extra negatieve elektron van de
negatieve molecule wordt weggetrokken door de positief geladen molecule. Batterijen hebben dan
ook de opslag van de negatieve en positieve moleculen in aparte compartimenten. Elk van deze
compartimenten is verbonden met een terminal van de batterij; de positieve moleculen in een
compartiment zijn de positieve (+) terminal, en de negatieve moleculen in het andere compartiment
zijn de negatieve (-) terminal.
Volt is de dimensie van de elektrische druk en het wordt aangeduid met een hoofdletter V. Je zal
dit zeker herkennen, denk maar aan de negen volt (9 V) batterij die als voeding voor het Board of
Education of HomeWork Board wordt gebruikt. Andere veel voorkomende batterijen zijn de 12 V
batterijen in auto’s en de 1.5 V AA batterijen die gebruikt worden in rekenmachines, draadloze
muizen, en andere toestellen.
Wat is stroom? Stroom is een maat voor het aantal elektronen per seconde die door de
schakeling vloeien. Wat ook kan is dat de elektron de negatieve geladen molecule verlaat en dan
naar de positieve molecule overspringt. De stroom wordt meestal aangeduid met de hoofdletter ‘I’
in zowel boeken als schema’s.
Wat is ampère? Een ampère is de basis eenheid voor stroom en dit wordt afgekort met
hoofdletter ‘A’. Vergeleken met de schakelingen die je met de BASIC Stamp gebruikt, is ampère
een zeer grote eenheid. Ampère wordt meestal gebruikt voor beschrijving van stroom in
autobatterijen, autolichten, industriële machines. Een betere beschrijving in deze toepassingen is in
milli-ampère.
Wat is Weerstand? Weerstand is een element in de schakeling dat de stroom van elektronen af
remt, zodat er minder snel elektronen van de negatieve naar de positieve terminal lopen.
De ohm is de eenheid voor de weerstand. Deze is al geïntroduceerd en wordt aangeduid als
afkorting met de Griekse letter omega (Ω).
Wat is een Geleider? Koperen draden hebben bijna geen weerstand, dit noemt men dan een
geleider.
Appendix B: More about Electricity · Page 221
BONUS OPDRACHT: WET VAN OHM, SPANNING EN STROOM
Deze opdracht gebruikt enkele definities van bijlage B.
Onderdelen voor de wet Ohm
(1) Weerstand – 220 Ω (rood-rood-bruin)
(1) Weerstand – 470 Ω (geel-violet-bruin)
(1) Weerstand – 1 kΩ (bruin-zwart-rood)
(1) Weerstand – 2 kΩ (rood-zwart-rood)
(1) LED – gelijk welke kleur
Test schakeling
De weerstandswaarde van Ri in Figuur B-1 kan veranderen. Een lagere weerstand zal meer stroom
door de LED sturen, en deze zal dan meer oplichten. Een hogere weerstand zal de LED doen dimmen
aangezien er minder stroom door vloeit.
9 Koppel de voeding af van je Board of Education of HomeWork Board terwijl je de schakeling
aanpast.
9 Bouw de schakeling van Figuur B-1, begin met de 220 Ω weerstand.
9 Pas de schakeling aan door de 220 Ω weerstand te vervangen door een van 470 Ω
9 Brandt de LED inderdaad minder helder?
9 Herhaal dit met een 1 kΩ weerstand, dan een 2 kΩ weerstand, controleer telkens de
veranderingen in helderheid.
Vdd
X3
Vdd
R1 R2 R3 R4
Ri
LED
Vss
R1 = 220 Ω
R2 = 470 Ω
R3 = 1 kΩ
R4 = 2 kΩ
P15
P14
P13
P12
P11
P10
P9
P8
P7
P6
P5
P4
P3
P2
P1
P0
X2
Vin
Vss
+
Figuur B-1
LED Stroom
Monitor
Indien je een 9 V batterij gebruikt, kun je de helderheid ook vergelijken als je Vin, de
ingangsspanning, gaat variëren. Vin is direct verbonden met de + aansluiting van de 9 V batterij. Vss
is verbonden met de negatieve aansluiting van de batterij. Vdd wordt geregeld op 5 V. Dat is
ongeveer de helft van de spanning van de 9 V batterij.
9 Indien je geen 9V batterij gebruikt, stop dan hier en ga naar de volgende paragraaf: Het
berekenen van de Stroom.
9 Start met de schakeling Figuur B-1, maar gebruik de 1 kΩ weerstand.
9 Noteer hoe helder de LED is.
9 Koppel de voeding af.
9 Pas de schakeling aan door de weerstand los te koppelen van Vdd en plug deze nu in Vin.
9 Sluit de voeding weer aan. Is de LED feller gaan branden? Hoeveel feller?
DOE DIT NIET met een 220 of 470 Ω weerstand, aangezien dan teveel stroom door de LED
zal stromen en de LED kan doorbranden.
Pagina 222 · Wat is een Microcontroller? NL HJK
Berekenen van de stroom
De BASIC Stamp Handleiding geeft enkele regels voor de maximale stroom die er mag vloeien door
een schakeling, die is aangesloten op een I/O-pin. Indien je deze regels niet aanhoudt kan de BASIC
Stamp beschadigd worden. De volgende regels leggen uit hoeveel stroom er is toegelaten via een de
I/O pin als output.
Stroomregels voor de BASIC Stamp I/O Pinnen
Een I/O pin kan maxmaal 20 mA leveren. Met andere woorden, indien je een HIGH signaal
naar de I/O pin stuurt, mag je niet meer dan 20 mA door bijvoorbeeld een LED laten
stromen.
Indien je een LOW commando stuurt, kan de I/O pin maximaal 25 mA afvoeren naar massa.
P0 tot P7 kunnen dus ieder maximal 20 mA aan, evenals P8 tot P15. Met behulp van
weerstand in de schakeling, die aangesloten is op de I/O-pin, moet je de stroom op deze
maximale waarde begrenzen..
Voor meer informatie kun je meer details vinden in het handboek van de BASIC Stamp 2.
Indien je weet hoe je de stroom kunt berekenen, weet je, hoe je een LED zonder problemen kunt laten
branden. Elk elektronisch onderdeel heeft regels wat betreft spanning, weerstand en stroom. Voor de
LED geldt dat de diode een zogenaamde doorlaatspanning heeft. Dit is de spanning over de LED,
indien er stroom door de LED loopt. Voor de weerstand is er de wet van Ohm. Je kunt uitrekenen
hoeveel stroom de LED gebruikt in de schakeling. Er zijn ook regels hoe stroom en spanning moeten
worden opgeteld in een schakeling. Deze regels noemt men de wetten van Kirchoff over spanning en
stroom.
Appendix B: More about Electricity · Page 223
Vdd – Vss = 5 V De spanning van Vdd naar Vss is 5 V. Dit noemt men de geregelde
spanning, dit werkt net als een batterij die exact 5 V levert. (Batterijen leveren geen 5 V.
Vier oplaadbare nikkel-cadmiumbatterijen, leveren 4 keer 1,2 volt en dat is 4,8 volt) De
Board of Education en BASIC Stamp HomeWork Board hebben een spanningsregelaar, die
de 6-9 volt ingangsspanning omzet in een stabiele 5 volt. Deze spanning is aangesloten op
Vdd van het breadboard. De BasicStamp heeft zelf ook een ingebouwde regelaar voor 5 volt
voor zijn eigen onderdelen.
Vin – Vss = 9 V Indien je een 9 V batterij gebruikt, is de spanning van Vin naar Vss 9 V.
Wees voorzichtig. Indien je een spanningsregelaar gebruikt die in de muur past, en er is een
aanduiding die zegt dat er 9 V wordt geleverd. De spanning kan in de praktijk veel hoger
zijn dan 9 volt en zelfs wel 18 V zijn.
Massa of de referentie van een schakeling verwijst meestal naar de negatieve aansluiting
van een schakeling. Bij de BASIC Stamp en Board of Education wordt de massa aangeduid
met Vss. Vss is dus 0 volt. En als er een batterij wordt gebruikt, is Vss aangesloten op de –
van de batterij. Hierdoor is de positieve aansluiting van de batterij 9 volt. De spanning na de
regelaar wordt Vdd genoemd en wordt ook weer gemeten ten opzichte van de referentie. De
spanningsregelaar op de BASIC Stamp voorziet zo de BASIC Stap van 5 volt
Wet van Ohm: V = I × R Het voltage over een weerstand is gelijk aan de stroom die
erdoorheen gaat, vermenigvuldigd met de weerstandswaarde.
Diode Voorwaartsespanning of doorlaatspanning: Dit is de spanning over de diode
tussen anode en kathode, als er stroom door de LED loopt. Voor de groene LED in de
schakeling van Figuur 2-6 op bladzijde 23, kun je voor je berekeningen aannemen, dat deze
doorlaatspanning ongeveer 2,1 volt is. Een gele LED heeft een doorlaatspanning van
ongeveer 2,0 volt en een rode LED 1,7 volt. Deze spanning zal een klein beetje veranderen,
als de stroom door de LED verandert. Bij een kleine serieweerstand of een hogere spanning
loopt er meer stroom door de LED. Bij een grotere weerstand of een lagere spanning, loopt
er minder stroom.
Vereenvoudigde wetten van Kirchoff: gebruikt voltage is gelijk aan geleverd voltage.
Indien je een schakeling 5 V geeft, dan dient de som van alle gebruikte voltages over de
componenten gelijk te zijn aan 5 V.
Vereenvoudigde wetten van Kirchoff: gebruikte stroom is gelijk aan geleverde
stroom. De hoeveelheid stroom die door een LED schakeling stroomt langs Vdd is exact
hetzelfde als de hoeveelheid, die via Vss weer eruit stroomt . Indien je drie LED’s aan de
BASIC Stamp hangt en elke LED schakeling gebruikt 5 mA, dan dient de BASIC Stamp
15mA te leveren.
Voorbeeld Berekening: Eén schakeling, twee schakelingen
Bereken hoeveel stroom er door de LED schakeling stroomt in twee stappen:
1. Zoek uit wat de spanning over de weerstand is
2. Gebruik de wet van Ohm om de stroom in de weerstand te berekenen.
Figuur B-2 laat zien hoe je kunt bepalen wat de spanning over de weerstand is. Links is een
voedingsspanning van 5 V aangegeven. De onbekende spanning noemen we VR, de spanning over de
weerstand. We weten dat de spanning over de LED 1.6 V is. En we weten dat de spanning over alle
componenten tezamen 5 V is, door de wet van Kirchoff. Het verschil tussen 5 V en 1.6 V is 3.4 V.
Dat is dus de spanning over de weerstand VR.
Pagina 224 · Wat is een Microcontroller? NL HJK
VR + 1.7 V = 5 V
VR = 5 V − 1.7 V
VR = 3.3 V
Figuur B-2
Spanning bij
Weerstand en
LED
Kilo is metrisch 1000. 1000 is kilo. Dit wordt afgekort met een kleine letter k. In plaats van
1000 Ω te schrijven, kan je 1 kΩ schrijven. In ieder geval is het uitgesproken als een kiloohm. Evenals 2000 Ω geschreven kan worden als 2 kΩ.
Milli is metrisch 1/1000. De afkorting is gedefinieerd met de kleine letter m. Indien de
BASIC Stamp een LED schakeling voedt met 3.4 duizendste van een ampère, dan is dit 3.4
milli-ampère, of 3.4 mA.
Wat is een mA? Uitgesproken als milli-ampère, het is de notatie voor een duizendste van
een ampère. De ‘m’ in mA is de metrische notatie voor milli, wat gelijk is aan 1/1000. De ‘A’
in mA staat voor ampère. Voeg deze twee tezamen en je hebt milli-ampères. Dit is zeer
handige benaming van de hoeveelheid stroom die loopt door de BASIC Stamp en de
schakelingen die ermee verbonden zijn.
Figuur B-3 toont een voorbeeld hoe je de stroom kunt berekenen in de schakeling met een weerstand
van 470 Ω. Begin met de wet van Ohm. Je weet uit het vorige antwoord dat de spanning over de
weerstand(3.4 V is. En de weerstand is 470 Ω. Je kunt nu de stroom berekenen, met de wet van Ohm.
V = I×R
3.3 V = I × 470 Ω
3.3V
I=
470 Ω
I ≈ 0.00702 V
Ω
I = 0.00702 A
7.02
I=
A
1000
I = 7.02 mA
Figuur B-3
Berekenen van
de stroom door
de
Weerstand
Ja, het klopt ! 1 A = 1 V/Ω (Een ampère is een volt per ohm).
Hoe veel stroom is 7.02 mA? Dit is de hoeveelheid stroom door de LED van Figuur B-2.
Je kunt de weerstand van 470 Ω vervangen door een van 220 Ω. Er zal dan ongeveer 15.0
mA door de schakeling gaan. De LED zal feller branden. Als je een 1000 Ω weerstand
gebruikt zal er ongeveer 3.3 mA door de LED gaan. De LED zal nu veel minder licht geven.
Een weerstand van 2000 Ω laat de LED nog minder licht geven. De stroom zal nu ongeveer
1.65 mA zijn.
Stel, dat je twee LED’s tegelijkertijd wilt aanzetten. Dat zou betekenen, dat de BASIC Stamp de
schakeling van Figuur B-4 moet aansturen met een I/O-pin. Zou hierdoor de grens van 20 mA
uitgangsstroom voor de I/O-pin overschreden worden? Laten we dat proberen uit te zoeken. Denk nog
eens aan de vereenvoudigde wet van Kirchoff’, die zegt dat de totale stroom de som is van alle
stromen in alle aangesloten schakelingen. Dit betekent dat, zoals Figuur B-4 toont, de totale stroom
gelijk is aan de som van de twee stromen. Het antwoord is 14.04 mA. Omdat deze stroom onder de
grenswaarde van 20 mA ligt, kun je de schakeling veilig aansluiten.
Appendix B: More about Electricity · Page 225
I = I 1 + I 2 + ... I i
I = 7.02 mA + 7.02 mA
I = 14.04 mA ≈ 14.0 mA
Figuur B-4
Totale
Stroom
geleverd aan
de Twee
LED
schakelingen
Jouw beurt – Aanpassen van de schakeling
9 Herhaal de opdracht van Figuur B-2, maar gebruik Vin – Vss = 9 V in plaats van Vdd – Vss =
5 V.
Veronderstel dat de doorlaatspanning van de diodes niet verandert. Het antwoord is dan is VR = 7.3 V.
De gemeten spanning over de weerstand zal waarschijnlijk iets lager zijn, omdat de doorlaatspanning
van de LED iets groter is, omdat er vanuit de schakeling meer stroom door de LED gaat.
9 Herhaal de oefening van Figuur B-3 met een weerstand van 1 kΩ.
Antwoord: I = 3.3 mA.
9 Gebruik VR = 7.3 V om de oefening van Figuur B-3 met een weerstand van 1 kΩ uit te voeren.
Antwoord: I = 7.3 mA.
9 Herhaal de oefening van Figuur B-4 met een weerstand van 470 Ω en met een van 1 kΩ.
Antwoord: I = 7.23 mA + 3.4 mA = 10.63 mA.
Pagina 226 · Wat is een Microcontroller? NL HJK
Appendix C: Samenvatting RTTTL Formaat
Dit is een samenvatting, bedoeld om het RTTT-formaat te begrijpen. De volledige RTTTL
specificaties kunnen gevonden worden op meerdere websites. Gebruik een zoekmachine met de
sleutelwoorden RTTTL specificatie om een overzicht te krijgen.
Hier is een voorbeeld van het RTTTL formaat ringtoon:
TakeMeOutToTheBallgame:d=4,o=7,b=225:2c6,c,a6,g6,e6,2g.6,2d6,p,2c6,c,a6,g
6,e6,2g.6,g6,p,p,a6,g#6,a6,e6,f6,g6,a6,p,f6,2d6,p,2a6,a6,a6,b6,c,
d,b6,a6,g6
De tekst voor de eerste dubbele punt geeft aan wat een mobiele telefoon als naam van het liedje laat
zien. Hier is de ringtoonnaam:
TakeMeOutToTheBallGame:
Tussen de eerste en tweede dubbele punt kan je de standaardwaarden zien d, o, en b. Hier betekenen
ze :
d – duration
o – octave
b – beats per minute or tempo.
De standaardinstellingen voor TakeMeOutToTheBallGame zijn:
d=4,o=7,b=225:
De noten van het liedje staan na de tweede dubbele punt en worden gescheiden door een komma. Als
enkel de nootletter is gebruikt, zal die afgespeeld worden met de standaard waarden. Als voorbeeld uit
TakeMeOutToTheBallGame is de tweede noot:
,c,
Aangezien het geen andere informatie bevat, zal de noot de standaardwaarden hebben; een vierde van
de nootlengte (d=4), in het zevende octaaf (o=7).
Een noot kan tot 5 karakters bevatten tussen de komma’s ; hierbij de specificatie van elk karakter:
,duration
note
sharp
dot
octave,
Bijvoorbeeld:
,2g#.6,
….betekent: speel een halve noot G-sharp gedurende 1 ½ tijd van de halve noot in het zesde octaaf.
Hier volgen enkele voorbeelden uit TakeMeOutToTheBallGame:
,2g.6, – halve noot, G, gepunt, een zesde octaaf
,a6, – standaard een kwart noot gespeeld met een zesde octaaf
,g#6, – kwarts duur, g-noot, scherp (aangeduid met #), een zesde octaaf
Het karakter:
· Page 227
,p,
…staat voor pauze en rust. Zonder extra informatie speelt de p een kwart noot. Je kunt ook een halve
noot spelen:
,2g.6, – halve noot, G, gepunt, zesde octaaf
,a6, – standaard kwart noot in zesde octaaf
,g#6, – kwart noot, g , scherp (kruis door #), zesde octaaf
de karakters:
,p,
Hier volgt een voorbeeld van een gepunte rust:
,2p.,
In dit geval duurt de rust een halve noot, plus een kwart voor de duur van de noot.
Pagina 228 · Wat is een Microcontroller? NL HJK
Appendix D Inhoud van de kit
Het soort onderdelen en de hoeveelheden van de „What’s a Microcontroller“ kit kunnen veranderen
zonder reden. Als je vragen hebt, mail dan met [email protected].