SISTEMA INTEL·LIGENT DE REGULACIÓ DE TRÀNSIT TERRESTRE I FLUVIAL AMB ARDUINO.
TECNOLOGIA 4ESO - 1 BATX Institut Bellvitge. Curs 2015-16

CIRCUIT 1

Detecció de vaixells - Accionament del pont i les barreres - Enviament de dades a les plaques receptores


Esquema de connexions:

Pont1 i Pont2: servos de rotació contínua.
Barr1 i Barr2: servos estàndar.
FC1 i FC2: finals de carrera de baixada ponts.
Detecta Arriva i Detecta Marxa: sensors d'ultrasons.
TX: transmissió de dades pel port sèrie. Connexió de TX-placa1 a RX-placa2 i a RX-placa3.
Alimentació servos: 8 piles AA.

Diagrama de flux:

* Ponts i barreres. En vermell: accions que es realitzen, en negre: accions que es mantenen

Valors amb que treballem:
// valors servos:
#include <Servo.h> // llibreria per treballar amb servos
Servo Pont1;    // pont dret
Servo Pont2;    // pont esquerre
Servo Barrera1; // barrera dreta
Servo Barrera2; // barrera esquerre
int FC1 = 12;   // final de carrera dret connectat al pin 12
int FC2 = 13;   // final de carrera esquerre connectat al pin 13
int pos = 0;    // variable per desar la posició dels servos barreres

// pins utilitzats pels ultrasons:
int trig_1 = 7;  // trig ultrasons arrivada vaixell
int echo_1 = 6;  // echo ultrasons arrivada vaixell
int trig_2 = 5;  // trig ultrasons marxa vaixell
int echo_2 = 4;  // echo ultrasons marxa vaixell

// variables:
long durada_1,distancia_1;  // per al càlcul de distància d'arrivada vaixell
long durada_2,distancia_2;  // per al càlcul de distància de marxa vaixell
int x = 0;   // defineix si hi ha vaixell o no
int i = 0;   // per definir el nombre de cops que s'executa una acció mitjançant bucle while
int X1, X2;  // per les lectures dels finals de carrera

// valors a depurar:
int vaixell_arriva = 40;  // distància a la qual es comença a detectar vaixell que arriva
int vaixell_entra= 20;    // distància a la qual ha de pujar el pont
int vaixell_marxa = 20;   // distància de detecció del sensor 2 (vaixell que marxa)
int temps=2700;       // temps de pujada/baixada pont1 
int temps_P1= 265;    // temps de més que necessita pont1 respecte a pont2 en la baixada
int temps_P2 = 1740;  // temps de més que necessita pont2 respecte a pont1 en la pujada
int adalt = 180;      // posició límit barreres verticals
int abaix = 90;       // posició límit barreres horitzontals
Configuració
void setup() 
{
  pinMode(trig_1,OUTPUT);  // emissor 1 (arraivada vaixell)
  pinMode(trig_2,OUTPUT);  // emissor 2
  pinMode(echo_1,INPUT);   // receptor 1 (marxa vaixell)
  pinMode(echo_2,INPUT);   // receptor 2

  Pont1.attach(8);  // activa els servos (envia senyals)
  Pont2.attach(9);
  Barrera1.attach(10);
  Barrera2.attach(11);
  
  Serial.begin(9600);  // per enviar dades pel port sèrie a les altres plaques
  Serial.write('A');   // dada inicial a enviar
}
Definició de les accions
void loop() 
{
  posicio_inicial();
  detecta_arriva();
    
  if (x==0)    
  {
   if (distancia_1 < vaixell_arriva) // d<40 cm
   { if (distancia_1 > vaixell_entra)  baixa_barreres(); }  // d>20 cm - x=1
  }

  else if (x==1)
  { if (distancia_1 < vaixell_entra)  puja_pont(); }  // x=2

  else if (x==2)
  {
    detecta_marxa();
    if (distancia_2 < vaixell_marxa)   baixa_pont();
    else if ((X1==0)&&(X2==0)) puja_barreres();
  }

  //depuracio();  // mostra valors de variables per depuració
  delay(50);  // per estabilitzar
}
Funcions per la detecció de vaixells
void detecta_arriva()
{
  // detecció de vaixell que arriva:
  digitalWrite (trig_1,LOW);
  delayMicroseconds (2);
  digitalWrite (trig_1,HIGH);
  delayMicroseconds (10);
  digitalWrite (trig_1,LOW);
  durada_1 = pulseIn (echo_1,HIGH);
  distancia_1 = durada_1 / 58.2;
}

void detecta_marxa()
{
  // detecció de vaixell que marxa:
  digitalWrite (trig_2,LOW);
  delayMicroseconds (2);
  digitalWrite (trig_2,HIGH);
  delayMicroseconds (10);
  digitalWrite (trig_2,LOW);
  durada_2 = pulseIn (echo_2,HIGH);
  distancia_2 = durada_2 / 58.2;
}
Posicionament inicial
void posicio_inicial()
{
  Barrera1.write(adalt); 
  Barrera2.write(adalt);
  Barrera1.detach();
  Barrera2.detach();
  Pont2.detach();                 // desactiva pont2
  X1 = digitalRead(FC1);          // llegeix el final de carrera 1
  if (X1 == 1) Pont1.write(0);    // si FC1 no activat el pont ha de baixar
  else                            // quan FC1 s'activi ...
  {
    delay(temps_P1);
    Pont1.detach();               // desactiva pont1
    X2 = digitalRead(FC2);        // llegeix el final de carrera 2
    Pont2.attach(9);              // activa pont2
    if (X2 == 1) Pont2.write(0);  // si FC2 no activat el pont ha de baixar
    else Pont2.detach();          // quan FC2 s'activi, desactiva el servo esquerre  
  }
}
Definició dels moviments del pont i les barreres
void baixa_barreres()
{
  Serial.write('B');
  delay(1000);
  Serial.write('C');
  delay(100);
  Barrera1.attach(10);
  Barrera2.attach(11);
  for(pos=adalt; pos>=abaix; pos-=1)  // mou grau a grau   
  {                               
    Barrera1.write(pos); 
    Barrera2.write(pos); 
    delay(15);   
  } 
  Barrera1.detach();
  Barrera2.detach();
  x=1;
}

void puja_pont()
{
  Serial.write('D');
  Pont1.attach(8);   // activa els servos
  Pont2.attach(9);  
  Pont1.write(180);  // puja els ponts
  Pont2.write(180); 
  delay(temps);      // temps de pujada dels dos ponts a l'hora
  Pont1.detach();    // desactiva pont1
  delay(temps_P2);  // temps de més de pujada per al pont2
  Pont2.detach();    // desactiva pont2 
  x=2;
  Serial.write('E');
}

void baixa_pont()
{
  Pont1.attach(8);                 // activa pont1
  Pont2.attach(9);              // activa pont2
  Pont1.write(0);
  Pont2.write(0);
  X1 = digitalRead(FC1);          // llegeix el final de carrera 1
  X2 = digitalRead(FC2);
  if (X1 == 0)  // si FC1  activat
  {
    delay(temps_P1);
    Pont1.detach();     
  }
  if (X2 == 0)  Pont2.detach();
  Serial.write('F');
  x=3;
}

void puja_barreres()
{
  Barrera1.attach(10);
  Barrera2.attach(11); 
  for(pos=abaix; pos<=adalt; pos+= 1) 
  {                                  
    Barrera1.write(pos);
    Barrera2.write(pos); 
    delay(15);   
  } 
  Barrera1.detach();
  Barrera2.detach();
  delay(50);
  Serial.write('A');
  x=0;
  }
Depuració de valors
void depuracio()
{
  Serial.print("X1= ");  // valors finals de carrera
  Serial.println(X1);
  Serial.print("X2= ");
  Serial.println(X2);
  Serial.print("x= ");   // valor variable posició vaixell
  Serial.println(x);
  Serial.print("d1= ");  // distància mesurada pel ultrasons 1
  Serial.println(distancia_1);
  Serial.print("d2= ");  // distància mesurada pel ultrasons 2
  Serial.println(distancia_2);
}

No hay comentarios:

Publicar un comentario