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].
© Copyright 2024 ExpyDoc