Codewerkplaats Les 6 (LED-strip en lijnvolger)
Dit is al de zesde en laatste les. Deze les gaan we een coole LED-strip voorop het karretje aansluiten en programmeren. Ook gaan we de lijnsensors gebruiken om het karretje een zwarte lijn te laten volgen.
LED-strip[↑]
De LED-strip sluiten we aan op pin 12 van de Arduino.
Deze strip heet officieel ‘NeoPixel’. De strip hierboven heeft 8 LED’s die elk een eigen kleur kunnen krijgen.
Snoertje aan LED-strip bevestigen [↑]
Op de achterkant van de LED-strip staat twee keer ‘GND’. We gebruiken de onderste. Hierop komt de zwarte draad van het snoertje.
LED-strip aansluiten op pin 12 van de Arduino [↑]
LED-strip vastzetten met draadje [↑]
Hieronder zie je hoe de LED-strip wordt vastgezet. Het is handig als je eerst het snoertje aan de sensor bevestigd.
Het programma [↑]
Met het programma hieronder kunnen we de knoppen van de afstandsbediening hiervoor gebruiken:
Knop | Doet dit |
2 | Ga vooruit |
8 | Ga achteruit |
4 | Draai links |
6 | Draai rechts |
5 | STOP |
EQ | Koplampen AAN/UIT |
CH- | Mode Ultrasoon, het karretje rijdt vanzelf en ontwijkt objecten die in de weg staan. |
CH | Mode Lijnvolger, het karretje volgt een zwarte lijn. |
CH+ | Speel geluid |
>|| | Verander patroon van de LED-strip |
Bibliotheken [↑]
Zorg dat je deze libraries in de IDE hebt geladen:
- L298N
- IRremote
- Adafruit NeoPixel
De code [↑]
Kopieer de code hieronder en plak deze in de IDE op je laptop:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 |
// Versie 2024-04-23_1450 // Geschreven door Chris Dorna, met dank aan Paul van Deelen die me hielp // bij het oplossen van het probleem dat de rechter motor niet meer bestuurd // kon worden als de bibliotheek IRremote werd gebruikt. #include <L298N.h> // We gebruiken de library L298N voor de motordriver // Dit programma is getest met versie 2.0.3 van deze bibliotheek #include <IRremote.hpp> // We gebruiken de library IRremote voor de afstandsbediening // Dit programma is getest met versie 4.3.0 van deze bibliotheek unsigned long ontvangenCode; // Variabele om code uit afstandsbediening in op te slaan int gemetenAfstand = 0; // Wordt gebruikt om de afstand in op te slaan unsigned long tijdGestopt = 0; #include <Adafruit_NeoPixel.h> // Bibliotheek voor aansturen LED-strip // Dit programma is getest met versie 1.12.0 van deze bibliotheek Adafruit_NeoPixel ledstrip = Adafruit_NeoPixel(8, 12); // 8 pixels op pin 12 unsigned long huidigeMillis = 0; // Om huidige tijd op te slaan unsigned long vorigeMillisLedstrip = 0; // Om laatste tijd op te slaan dat de LED werd bijgewerkt int ledstripHuidigePixel = 0; // Houdt bij welke pixel momenteel is bijgewerkt int ledstripPatroon = 1; int ledstripErbijEraf = 1; //Gebruiken we in patroon 2 const int pinLampRechts = 6; // Nummer van de pin waarop de koplamp rechts is aangesloten const int pinLampLinks = 7; // Nummer van de pin waarop de koplamp links is aangesloten const int pinZoemer = 8; // Nummer van de pin waarop de zoemer is aangesloten const int pinSensorLinks = 14; // Pinnen van de lijnsensors const int pinSensorRechts = 15; // const int pinTrigger = 16; // Pinnen Ultrasoonsensor const int pinEcho = 17; // // Maak L298N-objecten voor de motoren L298N motorRechts(5, 4, 3); // ENA, IN1, IN2 L298N motorLinks(9, 10, 11); // ENB, IN3, IN4 boolean modeUltrasoon = false; // Gebruik mode 'Ultrasoon' boolean modeLijnvolger = false; // Gebruik mode 'Lijnvolger' int basissnelheidLinks; // Omdat de motoren niet allemaal even snel draaien int basissnelheidRechts; // slaan we de basissnelheid op in deze variabelen int snelheidLinks; // Variabelen om actuele snelheid van de motoren in int snelheidRechts; // op te slaan const int vooruit = 1; const int linksaf = 2; const int rechtsaf = 3; const int achteruit = 4; const int stop = 5; int huidigeRichting; int gekozenRichting; void setup() { pinMode(13, OUTPUT); // LED op de Arduino pinMode(pinLampRechts, OUTPUT); pinMode(pinLampLinks, OUTPUT); Serial.begin(9600); // Hiermee kunnen we informatie van de Arduino naar de laptop sturen. // Dit is handig om fouten in het programma op te sporen Serial.println("Communicatie tussen Arduino en Serial Monitor van IDE gestart"); IrReceiver.begin(2); // Start IR-ontvanger (aangesloten op pin 2) digitalWrite(pinLampRechts, HIGH); // Koplamp Rechts AAN digitalWrite(pinLampLinks, HIGH); // Koplamp Links AAN pinMode(pinEcho, INPUT); pinMode(pinTrigger, OUTPUT); basissnelheidLinks = 125; // Pas één van deze twee aan als een van de motoren basissnelheidRechts = 125; // sneller draait als de andere. De maximumsnelheid is 255. snelheidLinks = basissnelheidLinks; snelheidRechts = basissnelheidRechts; motorLinks.setSpeed(snelheidLinks); motorRechts.setSpeed(snelheidRechts); ledstrip.begin(); } void loop() { huidigeMillis = millis(); if (IrReceiver.decode()) { // Kijken of we een IR-signaal hebben ontvangen ontvangenCode = IrReceiver.decodedIRData.decodedRawData; Serial.println("--------------------"); // Stuur informatie naar de laptop, Serial.print("DEC: "); // dit werkt alleen als de USB-kabel is aangesloten Serial.println(ontvangenCode); // if (ontvangenCode != 0) { // != betekent NIET gelijk switch (ontvangenCode) { case 3125149440: // Knop CH- [ULTRASOON] Serial.println("*** Knop CH- ***"); modeUltrasoon = true; // Stand 'Ultrasoon' modeLijnvolger = false; break; case 3108437760: // Knop CH [LIJNVOLGER] Serial.println("*** Knop CH ***"); modeLijnvolger = true; // Hiermee zet je de robot in de stand 'Lijnvolger' modeUltrasoon = false; break; case 3091726080: // Knop CH+ [Geluid afspelen] Serial.println("*** Knop CH+ ***"); functieSpeelToon(pinZoemer, 500, 100); // 500 Hz 100 ms functieSpeelToon(pinZoemer, 750, 100); // 750 Hz 100 ms functieSpeelToon(pinZoemer, 1000, 100); // 500 Hz 100 ms functieSpeelToon(pinZoemer, 1250, 100); // 750 Hz 100 ms break; case 4077715200: // Knop 1 Serial.println("*** Knop 1 ***"); break; case 3877175040: // Knop 2 [VOORUIT] Serial.println("*** Knop 2 [VOORUIT] ***"); modeUltrasoon = false; modeLijnvolger = false; gekozenRichting = vooruit; break; case 2707357440: // Knop 3 Serial.println("*** Knop 3 ***"); break; case 4144561920: // Knop 4 [LINKS] Serial.println("*** Knop 4 [LINKS] ***"); modeUltrasoon = false; modeLijnvolger = false; gekozenRichting = linksaf; break; case 3810328320: // Knop 5 [STOP en RESET] Serial.println("*** Knop 5 [STOP en RESET] ***"); modeUltrasoon = false; modeLijnvolger = false; motorLinks.stop(); // stop motorRechts.stop(); // stop gekozenRichting = stop; snelheidLinks = basissnelheidLinks; // terug naar de basissnelheid snelheidRechts = basissnelheidRechts; break; case 2774204160: // Knop 6 [RECHTS] Serial.println("*** Knop 6 [RECHTS] ***"); modeUltrasoon = false; modeLijnvolger = false; gekozenRichting = rechtsaf; break; case 3175284480: //Knop 7 Serial.println("*** Knop 7 ***"); break; case 2907897600: //Knop 8 [ACHTERUIT] Serial.println("*** Knop 8 [ACHTERUIT] ***"); modeUltrasoon = false; modeLijnvolger = false; gekozenRichting = achteruit; break; case 3041591040: //Knop 9 Serial.println("*** Knop 9 ***"); break; case 3910598400: //knop 0 Serial.println("*** Knop 0 ***"); break; case 4127850240: // Knop EQ [LAMPEN AAN/UIT] Serial.println("*** Knop EQ ***"); // Als de koplampen AAN zijn, gaan ze UIT en andersom digitalWrite(pinLampRechts, !digitalRead(pinLampRechts)); digitalWrite(pinLampLinks, !digitalRead(pinLampLinks)); break; case 4161273600: // knop MIN [GA LANGZAMER] Serial.println("*** Knop MIN ***"); if (snelheidLinks > 25) { snelheidLinks = snelheidLinks - 25; motorLinks.setSpeed(snelheidLinks); motorRechts.setSpeed(snelheidRechts); // De nieuwe snelheid wordt pas gebruikt als je opnieuw een opdracht geeft motorLinks.forward(); motorRechts.forward(); } break; case 3927310080: // knop PLUS [GA SNELLER] Serial.println("*** Knop PLUS ***"); if (snelheidLinks < 225) { snelheidLinks = snelheidLinks + 25; snelheidRechts = snelheidRechts + 25; motorLinks.setSpeed(snelheidLinks); // Instellen snelheid motorRechts.setSpeed(snelheidRechts); // De nieuwe snelheid wordt pas gebruikt als je opnieuw een opdracht geeft motorLinks.forward(); motorRechts.forward(); } break; case 3158572800: // knop >|| [LEDSTRIP] Serial.println("*** knop >|| ***"); ledstripPatroon = ledstripPatroon + 1; if (ledstripPatroon > 3) { ledstripPatroon = 0; } Serial.print("Patroon: "); Serial.println(ledstripPatroon); break; } } // IrReceiver herstarten omdat deze was gestopt nadat er een code was ontvangen IrReceiver.resume(); } functieLedstrip(ledstripPatroon); // Laat gekozen patroon zien if (modeUltrasoon == true) { functieUltrasoon(); // Naar de mode 'Ultrasoon' } if (modeLijnvolger == true) { functieLijnvolger(); // Naar de mode 'Lijnvolger' } if (gekozenRichting != huidigeRichting) { switch (gekozenRichting) { case vooruit: motorLinks.forward(); // vooruit motorRechts.forward(); // vooruit break; case achteruit: motorLinks.backward(); // achteruit motorRechts.backward(); // achteruit break; case rechtsaf: motorLinks.forward(); // vooruit motorRechts.stop(); // stop break; case linksaf: motorLinks.stop(); // stop motorRechts.forward(); // vooruit break; case stop: motorLinks.stop(); // stop motorRechts.stop(); // stop } huidigeRichting = gekozenRichting; } } void functieUltrasoon() { // We beginnen met het meten we de afstand en zetten deze in // de variabele gemetenAfstand. gemetenAfstand = functieMeetAfstand(pinTrigger, pinEcho, 40); // Maximale afstand = 40 if (gemetenAfstand > 0 && gemetenAfstand < 10) { // Obstakel gedetecteerd op minder dan 10 cm afstand functieSpeelToon(pinZoemer, 1000, 500); // Laat een toon horen (1000 Hz, 500 ms) digitalWrite(13, HIGH); // LED op Arduino AAN motorLinks.stop(); // motor eerst stoppen vóór je richting omkeert motorRechts.stop(); // motor eerst stoppen vóór je richting omkeert motorLinks.backward(); // achteruit motorRechts.backward(); // achteruit delay(500); motorLinks.stop(); delay(500); motorRechts.stop(); } else { // Geen obstakel binnen 40 cm digitalWrite(13, LOW); // LED op Arduino UIT motorLinks.forward(); // vooruit motorRechts.forward(); // vooruit } } void functieLijnvolger() { if (huidigeMillis - tijdGestopt > 500) { // Als er is gestopt wachten we een halve seconde vóór // opnieuw wordt gekeken of er een obstakel is gemetenAfstand = functieMeetAfstand(pinTrigger, pinEcho, 40); if (gemetenAfstand > 0 && gemetenAfstand < 10) { motorLinks.stop(); motorRechts.stop(); gekozenRichting = stop; tijdGestopt = huidigeMillis; digitalWrite(13, HIGH); // LED op Arduino AAN functieSpeelToon(pinZoemer, 250, 50); // Laat een toon horen (250 Hz, 50 ms) } else { digitalWrite(13, LOW); // LED op Arduino UIT bool sensorLinks = digitalRead(pinSensorLinks); bool sensorRechts = digitalRead(pinSensorRechts); if ((sensorLinks == false) && (sensorRechts == false)) { // Beide sensors zien zwart (ga rechtdoor) gekozenRichting = vooruit; } else if ((sensorLinks == true) && (sensorRechts == true)) { // Beide sensors zien wit (ga achteruit) gekozenRichting = achteruit; } else if ((sensorLinks == true) && (sensorRechts == false)) { // Links ziet geen zwarte lijn (ga naar rechts) gekozenRichting = rechtsaf; } else if ((sensorLinks == false && sensorRechts == true)) { // Rechts ziet geen zwarte lijn (ga naar links) gekozenRichting = linksaf; } } } } void functieLedstrip(int patroon) { if (huidigeMillis - vorigeMillisLedstrip >= 100) { // 100 milliseconde is de snelheid van de LED's vorigeMillisLedstrip = huidigeMillis; // Sla de laatste update tijd op // Hieronder stel je bij ledstrip.Color met de laatste drie getallen de kleur in // (rood, groen, blauw) // Deze kan je een waarde geven tussen 0 en 255 // Er zitten 8 ledstrip op de strip, deze hebben in het programma de nummers // 0, 1, 2, 3, 4, 5, 6, 7 switch (patroon) { // Hier worden de verschillende patronen klaargezet, maar nog niet getoond case 0: // Alle LED's uit ledstrip.clear(); break; case 1: // Opbouwende rode lichtbalk ledstrip.setPixelColor(ledstripHuidigePixel, ledstrip.Color(100, 0, 0)); ledstripHuidigePixel = ledstripHuidigePixel + 1; if (ledstripHuidigePixel >= 9) { ledstripHuidigePixel = 0; // Begin opnieuw bij de eerste pixel ledstrip.clear(); // Zet alle pixels uit } break; case 2: // Heen en weer lopende blauwe led ledstrip.clear(); // Zet alle pixels uit ledstrip.setPixelColor(ledstripHuidigePixel, ledstrip.Color(0, 0, 255)); ledstripHuidigePixel = ledstripHuidigePixel + ledstripErbijEraf; if (ledstripHuidigePixel > 7) { ledstripErbijEraf = -1; } if (ledstripHuidigePixel < 0) { ledstripErbijEraf = 1; } break; case 3: // Groene leds van binnen naar buiten if (ledstripHuidigePixel == 1) { ledstrip.setPixelColor(3, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(4, ledstrip.Color(0, 50, 0)); } if (ledstripHuidigePixel == 2) { ledstrip.setPixelColor(2, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(5, ledstrip.Color(0, 50, 0)); } if (ledstripHuidigePixel == 3) { ledstrip.setPixelColor(1, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(6, ledstrip.Color(0, 50, 0)); } if (ledstripHuidigePixel == 4) { ledstrip.setPixelColor(0, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(7, ledstrip.Color(0, 50, 0)); } ledstrip.show(); ledstripHuidigePixel = ledstripHuidigePixel + 1; if (ledstripHuidigePixel >= 8) { ledstripHuidigePixel = 0; // Begin opnieuw bij de eerste pixel ledstrip.clear(); // Zet alle pixels uit } break; } ledstrip.show(); // Laat het patroon zien } } int functieMeetAfstand(int pinTrigger, int pinEcho, int maxAfstand) { // Deze functie bepaalt de afstand tussen de ultrasoonsensor en een // obstakel. In de Codewerkplaats gaan we niet uitleggen hoe dit // werkt en het advies is om niet te gaan sleutelen aan deze code. // Bereken de maximale wachttijd op basis van de maximale afstand unsigned long maxDuur = (maxAfstand * 2 * 1000000L) / 34300; // in microseconden // Zorg dat de triggerPin laag is en wacht voor stabiliteit digitalWrite(pinTrigger, LOW); delayMicroseconds(2); // Genereer een korte ultrasone puls digitalWrite(pinTrigger, HIGH); delayMicroseconds(10); // Ultrasone puls duurt 10 microseconden digitalWrite(pinTrigger, LOW); // Meet de duur van de teruggekeerde echo pulse met een time-out op basis van de maximale afstand long duur = pulseIn(pinEcho, HIGH, maxDuur); if (duur == 0) { // Als er geen echo is gedetecteerd binnen de time-out, geef -1 terug return -1; } // Bereken de afstand gebaseerd op de duur van de echo int afstand = duur * 0.0343 / 2; return afstand; // Geef de gemeten afstand terug } void functieSpeelToon(uint8_t pin, unsigned long frequentie, unsigned int duur) { // Deze functie is gebaseerd op de bibliotheek TimerFreeTone van Tim Eckel // (https://bitbucket.org/teckel12/arduino-timer-free-tone/wiki/Home) // Samen met ChatGPT is de code aangepast voor de Codewerkplaats // In de Codewerkplaats gaan we niet uitleggen hoe dit werkt en het advies // is om niet te gaan sleutelen aan deze code frequentie = 500000 / frequentie; // Bereken de helft van de periode van de vierkante golf (in microseconden). // Zet pin in uitgangsmodus. uint8_t pinBit = digitalPinToBitMask(pin); volatile uint8_t *pinOutput = (uint8_t *)portOutputRegister(digitalPinToPort(pin)); *(uint8_t *)portModeRegister(digitalPinToPort(pin)) |= pinBit; uint32_t startTime = millis(); // Begintijd van de noot. while (millis() - startTime < duur) { // Lus voor de duur. *pinOutput |= pinBit; // Zet pin hoog. delayMicroseconds(frequentie); // Duur van vierkante golf (hoe lang de pin hoog blijven). *pinOutput &= ~pinBit; // Zet pin laag. delayMicroseconds(frequentie); // Duur van vierkante golf (hoe lang de pin laag blijven). } } |
functieLedstrip
Vanuit het hoofdprogramma loop() wordt functieLedstrip aangeroepen. Dat ziet in de buurt van regel 211 zo uit:
211 |
functieLedstrip(ledstripPatroon); // Laat gekozen patroon zien |
Met de parameter ledstripPatroon geef je aan de functie door welk patroon je wilt zien.
De waarde van ledstripPatroon wordt ingesteld met de toets [>||] op de afstandsbediening. In de buurt van regel 195 staat daarvoor deze code:
195 196 197 198 199 200 201 202 203 |
case 3158572800: // knop >|| [LEDSTRIP] Serial.println("*** knop >|| ***"); ledstripPatroon = ledstripPatroon + 1; if (ledstripPatroon > 3) { ledstripPatroon = 0; } Serial.print("Patroon: "); Serial.println(ledstripPatroon); break; |
De opdract Serial.println() stuurt gegevens naar de Arduino IDE en gebruiken we bijvoorbeeld voor het zoeken van fouten.
De functie ziet er dan zo uit:
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 |
void functieLedstrip(int patroon) { huidigeMillis = millis(); // Hebben we nodig om tijd vast te leggen if (huidigeMillis - vorigeMillis >= 100) { // 100 milliseconde vorigeMillis = huidigeMillis; // Sla de laatste update tijd op // Hieronder stel je bij ledstrip.Color met de laatste drie getallen de kleur in // (rood, groen, blauw) // Deze kan je een waarde geven tussen 0 en 255 // Er zitten 8 ledstrip op de strip, deze hebben in het programma de nummers // 0, 1, 2, 3, 4, 5, 6, 7 switch (patroon) { // Hier worden de verschillende patronen klaargezet, maar nog niet getoond case 0: // Alle LED's uit ledstrip.clear(); break; case 1: // Opbouwende lichtbalk ledstrip.setPixelColor(currentPixel, ledstrip.Color(100, 0, 0)); currentPixel = currentPixel + 1; if (currentPixel >= 9) { currentPixel = 0; // Begin opnieuw bij de eerste pixel ledstrip.clear(); // Zet alle pixels uit } break; case 2: // Lopende led ledstrip.clear(); // Zet alle pixels uit ledstrip.setPixelColor(currentPixel, ledstrip.Color(100, 0, 0)); currentPixel = currentPixel + 1; if (currentPixel >= 9) { currentPixel = 0; // Begin opnieuw bij de eerste pixel } break; case 3: // Van binnen naar buiten if (currentPixel == 1) { ledstrip.setPixelColor(3, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(4, ledstrip.Color(0, 50, 0)); } if (currentPixel == 2) { ledstrip.setPixelColor(2, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(5, ledstrip.Color(0, 50, 0)); } if (currentPixel == 3) { ledstrip.setPixelColor(1, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(6, ledstrip.Color(0, 50, 0)); } if (currentPixel == 4) { ledstrip.setPixelColor(0, ledstrip.Color(0, 50, 0)); ledstrip.setPixelColor(7, ledstrip.Color(0, 50, 0)); } ledstrip.show(); currentPixel = currentPixel + 1; if (currentPixel >= 8) { currentPixel = 0; // Begin opnieuw bij de eerste pixel ledstrip.clear(); // Zet alle pixels uit } break; } ledstrip.show(); // Laat het patroon zien } } |
Instellen kleuren
Ieder LED van de strip kan je een kleur geven. We doen dit met waardes voor Rood, Groen en Blauw.
In de opdracht ledstrip.Color(0, 50, 0) geven we drie waardes mee.
- De eerste waarde geeft aan hoe ROOD de LED wordt
- De tweede waarde hoe GROEN
- De derde waarde hoe BLAUW
Je kan getallen van 0 tot 255 gebruiken en de kleuren ook mengen.
Hieronder een paar voorbeelden:
ledstrip.Color(255, 0, 0) | Rood | |
ledstrip.Color(0, 255, 0) | Groen | |
ledstrip.Color(0, 0, 255) | Blauw | |
ledstrip.Color(255, 255, 0) | Geel | |
ledstrip.Color(255, 0, 255) | Violet | |
ledstrip.Color(0, 255, 255) |
Cyaan | |
ledstrip.Color(255, 255, 255) | Wit | |
ledstrip.Color(0, 0, 0) |
Zwart |
Eerst klaarzetten en dan pas tonen: ledstrip.show()
De kleur die je instelt met ledstrip.Color zie je niet meteen, maar pas als je de opdracht ledstrip.show() hebt gegeven.
ledstrip.clear()
Met ledstrip.clear() wis je alle kleuren van de de LED-strip, maar dit zie je pas na een opdracht ledstrip.show().
We tellen van 0 tot 7
Met de opdracht ledstrip.setPixelColor(3, ledstrip.Color(0, 50, 0)); zetten we een lichtgroene kleur voor de LED met nummer 3. De telling van de LED’s begint echter met 0 (nul). De eerste led heeft dus nummer 0, de tweede nummer 1 enzovoort. LED 3 is dus de vierde LED op de strip.
Bij het aanroepen van functieSpeelToon geven we drie getallen mee:
- Het eerste getal geeft aan op welke pin de luidspreker is aangesloten. Eerder hebben we een variabele pinZoemer gemaakt en deze de waarde 8 gegeven.
- Het tweede getal is de hoogte van de toon in Hertz.
- Het derde getal geeft aan hoeveel milliseconden de toon moet duren.
Lijnvolger
Met de de toets CH zetten we de mode Lijnvolger aan. In het hoofdprogramma loop() ziet dat er in de buurt van regel 91 zo uit:
91 92 93 94 95 |
case 3108437760: // Knop CH [LIJNVOLGER] Serial.println("*** Knop CH ***"); modeLijnvolger = true; // Hiermee zet je de robot in de stand 'Lijnvolger' modeUltrasoon = false; break; |
Op het einde van het hoofdprogramma loop() staat dan deze code om naar functieLijnvolger() te gaan:
216 217 218 |
if (modeLijnvolger == true) { functieLijnvolger(); // Naar de mode 'Lijnvolger' } |
Dit is de functie functieLijnvolger(). Deze kijkt of de lijnsensors onder het karretje zwart of wit waarnemen en schakelt de motoren aan en uit.
In de functie gebruiken we ook nog de functie functieMeetAfstand(). Hiermee kunnen we ervoor zorgen dat het karretje stopt als er een obstakel is.
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
void functieLijnvolger() { if ((digitalRead(pinSensorLinks) == LOW) && (digitalRead(pinSensorRechts) == LOW)) { Serial.println("RECHTDOOR"); // Beide sensors zien zwart (ga rechtdoor) gemetenAfstand = functieMeetAfstand(16, 17, 40); // Maar we kijken wel eerst of er niets // in de weg staat. In de functie // functieMeetAfstand() staat hoe dit werkt. if (gemetenAfstand > 0 && gemetenAfstand < 10) { motorLinks.stop(); // stop motorRechts.stop(); // stop functieSpeelToon(pinZoemer, 1000, 200); // Laat een toon horen (1000 Hz, 200 ms) } else { motorLinks.forward(); // vooruit motorRechts.forward(); // vooruit } } else if ((digitalRead(pinSensorLinks) == HIGH) && (digitalRead(pinSensorRechts) == HIGH)) { Serial.println("ACHTERUIT"); //Beide sensors zien wit (ga achteruit) motorLinks.backward(); // achteruit motorRechts.backward(); // achteruit } else if (digitalRead(pinSensorLinks) == HIGH) { Serial.println("NAAR RECHTS"); // Links ziet geen zwarte lijn (ga naar rechts) motorLinks.forward(); // vooruit motorRechts.stop(); // stop } else if (digitalRead(pinSensorRechts) == HIGH) { Serial.println("NAAR LINKS"); //Rechts ziet geen zwarte lijn (ga naar links) motorLinks.stop(); // stop motorRechts.forward(); // vooruit } } |
Welke lijn?
Hieronder zie je het karretje in actie. De lijn is gemaakt van stroken zwart karton van 3 cm breed.
De stroken zijn met stukjes schilderstape op de vloer vastgezet:
Maak de hoeken niet te scherp!
Als de hoeken te scherp zijn dan kan het karretje de bocht niet maken of moet deze heel vaak heen en weer steken om verder te kunnen.
Link naar de website [↑]
Colofon [↑]
Huis73 | maakte het mogelijk om deze lessen te schrijven en organiseert de lessen. | |
Digitaal Atelier | had de spullen voor het lasersnijden en 3d-printen van de onderdelen en is ook nog eens een hartstikke leuke ruimte waar iedereen hartstikke leuke dingen kan doen. | |
Stichting Leaphy | was de eerste die in Nederland op grote schaal Arduino-robotkarretjes beschikbaar stelde en ook nog eens de programmeeromgeving Leaphy Easybloqs ontwikkelde en voor iedereen beschikbaar stelt. | |
CodeKids | bedacht de lessen, ontwikkelde een eigen (goedkoper) karretje en verzorgt de lessen. | |
Iedereen mag materiaal uit deze lessen (her)gebruiken als daarbij de bron (www.codekids.nl) wordt vermeld. |