Les 26/31: Slimme auto deel 4: Obstakels vermijden met behulp van ultrasone sensor | SunFounder Robojax
In deze les upgraden we je slimme auto met de mogelijkheid om zijn omgeving te zien en erop te reageren met behulp van een ultrasone sensor. Door de afstand tot objecten ervoor te meten, kan de auto intelligente beslissingen nemen: hij rijdt vooruit wanneer het pad vrij is, stopt wanneer een object zich in een waarschuwingszone bevindt, en rijdt achteruit wanneer een obstakel te dichtbij komt. Dit project bouwt voort op de kernprincipes van motorregeling en sensoren die je al hebt geleerd, wat resulteert in een echt autonoom voertuig.
Dit is niet zomaar een speeltje; het is een fundamentele stap richting het bouwen van complexere robotica-projecten. De logica die je hier implementeert—waarnemen, denken, handelen—is dezelfde die wordt gebruikt in alles, van robotische stofzuigers tot industriële automatisering. Hier zijn een paar ideeën om je eigen builds te inspireren:
- Autonome Rover: Maak een robot die een kamer of gang kan verkennen zonder tegen muren of meubels te botsen.
- Nabijheidsalarmsysteem: Monteer de ultrasone sensor op een servo om een gebied te scannen en een alarm of licht te activeren wanneer een indringer een gedefinieerde zone betreedt.
- Slimme parkeerassistent: Bouw een systeem dat afstandsmetingen gebruikt om een voertuig in een krappe ruimte te begeleiden, met visuele of hoorbare feedback.
Deze handleiding is gebaseerd op de SunFounder 3-in-1 Arduino-kit en het project "Play with Ultrasonic Module". We doorlopen de bedrading, leggen de besluitvormingscode uit en demonstreren de auto in actie.
Hoe de obstakelvermijdingslogica werkt
De kern van dit project is een eenvoudige maar krachtige beslisboom. De ultrasone sensor meet voortdurend de afstand tot het object direct ervoor. Deze afstandswaarde wordt vervolgens gebruikt om de motoren van de auto aan te sturen, zoals weergegeven in het onderstaande diagram.
- Als afstand > 25 cm: Het pad is vrij, dus de auto rijdt vooruit.
- Als 10 cm < afstand <= 25 cm: Er wordt een object gedetecteerd in een "waarschuwingszone", dus de auto stopt om een botsing te voorkomen.
- Als 2 cm < afstand <= 10 cm: Een object is gevaarlijk dichtbij. De auto rijdt achteruit om meer ruimte te creëren.
- Als afstand <= 2 cm: De meting is waarschijnlijk een fout (te dichtbij om nauwkeurig te meten), dus de auto stopt als veiligheidsmaatregel.
Hardwarecomponenten
Om dit project te bouwen heb je de volgende componenten nodig, die allemaal zijn inbegrepen in de SunFounder 3-in-1-kit.
- 1x Arduino Uno (of compatibel bord)
- 1x Smart Car-chassis met twee getande motoren
- 1x L298N-motorstuurmodule
- 1x HC-SR04 ultrasone afstandssensor
- 1x breadboard
- Jumperdraden
- Voeding voor de auto (bijv. batterijpakket)
Bedradingshandleiding
De bedrading verbindt de motorstuurmodule, de ultrasone sensor en de Arduino. De motorstuurmodule regelt de wielen van de auto, terwijl de ultrasone sensor fungeert als zijn "ogen".
Hier is het verbindingsdiagram uit de SunFounder-documentatie:
Laten we de verbindingen opsplitsen. Voed eerst de positieve en negatieve rails van het breadboard vanaf de 5V- en GND-pinnen van de Arduino. De ultrasone sensor wordt vervolgens als volgt aangesloten:
- VCC (voeding): Verbonden met de positieve rail op het breadboard.
- GND (aarde): Verbonden met de negatieve rail op het breadboard.
- Trig (trigger): Verbonden met digitale pin 3 op de Arduino. Deze pin verzendt de ultrasone puls.
- Echo (ontvangst): Verbonden met digitale pin 4 op de Arduino. Deze pin ontvangt de gereflecteerde puls.
De verbindingen van de motorstuurmodule zijn hetzelfde als in eerdere lessen. De vier stuurpinnen (IN1, IN2, IN3, IN4) zijn verbonden met de digitale pinnen 5, 6, 9 en 10 van de Arduino. Deze pinnen regelen de snelheid en richting van de twee motoren. Zorg ervoor dat de voeding en aarde van de motorstuurmodule correct zijn verbonden met het batterijpakket en de aarde van de Arduino. (in video op 02:24)
Uitleg van de code
De code voor dit project regelt het gedrag van de auto op basis van de afstandsmeting van de ultrasone sensor. De logica is eenvoudig en gemakkelijk aan te passen. Laten we kijken naar de belangrijkste, door de gebruiker configureerbare onderdelen.
1. Pindefinities
Bovenaan de schets worden de pinnen voor de motoren en de ultrasone sensor gedefinieerd. Je kunt deze wijzigen als je je componenten op andere Arduino-pinnen hebt aangesloten.
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int trigPin = 3;
const int echoPin = 4;
Hier regelen A_1A, A_1B, B_1A en B_1B de linker- en rechtermotor via de L298N-stuurmodule. trigPin en echoPin zijn voor de ultrasone sensor.
2. Gedragsvariabelen en logica
Het hoofdgedrag wordt geregeld binnen de loop()-functie. Dit is waar je de "persoonlijkheid" van de auto kunt aanpassen.
void loop() {
float afstand = leesSensorData();
if (afstand > 25) {
beweegVooruit(200);
}
else if (afstand < 10 && afstand > 2) {
beweegAchteruit(200);
} else {
stopBeweging();
}
}
Hier lees je hoe je het kunt aanpassen:
- Afstandsdrempels: De getallen
25en10bepalen de "veilige" en "gevaarlijke" zones in centimeters. Verhoog25om de auto eerder te laten stoppen, of verlaag het om dichter bij obstakels te laten komen. De2is een veiligheidsmarge om foutieve metingen van objecten die te dichtbij zijn te negeren. - Motorsnelheid: De
200die wordt doorgegeven aanbeweegVooruit()enbeweegAchteruit()stelt de snelheid van de auto in. Deze waarde kan variëren van 0 tot 255. Een lagere waarde, zoals 150, zorgt ervoor dat de auto langzamer en voorzichtiger beweegt.
De rest van de code bestaat uit de functie leesSensorData(), die de timing van de ultrasone sensor afhandelt om de afstand te berekenen, en de functies beweegVooruit(), beweegAchteruit() en stopBeweging(), die de motordriver aansturen om de gewenste actie uit te voeren.
Een veelvoorkomende fout oplossen
Je kunt een fout tegenkomen zoals 'beweegVooruit' was not declared in this scope. Dit gebeurt omdat de Arduino IDE de code van boven naar beneden leest. Wanneer het bij de functie loop() aankomt, weet het nog niet welke functies eronder zijn gedefinieerd. Om dit op te lossen, moet je "function prototypes" toevoegen vóór de functie setup(). Dit zijn simpelweg declaraties van de naam en het retourtype van de functie, eindigend met een puntkomma.
void beweegVooruit(int snelheid);
void beweegAchteruit(int snelheid);
void stopBeweging();
float leesSensorData();
Deze regels toevoegen vertelt de compiler: "Deze functies bestaan en worden later gedefinieerd," wat de fout oplost. (in video op 09:21)
De stabiliteit van de sensor verbeteren
Tijdens het testen merk je misschien dat de auto stopt of stottert, zelfs wanneer het pad vrij is. Dit komt vaak doordat de loop te snel draait en de ultrasone sensor niet genoeg tijd heeft om het echog signaal te ontvangen, wat resulteert in een meting van 0 cm. Om dit op te lossen, voeg je een kleine vertraging toe aan het einde van de functie loop() om de sensor de tijd te geven om te werken.
void loop() {
float afstand = leesSensorData();
if (afstand > 25) {
beweegVooruit(200);
}
else if (afstand < 10 && afstand > 2) {
beweegAchteruit(200);
} else {
stopBeweging();
}
delay(100); // Voeg een vertraging van 100 ms toe voor stabiele metingen
}
Een vertraging van 100 milliseconden is meestal voldoende om stabiele en consistente afstandsmetingen te krijgen. (in video op 10:56)
Live demonstratie van het project
Zodra de code is geüpload, open je de Seriële Monitor. Je ziet dan tekst die de staat van de auto aangeeft, zoals "Vooruit", "Achteruit" of "Stop".
In de demonstratie wordt de auto voor een obstakel geplaatst. Wanneer het obstakel meer dan 25 cm verwijderd is, rijdt de auto vooruit. Als je je hand dichterbij beweegt, stopt de auto wanneer de afstand onder de 25 cm zakt. Als je je hand heel dichtbij brengt, binnen 10 cm, zal de auto achteruitrijden. Dit gedrag is duidelijk zichtbaar in de video en bevestigt dat de obstakelvermijdingslogica correct werkt. (in video op 11:53)
Conclusie
Gefeliciteerd! Je hebt met succes een slimme auto gebouwd die zijn omgeving kan verkennen en obstakels kan vermijden. Dit project combineert sensorinvoer, besluitvormingslogica en motorregeling in één functioneel systeem. Je hebt niet alleen geleerd hoe je een ultrasone sensor gebruikt, maar ook hoe je een eenvoudig regelalgoritme implementeert dat de basis vormt voor veel complexere autonome robots.
Hoofdstukken
- [00:00] Inleiding tot obstakelvermijding
- [01:16] Projectoverzicht en vereisten
- [02:24] Bedrading van de ultrasone sensor en motordriver
- [04:56] Het projectcode openen
- [05:12] Uitleg van de code: logica en functies
- [08:34] De code uploaden en eerste test
- [09:21] Problemen oplossen: function prototypes
- [10:56] Problemen oplossen: een vertraging toevoegen voor stabiliteit
- [11:53] Live demonstratie van obstakelvermijding
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int trigPin = 3;
const int echoPin = 4;
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//ultrasonic
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
}
void loop() {
float distance = readSensorData();
if (distance > 25) {
moveForward(200);
}
else if (distance < 10 && distance > 2) {
moveBackward(200);
} else {
stopMove();
}
}
float readSensorData() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
return distance;
}
void moveForward(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void moveBackward(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void stopMove() {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
Common Course Links
Common Course Files
Dingen die je misschien nodig hebt
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Hulpmiddelen en referenties
-
DocumentatieDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ExternPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Bestanden📁
Arduino-bibliotheken (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB