7.1 Katse 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.
Vajalikud komponendid
- L293D või SN754410 mootori draiver
- lülitid 2tk
- 10kOhm takistid 2tk
- potentsiomeeter
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
Skeem

Programm
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
}
}
Mootori kiiruse reguleerimine
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.
Skeem

Programm
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
Ultrahelianduri HC-SR04 ühendamine Arduinoga
Ultraheli sensor on andur (sonar), mis mõõdab heliimpulsi abil kaugust eesoleva takistuseni. Nimelt mõõdetakse heliimpulsi saatmisest vastuvõtmiseni (kaja) kuluv aeg. Arvesse tuleb võtta veel heli levimise kiirus 340m/s ning tulemus jagada kahega.
Abiks: abiks: 1cm läbimiseks kulub 29μs. Signaali mõõtmiseks kasuta Arduino pulseIn() funktsiooni
Antud andur töötab 5V peal, mõõtenurk on kuni 15° ja mõõdetav distants 2-450cm. Tegemist on suhteliselt odava anduriga ning selle täpsus on 0,3cm.
Ühendamiseks Arduinoga ühendame Echo pesaga 8 ja Trig pesaga 7.
Komponeendid:

Skeem

#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);
}
7.3 Katse Lihtne parkimissüsteem
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.
Komponeendid:
- Kaugusemõõtmise andur
- Mootor
- Piezo
- LED
Skeem

Programm
#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 (Töö parides)
Töö kirjeldus
See projekt on nutikas rahakarp, mis ärkab ellu iga mündiga. See ei ole pelgalt mehhanism — see on väike elektrooniline sõber, kes rõõmustab iga sisestuse üle. Süsteem tuvastab käe lähenemise, avab kaane, tervitab kasutajat tänusõnade ja muusikaga ning loendab hoolikalt kogutud münte. Projekti südameks on Arduino Uno, mis juhib komponentide kooskõla täpselt ja usaldusväärselt.
Projekti põhifunktsioonid:
- Ultrasoniline kaugusandur jälgib ümbrust. Kui käsi läheneb kuni 30 cm kaugusele:
- avaneb kaane servomootoriga,
- aktiveerub roheline LED, mis annab märku valmisolekust.
- Kui käsi eemaldatakse ja eeldatakse mündi sisestust:
- mündiloendur suureneb,
- kõlab lühike rõõmus meloodia (insp. Super Mario),
- LCD-ekraanil kuvatakse tänusõnum ja praegune müntide arv.
- Kui 5 sekundi jooksul uut münti ei lisandu:
- ilmub ekraanile “Kurb vaikus…”, saates signaali punase LED-iga,
- rahakarp uinub hetkeks, oodates järgmist rõõmsat kohtumist.
- Ekraanil kuvatakse animatsioonid ja kohandatud tähemärgid (Ü, Ä, O), samuti emotsioonid: südamed, naeratused ja kurb nägu – sest isegi rahakarp tunneb midagi.

Kasutatud komponenid
- Arduino UNO plaat (1tk)
- Arendusplaat (1tk)
- LCD-ekraan (1tk)
- Potentiometer (1tk)
- Juhtmed (30tk)
- 220 Ω Takisti (3tk)
- LED (3tk: 1 punane, 1 roheline, 1 kollane)
- Piezo element (1tk)
- Servo mootor (1tk)
- Ultraheli kaugusandur HC-SR04 (1tk)
Töö protsess
Projekti käigus ühendati Arduino Uno plaadiga mitmed komponendid, et luua interaktiivne ja kasutajasõbralik nutikas rahakarp, mis reageerib inimese liigutusele, kuvab infot ning annab helilisi ja visuaalseid signaale.
Ühendatud komponendid:
- Ultrasoniline kaugusandur (HC-SR04):
- TRIG pin ühendati digitaalsisendisse A0,
- ECHO pin digitaalsisendisse A1.
See andur mõõdab objekti kaugust ja annab märku, kui käsi on karbile piisavalt lähedal.
- Servomootor:
Ühendati digitaalpordi D13 külge.
Mootor avab kaane 180° peale käe tuvastamist ja sulgeb selle taas neutraalasendisse 90°, kui käsi eemaldatakse. - LCD-ekraan (16×2, LiquidCrystal):
Ühendati digitaalportide D12, D11, D5, D4, D3 ja D2 kaudu.
Ekraan kuvab dünaamilist teavet, tänusõnumeid ja animeeritud emotikone (nt süda, naeratus, kurb nägu). - RGB LED-id:
- Punane LED – D10
- Sinine LED – D9
- Roheline LED – D8
LED-id näitavad süsteemi olekut: - roheline – valmis mündiks,
- sinine – ootab uut sisestust,
- punane – kurb vaikus.
- Pieso-summer (heliandur):
Ühendati pordile D7.
Mündi sisestamisel mängitakse rõõmus meloodia (klassikaline Super Mario Brosi viis).
Süsteemi tööloogika
- Käe tuvastamine:
- Kui kaugus ≤ 30 cm, avaneb rahakarp (servo = 180°),
- Süttib roheline LED,
- LCD-ekraanil kuvatakse: „Tuvastatud! Avan…”.
- Mündi sisestamine:
- Kui käsi eemaldub (> 30 cm), loetakse see sisestuseks,
- 2 sekundi pärast sulgub kaas,
- Mündiloendur suureneb, ekraan tänab („Aitäh!”),
- Esitatakse helisignaal ja kuvatakse müntide koguarv.
- Ooterežiim (taimer):
- Pärast mündi sisestamist küsib seade: „Veel üks?”,
- Kui 5 sekundi jooksul uut sisestust ei toimu:
- Süttib punane LED, kuvatakse „Kurb vaikus…” ja kurb emotikon,
- Süsteem jääb ooterežiimi.
- Katkestus enne viivitust:
- Kui kasutaja läheneb enne 5 sekundi möödumist, tühistatakse ooterežiim ja süsteem läheb tagasi käe tuvastamise tsüklisse.
Uuritud funktsioonid
#define ECHO_PIN A1 | Makro, mis määrab kaugusanduri ECHO pinni. Sellel pinnil mõõdetakse tagasipeegelduva impulsi kestust. |
#define TRIG_PIN A0 | Makro, mis määrab kaugusanduri TRIG pinni. Selle kaudu saadetakse ultraheliimpulss välja. |
pinMode(ECHO_PIN, INPUT); | Määrab ECHO pinni sisendiks, et mõõta andurilt tulevat signaali. |
pinMode(TRIG_PIN, OUTPUT); | Määrab TRIG pinni väljundiks, et saata ultraheliimpulss välja. |
digitalWrite(TRIG_PIN, HIGH); | Seab TRIG pinni kõrgele tasemele (HIGH), et alustada ultraheliimpulsi saatmist. |
delayMicroseconds(10); | Ootab 10 mikrosekundit – see on soovitatav impulsi pikkus HC-SR04 puhul. |
digitalWrite(TRIG_PIN, LOW); | Lõpetab impulsi saatmise, seab TRIG pinni madalaks. |
pulseIn(ECHO_PIN, HIGH, 15000)/57.5; | Mõõdab aega (mikrosekundites), kui kaua ECHO pin on HIGH. Jagades 57,5-ga saadakse kaugus sentimeetrites. |
millis() | Tagastab aja (millisekundites) alates Arduino käivitamisest. Kasutatakse näiteks taimerite ja viivituste mõõtmiseks. |
Kasutamisvõimalused tavaelus
- Õppevahend koolides ja huviringides – aitab õppida elektroonikat ja programmeerimist mänguliselt.
- Laste säästmist harjutav seade – muudab raha kogumise lõbusaks ja motiveerivaks.
- Interaktiivne annetuskast või reklaamiseade – sobib üritustele ja ettevõtetele, et koguda toetust või tähelepanu.
- Näitusel või töötoas demonstratsioon – paelub vaatajat heli, valguse ja emotsioonidega.
- Loovprojektide osa – ühendab tehnika ja kunsti, tuues elu igasse ruumi.
Interaktiivne skeem
Skeem

Video (link)
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();
}
}