Robopost Les 4 – Testen & Fouten Oplossen

25 juni 2025

l

Yilmaz Tamer

Onderdeel van de lessenserie: RoboPost – Bouw je eigen slimme postmelder
Voor wie: MBO Techniek/ICT studenten (niveau 3/4)
Tijdsduur: ± 45 minuten

Aansluiting op eerdere lessen

In Les 1 bouwde je een schakeling met een Arduino, LEDs en breadboard. In Les 2 voegde je een knop en afstandssensor toe. Les 3 ging over het programmeren van logica met if-structuren en digitalRead().

In deze les leer je hoe je je systeem test en foutmeldingen opspoort. Ook breiden we het systeem uit met een derde sensor (Sensor 3), waarmee RoboPost automatisch op standby gaat na voltooiing van de cyclus.


Leerdoelen

Na deze les kun jij als student:

  • Problemen in een Arduino-schakeling herkennen
  • Veelvoorkomende fouten in code en hardware oplossen
  • Testmethodes toepassen om je schakeling stap voor stap te controleren
  • De seriële monitor gebruiken om je programma te debuggen
  • Een extra sensor toevoegen aan je bestaande systeem
  • Begrijpen hoe een systeem automatisch terugkeert naar beginstatus

Waarom werkt het niet?

Iedereen loopt vast bij techniek. Gelukkig leer je het meest van je fouten – als je weet hoe je ze opspoort en oplost. In deze les leer je hoe je slim test en fouten (bugs) opspoort, zowel in je schakeling als in je code.


Hardware controleren

Controleer bij problemen altijd eerst de hardware:Hardware controleren – checklist

  • Zijn alle componenten goed aangesloten?
  • Zitten alle jumper wires goed in het breadboard?
  • Gebruik je de juiste pinnen (zoals aangegeven in je code)?
  • Brandt het powerlampje op de Arduino?
  • Heb je geen + en – per ongeluk direct verbonden?

Testtip: haal tijdelijk je knop weg en zet digitalWrite(ledPin, HIGH); in je code om te zien of de LED werkt.


Veelvoorkomende fouten

  • LED doet niets: check of het lange pootje op + zit (anode)
  • Knop reageert niet: waarschijnlijk geen pull-down of fout in INPUT_PULLUP
  • Uploaden mislukt: verkeerde COM-poort of Arduino niet aangesloten
  • Alles lijkt goed, maar geen reactie: gebruik de seriële monitor!

Debuggen met de seriële monitor

Via de seriële monitor kun je live zien wat je Arduino “denkt”. Voeg dit toe aan je code:

Voeg in je setup() toe:

void setup() {
  Serial.begin(9600); // start communicatie
}

void loop() {
  Serial.println(digitalRead(knop)); // toont 1 of 0
}

Open de seriële monitor via: Hulpmiddelen > Seriële monitor
Zo zie je direct of de knop werkt en of je afstand goed wordt gemeten.

Uitbreiding schakeling: Sensor 3 (standby)

Sluit Sensor 3 aan op:

  • Trig → pin 2
  • Echo → A0
Toevoeging in de variabelenlijst:
const int trig3 = 2;
const int echo3 = A0;
Toevoeging in setup():
pinMode(trig3, OUTPUT);
pinMode(echo3, INPUT);
Toevoeging in loop() vóór de rest van de logica:
float d3 = meetAfstand(trig3, echo3);

// Als sensor 3 iets ziet → standby
if ((motorFwd || motorRev) && d3 > 0 && d3 <= 10) {
  setMotorVooruit(false);
  setMotorAchteruit(false);
  motorFwd = false;
  motorRev = false;
  ledsAan = false;
  timer = 0;
  standby = true;
  Serial.println(F("Sensor 3 actief → systeem in STANDBY"));
}

// Alleen herstarten als Sensor 1 opnieuw post ziet
if (standby && d1 > 0 && d1 <= drempel1) {
  standby = false;
  Serial.println(F("Nieuwe post → systeem opnieuw actief"));
}

// Pauzeer de loop als standby actief is
if (standby) return;

De rest van je loop() mag gewoon blijven zoals in Les 3

Mini-opdracht: test je eigen fout

  • Verwijder een draadje en kijk wat er in de seriële monitor gebeurt
  • Programmeer if (afstand1 <= 10) en bekijk of de LED reageert
  • Laat je systeem expres vastlopen en probeer het op te lossen

Reflectievragen

  • Welke fout kwam jij tegen? Hoe heb je die opgelost?
  • Hoe helpt de seriële monitor bij foutzoeken?
  • Wat doet Sensor 3 met de werking van het systeem?
  • Wat zou jij in een volgende versie van RoboPost verbeteren?

Noteer je antwoorden of bespreek ze met een klasgenoot

Volledige werkende code – RoboPost (3 sensoren)

Gebruik deze code als referentie bij het testen en oplossen van problemen. Alle onderdelen uit Les 1 t/m 4 zijn hierin geïntegreerd.


const int trig1 = 4, echo1 = 3;        // Sensor 1 – Postdetectie
const int trig2 = 12, echo2 = 11;      // Sensor 2 – Stoppositie motor vooruit
const int trig3 = 2, echo3 = A1;      // Sensor 3 – Standby-detectie

const int led1 = 9, led2 = 8;
const int knop = 7;

const int en1 = 5, in1 = 6, in2 = 10;  // H-brug motorpins

const int drempel1 = 20;
const int drempel2 = 10;
const int drempel3 = 10;

const unsigned long wachttijd = 8000;     // Wacht 10 sec voordat motor terugdraait
const unsigned long terugTijd = 2000;      // Duur van achteruit draaien
const unsigned long fwdTimeout = 8000;     // Failsafe voor vooruit draaien

bool ledsAan = false, motorFwd = false, motorRev = false, standby = false;
unsigned long timer = 0, motorFwdStart = 0;

void setup() {
  pinMode(trig1, OUTPUT);  pinMode(echo1, INPUT);
  pinMode(trig2, OUTPUT);  pinMode(echo2, INPUT);
  pinMode(trig3, OUTPUT);  pinMode(echo3, INPUT);

  pinMode(led1, OUTPUT);   pinMode(led2, OUTPUT);
  pinMode(knop, INPUT_PULLUP);

  pinMode(en1, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
  digitalWrite(en1, LOW);

  Serial.begin(9600);
}

void loop() {
  static unsigned long meetTijd = 0;
  if (millis() - meetTijd < 60) return;
  meetTijd = millis();

  float d1 = meetAfstand(trig1, echo1);
  float d2 = meetAfstand(trig2, echo2);
  float d3 = meetAfstand(trig3, echo3);

  // Sensor 3 actief → standby
  if ((motorFwd || motorRev) && d3 > 0 && d3 <= drempel3) {
    resetSysteem();
    standby = true;
    Serial.println(F("Sensor 3 → STANDBY"));
  }

  // Herstart alleen als Sensor 1 opnieuw post ziet
  if (standby && d1 > 0 && d1 <= drempel1) {
    standby = false;
    Serial.println(F("Nieuwe post → Actief"));
  }

  if (standby) return;

  if (d1 > 0 && d1 <= drempel1 && !motorFwd && !motorRev && !ledsAan) {
    digitalWrite(led1, HIGH); digitalWrite(led2, HIGH);
    ledsAan = true;
    Serial.println(F("Post gedetecteerd"));
  }

  if (digitalRead(knop) == LOW && ledsAan && !motorFwd) {
    digitalWrite(led1, LOW); digitalWrite(led2, LOW);
    ledsAan = false;
    motorFwd = true;
    motorFwdStart = millis();
    setMotorVooruit(true);
    Serial.println(F("Motor vooruit"));
  }

  if (motorFwd && d2 > 0 && d2 <= drempel2) {
    setMotorVooruit(false);
    motorFwd = false;
    timer = millis();
    Serial.println(F("Motor gestopt (Sensor 2)"));
  }

  if (motorFwd && millis() - motorFwdStart > fwdTimeout) {
    setMotorVooruit(false);
    motorFwd = false;
    timer = millis();
    Serial.println(F("Failsafe actief – motor vooruit gestopt"));
  }

  if (!motorFwd && !motorRev && timer && millis() - timer >= wachttijd) {
    motorRev = true;
    timer = millis();
    setMotorAchteruit(true);
    Serial.println(F("Motor achteruit"));
  }

  if (motorRev && millis() - timer >= terugTijd) {
    setMotorAchteruit(false);
    motorRev = false;
    timer = 0;
    Serial.println(F("Motor terug – cyclus afgerond"));
  }
}

float meetAfstand(int trig, int echo) {
  for (uint8_t i = 0; i < 3; i++) {
    digitalWrite(trig, LOW); delayMicroseconds(2);
    digitalWrite(trig, HIGH); delayMicroseconds(10);
    digitalWrite(trig, LOW);
    long us = pulseIn(echo, HIGH, 30000);
    if (us > 0) return us * 0.0343f / 2.0f;
  }
  return -1.0f;
}

void setMotorVooruit(bool aan) {
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(en1, aan ? HIGH : LOW);
}

void setMotorAchteruit(bool aan) {
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(en1, aan ? HIGH : LOW);
}

void resetSysteem() {
  digitalWrite(led1, LOW); digitalWrite(led2, LOW);
  setMotorVooruit(false);
  setMotorAchteruit(false);
  ledsAan = false; motorFwd = false; motorRev = false;
  timer = 0; motorFwdStart = 0;
}

RoboPost Les 5 – Sensoren & Postdetectie

Status: Onder constructie 🚧

In Les 5 gaan we dieper in op het verfijnen van je postdetectie met behulp van nauwkeurige afstanden, veilige failsafes en het verbeteren van je knoprespons met debouncen. Ook leer je hoe je millis() gebruikt in plaats van delay() om je systeem betrouwbaarder te maken.

Deze les is momenteel nog in ontwikkeling. Kom binnenkort terug om verder te bouwen aan je slimme RoboPost-systeem!

Geschreven door Yilmaz Tamer

Comments

0 reacties

Een reactie versturen

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *