Lego Mindstorms - Bewegingssensoren
In dit deel ga je een bewegingssensor aansluiten op de Lego Mindstorms.
Opdracht PIR-sensor aansluiten
1. HiTechnic heeft sensoren voor Lego Mindstorms in het assortiment.
![](/userfiles/a2a23a77f6b59a87e80efe41b58aa2ca5cea9912.png)
A. Ga naar (http://modernroboticsinc.com) en zoek daarin op HiTechnic.
Er is een aantal infraroodsensoren, bijvoorbeeld een PIR-sensor. (http://modernroboticsinc.com/hitechnic-nxt-pir-sensor).
B. Zoek de gegevens van deze sensor op.
C. Wat verandert er bij het detecteren van een beweging?
D. Kun je iets instellen aan deze sensor? Zo ja, wat dan?
E. Wat is de hoek waaronder de PIR-sensor beweging kan detecteren?
F. Wat is de afstand waarbinnen nog beweging gedetecteerd kan worden?
Een van de andere sensoren is de HiTechnic NXT IRSeeker V2.![](/userfiles/e1dcc0dfd74090a730738818da35ecdc0d2a872c.png)
G. Zoek de gegevens van deze sensor op.
H. Welke toepassing heeft deze sensor?
I. Leg duidelijk uit hoe deze sensor werkt.
J. Wat is de overeenkomst en wat het verschil met de vorige sensor(en)?
2. Koppel de infraroodsensor aan poort 4 van de EV3-robot. Geen infraroodsensor? Daar is een oplossing voor. Zie hierna.
Programmeren
Voordat we aan de code voor de PIR-sensor beginnen moeten we eerst het toestandsdiagram maken. In feite is dat vrij simpel aangezien de PIR-sensor veel zaken al intern regelt. Laten we de PIR sensor beschouwen als een bewegingsmelder van een lamp. In dat geval moet er dus bij beweging een lampje aangaan. Bij de EV3 maken we daarvoor in de plaats gebruik van de display.
We krijgen dus de volgende toestanden:
- Er wordt geen beweging gedetecteerd dus op de display komt ‘uit’ te staan.
- Er wordt beweging gedetecteerd: op de display komt ‘aan’ te staan.
Op sommige PIR’s kun je de gevoeligheid en de vertraging instellen. Dit laten we nu nog buiten beschouwing.
Het eenvoudige toestandsdiagram zal er dan zo uitzien.
![](/userfiles/48844ec7bdaf7f2d3bd33247ec2f9e8c90590267.png)
Als er geen PIR aanwezig is, kunnen we voor het maken van een bewegingssensor ook gebruik maken van een touch-sensor om het gedrag van de PIR-sensor te simuleren.
Opdracht touch sensor
Als er geen PIR aanwezig is, kunnen we voor het maken van een bewegingssensor ook gebruik maken van een touch-sensor om het gedrag van de PIR-sensor te simuleren.
- Waarom maakt dit voor deze opdracht geen verschil?
Opdracht EV3 programmeren
Gebruik het onderstaande programma om de bewegingssensor te kunnen gebruiken. Test je programma.
De bijbehorende code (op het display wordt niet alleen ‘aan’ of ‘uit’ aangegeven, maar ook de waarde die de sensor heeft en de toestand waarin het programma zit):
'De touchsensor wordt gekoppeld aan poort 1. De modus is 0.
'Modus 0 betekent dat na aanraking het percentage weer 0 wordt.
Sensor.SetMode(1,0)
'lamp kan uit of aan zijn
lamp = "uit"
'toestand geeft aan in welke toestand het systeem zit: 1 of 2
toestand = 1
'waarde 100 geeft aan dat de sensor ingedrukt is en bij waarde 0 is deze niet ingedrukt
waarde = 0
'De regels om het scherm te verversen moeten direct, na wijzigen van de toestand, worden uitgevoerd i.v.m. de leesbaarheid
LCD.Clear()
LCD.Write(10, 40, "Waarde = " + waarde)
LCD.Write(10, 60, "Toestand = " + toestand)
LCD.Write(10, 80, "Lamp = " + lamp)
'De While-lus wordt continu doorlopen
While "true"
'Lees de waarde die de touchsensor aangeeft en ken deze toe aan de variabele 'waarde'
waarde = Sensor.ReadPercent(1)
'Controleer of de sensor is ingedrukt
If toestand = 1 Then
If waarde = 100 Then
lamp = "aan"
toestand = 2
LCD.Clear()
LCD.Write(10, 40, "Waarde = " + waarde)
LCD.Write(10, 60, "Toestand = " + toestand)
LCD.Write(10, 80, "Lamp = " + lamp)
EndIf
EndIf
'Controleer of de sensor is losgelaten
If toestand = 2 Then
If waarde = 0 Then
lamp = "uit"
toestand = 1
LCD.Clear()
LCD.Write(10, 40, "Waarde = " + waarde)
LCD.Write(10, 60, "Toestand = " + toestand)
LCD.Write(10, 80, "Lamp = " + lamp)
EndIf
EndIf
EndWhile
Opdracht toestandsdiagram timer
De bedoeling is dat het 'lampje' niet onmiddellijk uit gaat als er na een beweging geen beweging meer wordt gedetecteerd.
Laten we er van uit gaan dat er 30 seconden moeten verstrijken voor het licht uitgaat. En mocht tijdens die 30 seconden toch weer een beweging gedetecteerd worden dan blijft het programma in toestand 2 en begint, als er daarna opnieuw geen beweging is, de timer opnieuw te lopen.
Je zou kunnen kiezen voor 3 toestanden.
- Er wordt geen beweging gedetecteerd: uit
- Er wordt beweging gedetecteerd: van uit naar aan
- Er wordt geen beweging meer gedetecteerd en de timer gaat lopen.
Als de timer (zonder gedetecteerde beweging) 30 seconden gelopen heeft dan naar toestand 1 maar als er binnen die 30 seconden opnieuw beweging wordt gedetecteerd dan terug naar toestand 2
- Teken het toestandsdiagram
Opdracht tijd
Met Clock.ElapsedMilliseconds is het mogelijk om de tijd te bepalen die er verstreken is sinds 1900. Als je deze code op verschillende momenten uitleest is het mogelijk om de tijd tussen die twee momenten te meten… Je kunt een constante ‘tijd’ opnemen in je programma die je de waarde van 30.000 ms geeft.
Opdracht timer
De code voor de 'timer' ziet er als volgt uit:
If toestand = 3 Then
If waarde = 0 Then
T2 = Clock.ElapsedMilliseconds
'Alleen wanneer de tijd verstreken is moet de lamp worden uitgezet
If T2-T1 > tijd Then
lamp = "uit"
toestand = 1
LCD.Clear()
LCD.Write(10, 40, "Waarde = " + waarde)
LCD.Write(10, 60, "Toestand = " + toestand)
LCD.Write(10, 80, "Lamp = " + lamp)
Endif
Endif
Endif
If toestand = 3 Then
If waarde = 100 Then
lamp = "aan"
toestand = 2
LCD.Clear()
LCD.Write(10, 40, "Waarde = " + waarde)
LCD.Write(10, 60, "Toestand = " + toestand)
LCD.Write(10, 80, "Lamp = " + lamp)
Endif
EndIf
- Pas nu de code aan zodat de timer ook goed gaat werken. Vergeet de constante niet. Ook elders in het programma moet je nog het een en ander aanpassen.
Vragen bij bewegingssensor
A. Had je de vertraging bij het uitgaan ook simpelweg in kunnen stellen door Program.Delay(30000) te gebruiken in je code? Dat had namelijk heel wat code gescheeld! Deze regel kun je invoegen in het eerste programma (2 toestanden).
B. Waar zou je dat moeten doen? Probeer dit uit en kijk wat de gevolgen zijn.
De actieve sensor / infrarood sensor
Opdracht HiTechnic NXT EOPD
Objecten kunnen gedetecteerd worden met de HiTechnic NXT EOPD.
A. Zoek de gegevens van deze sensor op.
B. Welke toepassing heeft deze sensor?
C. Wat betekenen de laatste vier letters?
D. Leg duidelijk uit hoe deze sensor werkt.
E. Wat is de overeenkomst en wat het verschil met een actieve infrarood-sensor?
Opdracht IR-sensor
De IR-sensor van Lego Mindstorms (nr. 45509) wordt meegeleverd met de ‘home-editie (niet met de educatieve set).
A. Zoek de eigenschappen en de toepassing op.
B. Zou je deze sensor kunnen gebruiken om voorwerpen of mensen/dieren te detecteren?
C. Waarom wel of waarom niet?
![](/userfiles/6528ad656aef18c3285e9dfbb198e2df29b24212.jpg)
Opdracht infrarood baken
Lego Mindstorms heeft een infrarood baken (nr. 45508).
A. Is dit een sensor?
B. Leg uit waarom wel of waarom niet.
C. Noem twee manieren waarop deze kan worden gebruikt.
![](/userfiles/57de8084341c74c9d3debbf562c8797106c459b3.png)
Opdracht toegangspoort
Je kent ze ongetwijfeld. Van die poortjes bij een supermarkt of bouwmarkt. Je kunt er wel in maar moet via de kassa weer naar buiten. Vaak werkt zo’n poortje met een actieve infrarood sensor. Zodra je je in de straal bevindt gaat het poortje korte tijd open.
![](/userfiles/04f3b4c8f70bb432e2c7bc5e220f085a8ed63eab.jpg)
Afbeelding: Toegangspoorten (met toestemming van Alrecar B.V. Sprang-Capelle)
Je hebt actieve infrarood sensoren waarbij aan één kant van de doorgang zich de zender bevindt die dus het infrarode licht uitzendt en er tegenover zit dan de ontvanger. Zodra de ontvanger geen infrarood licht ontvangt kan op die veranderde situatie gereageerd worden.
De infrarood sensor van Mindstorms is iets simpeler. De zender en de ontvanger zitten naast elkaar. Het infrarode licht wordt uitgezonden en wanneer er dan iemand of iets zich in die lichtstraal bevindt wordt deze teruggekaatst, opgevangen door de ontvanger en kan er een reactie plaatsvinden.
Wij zullen ons in verband met de eenvoud alleen bezig houden met een infrarood sensor zoals die van Lego (of de HiTechnic NXT EOPD)
Het poortje simuleren we met de Lego-robot. In plaats het openen van een poort laten we de robot kort achteruit rijden, namelijk precies één omwenteling van de voorwielen. Voor het openen van een poort zou je ook een motor gebruiken en deze een korte slag laten maken. Ook zorg je ervoor dat de afstand van de ‘persoon’ (of de poort) tot de IR-sensor op het scherm wordt getoond. Voor dit laatste kun je deze code gebruiken.
'connect IR sensor to port 4
Sensor.SetMode(4,0) 'Set port 4 to mode 0: distance in cm
While "True"
LCD.StopUpdate() 'to prevent flickering, don't update LCD until text is ready
LCD.Clear()
LCD.Text(1,45,55,2,Sensor.ReadRawValue(4,0)+" cm")
LCD.Update()
EndWhile
Met het voorbeeld van de PIR sensor moet het nu niet zo heel moeilijk meer zijn om het toestandsdiagram te tekenen en daarna de code voor deze schakeling te schrijven.
A. Teken het toestandsdiagram en schrijf het programma.
B. Als de infraroodstraal niet meer wordt onderbroken, hoe lang duurt het dan voordat de sensor dit signaleert?
C. Zorg er in het toestandsdiagram en in de code voor dat de robot daarna 5 seconden wacht en dan terugrijdt naar zijn eerste positie.
D. Onderzoek wat het effect is van het wijzigen van de sensormodus in 1, resp. 2.