Soek Kode

Les 26/31: Slimme Motor Deel 4: Vermy Hindernis Met Behulp van Ultrasoniese Sensor | SunFounder Robojax

Les 26/31: Slimme Motor Deel 4: Vermy Hindernis Met Behulp van Ultrasoniese Sensor | SunFounder Robojax

In hierdie les brei ons jou slim motor uit met die vermoë om sy omgewing te sien en daarop te reageer deur 'n ultrasoniese sensor te gebruik. Deur die afstand tot voorwerpe voor hom te meet, kan die motor intelligente besluite neem: dit sal vorentoe beweeg wanneer die pad oop is, stop wanneer 'n voorwerp binne 'n versigtigheidsone is, en terugry wanneer 'n obstruksie te naby kom. Hierdie projek bou voort op die kernmotorbestuur- en sensorgrondbeginsels wat jy reeds geleer het, wat 'n werklik outonome voertuig tot gevolg het.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

Dit is nie net 'n speelding nie; dit is 'n fundamentele stap in die rigting van die bou van meer komplekse robotikaprojekte. Die logika wat jy hier sal implementeer—voel, dink, doen—is dieselfde as wat gebruik word in alles van robotstofsuiers tot industriële outomatisering. Hier is 'n paar idees om jou eie bouprojekte te inspireer:

  • Outonome Rover: Skep 'n robot wat 'n kamer of gang kan verken sonder om teen mure of meubels te bots.
  • Nabyheidalarmstelsel: Monteer die ultrasoniese sensor op 'n servo om 'n area te skandeer en 'n alarm of lig te aktiveer wanneer 'n indringer 'n gedefinieerde sone binnegaan.
  • Slim Parkeerassistent: Bou 'n stelsel wat afstandslesings gebruik om 'n voertuig in 'n nou parkeerplek te lei, met visuele of hoorbare terugvoer.

Hierdie gids is gebaseer op die SunFounder 3-in-1 Arduino-stel en sy "Play with Ultrasonic Module"-projek. Ons sal deur die bedrading stap, die besluitnemingskode verduidelik, en die motor in aksie demonstreer.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

Hoe die Obstakelvermydingslogika Werk

Die kern van hierdie projek is 'n eenvoudige, maar kragtige, besluitnemingsboom. Die ultrasoniese sensor meet voortdurend die afstand tot die voorwerp direk voor hom. Hierdie afstandswaarde word dan gebruik om die motor se motors te beheer, soos in die diagram hieronder getoon.

  • As afstand > 25 cm: Die pad is oop, so die motor beweeg vorentoe.
  • As 10 cm < afstand <= 25 cm: 'n Voorwerp word in 'n "versigtigheidsone" bespeur, so die motor stop om 'n botsing te vermy.
  • As 2 cm < afstand <= 10 cm: 'n Voorwerp is gevaarlik naby. Die motor ry terug om meer ruimte te skep.
  • As afstand <= 2 cm: Die lesing is waarskynlik 'n fout (te naby om akkuraat te meet), so die motor stop as 'n veiligheidsmaatreël.

Hardeware-komponente

Om hierdie projek te bou, sal jy die volgende komponente nodig hê, wat alles in die SunFounder 3-in-1-stel ingesluit is.

  • 1x Arduino Uno (of versoenbare bord)
  • 1x Slimmotor-onderstel met twee ratmotors
  • 1x L298N-motorbestuurdermodule
  • 1x HC-SR04 Ultrasoniese Afstandsensor
  • 1x Broodbord
  • Springdrade
  • Kragtoevoer vir die motor (bv. batterypak)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

Bedradingsgids

Die bedrading verbind die motorbestuurder, die ultrasoniese sensor, en die Arduino. Die motorbestuurder beheer die motor se wiele, terwyl die ultrasoniese sensor as sy "oë" optree.

Hier is die verbindingsdiagram uit die SunFounder-dokumentasie:

Kom ons breek die verbindings af. Eerstens, voorsien krag aan die broodbord se positiewe en negatiewe spore vanaf die Arduino se 5V- en GND-penne. Die ultrasoniese sensor word dan soos volg verbind:

  • VCC (Krag): Verbind aan die positiewe spoor op die broodbord.
  • GND (Grond): Verbind aan die negatiewe spoor op die broodbord.
  • Trig (Sneller): Verbind aan digitale pen 3 op die Arduino. Hierdie pen stuur die ultrasoniese puls.
  • Echo (Ontvang): Verbind aan digitale pen 4 op die Arduino. Hierdie pen ontvang die weerkaatste puls.

Die motorbestuurderverbindings is dieselfde as in vorige lesse. Die vier beheerpenne (IN1, IN2, IN3, IN4) is verbind aan die Arduino se digitale penne 5, 6, 9, en 10. Hierdie penne beheer die spoed en rigting van die twee motors. Maak seker dat die motorbestuurder se krag en grond behoorlik aan die batterypak en die Arduino se grond verbind is. (in video by 02:24)

Kodeverduideliking

Die kode vir hierdie projek beheer die motor se gedrag gebaseer op die afstandslesing van die ultrasoniese sensor. Die logika is eenvoudig en maklik om aan te pas. Kom ons kyk na die sleutel, gebruikerskonfigureerbare dele.

1. Pen-definisies

Boonop in die skets word die penne vir die motors en die ultrasoniese sensor gedefinieer. Jy kan dit verander as jy jou komponente aan verskillende Arduino-penne gekoppel het.

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 beheer A_1A, A_1B, B_1A, en B_1B die linker- en regtermotors via die L298N-bestuurder. trigPin en echoPin is vir die ultrasoniese sensor.

2. Gedragsvariabeles en -logika

Die hoofgedrag word binne die loop()-funksie beheer. Dit is waar jy die motor se "persoonlikheid" kan aanpas.

void loop() {
    float afstand = leesSensorData();
    if (afstand > 25) {
      beweegVorentoe(200);
    }
    else if (afstand < 10 && afstand > 2) {
      beweegAgtertoe(200);
    } else {
      stopBeweging();
    }
  }

Hier is hoe om dit aan te pas:

  • Afstanddrempels: Die getalle 25 en 10 definieer die "veilige" en "gevaar" sones in sentimeters. Verhoog 25 om die motor vroeër te laat stop, of verlaag dit om dit nader aan hindernisse te laat kom. Die 2 is 'n veiligheidsmarge om foutiewe lesings van voorwerpe wat te naby is, te ignoreer.
  • Motorspoed: Die 200 wat aan beweegVorentoe() en beweegAgtertoe() deurgegee word, stel die motor se spoed. Hierdie waarde kan wissel van 0 tot 255. 'n Laer waarde, soos 150, sal die motor stadiger en meer versigtig laat beweeg.

Die res van die kode bestaan uit die leesSensorData()-funksie, wat die ultrasoniese sensor se tydsberekening hanteer om afstand te bereken, en die beweegVorentoe(), beweegAgtertoe(), en stopBeweging()-funksies, wat die motorbestuurder beheer om die gewenste aksie uit te voer.

Hantering van 'n Algemene Fout

Jy mag dalk 'n fout teëkom soos 'beweegVorentoe' was not declared in this scope. Dit gebeur omdat die Arduino IDE die kode van bo na onder lees. Wanneer dit by die loop()-funksie kom, weet dit nog nie van die funksies wat daaronder gedefinieer is nie. Om dit reg te stel, moet jy "funksieprototipes" voor die setup()-funksie byvoeg. Dit is bloot verklarings van die funksie se naam en terugkeertipe, wat met 'n kommapunt eindig.

void beweegVorentoe(int spoed);
  void beweegAgtertoe(int spoed);
  void stopBeweging();
  float leesSensorData();

Deur hierdie reëls by te voeg, sê dit vir die samesteller: "Hierdie funksies bestaan en sal later gedefinieer word," wat die fout oplos. (in video by 09:21)

Verbetering van Sensorstabiliteit

Tydens toetsing mag jy agterkom dat die motor stop of hakkel selfs wanneer die pad duidelik is. Dit is dikwels omdat die lus te vinnig loop, en die ultrasoniese sensor nie genoeg tyd het om die eggosein te ontvang nie, wat 'n lesing van 0 cm tot gevolg het. Om dit reg te stel, voeg 'n klein vertraging aan die einde van die loop()-funksie by om die sensor tyd te gee om te werk.

void loop() {
    float afstand = leesSensorData();
    if (afstand > 25) {
      beweegVorentoe(200);
    }
    else if (afstand < 10 && afstand > 2) {
      beweegAgtertoe(200);
    } else {
      stopBeweging();
    }
    vertraging(100); // Voeg 'n 100ms vertraging by vir stabiele lesings
  }

'n Vertraging van 100 millisekondes is gewoonlik voldoende om stabiele en konsekwente afstandslesings te kry. (in video by 10:56)

Lewendige Projekdemonstrasie

Sodra die kode opgelaai is, maak die Serial Monitor oop. Jy sal teks sien wat die motor se toestand aandui, soos "Vorentoe", "Agtertoe", of "Stop".

In die demonstrasie word die motor voor 'n hindernis geplaas. Wanneer die hindernis meer as 25 cm weg is, beweeg die motor vorentoe. Soos jy jou hand nader beweeg, stop die motor wanneer die afstand onder 25 cm daal. As jy jou hand baie naby bring, binne 10 cm, sal die motor agtertoe beweeg. Hierdie gedrag is duidelik sigbaar in die video en bevestig dat die hindernisvermydingslogika korrek werk. (in video by 11:53)

Gevolgtrekking

Baie geluk! Jy het suksesvol 'n slim motor gebou wat sy omgewing kan navigeer en hindernisse kan vermy. Hierdie projek kombineer sensorinvoer, besluitnemingslogika, en motorbestuur in 'n enkele, funksionele stelsel. Jy het nie net geleer hoe om 'n ultrasoniese sensor te gebruik nie, maar ook hoe om 'n eenvoudige beheeralgoritme te implementeer wat die fondament is vir baie meer komplekse outonome robotte.

Hoofstukke

  • [00:00] Inleiding tot Hindernisvermyding
  • [01:16] Projekoorsig en Voorvereistes
  • [02:24] Bedrading van die Ultrasoniese Sensor en Motorbestuurder
  • [04:56] Opening van die Projekkode
  • [05:12] Kodeverduideliking: Logika en Funksies
  • [08:34] Oplaai van die Kode en Aanvanklike Toets
  • [09:21] Foutoplossing: Funksieprototipes
  • [10:56] Foutoplossing: Voeg 'n Vertraging by vir Stabiliteit
  • [11:53] Lewendige Demonstrasie van Hindernisvermyding

Beelde

27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Taal: C++
/*
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);
}

Hulpbronne en verwysings

Lêers📁

Arduino Biblioteke (zip)