|et

Praktika 7 Mootor ja kaugusemõõtmise andur

Katse 1

Eesmärk

Eelmises projektis kasutasime transistorit, et juhtida mootorit, kuid saime muuta ainult selle kiirust. Selle projektiga astume sammu edasi: kasutame H-silda, et saaksime muuta ka mootori pöörlemissuunda. Kuna see on oluline samm roboti ehitamisel, lisame ka:

  • ühe lüliti mootori käivitamiseks,
  • teise lüliti pöörlemissuuna muutmiseks,
  • ning muuttakisti (potentsiomeetri) mootori kiiruse reguleerimiseks.

Vajalikud komponendid

  • L293D või SN754410 mootori draiver
  • 2 lülitit
  • 2 × 10 kΩ takistit
  • 1 potentsiomeeter
  • H-sild

Kuidas see töötab

Et muuta mootori pöörlemissuunda, peame vahetama selle klemmide polaarsust. Selleks kasutame L293D mootori draiverit, mis võimaldab juhtida kahte mootorit. See kiip sisaldab ka kaitsedioode, mis kaitsevad tagasivoolude eest, mis tekivad induktiivsete koormuste puhul (nt mootor).

H-silla loo

L293D kiibi jalgade kirjeldus

  • Vss – kiibi toide (5V)
  • Vs – mootori väline toide (kuni 36V)
  • ENABLE1 ja ENABLE2 – aktiveerivad mootorid 1 ja 2
  • INPUT1 ja INPUT2 – mootor1 juhtimine
  • OUTPUT1 ja OUTPUT2 – ühendatakse mootoriga
  • INPUT3 ja INPUT4 – mootor2 juhtimine
  • OUTPUT3 ja OUTPUT4 – mootor2 ühendamine
  • GND – maandus

Ühendamine Arduinoga

Alustame ühendamisest:

  1. Ühenda L293D kiip, lülitid ja patarei juhtmed arendusplaadile.
    (NB! Ära veel patareisid ühenda)
  2. Ühenda toite + ja – ribad plaadil omavahel.
  3. Ühenda kiibi jalad vastavalt:
  • 1. viik → Arduino pin 9
  • 2. viik → Arduino pin 4
  • 3. ja 6. viik → mootor
  • 4., 5., 12., 13. viik → maandus (GND)
  • 7. viik → Arduino pin 3
  • 8. ja 16. viik → patarei pluss

Kood (1 lülitiga)

See kood paneb mootori pöörlema ühes suunas ja kui vajutada nuppu, pöörleb teises suunas:

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() {
  pinMode(switchPin, INPUT);
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin, HIGH); // aktiveeri mootor1
}

void loop() {
  if (digitalRead(switchPin) == HIGH) {
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
  } else {
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
  }
}

Täiendatud kood: 2 lülitit ja potentsiomeeter

Siin on kood, kus üks lüliti käivitab mootori, teine muudab suunda ja potentsiomeeter reguleerib kiirust:

int switchPin = 2; // lüliti 1 
int switchPin2 = 1; // lüliti 2 
int potPin = A0; // potentsiomeeter 
int motor1Pin1 = 3; // viik 2 (L293D) 
int motor1Pin2 = 4; // viik 7 (L293D) 
int enablePin = 9; // viik 1(L293D) 

void setup() {
  pinMode(switchPin, INPUT);
  pinMode(switchPin2, INPUT);
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
}

void loop() {
  int motorSpeed = analogRead(potPin); // mootori kiirus

  if (digitalRead(switchPin2) == HIGH) {
    analogWrite(enablePin, motorSpeed);
  } else {
    analogWrite(enablePin, 0);
  }

  if (digitalRead(switchPin) == HIGH) {
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
  } else {
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
  }
}

Katse 2 – Ultraheliandur, mis mõõdab kaugust takistuseni

Selles katses kasutame HC-SR04 ultraheliandurit, mis mõõdab kaugust objektini heliimpulsside abil. Tegemist on sonari põhimõttel töötava anduriga – see saadab välja ultrahelilaine ning ootab, kuni see takistuse peegeldusena tagasi jõuab. Mõõtmine põhineb aja määramisel, mis kulub signaali saatmise ja vastuvõtmiseni.

Arvutusloogika:

Heli kiirus õhus on ligikaudu 340 m/s, ehk 1 cm läbimiseks kulub umbes 29 mikrosekundit (μs). Kuna signaal läbib vahemaa kaks korda (saatmine ja tagasitulek), tuleb mõõdetud aeg jagada kahega. Anduri kauguse arvutamiseks kasutatakse tavaliselt funktsiooni pulseIn().

Anduri tehnilised andmed:

  • Tööpinge: 5V
  • Mõõtenurk: kuni 15°
  • Mõõtekaugus: 2–450 cm
  • Täpsus: ±0,3 cm

Ühendamine Arduinoga:

  • Trig (trigger) ühendatakse Arduino pin 7
  • Echo ühendatakse Arduino pin 8

Vajaminevad komponendid:

  • HC-SR04 ultraheliandur
  • Arduino UNO või muu kontroller
  • Juhtmed
  • USB-kaabel programmeerimiseks

Lihtne näidiskood kauguse mõõtmiseks:

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

Katse 3 – Ultraheliandur, mootor, LED ja buzzer

Selles projektis ühendame mitu komponenti, et reageerida takistusele kindla kauguse pealt. Ultraheliandur mõõdab kaugust, ning kui takistus on lähemal kui 50 cm, siis:

  • Süttib punane LED
  • Hakkab tööle helisignaal (buzzer)
  • Mootor seiskub

Kui takistus on kaugemal kui 50 cm, mootor töötab ja LED + buzzer on välja lülitatud.

Vajalikud komponendid:

  • HC-SR04 ultraheliandur
  • Mootor
  • LED
  • Piesoheliandur (buzzer)
  • Arduino UNO või muu kontroller
  • Juhtmed ja toiteallikas

Ühenduste skeem:

  • Echo → pin 7
  • Trig → pin 8
  • Mootor → pin 3
  • LED → pin 13
  • Buzzer → pin 9

Programmikood:




#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);   // Mootor töötab
    digitalWrite(LedPin, 0);       // LED kustub
    noTone(buzzerPin);             // Buzzer vaikib
    delay(1000);
  } else {
    analogWrite(motorPin1, 0);     // Mootor seisab
    digitalWrite(LedPin, 250);     // LED süttib
    tone(buzzerPin, 1000);         // Buzzer annab heli
  }
}