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

c++ 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
}
}
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

c++ kood
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
Komponentid:
- Juhe 4x
- Ultraheli andur
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.
kuidas elus rakendada?
Näiteks on see kasulik automaatsete uste väljatöötamisel poe sissepääsu juures
Skeem

koodi näide
#define ECHO_PIN 8
#define TRIG_PIN 7
void setup() {
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
Serial.begin(960);
}
void loop() {
digitalWrite(TRIG_PIN,HIGH);
digitalWrite(TRIG_PIN,LOW);
int distance=pulseIn(ECHO_PIN, HIGH)/50;
Serial.println(distance);
}
https://www.tinkercad.com/things/1SoBVhN5ZTv-magnificent-uusam/editel?sharecode=7Rdyj7ZEvSadAIn9H3E1bkW8YZBcIi0w-ApSgM9_YNI
Ülesanne 7.1 Rahakarp või Prügikast
Komponendid:
- Ultraheli kaugusandur,
- Servo,
- LCD ekraan,
- LED(RGB Led)
- Paber või papp
Eesmärk: Loo automatiseeritud hoiupõrsasprojekt
Kirjeldus: Tänu liikumisandurile tuvastab hoiupõrsas liikumise ja avab servomootori abil mündipesa. Näiteks teeb ta suu lahti või ulatab käe.
Skeem

c++ kood
#include <Servo.h>
#define ECHO_PIN 9
#define TRIG_PIN 8
int ServoPin = 11;
Servo servo;
void setup()
{
pinMode(ECHO_PIN, INPUT); // Устанавливаем режим входа для ECHO_PIN
pinMode(TRIG_PIN, OUTPUT); // Устанавливаем режим выхода для TRIG_PIN
servo.attach(ServoPin); // Подключаем сервомотор к пину ServoPin
Serial.begin(9600); // Инициализируем последовательную связь с скоростью 9600 бит/сек
servo.write(0); // Устанавливаем сервомотор в исходное положение (0 градусов)
}
void loop()
{
digitalWrite(TRIG_PIN, HIGH); // Посылаем импульс на TRIG_PIN
delayMicroseconds(10); // Задержка 10 микросекунд
digitalWrite(TRIG_PIN, LOW); // Завершаем импульс на TRIG_PIN
int distance = pulseIn(ECHO_PIN, HIGH) / 58; // Измеряем расстояние в сантиметрах, используя длительность импульса на ECHO_PIN и деление на 58
if (distance < 50)
{
servo.write(180); // Если расстояние меньше 50 см, поворачиваем сервомотор на 180 градусов
delay(5000); // Ждем 5 секунд
servo.write(0); // Возвращаем сервомотор в исходное положение (0 градусов)
delay(5000); // Ждем еще 5 секунд
}
else if (distance > 50)
{
servo.write(0); // Если расстояние больше 50 см, поворачиваем сервомотор в исходное положение (0 градусов)
}
}
https://www.tinkercad.com/things/kWe1LMhSyeZ-magnificent-gaaris-allis/editel?sharecode=lqRfUz9t8t_NFJLOpMU9tnmVrR4sEnui_zg0AU7Q7Lw
Valmis projekt, mis on kokku pandud tahvlile ja asetatud kasti, mis on hoiupõrsas
Video
Selle projekti käigus õppisin töötama liikumisanduriga, kleeplindiga ja sain aru, et käed kasvavad valest kohast, käsitsi võltsingute jaoks)
Kasutanud funktsioonid:
pinMode()
– Määrab pinile töörežiimi (sisend või väljund) antud pinile.servo.attach()
– Ühendab servo mootori antud piniga.Serial.begin()
– Algatab järjestikuse suhtluse kiirusega 9600 bitti sekundis.
Ülesanne 7.2 Auto parkimisanduriga
Töö eesmärk:
On luua masin, mis tänu andurile loeb, et ees on surve ja keerab ringi
Skeem:

c++ kood
const int trigPin = 3;
const int echoPin = 2;
int dist_check1, dist_check2, dist_check3;
long duration, distance, distance_all;
int dist_result;
//MOTORS VARIABLES
const int mot1f = 6;
const int mot1b = 5;
const int mot2f = 11;
const int mot2b = 10;
int mot_speed = 225; //motors speed
int k = 0; //BRAKE
//LOGICS VARIABLES
const int dist_stop = 25;
//const int dist_slow = 40;
const int max_range = 800;
const int min_range = 0;
int errorLED = 13;
//INITIALIZATION
void setup() {
// Serial.begin(9600);
// bluetoothSerial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(errorLED, OUTPUT);
}
//BASIC PROGRAM CYCLE
void loop() {
delay(1000);
goto start;
start:
int result = ping(); //Check distance
if (result <= min_range){ //Check min range
digitalWrite(errorLED, 1);
delay(500);
}
if (result == max_range || result > max_range){ //Check max range
digitalWrite(errorLED, 1);
delay(500);
}
if (result == dist_stop || result < dist_stop){ //Check stop range
digitalWrite(errorLED, 0);
motors_back();
delay(1000);
motors_stop();
delay(200);
motors_left();
delay(300);
motors_stop();
delay(200);
}
if (result > dist_stop){ //If all is OK, go forward
motors_forward();
delay(100);
}
goto start;
}
////***********************FUNCTIONS*******************************\\\\
int ping(){ //CHECK DISTANCE FUNCTION (3x)
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, 1);
distance = duration/58;
dist_check1 = distance;
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, 1);
distance = duration/58;
dist_check2 = distance;
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, 1);
distance = duration/58;
dist_check3 = distance;
int dist_check_sum;
dist_check_sum = dist_check1 + dist_check2 + dist_check3;
dist_result = dist_check_sum/3;
return dist_result;
}
void motors_forward(){ //MOTORS FORWARD FUNCTION
analogWrite(mot1f, mot_speed);
analogWrite(mot2f, mot_speed);
digitalWrite(mot1b, 0);
digitalWrite(mot2b, 0);
}
void motors_back(){ //MOTORS BACK FUNCTION
digitalWrite(mot1f, 0);
digitalWrite(mot2f, 0);
analogWrite(mot1b, mot_speed);
analogWrite(mot2b, mot_speed);
}
void motors_stop() { //MOTORS STOP FUNCTION
digitalWrite(mot1f, 1);
digitalWrite(mot2f, 1);
digitalWrite(mot1b, 1);
digitalWrite(mot2b, 1);
}
void motors_left() { //MOTORS LEFT FUNCTION
analogWrite(mot1f, mot_speed);
digitalWrite(mot2f, 0);
digitalWrite(mot1b, 0);
analogWrite(mot2b, mot_speed);
}
void motors_right() { //MOTORS RIGHT FUNCTION
digitalWrite(mot1f, 0);
analogWrite(mot2f, mot_speed);
analogWrite(mot1b, mot_speed);
digitalWrite(mot2b, 0);
}
void motors_foward_left() { //FORWARD LEFT FUNCTION
k = mot_speed*0.8;
analogWrite(mot1f, mot_speed);
analogWrite(mot2f, k);
digitalWrite(mot1b, 0);
digitalWrite(mot2b, 0);
}
void motors_foward_right() { //FORWARD RIGHT FUNCTION
k = mot_speed*0.8;
analogWrite(mot1f, k);
analogWrite(mot2f, mot_speed);
analogWrite(mot1b, 0);
analogWrite(mot2b, 0);
}
void motors_back_left() { //BACK LEFT FUNCTION
k = mot_speed*0.8;
digitalWrite(mot1f, 0);
digitalWrite(mot2f, 0);
analogWrite(mot1b, k);
analogWrite(mot2b, mot_speed);
}
void motors_back_right() { //BACK RIGHT FUNCTION
k = mot_speed*0.8;
digitalWrite(mot1f, 0);
digitalWrite(mot2f, 0);
analogWrite(mot1b, mot_speed);
analogWrite(mot2b, k);
}