Katse 7. Mootor ja kaugusemõõtmise andur

Töö protsess:

See kood juhib mootorit (H-mootori sild), kasutades Arduino ja L293D draiverit. See määrab ka mootori pöörlemissuuna: kui lüliti on sisse lülitatud, siis mootor pöörleb.

Kasutatud:
1x Arduino UNO
1x Mootor
1x L293D
1x taksis 220 om
1x nupp
1x Patarei
18x Juhtmed

Kood:

int switchPin = 7;      // lüliti 1
int motor1Pin1 = 11;     // viik 2 (L293D)
int motor1Pin2 = 12;     // viik 7 (L293D)
int enablePin = 13;      // 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
    }
}

Foto:

Töö protsess:

See kood juhib mootorit kahe lüliti ja potentsiomeetri abil. Üks lüliti käivitab mootori ja reguleerib selle kiirust, teine lüliti seab pöörlemissuuna. Potentsiomeeter võimaldab muuta kiirust.

Kasutatud:
1x Arduino UNO
1x Potentsiomeetr
2x Nupp
1x L293D
1x Patarei
1x Mootor
2x taksis 220om
23x Juhtmed

Kood:

int switchPin = 4; // lüliti 1 
int switchPin2 = 3; // lüliti 2 
int potPin = A0; // potentsiomeeter 
int motor1Pin1 = 7; // viik 2 (L293D) 
int motor1Pin2 = 12; // viik 7 (L293D) 
int enablePin = 13; // 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 
 } 
}

Foto:

Töö protsess:

Seda koodi kasutatakse kauguse mõõtmiseks ultrahelianduri abil.

Kasutatud:
1x Arduino UNO
1x Ultrahelianduri
4x Juhtmed

Kood:

#define ECHO_PIN 9
#define TRIG_PIN 10

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

Foto:

Töö protsess:

See kood juhib mootorit, LED-i ja helisignaali, kasutades ultraheli kaugusandurit. Sumisti kõlab ja LED lamp süttib, kui objekt on lähemal kui 50 cm.

Kasutatud:

1x Arduino Uno
1x LED lamp
1x Buzzer
1x Ultrahelianduri
1x Mootor
2x 220 om taksi
10x Juhtmed

Kood:

#define ECHO_PIN 4
#define TRIG_PIN 5
int motorPin1=12;
int distance=1;
int LedPin=13;
int duration;
const int buzzerPin = 11;
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);
  }
}

Foto:

7.4 Katse Mootiri käivitamine L298N draiveriga.

Töö protsess:

L298N mootorijuhi abil saab juhtida kahte mootorit või ühte samm-mootorit. Maksimaalne voolutarve ei tohiks ületada 2 amprit.

Seda juhitakse sisendite IN1, IN2, IN3 ja IN4 kaudu, kus signaalide vaheldumine määrab mootori pöörlemissuuna. ENA ja ENB viike kasutatakse eraldi kanalite juhtimiseks ja neid saab kasutada kahes režiimis:

Aktiivne režiim – võimaldab pöörlemiskiirust juhtida PWM-signaali abil.

Passiivne režiim – mootor töötab täisvõimsusel, kuid säästab kontrolleri viike.

Kasutatud:
2x Arduino UNO
1x L298 draiveriga
2x Mootor
12x Juhtmed

Foto:

Ülesanne 7.1 Rahakarp või Prügikast.

Töö protsess:

Pärast koodi käivitamist tervitab see teid ja seejärel käivitab loenduri, mis on väga kerge algoritm. Kui teie käsi on selle lähedal, avaneb kaas ja RGB LED-lamp süttib siniselt (passiivses ajas süttib see roheliselt) ning lisab ekraanil olevale loendurile +1. Seejärel sulgub see ja ootab, kuni te matenka uuesti sisse panete.

Kasutatud:
1x Arduino UNO
1x Ultrahelianduri
1x RGB LED lamp
4x 220om takist
1x LCD 16×2
1x Potentsiomeeter
1x Servo mootor
25x Juhtmed

Kood:

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

const int trigPin = 1;
const int echoPin = 2;
const int servoPin = 13;
const int redPin = 5;
const int greenPin = 4;
const int bluePin = 3;

const int openAngle = 90;
const int closeAngle = 0;
const int detectionDist = 15;
const long sadTimeout = 10000;

Servo servo;
LiquidCrystal lcd(6, 7, 9, 10, 11, 12);
int coinCount = 0;
unsigned long lastDetectionTime = 0;
bool lidOpen = false;

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

  servo.attach(servoPin);
  servo.write(closeAngle);

  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Tere tulemast!");
  lcd.setCursor(0, 1);
  lcd.print("Sastuspanka!");

  setColor(0, 0, 255);

  delay(1000);
}

void loop() {
  long distance = measureDistance();

  if (distance > 0 && distance < detectionDist) {
    handleDetection();
  } 
  else {
    if (lidOpen) {
      if (millis() - lastDetectionTime > 500) {
        closeLid();
      }
    } 
    else {
      checkSadState();
    }
  }

  updateDisplay();
}

long measureDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH);
  return duration * 0.034 / 2;
}

void handleDetection() {
  lastDetectionTime = millis();

  if (!lidOpen) {
    openLid();
    coinCount++;
    setColor(0, 255, 0);
    delay(1000);
  }
}

void openLid() {
  servo.write(openAngle);
  lidOpen = true;
}

void closeLid() {
  servo.write(closeAngle);
  lidOpen = false;
  setColor(0, 0, 255);
}

void checkSadState() {
  if (millis() - lastDetectionTime > sadTimeout) {
    setColor(255, 0, 0);
  }
}

void updateDisplay() {
  lcd.clear();

  if (lidOpen) {
    lcd.setCursor(0, 0);
    lcd.print("Aitah mundi eest!");
    lcd.setCursor(0, 1);
    lcd.print("Mundid: ");
    lcd.print(coinCount);
  } else {
    lcd.setCursor(0, 0);
    lcd.print("Mundid kokku: ");
    lcd.print(coinCount);

    lcd.setCursor(0, 1);
    if (millis() - lastDetectionTime > sadTimeout) {
      lcd.print("Ootan juba kaua:(");
    } else if (coinCount > 0) {
      lcd.print("Lahe, sa sastad!$");
    } else {
      lcd.print("Pane esimene munt!");
    }
  }

  delay(200);
}

void setColor(int red, int green, int blue) {
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);
}

Foto:

Video:

7.2 Parking

Töö protsess:
Kui kood käivitatakse, ilmub ekraanile vabade kohtade arv ja tervituskiri. Kui auto saabub ja on liiga lähedal, avaneb ja sulgub tõkkepuu 1 sekundi pikkuse viivitusega ning kood saab uuesti käivitada. Kui vabu kohti enam ei ole, ilmub ekraanile teade, et kohti enam ei ole.

Kasutatud:

1x Arduino UNO
1x Ultrahelianduri
1x RGB LED lamp
4x 220om takist
1x LCD 16×2
1x Potentsiomeeter
1x Servo mootor
25x Juhtmed

Kood:

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

const int trigPin = 2;
const int echoPin = 3;
const int servoPin = 13;
const int redPin = 8;
const int greenPin = 5;
const int bluePin = 4;

const int openAngle = 90;
const int closeAngle = 0;
const int detectionDist = 15;
const long sadTimeout = 10000;
const long debounceDelay = 1000;

Servo servo;
LiquidCrystal lcd(6, 7, 9, 10, 11, 12);

int parkingSpots = 5;
int currentCars = 0;
bool isBarrierOpen = false;
unsigned long lastCarTime = 0;
bool isParkingFull = false;
bool carDetected = false;
unsigned long lastActivationTime = 0;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  servo.attach(servoPin);
  servo.write(closeAngle);
  
  lcd.begin(16, 2);
  lcd.print("Parkimissusteem");
  delay(2000);
  updateDisplay();
  
  setRGBColor(0, 255, 0);
}

void loop() {
  long duration, distance;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  
  if (distance <= detectionDist && distance > 0) {
    if (!carDetected && (millis() - lastActivationTime > debounceDelay)) {
      carDetected = true;
      lastActivationTime = millis();
      
      if (!isBarrierOpen && !isParkingFull) {
        openBarrier();
        currentCars++;
        if (currentCars >= parkingSpots) {
          isParkingFull = true;
        }
        updateDisplay();
      }
    }
    lastCarTime = millis();
  } else {
    carDetected = false;
  }
  
  if (isBarrierOpen && (millis() - lastCarTime > sadTimeout)) {
    closeBarrier();
  }
  
  delay(100);
}

void openBarrier() {
  servo.write(openAngle);
  isBarrierOpen = true;
  setRGBColor(0, 0, 255);
  delay(1000);
  setRGBColor(0, 255, 0);
}

void closeBarrier() {
  servo.write(closeAngle);
  isBarrierOpen = false;
  setRGBColor(255, 0, 0);
  delay(1000);
  if (isParkingFull) {
    setRGBColor(255, 255, 0);
  } else {
    setRGBColor(0, 255, 0);
  }
}

void setRGBColor(int red, int green, int blue) {
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);
}

void updateDisplay() {
  lcd.clear();
  lcd.print("Vabu kohti: ");
  lcd.print(parkingSpots - currentCars);
  lcd.print("/");
  lcd.print(parkingSpots);
  
  lcd.setCursor(0, 1);
  if (isParkingFull) {
    lcd.print("TÄIS!");
  } else {
    lcd.print("Tere tulemast!");
  }
}

Foto:

Video: