Automatic bus door closer ­čÜî

Introducere

Mecanismul are rolul de a realiza ├«nchiderea u╚Öilor unui mijloc de transport ├«n comun (ex. autobuz) ├«n condi╚Ťii de siguran╚Ť─â. Atunci c├ónd un c─âl─âtor dore╚Öte s─â urce ├«n autobuz, este posibil ca u╚Öile s─â se ├«nchid─â brusc ╚Öi s─â ├«i prind─â haina, geanta sau chiar s─â ├«l r─âneasc─â. Pentru a evita astfel de situa╚Ťii, mecanismul folosit va detecta dac─â se afl─â persoane ├«n proximitatea u╚Öilor mijlocului de transport ├«n comun ├«nainte de a le ├«nchide.

Descriere general─â

Se va lega un ventilator la placa Arduino Uno ╚Öi un display LCD. Ventilatorul va porni atunci c├ónd vehiculul se deplaseaz─â ╚Öi reprezinta motorul acestuia, a c─ârui vitez─â va fi reglat─â prin intermediul unui poten╚Ťiometru ╚Öi afi╚Öat─â pe LCD (se face o conversie din RPM ├«n km/h).

Pentru a ├«nchide/deschide u╚Öile autobuzului se apas─â un buton ╚Öi este ac╚Ťionat servomotorul. C├ónd u╚Öile sunt ├«nchise un LED RGB se va aprinde ro╚Öu, iar c├ónd sunt deschise acesta va fi aprins verde. De asemenea, starea u╚Öilor va fi afi╚Öat─â pe LCD.

Se amplasează senzorul de mișcare PIR la ușa autobuzului pentru a vedea dacă se află călători în apropiere care vor să urce/coboare din autobuz, starea acestuia va fi activă pentru 3 secunde de la ultima mișcare înregistrată.

Dac─â se apas─â butonul pentru ├«nchiderea u╚Öilor ╚Öi senzorul indic─â faptul c─â se afl─â un c─âl─âtor ├«n apropiere, u╚Öile vor r─âm├óne deschise. De asemenea, pentru c─â se m─âsoar─â ╚Öi vitez─â autobuzului, am ad─âugat o func╚Ťionalitate c─â u╚Öile s─â se ├«nchid─â automat dup─â ce este dep─â╚Öit─â o anumit─â vitez─â (10km/h).

Schema bloc

Hardware Design

List─â componente:
  • Arduino UNO
  • Buton
  • LED RGB
  • PIR senzor mi╚Öcare
  • Poten╚Ťiometru
  • Ventilator
  • Servomotor
  • Display LCD 16×2
  • Rezistor 220╬ę x 2 pentru LED RGB
  • Rezistor 1k╬ę pentru contrast LCD
  • Rezistor 10k╬ę pentru buton
  • Dioda redresoare 1N4007
  • Tranzistor 2N2222

Schema electric─â

Software Design

Dezvoltarea codului s-a realizat folosind Arduino IDE.

Func╚Ťionare

  • Ini╚Ťial u╚Öile autobuzului sunt ├«nchise.
  • Viteza acestuia este reglat─â cu ajutorul poten╚Ťiometrului ╚Öi convertite ├«n km/h folosind map.
  • ├Än func╚Ťie de vitez─â ventilatorul va porni sau se va opri (c├ónd este sub 3km/h).
  • ├Än bucla principal─â se afi╚Öeaz─â ├«n permanen╚Ť─â pe LCD viteza autobozului ╚Öi starea u╚Öilor acestuia cu ajutorul bibliotecii LiquidCrystal, iar cu biblioteca Servo se realizeaz─â mi╚Öcarea u╚Öilor prin intermediul servomotorului.
  • Dac─â viteza de 10km/h este dep─â╚Öit─â, u╚Öile se vor ├«nchide singure f─âr─â a ap─âsa pe buton.
  • Atunci c├ónd este ac╚Ťionat butonul u╚Öile se vor deschide (doar dac─â autobuzul st─â pe loc) sau ├«nchide.
  • Se citesc ├«n permanen╚Ť─â date de la senzorul de mi╚Öcare atunci c├ónd se dore╚Öte ├«nchiderea u╚Öilor.
  • Dac─â a fost detectat─â mi╚Öcare ├«n proximitatea u╚Öilor ├«n momentul respectiv, acestea se vor deschide la loc ╚Öi se va afi╚Öa un mesaj cu Someone at the door!.

Cod surs─â

Cod surs─â

automatic_bus_door_closer.c
#include <LiquidCrystal.h>
#include <Servo.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
// Variables
Servo servo;
int speed = 0;		   // current vehicle speed
int pos = 0;		   // current servomotor position
int ledState = LOW;	   // the current state of the output pin
int buttonState;	   // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
float startTime;	   // when motion is detected and  doors fully open
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay =
    10; // the debounce time; increase if the output flickers
bool motionDetected = false;
 
// Constants
const int closed_pos = 0, open_pos = 130, servo_delay = 15;
const int max_speed = 10, start_moving_speed = 3;
const float printMotionTime = 2500;
const unsigned int calibrationTime = 60;
 
// Pins
const int sensorPin = 6;
const int buttonPin = 7;
const int ledPinRed = 8;
const int servoPin = 9;
const int motorPin = 10;
const int ledPinGreen = 13;
 
void setup()
{
	// Set up the LCD's number of columns and rows:
	lcd.begin(16, 2);
	pinMode(sensorPin, INPUT);
	pinMode(buttonPin, INPUT);
	pinMode(ledPinGreen, OUTPUT);
	pinMode(ledPinRed, OUTPUT);
	pinMode(motorPin, OUTPUT);
 
	Serial.begin(9600);
	servo.attach(servoPin, 500, 2500);
	servo.write(closed_pos);
 
	for (int i = 0; i < calibrationTime; i++) {
		lcd.setCursor(0, 0);
		lcd.print("Calibrating");
		lcd.setCursor(5, 1);
		lcd.print("sensor...");
		delay(1000);
	}
	lcd.clear();
 
	// Make sure vehicle is not moving when the simulation begins
	speed = map(analogRead(A0), 0, 999, 0, 115);
	speed -= speed;
}
 
void print_movement()
{
	lcd.setCursor(0, 0);
	lcd.print("Someone at the");
	lcd.setCursor(5, 1);
	lcd.print("door!");
}
 
void print_speed()
{
	// Conversion from RMP to km/h
	speed = map(analogRead(A0), 0, 999, 0, 115);
 
	if (speed >= start_moving_speed)
		digitalWrite(motorPin, HIGH);
	else
		digitalWrite(motorPin, LOW);
 
	lcd.setCursor(0, 0);
	lcd.print("Speed: ");
	lcd.print(speed);
	lcd.print(" km/h   ");
}
 
void print_door_state()
{
	lcd.setCursor(0, 1);
	lcd.print("Door: ");
	if (!ledState)
		lcd.print("Closed");
	else
		lcd.print("Opened");
}
 
void open_door()
{
	for (int i = pos; i <= open_pos; i++, pos++) {
		if (speed >= max_speed) {
			ledState = LOW;
			close_door();
			break;
		}
 
		// Tell servo to go to position in variable 'pos'
		servo.write(pos);
		delay(servo_delay);
 
		if (motionDetected) {
			print_movement();
		} else {
			print_speed();
		}
	}
	startTime = millis();
}
 
void close_door()
{
	for (int i = pos; i >= closed_pos; i--, pos--) {
		if (digitalRead(sensorPin) == HIGH && speed < max_speed) {
			ledState = HIGH;
			motionDetected = true;
			lcd.clear();
			open_door();
			break;
		}
 
		// Tell servo to go to position in variable 'pos'
		servo.write(pos);
		delay(servo_delay);
		print_speed();
	}
}
 
void loop()
{
	// Set the LED:
	if (ledState) {
		digitalWrite(ledPinRed, LOW);
		digitalWrite(ledPinGreen, HIGH);
	} else {
		digitalWrite(ledPinGreen, LOW);
		digitalWrite(ledPinRed, HIGH);
	}
 
	if (motionDetected) {
		if (millis() - startTime < printMotionTime) {
			print_movement();
			return;
		}
 
		lcd.clear();
		motionDetected = false;
		Serial.println(pos);
		return;
	}
 
	print_speed();
	print_door_state();
 
	if (ledState != LOW && speed >= max_speed) {
		ledState = LOW;
		close_door();
		return;
	}
 
	// Read the state of the switch into a local variable
	int reading = digitalRead(buttonPin);
 
	// If the switch changed, due to noise or pressing:
	if (reading != lastButtonState) {
		// Reset the debouncing timer
		lastDebounceTime = millis();
	}
 
	if ((millis() - lastDebounceTime) > debounceDelay) {
 
		// If the button state has changed:
		if (reading != buttonState) {
			buttonState = reading;
 
			// Only toggle the LED if the new button state is HIGH
			if (buttonState == HIGH)
				if (!ledState && speed < start_moving_speed) {
					ledState = HIGH;
					open_door();
				}
 
				else {
					ledState = LOW;
					close_door();
				}
		}
	}
 
	// Save the reading, it'll be the lastButtonState:
	lastButtonState = reading;
}

Rezultate Obţinute

Concluzii

Realiz├ónd acest proiect am observat c─â lucrurile ├«n practic─â stau mult mai diferit fa╚Ť─â de cum m─â a╚Öteptam. Ini╚Ťial am implementat circuitul ├«n Tinkercad ╚Öi a mers foarte bine, ├«ns─â ├«n realitate piesele (├«n special motoarele) consuma foarte mult curent ╚Öi perturbau func╚Ťionarea la parametrii normali a celorlalte componente (de ex. LCD-ul se stingea c├ónd func╚Ťiona motorul DC, motiv pentru care l-am ├«nlocuit cu un ventilator alimentat separat de o baterie de 9V). ├Änt├ómpin├ónd astfel de probleme ╚Öi ├«ncerc├ónd s─â le rezolv, pot spune c─â am ├«nteles mai bine anumite no╚Ťiunile de electronic─â ╚Öi sunt mul╚Ťumit de rezultatul final.

Download

Jurnal

  • 13/05/2022 - Publicare Introducere + Descriere general─â
  • 27/05/2022 - Schema electric─â + Software design
  • 31/05/2022 - Modificare circuit, ├«nlocuire motor DC cu ventilator ╚Öi ad─âugare baterie 9V

Bibliografie/Resurse

pm/prj2022/rstanescu/automatic-bus-door-closer.txt ┬Ě Last modified: 2022/06/02 03:36 by stefan.cocioran
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0