Praktika 7: Nutikas parkimistõkkepuu süsteem ja Iseliikuv auto

Katse 7.1: -Mootori kasutamine-

Eesmärk:

Eelmises projektis kasutasime transistori, et kontrollida mootorit, millega suutsime kontrollida vaid mootori kiirust. Selles projektis võtame kasutusele H-silla, et saaksime kontrollida mootori pöörlemissuunda. Kuna tegemist on suure sammuga robotiehitusele, siis lisame skeemi lüliti, mis paneb mootori tööle, lüliti mis muudab pöörlemissuunda ja muuttakisti mootori kiiruse muutmiseks.

H-sild:

Et mootorit juhtida ühte ja teist pidi, oleks vaja muuta mootori klemmide polaarsust. Siinkohal aitab meid välja mootori draiver L293D (või SN754410). Tegemist on nelja kanalise mootori draiveriga, mis on mõeldud mootorite, releede või muude induktiivsete elektriseadmete juhtimiseks. Ehk selle abil on võimalik kontrollida kohte mootorit. Kiipi on sisse ehitatud kaitsedioodid, mis kaitsevad induktiivsusest tuleneva elektrilise tagasilöögi eest.

Kui lihtsustada L293D tööpõhimõtet, siis on tegemist nelja lülitiga, mis meenutab H-tähte ja sealt see nimi tulebki.

L293D

Mootori draiver L293D on kiip 16-jalaga. Kiibi jalad on tavaliselt nummerdatud. Iga kiibi on ülemises osas lohk ja võta see ette nii, et lohk jääb üles. Number 1 jalg jääb üles vasakule ja jooksevad U-kujuliselt.

  • Vss – kiibi toide +5V
  • Vs – väline toide kuni +36V
  • ENABLE1 ja ENABLE2 – aktiveerivad mootor1 ja mootor2
  • INPUT1 ja INPUT2 – mootor1 juhtimiseks
  • OUTPUT1 ja OUTPUT2 – mootor1 ühendamiseks
  • INPUT3 ja INPUT4 – mootor2 juhtimiseks
  • OUTPUT3 ja OUTPUT4 – mootor2 ühendamiseks
  • GND – maandus

L293D ühendamine Arduinoga

Paneme siis mootorid praktilised mootori draiveri abiga tööle. Skeemi lisame kaks nuppu ja potentsiomeetri moodoti juhtumiseks.

Ühendame kõigepealt L293D kiibi, lüliti ja patarei juhtmed arendusplaadiga. Ära veel patareid kinnita. Seejärel ühendame arendusplaadi pluss ja miinus pikiribad omavahel. Edasi ühendame mootori draiveri järgmised viigud numbrite järgi. Jälgi, kuhu poole jääb kiibi lohk!

  • 1. viik – ühendame Arduino pesasse 9
  • 2. viik – ühendame Arduino pesasse 4
  • 3. ja 6. viik – ühendame mootoriga
  • 4., 5., 12. ja 13. viik – ühendame maandusega
  • 7. viik – ühendame Arduino pesasse 3
  • 8. ja 16. viik  – ühendame patareid toitega

Komponendid:

Arduino Uno

x1

Breadboard

x1

L293D mootori draiver

x1

Lüliti

x1

10kΩ takisti

x1

Mootor

x1

Patarei

x1

Juhtmed

x18

Skeem:

Selline ühendus vastutab meil siis ühe mootori eest. Skeemis oleva lüliti ühendame aga Arduino pessa 2. Lisame koodijupi mootori juhtimiseks.

Kood:

int switchPin = 2; // lüliti 1 
int motor1Pin1 = 3; // viik 2 (L293D) 

int motor1Pin2 = 4; // viik 7 (L293D) 

int enablePin = 9; // viik 1(L293D) 

 void setup() { 

 // sisendid 

 pinMode(switchPin, INPUT);

 //väljundid 

 pinMode(motor1Pin1, OUTPUT); 

 pinMode(motor1Pin2, OUTPUT); 

 pinMode(enablePin, OUTPUT); 

 // aktiveeri mootor1 

 digitalWrite(enablePin, HIGH); 

} 

 void loop() { 

 // kui lüliti on HIGH, siis liiguta mootorit ühes suunas: 

 if (digitalRead(switchPin) == HIGH) 

{ 

 digitalWrite(motor1Pin1, LOW); // viik 2 (L293D) LOW 

 digitalWrite(motor1Pin2, HIGH); // viik 7 (L293D) HIGH 

 } 

 // kui lüliti on LOW, siis liiguta mootorit teises suunas: 

 else

 { digitalWrite(motor1Pin1, HIGH); // viik 2 (L293D) HIGH 

 digitalWrite(motor1Pin2, LOW); // viik 7 (L293D) LOW 

 } 

} 

Interaktiivne Arduino skeem

Nüüd kui skeemi üles laed, siis töötab mootor ühtepidi ja kui nupule vajutad, siis teistpidi. Täiendame seda veel ühe lülitusega, mis käivitab mootori ja potentsiomeetriga, mis muudab mootori kiirust.

Komponendid:

Arduino Uno

x1

Breadboard

x1

L293D

x1

Lüliti

x2

Takisti

x2

Mootor

x1

Patarei

x1

Potentsiomeeter

x1

Juhtmed

x23

Skeem

Kood:

int switchPin = 2; // lüliti 1 
int motor1Pin1 = 3; // viik 2 (L293D) 

int motor1Pin2 = 4; // viik 7 (L293D) 

int enablePin = 9; // viik 1(L293D) 

 void setup() { 

 // sisendid 

 pinMode(switchPin, INPUT);

 //väljundid 

 pinMode(motor1Pin1, OUTPUT); 

 pinMode(motor1Pin2, OUTPUT); 

 pinMode(enablePin, OUTPUT); 

 // aktiveeri mootor1 

 digitalWrite(enablePin, HIGH); 

} 

 void loop() { 

 // kui lüliti on HIGH, siis liiguta mootorit ühes suunas: 

 if (digitalRead(switchPin) == HIGH) 

{ 

 digitalWrite(motor1Pin1, LOW); // viik 2 (L293D) LOW 

 digitalWrite(motor1Pin2, HIGH); // viik 7 (L293D) HIGH 

 } 

 // kui lüliti on LOW, siis liiguta mootorit teises suunas: 

 else

 { digitalWrite(motor1Pin1, HIGH); // viik 2 (L293D) HIGH 

 digitalWrite(motor1Pin2, LOW); // viik 7 (L293D) LOW 

 } 

} 

Interaktiivne Arduino skeem

Katse 7.2: -Kauguse mõõtmise anduri kasutamine-

Komponendid:

Arduino Uno

x1

Ultraheliandur

x1

Juhtmed

x4

Kirjeldus:

Ultraheliandur (sonar) on seade, mis mõõdab kaugust eesoleva objektini ultraheliimpulsside abil. Andur saadab välja helilaine ning mõõdab aega, mis kulub kaja tagasijõudmiseks vastuvõtjani. Kauguse arvutamisel võetakse arvesse heli levimise kiirust õhus (ligikaudu 340 m/s) ning saadud tulemus jagatakse kahega, kuna heli läbib teekonna objektini ja tagasi.

Praktikas kulub heli levimiseks umbes 29 μs ühe sentimeetri kohta. Signaali kestuse mõõtmiseks saab kasutada Arduino funktsiooni pulseIn().

Andur töötab 5 V toitepingel, selle mõõtenurk on kuni 15° ning mõõteulatus 2–450 cm. Tegemist on soodsa, kuid üsna täpse anduriga, mille mõõtevea suurus on ligikaudu ±0,3 cm.

Arduino ühendamisel ühendatakse Echo viik digitaalsisendisse 8 ning Trig viik digitaalsisendisse 7.

Skeem:

Kood:

Variant 1
Variant 2
#define ECHO_PIN 8

#define TRIG_PIN 7

void setup() {

  pinMode(ECHO_PIN, INPUT);

  pinMode(TRIG_PIN, OUTPUT);

  Serial.begin(9600);

}

void loop() {

  digitalWrite(TRIG_PIN,HIGH);

  digitalWrite(TRIG_PIN,LOW);

  int distance=pulseIn(ECHO_PIN, HIGH)/50;

  Serial.println(distance);

}
#define ECHO_PIN 8

#define TRIG_PIN 7

void setup() {

  pinMode(ECHO_PIN, INPUT);

  pinMode(TRIG_PIN, OUTPUT);

  Serial.begin(960);

}

void loop() {

  Serial.println(measure()); 

}

int measure()

{

  digitalWrite(TRIG_PIN,HIGH);

  digitalWrite(TRIG_PIN,LOW);

  int distance=pulseIn(ECHO_PIN, HIGH,15000)/50;

  return constrain(distance,1,300);

}

Interaktiivne Arduino skeem

Katse 7.3: -Lihtne parkimissüsteem-

Komponendid:

Arduino Uno

x1

Kaugusemõõtmise andur

x1

Mootor

x1

Piezo

x1

LED

x1

Juhtmed

xN

Kirjeldus:

Projekt mõõdab takistuse kaugust ultrahelianduri abil. Kui kaugus on väiksem kui 50, süttib punane LED, buzzer annab helisignaali ja mootori kiirus on 0.

Skeem:

Kood:

#define ECHO_PIN 7
#define TRIG_PIN 8
int motorPin1=3;
int distance=1;
int LedPin=13;
int duration;
const int buzzerPin = 9;
void setup() {
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(motorPin1,OUTPUT);
  pinMode(LedPin,OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  digitalWrite(TRIG_PIN,LOW);
  delay(200);
  digitalWrite(TRIG_PIN,HIGH);
  delay(200);
  digitalWrite(TRIG_PIN,LOW);
  duration = pulseIn(ECHO_PIN, HIGH);
  distance=duration/58;
  Serial.println(distance);
  if (distance>50)
  {
      analogWrite(motorPin1,100);
      digitalWrite(LedPin,0);
    noTone(buzzerPin);     
      delay(1000);}  
  else
  {
    analogWrite(motorPin1,0);
      digitalWrite(LedPin,250);
       tone(buzzerPin, 1000);
  }
}

Interaktiivne Arduino skeem

Ülesanne 7.2: Nutikas parkimistõkkepuu süsteem

Kirjeldus:

Selles projektis loodi nutikas parkimistõkkepuu süsteem, mis kasutab ultraheliandurit sõiduki tuvastamiseks. Kui auto läheneb tõkkepuule ja jääb määratud kaugusele, kuvab LCD-ekraan esmalt teate „Auto leitud“ ning seejärel kontrollib süsteem olukorda. Pärast lühikest pausi kuvatakse tervitussõnum „Tere tulemast“ ja servomootor avab tõkkepuu.

RGB LED annab kasutajale visuaalset tagasisidet süsteemi oleku kohta. Kui tõkkepuu on suletud, põleb punane tuli. Kui sõiduk on tuvastatud ja tõkkepuu avaneb, süttib roheline tuli. Kui sõiduk eemaldub andurist, sulgub tõkkepuu automaatselt ning süsteem naaseb algolekusse.

Projekt demonstreerib andurite, servomootori, RGB LED-i ja LCD-ekraani koostööd ühe automaatse juhtimissüsteemi loomisel.

Komponendid:

Arduino Uno

x1

Breadboard

x1

Ultraheliandur HC-SR04

x1

LCD 16x2

x1

Potentsiomeeter

x1

Servomootor SG90

x1

RGB LED

x1

220 - 330 Ω takisti

x4

Juhtmed

x25

Skeem:

Simulatsioon väljas:
Simulatsiooni tööl:

Füüsilise mudeli koostamisel kasutati RGB LED-i, mis erines Tinkercad simulatsioonis kasutatud komponendist. Simulatsioonis oli RGB LED-i ühine viik ühendatud maandusega (GND), füüsilises mudelis aga toitepingega (+5 V). Vaatamata erinevale ühendusele töötas süsteem mõlemas keskkonnas korrektselt ning kasutati sama programmi.

Kood:

#include <Servo.h>
#include <LiquidCrystal.h>

Servo barrier;

// LCD: RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(12, 11, 7, 8, 2, 13);

// HC-SR04
const int trigPin = 9;
const int echoPin = 10;

// RGB LED
const int redPin = 5;
const int greenPin = 4;
const int bluePin = 3;

// Servo
const int servoPin = 6;

const int limitDistance = 15;

long duration;
int distance;

int getDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH, 30000);

  if (duration == 0) {
    return 999;
  }

  return duration * 0.034 / 2;
}

void redLight() {
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);
  digitalWrite(bluePin, HIGH);
}

void greenLight() {
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, HIGH);
}

void showClosed() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Parkla sisse");
  lcd.setCursor(0, 1);
  lcd.print("Suletud");
}

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  barrier.attach(servoPin);
  barrier.write(0);

  lcd.begin(16, 2);

  redLight();
  showClosed();

  Serial.begin(9600);
}

void loop() {
  distance = getDistance();

  Serial.print("Distance: ");
  Serial.println(distance);

  if (distance > 0 && distance < limitDistance) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Auto leitud");
    lcd.setCursor(0, 1);
    lcd.print("Kontroll...");

    delay(1000);

    distance = getDistance();

    if (distance > 0 && distance < limitDistance) {
      barrier.write(90);
      greenLight();

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tere tulemast");
      lcd.setCursor(0, 1);
      lcd.print("Avatud");

      delay(2000);
    }
  } else {
    barrier.write(0);
    redLight();
    showClosed();
  }

  delay(300);
}

Video:

Interaktiivne Arduino skeem

Uuritud funktsioonid

Funktsioon Tüüp Kirjeldus Kasutus koodis
pinMode() Standard Määrab Arduino viigu sisendiks või väljundiks Ultrahelianduri, RGB LED-i ja teiste komponentide viikude seadistamine
digitalWrite() Standard Annab digitaalsele viigule väärtuse HIGH või LOW RGB LED-i värvide juhtimine ja ultrahelianduri TRIG-signaali saatmine
delayMicroseconds() Standard Peatab programmi töö määratud mikrosekunditeks Ultraheliandurile lühikese TRIG-impulsi tekitamine
pulseIn() Standard Mõõdab, kui kaua viik on HIGH või LOW olekus Ultrahelianduri ECHO-signaali kestuse mõõtmine kauguse arvutamiseks
delay() Standard Peatab programmi töö määratud millisekunditeks Kontrollpausi tegemine enne tõkkepuu avamist
barrier.attach() Servo Seob servomootori valitud Arduino viiguga Servomootori ühendamine tõkkepuu juhtimiseks
barrier.write() Servo Pöörab servomootori etteantud nurga alla Tõkkepuu avamine ja sulgemine
lcd.begin() LiquidCrystal Määrab LCD-ekraani veergude ja ridade arvu 16×2 LCD-ekraani alglaadimine
lcd.clear() LiquidCrystal Kustutab ekraanilt kogu teksti Ekraani puhastamine oleku muutumisel
lcd.setCursor() LiquidCrystal Määrab teksti alguskoha LCD-ekraanil Teksti paigutamine esimesele ja teisele reale
lcd.print() LiquidCrystal Kuvab teksti LCD-ekraanil Sõnumite “Auto leitud”, “Kontroll…” ja “Tere tulemast” kuvamine

Kasutamisvõimalused tavaelus

🅿️ Parklate sissepääsud

Süsteemi saab kasutada parklate sissepääsudes sõidukite automaatseks tuvastamiseks. Kui auto läheneb, avaneb tõkkepuu ning RGB LED ja LCD-ekraan näitavad süsteemi olekut.

🚪 Automaatsed uksed

Sarnast lahendust saab kasutada automaatuste juures. Andur tuvastab inimese või objekti lähenemise ning süsteem avab ukse ilma käsitsi vajutamiseta.

🏬 Kaubanduskeskused

Kaubanduskeskustes aitab automaatne avamissüsteem muuta inimeste liikumise sujuvamaks. Uksed või tõkked avanevad siis, kui külastaja jõuab piisavalt lähedale.

🏢 Büroohooned

Büroohoonetes saab süsteemi kasutada sissepääsude või parkimisalade juures. LCD-ekraan võib kuvada tervituse või teate ning LED näitab, kas läbipääs on lubatud.

♿ Ligipääsetavus

Automaatne avamissüsteem aitab inimesi, kellel on raske ust käsitsi avada. See on kasulik ratastooli kasutajatele, lapsevankriga liikujatele või inimestele, kellel on käed hõivatud.

🏭 Tööstus- ja laoalad

Tööstus- ja laoaladel saab süsteemi kasutada sõidukite või töötajate liikumise kontrollimiseks. Automaatne tõkkepuu või uks aitab muuta läbipääsu turvalisemaks ja mugavamaks.

Ülesanne 7.3: Iseliikuv auto.

Kirjeldus:

Iseliikuv auto, mis tõrjub oma teel olevaid takistusi.

Komponendid:

Komponent Kogus Otstarve
Arduino Uno 1 Roboti juhtimine ja programmi täitmine
L298N mootoridraiver 1 Kahe alalisvoolumootori juhtimine
HC-SR04 ultraheliandur 1 Takistuste kauguse mõõtmine
Alalisvoolumootor 2 Roboti liikumise tagamine
Rattad 2 Roboti liikumine pinnal
Pöörlev tugiratas 1 Roboti tasakaalustamine
AAA patareid 6 Süsteemi toiteallikas
6-pesaline AAA patareihoidja 1 Patareide ühendamine süsteemiga
Juhtmed mitu Komponentide elektriline ühendamine
Roboti raam 1 Kõikide komponentide kinnitamine

Skeem:

Märkus: Tegelikus projektis kasutati ühte 6-pesalist AAA patareihoidjat. Skeemil kujutatud kaks eraldi patareipesa ja ON-OFF lüliti ei olnud lõplikus lahenduses kasutusel.

Kood:

// KAUGUSE MÕÕTMISE MUUTUJAD (DISTANCE VARIABLES)
const int trigPin = 8;
const int echoPin = 7;
long duration, distance;
int dist_result;

// MOOTORITE MUUTUJAD (MOTORS VARIABLES)
const int mot1f = 6;
const int mot1b = 5;
const int mot2f = 11;
const int mot2b = 10;
int mot_speed = 180; // Mootorite kiirus (0-255)
int k = 0;           // Muutuja sujuvaks pööramiseks

// LOOGIKA MUUTUJAD (LOGICS VARIABLES)
const int dist_stop = 25;   // Peatumise kaugus sentimeetrites
const int max_range = 800;  // Maksimaalne lubatud väärtus (veatuvastus)
const int min_range = 0;    // Minimaalne lubatud väärtus (veatuvastus)
int errorLED = 13;          // Integreeritud LED veateadeteks

// ESMANE SEADISTAMINE
void setup() {
  Serial.begin(9600); // Algatame jadaside andmete jälgimiseks
  
  // Sensori viikude seadistamine
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(errorLED, OUTPUT);
  
  // Mootorite viikude seadistamine väljundiks (VÄGA OLULINE!)
  pinMode(mot1f, OUTPUT);
  pinMode(mot1b, OUTPUT);
  pinMode(mot2f, OUTPUT);
  pinMode(mot2b, OUTPUT);
}

// PÕHIPROGRAMMI TSÜKKEL
void loop() {
  int result = ping(); // Küsime andurilt praeguse kauguse

  // Kontrollime, kas anduri näit on vigane (0 või liiga suur)
  if (result <= min_range || result >= max_range) { 
    digitalWrite(errorLED, HIGH); // Süütame vea LED-i
    motors_stop();                // Ohutuse tagamiseks peatame mootorid
    delay(500);
    return;                       // Katkestame selle tsükli ja alustame loop() otsast peale
  }
  
  digitalWrite(errorLED, LOW); // Kui kõik on korras, kustutame vea LED-i

  // Loogika: mida teha takistuse korral
  if (result <= dist_stop) { 
    // Kui takistus on liiga lähedal (<= 25 cm)
    motors_stop();  // Jääme seisma
    delay(200);
    motors_back();  // Sõidame tagurpidi
    delay(1000);
    motors_stop();
    delay(200);
    motors_left();  // Pööramise manööver vasakule
    delay(300);
    motors_stop();
    delay(200);
  } else { 
    // Kui tee on vaba, sõidame otse edasi
    motors_forward();
    delay(100);     // Sõidame lühikeste sammudega, et pidevalt kaugust kontrollida
  }
}

// Abifunktsioon ÜHE mõõtmise tegemiseks
int getSingleDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // Vajalik 10 mikrosekundiline impulss sensori käivitamiseks
  digitalWrite(trigPin, LOW);
  
  // pulseIn() ootab signaali HIGH. Lisatud on aegumine (timeout) 30000 mks (~4.5 meetrit),
  // et kood ei jääks seisma, kui kaja tagasi ei tule.
  long pulse_time = pulseIn(echoPin, HIGH, 30000); 
  
  if (pulse_time == 0) return 400; // Kui kaja ei tulnud, eeldame et ees on vaba tee (400 cm)
  return pulse_time / 58;          // Teisendame mikrosekundid sentimeetriteks
}

// KAUGUSE MÕÕTMISE FUNKTSIOON (3 mõõtmist ja keskmistamine)
int ping() {
  int dist1 = getSingleDistance(); delay(30);
  int dist2 = getSingleDistance(); delay(30);
  int dist3 = getSingleDistance();
  
  // Kolme arvu sorteerimine mediaani (keskmise) leidmiseks
  int middle;
  if ((dist1 <= dist2 && dist2 <= dist3) || (dist3 <= dist2 && dist2 <= dist1)) {
    middle = dist2;
  } else if ((dist2 <= dist1 && dist1 <= dist3) || (dist3 <= dist1 && dist1 <= dist2)) {
    middle = dist1;
  } else {
    middle = dist3;
  }
  
  dist_result = middle;

  Serial.print("Di: ");
  Serial.println(dist_result);
  
  return dist_result;
}

// MOOTORITE JUHTIMISE FUNKTSIOONID
void motors_forward() { 
  analogWrite(mot1f, mot_speed);
  analogWrite(mot2f, mot_speed);
  digitalWrite(mot1b, LOW);
  digitalWrite(mot2b, LOW);
}

void motors_back() { 
  digitalWrite(mot1f, LOW);
  digitalWrite(mot2f, LOW);
  analogWrite(mot1b, mot_speed);
  analogWrite(mot2b, mot_speed);
}

void motors_stop() { 
  // L298N draiveri puhul tagab kõigi viikude seadmine HIGH olekusse mootorite kiire pidurdamise
  digitalWrite(mot1f, HIGH);
  digitalWrite(mot2f, HIGH);
  digitalWrite(mot1b, HIGH);
  digitalWrite(mot2b, HIGH);
}

void motors_left() { 
  analogWrite(mot1f, mot_speed);
  digitalWrite(mot2f, LOW);
  digitalWrite(mot1b, LOW);
  analogWrite(mot2b, mot_speed);
}

void motors_right() { 
  digitalWrite(mot1f, LOW);
  analogWrite(mot2f, mot_speed);
  analogWrite(mot1b, mot_speed);
  digitalWrite(mot2b, LOW);
}

void motors_forward_left() { 
  k = mot_speed * 0.8;
  analogWrite(mot1f, mot_speed);
  analogWrite(mot2f, k);
  digitalWrite(mot1b, LOW);
  digitalWrite(mot2b, LOW);
}

void motors_forward_right() { 
  k = mot_speed * 0.8;
  analogWrite(mot1f, k);
  analogWrite(mot2f, mot_speed);
  digitalWrite(mot1b, LOW);
  digitalWrite(mot2b, LOW);
}

void motors_back_left() { 
  k = mot_speed * 0.8;
  digitalWrite(mot1f, LOW);
  digitalWrite(mot2f, LOW);
  analogWrite(mot1b, k);
  analogWrite(mot2b, mot_speed);
}

void motors_back_right() { 
  k = mot_speed * 0.8;
  digitalWrite(mot1f, LOW);
  digitalWrite(mot2f, LOW);
  analogWrite(mot1b, mot_speed);
  analogWrite(mot2b, k);
}

Video:

Uuritud funktsioonid

Funktsioon Tüüp Kirjeldus Kasutus koodis
analogWrite() Standard / PWM Saadab PWM-signaali väljundile Mootorite kiiruse juhtimine
pulseIn() Standard Mõõdab impulsi kestust Ultrahelianduri ECHO-signaali mõõtmine
getSingleDistance() Kasutaja loodud Teeb ühe kauguse mõõtmise Takistuse kauguse määramine
ping() Kasutaja loodud Teeb kolm mõõtmist ja leiab mediaani Stabiilse kauguse väärtuse saamine
motors_forward() Kasutaja loodud Liigutab robotit edasi Normaalne liikumine vabal teel
motors_stop() Kasutaja loodud Peatab mootorid Takistuse või vea korral peatumine

Kasutamisvõimalused tavaelus

🤖 Autonoomsed robotid

Sarnast süsteemi kasutatakse autonoomsetes robotites, mis liiguvad iseseisvalt ja väldivad takistusi. Ultraheliandur aitab robotil ümbrust jälgida ning ohutult liikuda.

🏭 Lao- ja tööstusrobotid

Ladudes ja tootmisettevõtetes saavad robotid transportida kaupu ning vältida kokkupõrkeid inimeste ja teiste objektidega. See suurendab töö efektiivsust ja ohutust.

🧹 Robot-tolmuimejad

Paljud robot-tolmuimejad kasutavad sarnaseid kaugusandureid takistuste tuvastamiseks. Süsteem aitab vältida mööblile otsasõitmist ja võimaldab ruumis iseseisvalt liikuda.

🚗 Autonoomsed sõidukid

Takistuste tuvastamise põhimõtet kasutatakse ka autonoomsetes sõidukites. Kuigi pärisautod kasutavad keerukamaid andureid, on tööpõhimõte sarnane – ümbruse jälgimine ja ohutu liikumine.

🚑 Pääste- ja uurimisrobotid

Selliseid süsteeme kasutatakse robotites, mis liiguvad inimestele ohtlikes piirkondades, näiteks varingutes või tööstusõnnetuste järel. Takistuste vältimine võimaldab turvalisemat liikumist.

🎓 Õppe- ja teadusprojektid

Takistusi vältivad robotid on populaarsed haridusprojektides. Need aitavad õppida programmeerimist, andurite kasutamist, robootikat ja automaatjuhtimist praktiliste näidete kaudu.