Arduino cursus/Dag 2: verschil tussen versies
Regel 133: | Regel 133: | ||
| potmeter | | potmeter | ||
| servo | | servo | ||
| | | [[../Servo-0]] | ||
| | | | ||
|} | |} |
Versie van 18 nov 2017 21:05
Dag 2 - cursus Arduino
Input: sensoren
Signalen en events
We hebben te maken met verschillende soorten inputs: signalen en events.
Een signaal is continu: het heeft op elk moment een waarde. Meestal is dit een weergave ("spoor") van een fysisch proces..
- Enkele voorbeelden van signalen: geluid; elektrisch signaal van de hartslag; lichtniveau (via LDR); temperatuur; snelheid; versnelling;
Periodieke signalen
Sommige signalen bestaat uit een herhalend patroon. We spreken dan over een periodiek signaal; de periode is de duur van het (kleinste) deel dat steeds herhaald wordt.
- Enkele voorbeelden van periodieke signalen: sinus (toon); PWM-signaal (bijvoorbeeld voor het aansturen van een LED of van een motor);
Discretiseren van een signaal (bemonstering)
Een signaal is continu: voor het werken met een signaal in een computer moet je dit discreet maken, door middel van bemonstering. Dit betekent dat je periodiek de waarde van het signaal meet via een A/D omzetter: het resultaat van zo'n meting is een getal. Een signaal beschrijf je dan door een reeks getallen. Als je zo'n bemonstering vaak genoeg doet, kun je deze reeks waarden beschouwen als een betrouwbare benadering van het oorspronkelijke signaal.
- Hoe vaak is "vaak genoeg"? Dat hangt van het signaal af. Als een signaal snel verandert (met andere woorden: als het signaal hoge frequenties bevat), dan zul je dit sneller moeten bemonsteren. Voor een periodiek signaal geldt dat je dit tenminste tweemaal in een periode moet bemonsteren; in de praktijk doen we dat meestal iets vaker.
- voorbeeld: de temperatuur in een kamer hoeven we niet elke 1/10 seconde te bemonsteren: zo snel verandert deze niet. In een vriezer of in een koelkast zal de temperatuur nog minder snel veranderen (door de isolatie).
- Hoorbaar geluid heeft frequenties tot ca. 15 kHz; dit zul je dan met tenminste 30 kHz moeten bemonsteren.
Events
Een event is een gebeurtenis die op een bepaald moment plaatsvindt. In onze aanpak speelt de duur van een event geen rol: een event is "momentaan".
- Voorbeelden van events: het indrukken van een toets; een muisklik; het aflopen van een kookwekker; een val; een stap; een hartslag;
Ook events kunnen (semi-)periodiek zijn: denk bijvoorbeeld aan de stappen van iemand die loopt; of aan een reeks opeenvolgende hartslagen. In deze voorbeelden kan er een kleine variatie in de periode tussen de opeenvolgende events zitten.
Een event is soms een gebeurtenis die in een signaal herkend kan worden: bijvoorbeeld, in een electrocardiogram (ECG: hartsignaal) kunnen we de hartslagen herkennen. Of in het signaal van een 3D-versnellingsopnemer (accellerometer) kunnen we de stappen herkennen.
- Een eenvoudig voorbeeld hiervan: in het signaal van een drukknop kunnen we de overgang L->H herkennen: dit komt overeen met het indrukken van de drukknop.
Sensoren
Sommige sensoren meten een signaal:
- temperatuursensor
- lichtsensor (LDR)
- potmeter (potentiometer)
- versnellingsopnemer (accellerometer)
- microfoon
- afstandssensor
Andere sensoren detecteren een event:
- bewegingsmelder
- deursensor (openen/sluiten van een deur)
- brandmelder
Soms gebruiken we een stukje programma om een event in een signaal te herkennen:
- indrukken van een toets
- hartslag in een hartsignaal
Voorbeelden van deze sensoren - voor signalen en events - behandelen we in de opdrachten verderop.
Koppelen van input aan output
Directe koppeling van input- naar output-signaal
Sensoren met een signaal als output kun je koppelen aan actuatoren met een signaal als input. Soms moet je het signaal daarvoor aanpassen - bijvoorbeeld door middel van schaling (map-functie), filtering, of andere berekeningen. De tabel hieronder geeft voorbeelden van sensoren en actuatoren die je op een dergelijke manier direct kunt koppelen. Sommige combinaties zijn nuttig, andere vooral creatief.
in (signaal) | bewerking | output (signaal) |
---|---|---|
input = analogRead(pin); |
map(in, inFrom, inTo, outFrom, outTo) |
analogWrite(pin, out);
|
potmeter | ...filter... | buzzer (toonhoogte) |
LDR (lichtniveau) | ... | LED (helderheid) |
temperatuursensor | ... | RGB-LED (kleur) |
kracht/gewichtsensor | display (waarde) | |
oriëntatiesensor (kompas) | motor (snelheid) | |
versnellingopnemer | servo (hoek) | |
geluidsniveausensor | ... | |
afstandssensor | ... | |
... | timer (periode) | |
... | -> tikker, enz. | |
... | ... |
De Arduino-code voor deze directe koppeling van input- en outputsignalen kan er als volgt uitzien:
input = analogRead(sensorPin);
output = map(input, inFrom, inTo, outFrom, outTo);
digitalWrite(output);
Dit kunnen we nog directer weergeven:
digitalWrite(map(analogRead(sensorPin), inFrom, inTo, outFrom, outTo));
Opdrachten - directe koppeling van signalen
input (sensor) | output (actuator) | opdracht(en) | library | voorkennis |
---|---|---|---|---|
analoge temperatuursensor | serial plotter; display | Arduino cursus/Analoge temperatuursensor | (met schaling) | display |
digitale temperatuursensor | serial plotter; display | Arduino cursus/Digitale temperatuursensor | (met schaling) | display |
afstandssensor | serial monitor; display; | Arduino cursus/Afstandssensor | ||
hartslagsensor | serial plotter; LED | Arduino cursus/Hartslagsensor | ||
LDR (lichtsensor) | serial plotter; buzzer (tone) | display | ||
potmeter | servo | Arduino cursus/Servo-0 |
Nog wat ideeën:
- afstandssensor met buzzer (kliksnelheid - vgl. parkeersensor?)
- afstandssensor met servo
- afstandssensor met buzzer (tone)
- potmeter met RGB-LED (kleur)
Events en event-detection
input (event) | output (event) | |
---|---|---|
button (indrukken) | digitalWrite(...)
| |
timer | LED aan/uit | |
bewegingsdetector | motor aan/uit; richting | |
relais aan/uit |
Meerdere taken "tegelijk"
- vermijden van blokkerende acties (zoals
delay
) - gebruik van timers (zie: "Blink without delay")
Timers
- nb: een (herstartende) timer is een periodiek signaal - dit kunnen we gebruiken voor het genereren van allerlei andere periodiek signalen.
- bijv.: gebruik van een timer om een LED te laten dimmen in een bepaalde periode. Je gebruikt dan het verschil (now - start) voor de PWM-parameter.
Opdrachten
Niet alle combinaties van inputs en outputs zijn geschikt. Sommige zijn nuttig; andere vooral creatief.
(software) timer | Blink without delay | Blink (LED) | |
directe koppeling met schaling |
LDR en buzzer (toonhoogte) | ||
directe koppeling met beslissing |
temperatuursensor met LED-indicatie | analoge input; schaling; | |
directe koppeling met schaling |
potmeter met kleur | analoge input; schaling | |
bewegingsdetector met lichtschakelaar (LED) |
veiligheidsverlichting | timers; LDR; (eventueel: relais/MosFET) |
Signalen met directe koppeling naar output
input (sensor) | output (actuator) | opdracht(en) | library | voorkennis |
---|---|---|---|---|
analoge temperatuursensor | serial plotter; display | Arduino cursus/Analoge temperatuursensor | (met schaling) | display |
digitale temperatuursensor | serial plotter; display | Arduino cursus/Digitale temperatuursensor | (met schaling) | display |
afstandssensor | serial monitor; display; | Arduino cursus/Afstandssensor | ||
hartslagsensor | serial plotter; LED | Arduino cursus/Hartslagsensor | ||
LDR (lichtsensor) | serial plotter; buzzer (tone) | display | ||
potmeter | servo |
Nog wat ideeën:
- afstandssensor met buzzer (kliksnelheid - vgl. parkeersensor?)
- afstandssensor met servo
- afstandssensor met buzzer (tone)
- potmeter met RGB-LED (kleur)
Events en event-detection
input (event) | output (event) | |
---|---|---|
button (indrukken) | digitalWrite(...)
| |
timer | LED aan/uit | |
bewegingsdetector | motor aan/uit; richting | |
relais aan/uit |
Sensor | detectie | output | opdracht(en) | library | voorkennis |
---|---|---|---|---|---|
button | indrukken van button | LED | Arduino cursus/Button-event - LED omschakelen | ||
bewegingsdetector | beweging | LED | Arduino cursus/Bewegingsdetector - LED omschakelen | ||
hartslagsensor | hartslag (signaalniveau) | ||||
directe koppeling met beslissing |
temperatuursensor met LED-indicatie | analoge input; schaling; | |||
bewegingsdetector met lichtschakelaar (LED) |
veiligheidsverlichting | timers; LDR; (eventueel: relais/MosFET) |
Automaat - met input
bouwsteen | opdracht(en) | library | voorkennis |
---|---|---|---|
button (indrukken als event) |
|||
bewegingsdetector | LED | ||
hartslagsensor detecteren van hartslag |
display; LED | ||
(software) timer | Blink without delay | Blink (LED) | |
directe koppeling met schaling |
LDR en buzzer (toonhoogte) | ||
directe koppeling met beslissing |
temperatuursensor met LED-indicatie | analoge input; schaling; | |
directe koppeling met schaling |
potmeter met kleur | analoge input; schaling | |
bewegingsdetector met lichtschakelaar (LED) |
veiligheidsverlichting | timers; LDR; (eventueel: relais/MosFET) |
Timers en multitasking
bouwsteen | opdracht(en) | library | voorkennis |
---|---|---|---|
timer | LED: symmetrisch knipperen | ||
timer | LED: PWM (o.a. voor dimmer) | LED | |
timer: oneshot (delay) | LED (voorbereiding nachtlamp) - met button | Button | |
tikker(met buzzer) | Arduino cursus/Tikker | timer | |
(mini-project) | bewegingsdetector (en evt. LDR) met LED-schakelaar/timer |
timer (one-shot); evt. LDR; | |
(mini-project) | afstandssensor met tikker |
NB: we hebben zowel simpele opdrachten - om een bouwsteen te leren kennen; met enkele variaties, ook voor een beter begrip. En we hebben (mini)projecten waarin we enkele bouwstenen combineren.
In latere projecten zullen we meerdere bouwstenen combineren.
Projecten
- verkeerslichten