Bezpečnostní dveře

Cílem projektu bylo vytvořit inteligentní systém, který detekuje otevřené a zavřené dveře na základě senzoru detekce překážek a umožňuje manuální ovládání pomocí tlačítek. Tento systém je navržen tak, aby zlepšil bezpečnost a kontrolu přístupu do prostorů, kde se pohybuje VZV, aby byl řidič VZV informován zvukovou signalizací o přítomnosti osoby v konkrétním sektoru.

Schéma zapojení:

  • Arduino Pin 2    ->  Relé IN
  • Arduino Pin 3    ->  Signálový pin IR senzoru
  • Arduino Pin 4    ->  Jeden pin tlačítka pro otevření (openbutton)
  • Arduino Pin 5    ->  Jeden pin tlačítka pro zavření (closebutton)
  • Arduino Pin 6    ->  Rezistor -> Anoda LED2
  • Arduino Pin 7    ->  Rezistor -> Anoda LED1
  • Arduino Pin 8    ->  IN1 na ULN2003
  • Arduino Pin 9    ->  IN2 na ULN2003
  • Arduino Pin 10  ->  IN3 na ULN2003
  • Arduino Pin 11  ->  IN4 na ULN2003

 Kód pro Arduino:

#include <Arduino.h>

const int rele1 = 2;
const int IR = 3;
const int led1 = 7;
const int led2 = 6;
const int IN1 = 8;
const int IN2 = 9;
const int IN3 = 10;
const int IN4 = 11;
const int openbutton = 4;
const int closebutton = 5;
int lastsensorState = HIGH;
const int stepsPerRevolution = 2048;  // Počet kroků pro úplnou otáčku (pro 24BYJ48)
const int stepsForOpen = 512;  // Upravit podle mechaniky dveří
const int stepsForClose = 512; // Upravit podle mechaniky dveří

unsigned long lastDebounceTimeOpen = 0; // čas posledního stisku openbutton
unsigned long lastDebounceTimeClose = 0; // čas posledního stisku closebutton
const unsigned long debounceDelay = 50; // zpoždění pro debouncing v milisekundách

int lastButtonOpenState = HIGH; // poslední stav tlačítka openbutton
int lastButtonCloseState = HIGH; // poslední stav tlačítka closebutton

// deklarace funkcí
void stepForward();
void stepBackward();
void moveMotor(int steps, bool direction);

void setup() {
  Serial.begin(9600);
  pinMode(rele1, OUTPUT);
  pinMode(IR, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  pinMode(openbutton, INPUT_PULLUP);
  pinMode(closebutton, INPUT_PULLUP);
}

void loop() {
  int sensorState = digitalRead(IR);
  int buttonOpenState = digitalRead(openbutton);
  int buttonCloseState = digitalRead(closebutton);

  if (sensorState == HIGH) {
    digitalWrite(rele1, LOW);
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
  } else {
    digitalWrite(rele1, HIGH);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
  }

  // Výpis změny stavu na sériový monitor z IR senzoru
  if (sensorState == HIGH & lastsensorState == LOW) {
    Serial.println("Open door");
  }
  if (sensorState == LOW & lastsensorState == HIGH) {
    Serial.println("Closed door");
  }
  lastsensorState = sensorState;

  // Debouncing pro openbutton
  if (buttonOpenState != lastButtonOpenState) {
    lastDebounceTimeOpen = millis(); // reset debounce časovače
  }

  if ((millis() - lastDebounceTimeOpen) > debounceDelay) {
    if (buttonOpenState == LOW) {
      digitalWrite(rele1, LOW);
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
      Serial.println("Manual door opening");
      moveMotor(stepsForOpen, true);
    }
  }
  lastButtonOpenState = buttonOpenState;

  // Debouncing pro closebutton
  if (buttonCloseState != lastButtonCloseState) {
    lastDebounceTimeClose = millis(); // reset debounce časovače
  }

  if ((millis() - lastDebounceTimeClose) > debounceDelay) {
    if (buttonCloseState == LOW) {
      Serial.println("Manual door closing");
      moveMotor(stepsForClose, false);
    }
  }
  lastButtonCloseState = buttonCloseState;
}

// funkce pro ovládání krokového motoru
void moveMotor(int steps, bool direction) {
  for (int i = 0; i < steps; i++) {
    if (direction) {
      stepForward();
    } else {
      stepBackward();
    }
    delay(1); // Nastavení rychlosti krokování (upravit podle potřeby)
  }
}

// Sekvence pro krokování dopředu
void stepForward() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delay(2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(2);
}

// Sekvence pro krokování dozadu
void stepBackward() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delay(2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(2);

  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(2);
}

Další podobné články

ROBOTICKÉ RAMENO

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy. 

Electronic TiltMaze

Cílem tohoto projektu je vytvoření jednoduchého ovládacího systému, který umožňuje naklápění dvou servomotorů pomocí analogového joysticku. Platforma řízená servomotory může simulovat pohyb například v ose X a Y — tedy naklánění doleva/doprava a dopředu/dozadu. Tento systém může sloužit jako základ pro různé aplikace:

- Manuální ovládání kamery nebo senzoru (např. na pohyblivé konstrukci nebo robotovi)
- Interaktivní ovládací panel pro školní projekty nebo herní ovladač