Inhoud
Terug naar mijn portfolio overzicht
07 - Sensoren en Actuatoren
Laat de LEDjes knipperen
Opdracht 1: Stuur 5 LEDs aan met behulp van je microcontroler board naar keuze:
- Verbind alle LEDs en weerstanden met je microcontroler board, gebruik verschillende pins zodat je ze apart kunt aansturen. Test of al je LEDs het doen. Teken je schakeling uit in Tinkercad en zet deze in je documentatie / portfolio.
Ik heb ervoor gekozen om mijn picoproto te gebruiken. Veel pins die aan de rechterkant van de pico zitten worden gebruikt voor de onderdelen die we op het board hebben gesoldeerd.
- GP28: Potentiometer
- GP27: LED
- GP22: Button
- GP21: Buzzer
- GP18: Externe connector / servo
Ik heb GP11 t/m GP15 op de pico gebruikt om 5 rode LEDs aan te sluiten met een 330r weerstanden.
Daarna heb ik een tekening gemaakt in Thinkercad van mijn schakeling. Alleen is er geen pico in Thinkercad dus heb ik een arduino gebruikt.
Dit is de situatie in het echt.
- Programma 1: Iedere LED word om de beurt aangezet, er wordt gewacht, de LED word uitgezet, er word weer gewacht en daarna word de volgende LED aangezet, totdat alle LEDs een keer aan en uit zijn geweest, heen en terug. Maak gebruik van een array en van een for-loop, hierdoor wordt het programma een stuk korter en overzichtelijker.
- programma-1.ino
// Opdracht 1: Stuur 5 LEDs aan met behulp van je microcontroler board naar keuze // Programma 1: Knight Rider loop int pinArray[] = {11,12,13,14,15}; int count = 0; int timer = 100; void setup(){ for (count=0;count<5;count++) { pinMode(pinArray[count], OUTPUT); } } void loop() { for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } for (count=3;count>=1;count--) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } }
In bovenstaande code heb ik delay(), in de delay periode wacht de microcontroller en voert die tijd niks anders uit, kan dus ook geen data ontvangen.
- Programma 2: Maak nog twee andere knipper patronen die na elkaar worden getoond. Laat bijvoorbeeld de LEDs tegelijk branden en 10 keer knipperen, een looplicht, 3 seconden laten branden en daarna uit. Maak hierbij ook weer gebruik van een for-loop, daarnaast kun je delay() of millis() gebruiken voor de timing.
millis() = aantal msec dat de arduino aan staat
long = dubbele interger (32 bits)
- programma-2.ino
// Opdracht 1: Stuur 5 LEDs aan met behulp van je microcontroler board naar keuze // Programma 2: Drie knipper patronen int pinArray[] = {11,12,13,14,15}; int count = 0; int timer = 100; void setup(){ for (count=0;count<5;count++) { pinMode(pinArray[count], OUTPUT); } } void loop() { // Steady on for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); } delay(3000); for (count=0;count<5;count++) { digitalWrite(pinArray[count], LOW); } delay(timer); // Knight Rider loop for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } for (count=3;count>=0;count--) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } // Flash for (int i = 0; i < 10; i++){ for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); } delay(timer); for (count=0;count<5;count++) { digitalWrite(pinArray[count], LOW); } delay(timer); } }
- Optioneel: Doe dezelfde opdracht maar gebruik zo min mogelijk regels code. Het zou mogelijk moeten zijn om het binnen 10 regels te kunnen programmeren.
Nog niet gedaan.
Seriële data
Opdracht 2: Maak een sketch waarbij je seriële data op je computer kunt inlezen en verzenden.
- Als eerste testen we of we data van het microcontroler board op de computer kunnen inzien. Maak een “hello world” programma en open de serial monitor om de data te kunnen inzien.
- Maak een sketch waarbij je een (externe) knop kan inlezen. Teken je schakeling uit in Tinkercad. Zorg ervoor dat je de waardes op je computer in een grafiek krijgt in de serial plotter.
- Als laatste gaan we de status van de LED veranderen door data naar de micocontroler toe te sturen. Maak een sketch waarbij je door 'O' te sturen de LED aan zet en met 'X' de LED uit.
Serial.println = automatisch een new line
buffer (data naar de arduino sturen) –> fifo
serial.available = kijken of er nog dat in de buffer is
- opdracht-2.ino
// Opdracht 2: seriele data int buttonState = 0; int pinArray[] = {11,12,13,14,15}; int count = 0; const int buttonPin = 22; // GP22: Button unsigned long looptime; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); pinMode(LED_BUILTIN, OUTPUT); for (count=0;count<5;count++) { pinMode(pinArray[count], OUTPUT); } } void loop() { if (millis() > looptime + 99){ buttonState = digitalRead(buttonPin); Serial.println(buttonState); if(buttonState == HIGH) { digitalWrite(LED_BUILTIN, HIGH); } else{ digitalWrite(LED_BUILTIN, LOW); } looptime = millis(); } if(Serial.available()>0){ int incomingByte = Serial.read(); if (incomingByte == 'O') { for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); } } if (incomingByte == 'X') { for (count=0;count<5;count++) { digitalWrite(pinArray[count], LOW); } } } }
Analoge data
Opdracht 3: Lees analoge data in en maak een schets waarbij iets gebeurt wanneer er een drempelwaarde overschreden wordt.
- Maak de knop sketch uit opdracht 2 opnieuw, maar gebruik deze keer de interne pull-up.
- opdracht-3-1.ino
const int buttonPin = 22; // GP22: Button unsigned long looptime; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (millis() > looptime + 99){ int buttonState = digitalRead(buttonPin); Serial.println(buttonState, DEC); if(buttonState == HIGH) { digitalWrite(LED_BUILTIN, LOW); } else{ digitalWrite(LED_BUILTIN, HIGH); } looptime = millis(); } }
- Maak sketch waarbij je een een potentiometer (analoog) uitleest in de serial plotter.
- opdracht-3-1.ino
const int potentiPin = 28;// GP28: Potentiometer unsigned long looptime; void setup() { Serial.begin(9600); pinMode(potentiPin, INPUT); } void loop() { if (millis() > looptime + 99){ int sensorValue = analogRead(potentiPin); Serial.println(sensorValue); looptime = millis(); } }
- Kies een sensor (b.v. een LDR) en maak een sketch waarbij iets gebeurt wanneer een drempelwaarde overschreden wordt.
Er zijn specifieke pins die ADC kunnen, op de pico zijn dat 26, 27 en 28.
- opdracht-3-2.ino
unsigned long looptime; int pinArray[] = {11,12,13,14,15}; int count = 0; const int LDRpin = 26; int LDRValue = 0; void setup() { Serial.begin(9600); pinMode(LDRpin, INPUT); pinMode(LED_BUILTIN, OUTPUT); for (count=0;count<5;count++) { pinMode(pinArray[count], OUTPUT); } } void loop() { if (millis() > looptime + 99){ looptime = millis(); LDRValue = analogRead(LDRpin); Serial.println(LDRValue); if (LDRValue < 500) { for (count=0;count<5;count++) { digitalWrite(pinArray[count], HIGH); } } else{ for (count=0;count<5;count++) { digitalWrite(pinArray[count], LOW); } } } }
Beweging
Opdracht 4: Sluit een RC servo aan en zorg ervoor dat je deze kunt bewegen met je potentiometer.
De pico kan op elke pin PWM uitsturen.
- opdracht-4.ino
#include <Servo.h> const int potentiPin = 28;// GP28: Potentiometer const int ServoPin = 2; Servo myservo; unsigned long looptime; void setup() { Serial.begin(9600); pinMode(potentiPin, INPUT); myservo.attach(ServoPin); } void loop() { if (millis() > looptime + 99){ int sensorValue = analogRead(potentiPin); Serial.println(sensorValue); sensorValue = map(sensorValue, 0, 1023, 0, 179); myservo.write(sensorValue); looptime = millis(); } }
Afsluitende opdracht
Opdracht 5: pak de ELEGOO kit, kies 1 sensor die je interessant lijkt (b.v. temperatuur, joystick, licht, beweging, geluid, acceleratie, RFID) en kies 1 actuator die je interessant lijkt (DC motor, stappenmotor, RC servo, LCD display, LED matrix) en maak een schets waarbij je gebruik maakt van 'Sense-Think-Act'.







