Pretraži kod

Lekcija 28/31: Auto-6 SunFounder samovozeći Arduino auto koristeći | Robojax

Lekcija 28/31: Auto-6 SunFounder samovozeći Arduino auto koristeći | Robojax

U ovom projektu ćemo napraviti osnovni samovozeći automobil koristeći Arduino, ultrazvučni senzor i dva infracrvena senzora. Ovo je fantastičan uvodni projekat za učenje o autonomnoj navigaciji, fuziji senzora i logici donošenja odluka. Automobil se može kretati naprijed, nazad i skretati kako bi izbjegao prepreke, efektivno pronalazeći jasan put samostalno. Ovaj projekat se zasniva na SunFounder 3-u-1 Arduino kompletu i dio je Arduino kursa Robojax-a.

Ovaj projekat nije samo o pravljenju igračke; to je praktičan uvod u osnovne koncepte iza autonomne robotike. Ista logika i senzori se koriste u stvarnim aplikacijama poput robotskih usisivača, automatizovanih vođenih vozila u skladištima, pa čak i navigacionih sistema složenijih robota. Razumijevanjem kako kombinovati mjerenje udaljenosti sa jednostavnim pravilima navigacije, možete kreirati različite projekte, kao što su:

  • Pravljenje malog robota koji može navigirati prostorijom i izbjegavati namještaj.
  • Kreiranje automatizovanog vozila koje može pratiti jednostavan put ili patrolirati područjem.
  • Učenje kako implementirati osnovne algoritme za izbjegavanje prepreka za veće robotičke projekte.

Hardverske komponente

Ovaj projekat koristi komponente iz SunFounder 3-u-1 kompleta. Bitni dijelovi su:

  • Arduino Uno ploča
  • SunFounder 2WD ili 3-u-1 šasija automobila sa motorima
  • Modul drajvera za motore (npr. L298N ili sličan)
  • HC-SR04 ultrazvučni senzor udaljenosti
  • Dva IR senzora za prepreke
  • Konektorske žice i izvor napajanja za motore

Vodič za povezivanje

Povezivanje je kritičan prvi korak da oživite svoj samovozeći automobil. Veze su jednostavne, ali je bitno provjeriti svaku kako biste izbjegli oštećenje komponenti. Logika iza povezivanja je da se kontrolni pinovi Arduina povežu na drajver motora i senzore, omogućavajući Arduinu da čita podatke i šalje komande.

  • Pinovi drajvera motora (A-1B, A-1A, B-1B, B-1A): Ovi pinovi kontrolišu brzinu i smjer dva motora. Povezani su na Arduino pinove 5, 6, 9 i 10, koji podržavaju PWM, omogućavajući promjenjivu kontrolu brzine.
  • Ultrazvučni senzor (Trig i Echo): Trig pin šalje ultrazvučni puls, a Echo pin prima reflektovani signal. Trig pin je povezan na Arduino pin 3, a Echo pin na Arduino pin 4.
  • IR senzori (lijevi i desni): Ovi senzori detektuju da li je prepreka direktno ispred njih. Lijevi IR senzor je povezan na Arduino pin 8, a desni IR senzor na pin 7. Koriste se za provjeru prostora sa strane automobila.

Za detaljan vizuelni vodič, pogledajte dijagram povezivanja ispod, koji jasno prikazuje svaku vezu.

Objašnjenje koda

Kod je napisan u Arduino programskom jeziku (C++). Cijeli program je dostupan za preuzimanje sa stranice resursa povezane u opisu videa. Hajde da raščlanimo ključne, korisnički podesive dijelove ovog sketch-a.

Definicije pinova

Na vrhu koda definirate pinove koji povezuju Arduino sa različitim komponentama. Možete ih promijeniti ako koristite različite pinove na svojoj ploči.

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

Pinovi A_1B, A_1A, B_1B i B_1A kontrolišu H-most drajver motora. Postavljanjem ovih pinova na HIGH ili LOW u različitim kombinacijama, možete kontrolisati smjer svakog motora. echoPin i trigPin su za ultrazvučni senzor, a rightIR i leftIR za infracrvene senzore.

Varijable ponašanja i logika

Osnovna logika samovozećeg ponašanja je u funkciji loop(). Automobil donosi odluke na osnovu očitanja IR senzora i ultrazvučnog senzora. Kod definira specifične udaljenosti koje pokreću različite akcije. Na primjer, varijabla distance se mjeri u centimetrima. Logika je sljedeća:

  • Ako je udaljenost veća od 50 cm: Put ispred je jasan, pa se automobil kreće naprijed brzinom od 200.
  • Ako je udaljenost između 2 cm i 10 cm: Automobil je preblizu prepreci. Ide unazad jednu sekundu, zatim skreće nazad-lijevo pola sekunde kako bi pronašao novi put.
  • Ako je udaljenost između 10 cm i 50 cm: Automobil je u "zoni opreza". Kreće se naprijed, ali sporijom brzinom od 150.

Ove granične vrijednosti (50 cm, 10 cm i 2 cm) i brzine (200 i 150) su primarne varijable koje možete prilagoditi da promijenite ponašanje svog automobila. Na primjer, možete povećati "sigurnu" udaljenost na 60 cm ako se vaš automobil kreće brzo.

Prilagođene funkcije

Kod uključuje nekoliko prilagođenih funkcija za kontrolu pokreta automobila. One se koriste kroz glavnu petlju kako bi kod bio čišći i lakši za razumijevanje.

  • moveForward(int speed): Ova funkcija postavlja pinove motora da voze automobil naprijed. Parametar speed (0-255) kontroliše koliko brzo se motori okreću.
  • moveBackward(int speed): Slično kao moveForward, ali okreće smjer motora da vozi automobil unazad.
  • backLeft(int speed) i backRight(int speed): Ove funkcije okreću automobil tako što pokreću jedan motor u rikverc dok je drugi zaustavljen. Ovo je okret na mjestu koji pomaže automobilu da efikasno promijeni smjer.
  • stopMove(): Ova funkcija zaustavlja sve motore postavljanjem svih kontrolnih pinova na LOW.
  • readSensorData(): Ova funkcija šalje puls iz ultrazvučnog senzora i mjeri vrijeme potrebno da se eho vrati. Zatim izračunava udaljenost u centimetrima i vraća vrijednost.

Demonstracija uživo projekta

(u videu na 07:09) U demonstraciji, automobil je postavljen u okruženje s raznim preprekama poput kutija i zidova. Logika automobila je vidljiva dok se kreće. Kada ultrazvučni senzor detektuje zid ili prepreku udaljenu više od 50 cm, automobil samouvjereno vozi naprijed. Kako se približava, IR senzori sa strane provjeravaju ima li otvorenog prostora.

Ako se prepreka detektuje s lijeve strane, automobil izvodi okret unazad udesno da je izbjegne i obrnuto. Kada se automobil nađe u tijesnom prostoru, poput ispod stola (u videu na 07:49), koristi funkcije rikverca i okretanja da se izvuče i pronađe čist put. Automobil kontinuirano čita svoje okruženje i donosi odluke, pokazujući reaktivni kontrolni sistem koji se ne oslanja na unaprijed planiranu rutu.

Poglavlja videa

  • [00:00] Uvod u projekat samovozećeg automobila
  • [00:28] O SunFounder 3-u-1 kompletu
  • [01:32] Otvaranje koda i pregled
  • [02:02] Objašnjenje strukture koda i novih funkcija
  • [03:11] Postavljanje pinova u setup funkciji
  • [03:28] Glavna logika donošenja odluka u petlji
  • [05:41] Demonstracija uživo: Automobil u akciji
  • [07:09] Demonstracija s preprekama i praćenjem zida
  • [09:58] Zaključak i završne misli

Slike

28-SunFounder-Car-6-Self-Driving-path
28-SunFounder-Car-6-Self-Driving-path
car_7_8_28_self_driving
car_7_8_28_self_driving
897-Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Jezik: C++
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

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 backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  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);
}

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);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);
}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);

  if (!left && right) {
    backLeft(150);
  } else if (left && !right) {
    backRight(150);
  } else if (!left && !right) {
    moveBackward(150);
  } else {
    float distance = readSensorData();
    Serial.println(distance);
    if (distance > 50) { // Safe
      moveForward(200);
    } else if (distance < 10 && distance > 2) { // Attention
      moveBackward(200);
      delay(1000);
      backLeft(150);
      delay(500);
    } else {
      moveForward(150);
    }
  }
}

Resursi i reference

Datoteke📁

Arduino biblioteke (zip)