Tafuta Msimbo

Somo la 28/31: Gari-6 Gari la Arduino linalojiendesha la SunFounder kwa kutumia | Robojax

Somo la 28/31: Gari-6 Gari la Arduino linalojiendesha la SunFounder kwa kutumia | Robojax

Vipengele vya Maunzi

Mradi huu unatumia vipengele kutoka kwenye kit cha SunFounder 3-in-1. Sehemu muhimu ni:

  • Bodi ya Arduino Uno
  • Chasi ya gari ya SunFounder 2WD au 3-in-1 yenye motors
  • Moduli ya kiendeshaji cha motor (k.m., L298N au sawa)
  • Sensor ya umbali ya ultrasonic HC-SR04
  • Sensor mbili za IR za kugundua vikwazo
  • Waya za jumper na chanzo cha nguvu kwa motors

Mwongozo wa Uunganishaji

car_7_8_28_self_driving

Uunganishaji ni hatua ya kwanza muhimu kuleta gari lako la kujiendesha kuwa hai. Uunganishaji ni rahisi, lakini ni muhimu kuangalia mara mbili kila moja ili kuepuka kuharibu vipengele vyako. Mantiki nyuma ya uunganishaji ni kuunganisha pini za udhibiti za Arduino kwenye kiendeshaji cha motor na sensor, kuruhusu Arduino kusoma data na kutuma amri.

  • Pini za Kiendeshaji cha Motor (A-1B, A-1A, B-1B, B-1A): Pini hizi hudhibiti kasi na mwelekeo wa motors mbili. Zimeunganishwa kwenye pini za Arduino 5, 6, 9, na 10, ambazo zina uwezo wa PWM, kuruhusu udhibiti wa kasi unaobadilika.
  • Sensor ya Ultrasonic (Trig na Echo): Pini ya Trig hutuma pulse ya ultrasonic, na pini ya Echo hupokea ishara iliyoakisiwa. Pini ya Trig imeunganishwa kwenye pini ya Arduino 3, na pini ya Echo imeunganishwa kwenye pini ya Arduino 4.
  • Sensor za IR (Kushoto na Kulia): Sensor hizi hugundua ikiwa kuna kikwazo moja kwa moja mbele yao. Sensor ya IR ya kushoto imeunganishwa kwenye pini ya Arduino 8, na sensor ya IR ya kulia imeunganishwa kwenye pini 7. Zinatumika kuangalia nafasi kwenye pande za gari.

Kwa mwongozo wa kina wa kuona, tafadhali rejelea mchoro wa uunganishaji hapa chini, ambao unaonyesha kila uunganishaji kwa uwazi.

Maelezo ya Msimbo

Msimbo umeandikwa kwa lugha ya programu ya Arduino (C++). Programu kamili inapatikana kwa kupakuliwa kutoka ukurasa wa rasilimali uliounganishwa kwenye maelezo ya video. Hebu tuchambue sehemu muhimu, zinazoweza kubadilishwa na mtumiaji za msimbo huu.

Ufafanuzi wa Pini

Juu ya msimbo, unafafanua pini zinazounganisha Arduino na vipengele mbalimbali. Unaweza kubadilisha hizi ikiwa unatumia pini tofauti kwenye bodi yako.

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;

Pini za A_1B, A_1A, B_1B, na B_1A hudhibiti kiendeshaji cha motor cha H-bridge. Kwa kuweka pini hizi HIGH au LOW katika michanganyiko tofauti, unaweza kudhibiti mwelekeo wa kila motor. echoPin na trigPin ni za sensor ya ultrasonic, na rightIR na leftIR ni za sensor za infrared.

Vigezo vya Tabia na Mantiki

Mantiki kuu ya tabia ya kujiendesha iko kwenye kazi ya loop(). Gari hufanya maamuzi kulingana na usomaji kutoka kwa sensor za IR na sensor ya ultrasonic. Msimbo unafafanua umbali maalum ambao husababisha vitendo tofauti. Kwa mfano, kigezo cha distance kinapimwa kwa sentimita. Mantiki ni kama ifuatavyo:

  • Ikiwa umbali ni zaidi ya 50 cm: Njia iliyo mbele iko wazi, kwa hiyo gari husonga mbele kwa kasi ya 200.
  • Ikiwa umbali ni kati ya 2 cm na 10 cm: Gari liko karibu sana na kikwazo. Linarudi nyuma kwa sekunde moja, kisha linageuka kushoto-nyuma kwa nusu sekunde kutafuta njia mpya.
  • Ikiwa umbali ni kati ya 10 cm na 50 cm: Gari liko katika "eneo la tahadhari." Linaenda mbele, lakini kwa kasi ndogo ya 150.

Viwango hivi vya kikomo (50 cm, 10 cm, na 2 cm) na kasi (200 na 150) ni vigezo vikuu unavyoweza kubadilisha kubadilisha tabia ya gari lako. Kwa mfano, unaweza kuongeza umbali wa "usalama" hadi 60 cm ikiwa gari lako linatembea kwa kasi.

Kazi Maalum

Msimbo unajumuisha kazi kadhaa maalum za kudhibiti harakati za gari. Hizi hutumiwa katika kitanzi kikuu kufanya msimbo kuwa safi na rahisi kueleweka.

  • moveForward(int speed): Kazi hii inaweka pini za motor kuendesha gari mbele. Kigezo cha speed (0-255) kinadhibiti kasi ya motor kugeuka.
  • moveBackward(int speed): Sawa na moveForward, lakini inabadilisha mwelekeo wa motor kuendesha gari nyuma.
  • backLeft(int speed) na backRight(int speed): Kazi hizi zinageuza gari kwa kuendesha motor moja kinyume wakati nyingine imesimama. Hii ni zamu ya pivot inayosaidia gari kubadilisha mwelekeo kwa ufanisi.
  • stopMove(): Kazi hii inasimamisha motor zote kwa kuweka pini zote za udhibiti kuwa LOW.
  • readSensorData(): Kazi hii inatuma pulse kutoka kwa sensor ya ultrasonic na kupima muda unaochukuliwa kwa echo kurudi. Kisha inahesabu umbali kwa sentimita na kurudisha thamani.

Maonyesho ya Mradi wa Moja kwa Moja

(katika video saa 07:09) Katika maonyesho, gari limewekwa katika mazingira yenye vikwazo mbalimbali kama masanduku na kuta. Mantiki ya gari inaonekana inaposafiri. Wakati sensor ya ultrasonic inapogundua ukuta au kikwazo zaidi ya cm 50 mbali, inaendesha mbele kwa ujasiri. Inapokaribia, sensor za IR kwenye pande zinaangalia nafasi iliyo wazi.

Ikiwa kikwazo kinagunduliwa upande wa kushoto, gari hufanya zamu ya nyuma-kulia kukiepuka na kinyume chake. Wakati gari linajikuta katika nafasi nyembamba, kama chini ya meza (katika video saa 07:49), linatumia kazi zake za kurudi nyuma na kugeuka kujitoa na kupata njia iliyo wazi. Gari linaendelea kusoma mazingira yake na kufanya maamuzi, kuonyesha mfumo wa udhibiti tendaji usiotegemea njia iliyopangwa mapema.

Sura za Video

  • [00:00] Utangulizi wa Mradi wa Gari la Kujiendesha
  • [00:28] Kuhusu Kifurushi cha SunFounder 3-in-1
  • [01:32] Kufungua Msimbo na Muhtasari
  • [02:02] Maelezo ya Muundo wa Msimbo na Kazi Mpya
  • [03:11] Kuweka Pini katika Kazi ya Setup
  • [03:28] Mantiki Kuu ya Kufanya Maamuzi katika Loop
  • [05:41] Maonyesho ya Moja kwa Moja: Gari Katika Kazi
  • [07:09] Maonyesho na Vikwazo na Kufuata Kuta
  • [09:58] Hitimisho na Mawazo ya Mwisho

Bilder

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
Språk: 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);
    }
  }
}

Resurser och referenser

Filer📁

Arduino-bibliotek (zip)