7. Teema: Mootor ja kaugusemõõtmise andur

7.1 Katse Mootori kasutamine

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 

 } 

} 
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() { 

 // sisendid 

 pinMode(switchPin, INPUT); 

 pinMode(switchPin2, INPUT); 

 //väljundid 

 pinMode(motor1Pin1, OUTPUT); 

 pinMode(motor1Pin2, OUTPUT); 

 pinMode(enablePin, OUTPUT); 

} 

 void loop() { 

 //mootori kiirus 

 int motorSpeed = analogRead(potPin); 

 //aktiveeri mootor 

 if (digitalRead(switchPin2) == HIGH)

{ 

 analogWrite(enablePin, motorSpeed); 

 } 

else 

{ analogWrite(enablePin, 0); } 

 // 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 

 } 

}

7.2 Katse Kauguse mõõtmise anduri kasutamine

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

}

7.3 Katse Lihtne parkimissüsteem

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

Ülesanne 7.1 Rahakarp või Prügikast. Töö paarides.

Töö kirjeldus

Meie töö on rahakarp, mis avab ise kaane, kui inimene käe lähedale paneb. See loeb, mitu münti on sisse pandud, teeb heli, näitab infot ekraanil ja kasutab LED-tulesid, et näidata erinevaid olekuid (nt roheline – OK, punane – ootab).

Kasutatud komponenid

  • Arduino UNO
  • HC-SR04 andur
  • Servo mootor
  • LCD ekraan (16×2)
  • LED-id (punane, sinine, roheline)
  • Pieso buzzer
  • Potentsiomeeter
  • Takistid ja juhtmed
  • Pistikplaat (breadboard)

Töö protsess:

  1. Ühendasime kõik juhtmed vastavalt skeemile: andur, servo, LCD, LED-id ja buzzer.
  2. Kirjutasime programmi Arduino IDE-s. Programm teeb järgmist:
    • Kui käsi on lähedal (kuni 30 cm), avaneb kaas.
    • Kui käsi eemaldatakse, loeme seda kui mündi lisamist.
    • Ekraanil tuleb tekst “Aitäh!” ja müntide arv suureneb.
    • LEDid ja buzzer reageerivad.
    • Kui 5 sekundi jooksul ei lisata uut münti, ekraanil on tekst “Kurb vaikus…” ja punane LED süttib.
  3. Ekraanil näitame ka erimärke – nagu süda, naerunägu ja tähed.

Kasutamisvõimalused tavaelus

  • Rahakarbina – näiteks annetuste kogumiseks või laste mänguasjana.
  • Prügikastina – kaas avaneb, kui käsi läheneb. Puhtam ja mugavam.
  • Õppimiseks – hea viis õppida, kuidas andurid ja Arduino töötavad.
  • Näitusel või poes – saab teha huvitava automaatse karbi, mis reageerib inimesele.

Skeem:

Programm:

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

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// LED-id
const int redPin = 10; 
const int bluePin = 9;
const int greenPin = 8;

// Kauguse mõõtmise andur
#define ECHO_PIN A1
#define TRIG_PIN A0

int myndid = 0;
bool kasiLahedal = false;
bool ootanRingi = false;
long timer = 0;

// Servo mootor
Servo mootor;

// Pieso helisignaali pin
const int buzzerPin = 7;

// LCD jaoks erimärgid
byte smile[8] = {
    0b00000,
    0b01010,
    0b01010,
    0b00000,
    0b10001,
    0b01110,
    0b00000,
    0b00000
};

byte smile2[8] = {
  0b00000,
  0b01010,
  0b01010,
  0b00000,
  0b11111,
  0b10001,
  0b01110,
  0b00000
};

byte tahtU[8] = {
  0b01010,
  0b00000,
  0b10001,
  0b10001,
  0b10001,
  0b10011,
  0b01101,
  0b00000
};

byte tahtO[8] = {
  0b01110,
  0b00000,
  0b01110,
  0b10001,
  0b10001,
  0b10001,
  0b01110,
  0b00000
};

byte tahtA[8] = {
  0b01010,
  0b00000,
  0b01110,
  0b00001,
  0b01111,
  0b10001,
  0b01111,
  0b00000
};

byte heart[8] = {
    0b00000,
    0b01010,
    0b11111,
    0b11111,
    0b01110,
    0b00100,
    0b00000,
    0b00000
};

byte sad[8] = {
  0b00000,
  0b01010,
  0b01010,
  0b00000,
  0b01110,
  0b10001,
  0b00000,
  0b00000
};

void setup() {
  // LED-id ja Buzzer
  pinMode(redPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(greenPin, OUTPUT);

  pinMode(buzzerPin, OUTPUT);
  
  // Servo mootor
  mootor.attach(13); 
  
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);
  Serial.begin(9600);
  
  //LCD ekraan
  lcd.begin(16, 2);
  lcd.createChar(1, smile);
  lcd.createChar(2, tahtU);
  lcd.createChar(3, tahtO);
  lcd.createChar(4, tahtA);
  lcd.createChar(5, heart);
  lcd.createChar(6, smile2);
  lcd.createChar(7, sad);
  
  // Tervitustekst ja animatsioon
  lcd.setCursor(3, 0);
  lcd.print("Pane m");
  lcd.write(byte(2));
  lcd.print("nt! ");
  lcd.setCursor(0, 1);
  lcd.print("Saa r");
  lcd.write(byte(3));
  lcd.write(byte(3));
  lcd.print("mu! ");
  
  // süda - paremale
  for (int koht = 11; koht <= 15; koht++) {
    lcd.setCursor(koht, 1);
    lcd.write(byte(5)); 
    delay(300);
    lcd.setCursor(koht, 1);
    lcd.print(" "); 
  }
 
  // süda - vasakule
  for (int koht = 14; koht >= 11; koht--) {
    lcd.setCursor(koht, 1);
    lcd.write(byte(5)); 
    delay(300);
    lcd.setCursor(koht, 1);
    lcd.print(" ");
  }
  
  lcd.setCursor(11, 1); 
  lcd.write(byte(5)); 
  delay(1000);
  lcd.clear();

}

// Lühike meloodia (Super Mario Bros)
void Sound() {
  tone(buzzerPin, 784, 200); delay(200);
  tone(buzzerPin, 880, 200); delay(200);
  tone(buzzerPin, 988, 200); delay(200);
  tone(buzzerPin, 1047, 400); delay(400);
  noTone(buzzerPin);
}

void loop() {
  // Mõõdame kaugust
  digitalWrite(TRIG_PIN,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN,LOW);
  delayMicroseconds(5);
  int distance=pulseIn(ECHO_PIN, HIGH, 15000)/57.5;
  
  Serial.println(distance);
  if (distance == 0 || distance > 400) {
    return; 
  }

  if (distance > 0 && distance <= 30) {
    // Käsi lähedal - avame kaane
    mootor.write(180);
    kasiLahedal = true;

    lcd.setCursor(0, 0);
    lcd.print("Tuvastatud!          ");
    lcd.setCursor(0, 1);
    lcd.print("Avan...");
    delay(400);  

    digitalWrite(greenPin, HIGH); 
    digitalWrite(bluePin, LOW); 
    digitalWrite(redPin, LOW); 
  }
  
  if (kasiLahedal && distance > 30) {
    // Käsi eemaldatud — lisame mündi
    delay(2000);
    mootor.write(90);
    kasiLahedal = false;
    myndid++;

    Sound(); // Esita heli
    
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print("Ait");
    lcd.write(byte(4)); // täht Ä
    lcd.print("h! ");
    lcd.write(byte(1)); // smile
    lcd.setCursor(0, 1);
    lcd.print("M");
    lcd.write(byte(2)); // täht Ü
    lcd.print("ndid kokku: ");
    lcd.print(myndid);
    delay(3000); 
    lcd.clear(); 
    
    // Küsib - kas veel üks?
    lcd.setCursor(0, 0);
    lcd.print("Veel ");
    lcd.write(byte(2));
    lcd.print("ks? ");
    lcd.write(byte(6)); // smile2
    
    digitalWrite(bluePin, HIGH); 
    digitalWrite(greenPin, LOW);
    digitalWrite(redPin, LOW); 
    
    // Käivitame taimeri
    timer = millis();
    ootanRingi = true;
   }
  
  // Kui möödub 5 sekundit ja keegi ei lähenenud
  if (ootanRingi && millis() - timer >= 5000 && distance > 30) {
  /* See tingimus kontrollib, kas ootame uut münti, on möödunud vähemalt 5 sekundit 
    ja kedagi pole läheduses. Kui kõik need tingimused on täidetud, siis kuvatakse sõnum ekraanil */ 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Kurb vaikus... ");
    lcd.write(byte(7));
    lcd.setCursor(4, 1);
    lcd.print("Zzz...");

    digitalWrite(bluePin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(redPin, HIGH);

    ootanRingi = false;
  }

  // Kui keegi lähenes enne 5 sekundit — katkestame ootamise
  if (ootanRingi && distance <= 30) {
    kasiLahedal = true;
    ootanRingi = false;
    lcd.clear();
  }
}


Video: