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:
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 horitzontalsConfiguració
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