Controle automático de portão ferroviário usando Arduino e sensor IR

Tempo de leitura: 7 minutes

Sistema automático de controle de portão ferroviário usando Arduino e sensor IR

Cerca de um milhão de pessoas morreram nos últimos 5 anos em travessias de ferrovias não tripuladas em todo o mundo. Pelo menos 1/3 das travessias ferroviárias não são tripuladas devido à sua localização remota e menor tráfego. O Sistema de Controle Automático de Portões Ferroviários usando Sensor IR e Arduino concentra-se no controle sistemático de tráfego de portões ferroviários tripulados e não tripulados. Este projeto não só tornará o sistema mais confiável e preciso, mas também evitará que as autoridades contratem mão de obra para fazer o trabalho. Você pode considerá-lo um investimento único.

O projeto de sistema de controle automático de portão ferroviário faz uso de um Arduino Nano para controlar todo o circuito. Dois servo motores são usados ​​para abrir e fechar os portões da ferrovia. Quatro sensores IR são usados ​​para detectar a chegada ou partida do trem. O objetivo principal é fechar os portões da ferrovia quando o trem se aproximar, de modo a impedir que os veículos cruzem os trilhos. Assim que o trem se afasta da passagem ferroviária, os portões devem se abrir automaticamente para permitir a passagem de veículos.

Componentes Usados

ComponentesEspecificaçãoQuantidade
Arduino NanoNano1
Servo MotorG92
Buzzer1
Led Ir4
Foto-diodo4
LM3582
Trimpop10K4
Fonte de Alimentação12V1
LEDVermelho4
Resistores10K4
Resistores330 Ohms8
Trem de brinquedo1

 

Sistema de Controle Automático de Portão Ferroviário Usando Microcontrolador – Circuito

O controle automático do portão ferroviário faz uso de 3 PCBs. Um é para o Arduino Nano, que funciona como controlador de todo o projeto. Os outros dois PCBs são necessários para os pares IR. Eu projetei todos os três PCBs no software CAD EAGLE. Se você quiser fazer um PCB gravado, consulte as duas figuras abaixo.

Automatic Railway Gate Control – PCB Design for Arduino Nano

 

Projeto de Sistema de Controle Automático de Portão Ferroviário – Projeto PCB para Par de Sensor IR

 

Trilha do Arduino Nano PCB

 

 

Par de sensores infravermelhos – trilha PCB

 

 

Se você quiser fazer o circuito em zero PCB ou placa de ensaio, consulte as duas figuras abaixo.

Par de IR usando LM358 Op-Amp

 

Controle Automático de Portão Ferroviário – Diagrama de Circuito

A saída de todos os sensores é conectada aos pinos A0, A1, A2 e A3 do Arduino.

Os pinos D9 e D10 do Arduino são pinos PWM. Esses pinos são conectados ao servo motor. Os servos são controlados enviando um pulso elétrico de largura variável, ou modulação por largura de pulso (PWM), através do fio de controle.

O par de IR é feito com IC LM358 com amplificador Op duplo. Apenas um IC é necessário para um par. Uma predefinição é usada para calibração.

 

Sensores IR

Dois pares IR são usados no projeto. Se você está familiarizado com a gravação de PCB, você pode gravar a PCB, mas não é necessário usar a PCB gravada, você pode usar dois sensores IR em vez de um par que está facilmente disponível no mercado.

Conexão IR

Se você estiver usando sensores IR prontos, substitua “<” por “>” e “>” por “<” no código, porque a saída do sensor IR pronto é invertida do par de sensores usado no projeto.

 

Trabalhando

Sistema de controle automático de portão ferroviário

 

Quatro sensores são usados no projeto como dois pares de dois sensores; esses sensores são mantidos em ambos os lados da porta de passagens de nível, conforme mostrado na Fig 1. Todos os sensores são conectados ao Arduino.

Sensores IR colocados ao longo da ferrovia (Imagem Original)

Quando o trem chega de qualquer lado, ele primeiro cruza o sensor1 depois cruza o sensor2, dessa forma o Arduino fecha o portão enviando o sinal ao servomotor. Quando o trem sai de qualquer lado ele primeiro cruza o sensor2 depois cruza os sensores, desta forma o Arduino abre o portão.

Servomotores são usados no portão porque é muito fácil de usar e não requer nenhum driver IC ou circuito. O servo motor possui três pinos. O primeiro pino é PWM, o segundo é Vcc e o terceiro é GND. O servo motor recebe o sinal PWM do Arduino e gira o motor em um ângulo fixo de acordo com o ciclo de trabalho do sinal.

 

Calibração

Existem duas predefinições em um circuito de par de infravermelho. Antes da calibração, certifique-se de que o LED IR e os diodos fotográficos estão colocados em frente um do outro e caindo no fotodiodo

Agora gire o preset, até que o LED indicador não acenda. Quando alguma barreira é colocada entre o LED e os diodos fotográficos, o LED indicador começa a brilhar. Este procedimento de calibração deve ser feito para todos os sensores.

 

Código do Programa

#include <EEPROM.h>
#include <Servo.h>

Servo myservo1;
Servo myservo2;

int pos = 0;
int sensor1 = A0;
int sensor2 = A1;
int sensor3 = A2;
int sensor4 = A3;

int RLED1 = 8;
int GLED1 = 9;

int RLED2 = A4;
int GLED2 = A5;

int buzzer = 13;


void setup() {
  //Serial.begin(9600);

  myservo1.attach(5);
  myservo2.attach(6);

  pinMode(sensor1,INPUT);
  pinMode(sensor2,INPUT);
  pinMode(sensor3,INPUT);
  pinMode(sensor4,INPUT);

  pinMode(buzzer,OUTPUT);

  EEPROM.write(0, 0);
  EEPROM.write(1, 0);
}

void loop() {
  
  if (EEPROM.read(1)==0 || EEPROM.read(0)==0){

    while (analogRead(sensor1)>500){
      if (analogRead(sensor2)>500){
        if (EEPROM.read(1)!=1){ EEPROM.write(1, 1);}
        if (EEPROM.read(0)!=1){ EEPROM.write(0, 1);} 
        
       // Serial.println("X");
        delay(100);       
        }}

    while (analogRead(sensor3)>500){
      if (analogRead(sensor4)>500){
        if (EEPROM.read(1)!=1){ EEPROM.write(1, 1);}
        if (EEPROM.read(0)!=1){ EEPROM.write(0, 1);} 
        // Serial.println("Y");
        delay(100); 
        }}   
  }

  if (EEPROM.read(1)==1 || EEPROM.read(0)==0){

    while (analogRead(sensor2)>500){
      if (analogRead(sensor1)>500){
        if (EEPROM.read(1)!=0){ EEPROM.write(1, 0);}
        if (EEPROM.read(0)!=1){ EEPROM.write(0, 1);}
        
        //Serial.println("Z"); 
        delay(100);
        }}

    while (analogRead(sensor4)>500){
      if (analogRead(sensor3)>500){
        if (EEPROM.read(1)!=0){ EEPROM.write(1, 0);}
        if (EEPROM.read(0)!=1){ EEPROM.write(0, 1);}
        //Serial.println("A"); 
        delay(100);
        }}   
  }

  if (EEPROM.read(1)==1){     //Portão Aberto
    if (pos != 90){
      for (pos = 0; pos < 90; pos += 1){
      myservo1.write(pos);
      myservo2.write(pos);
      // Serial.println(pos);
      digitalWrite(buzzer,HIGH);
      delay(10);
      digitalWrite(buzzer,LOW);
      delay(10);
    }}
    
    //Serial.println("Portão Aberto");
    digitalWrite(buzzer,LOW);
    if (EEPROM.read(0)!=0)  {EEPROM.write(0, 0);  /*Serial.println("OK");*/}
  }
   
  if (EEPROM.read(1)==0){     //Portão Fechado
    if (pos != 0){
     for (pos = 90; pos > 0; pos -= 1){
         myservo1.write(pos);
         myservo2.write(pos);
         digitalWrite(buzzer,HIGH);
         delay(10);
         digitalWrite(buzzer,LOW);
         delay(10);
    }}
    
    //Serial.println("Portão fechado");    
    if (EEPROM.read(0)!=0)  {EEPROM.write(0, 0); Serial.println("OK");}
  }  


}

No código, duas bibliotecas “EEPROM.h” e “Servo.h” são definidas. No projeto, dois servomotores são usados, portanto, na quarta e quinta linhas, dois servomotores são definidos, chamados myservo1 e myservo2.

Agora, alguns inteiros estão declarados, “pos” é o inteiro da posição do servo. Depois disso, quatro sensores são declarados chamados “sensor1”, “sensor2”, “sensor3” e “sensor4” são usados ​​para conectar o Arduino após um número inteiro ser declarado pelo nome buzzer.

Na seção de configuração vazia, ambos os servo motores são anexados pela função “myservo1.attach(5)” nesta função 5 é o número do pino. Agora todos os quatro sensores são declarados como dispositivos de entrada usando a função “pinMode(sensor1, INPUT)”. Buzzer é declarado como dispositivo de Saída usando a função “pinMode(buzzer, OUTPUT)”. Agora a função EEPROM.write(0,0) é usada para escrever EEPROM do Arduino.

Na seção de loop vazio se a condição for usada, quando o valor no endereço 1 e endereço 2 da EEPROM se tornar zero, o sistema entrará em loop. Agora, um loop while é usado quando o trem vem e cruza o sistema senaor1 neste loop, depois disso um if é usado quando o trem cruza o senaor2, a EEPROM(0) e a EEPROM(1) são atualizados por um. Esta mesma abordagem é usada para sensor3 e sensor3.

Outro loop “se” é usado na linha 48 e torna-se verdadeiro quando o valor de EEPROM(0) é Zero e EEPROM(1) é um. Depois disso, o loop while é usado e se torna verdadeiro quando o trem cruza o senaor2 e quando o trem cruza o senaor1, a EEPROM(1) é atualizada por Zero e a EEPROM(0) é atualizada por Um. E esta mesma abordagem é usada para sensor4 e sensor3.

EEPROM(1) indica o status da porta, quando o valor da EEPROM(1) é Uma porta é aberta e quando EEPROM(1) é Zero, a porta está fechada

Agora, na linha 65, um loop if é usado, ele se torna verdadeiro quando o valor de EEPROM(1) é Um, agora o servo gira de zero a 90 graus e a porta está aberta. A função “digitalWrite” é usada para ligar e desligar a campainha nas linhas 70 e 72. Depois que todo o EEPROM(0) é atualizado para zero. Essa mesma abordagem é usada para fechar o portão.