SARRERA:
Mekatronika, Eraikuntza metalikoak eta elektronikako departamentuak parte hartu dute bertan, momentu oro hiru departamentuen arteko komunikazioa beharrezkoa izanda.
Itsaspeko bat eraikitzea izan da proiektu honen helburua, departamentu bakoitzari bere lana emanaz.
Post honetan, eraikuntza metaliko eta mekatronikako lanari buruz gainetik hitz egingo da, elektronikan zentratuz.
Eraikuntza fisikoari buruz, hona hemen argazki bat, hasiberria zenekoa:
Post honetan, eraikuntza metaliko eta mekatronikako lanari buruz gainetik hitz egingo da, elektronikan zentratuz.
Eraikuntza fisikoari buruz, hona hemen argazki bat, hasiberria zenekoa:
Itsaspekoa montatzen hasterakoan |
Orain arte funtzio desberdinak jarri zaizkio itsaspekoari:
- Aurrerako martxa (propultsio motorea alde batera biratuz)
- Atzerako martxa (propultsioa beste aldera mugituz)
- Ezker / Eskubi bira (servoa biratuz)
- Servomotorea zentratu (servoa dagoen lekuan dagoela, erdira eramateko)
- Eskuz kamerak bete ala hustu (bi kamerak banaka bete ala hustutzeko)
- Automatikoki urperatu ala azaleratu (bi kamerak batera bete ala hustutzeko)
- Estabilizatu (ezarritako inklinazio gradu batetik pasatzean, automatikoki estabilizatzeko)
- Flotabilidade neutroko puntua gogoratu eta bertara joan.
Erabilitako konponenteak (click bakoitzaren gainean datasheet edo webgunera sartzeko)
1x ARDUINO UNO
1x RASPBERRYPI
2x L293D QUADRUPLE HALF-H DRIVERS
1x ULN2003A DARLINTONG TRANSISTOR ARRAY
1x MX2125 2-AXIS ACCELEROMETER MODULE
1x SERVO BMS-630MG
2x RELAY FINDER 40.31
Eskema
Eskema 4 zati garrantzitsuenak nabarmeduta. Eskema hutsa hemen |
Eskeman ikusi dezakegunez 4 zati garrantzitsu dauzkagu:
1 - Azelerometroa: Azelerometro hau (MX2125), 2 ardatzeko azelerometro bat da, hau da, X eta Y ardatzak kontrolatzen ditu. Hala ere, proiektu honetarako X ardatza da kontrolatu behar izan dugun bakarra. Funtzionamendu teknikoa oso logikoa da: erdian gas bola bero bat dauka eta lau "termometro" eskin bakoitzean, beraz, azelerometroa biratzean, eta beroa goruntza joatean, termometro hoietako bat, bestea baino beroago egongo da. Pultsoaren luzeera jasoko dugu bueltan, hori jakinda, eta ariketa aritmetiko batzu egin ondoren, zenbat graduko inklinazioa daukagun azelerometroan, beraz, itsaspekoan ere, asmatu dezakegu.
-MX2125 Azelerometroa |
Hemen azelerometroa funtzionatzen. Bideoaren kalitatea ez da oso ona, baina gero eta gehiago biratuz, alderdi hortan, gero eta argi gehiago pizten direla ikusi dezakegu.
2 - Bonbak + Elektrobalbulak: Mekatronika/konstrukzio metalikoen ikasleak aukeratu dituzte erabiliko diren motoreak, bonbak etab.. Pausu hau gure kasuan pixkat astuna izan da, azkeneko momentuko aldaketak egon zirelako, eskema eta plaka aldaraztera behartuz. Hasieran bonbak besterik eziran jarri behar, horretarako L293D driver bat erabiliko genuke hauek kontrolatzeko. 12V-koak direnez, 8. pinetik 12V sartuko ditugu, 5V 16. pinetik eta bi "Enable" pinetatik, 10KΩ-ko erresistentzi batetik pasata 5V. Enableak konektatuak egonda, 5Vkin sarrerak aktibatzean, irteerak aktibatuko dira 12V emanda. Bideo honetan L293D chip-aren funtzionamendua ikusi daiteke: hemen.
Proiektua aurrera zihoan einean bonbei, elektrobalbula batzu jarri behar genizkiela konturatu ginen, anti-retorno bezala, ura sartzen zen zulotik berriz ere ez ateratzeko. Hauek kontrolatzeko ULN2003A chip-a erabili dugu, pin komunetik (COM) 12V pasarazten ditugu, elektrobalbulara ere konektatuz, sarreran aktibatzen duguna, irteeran ikusten dugu. Pista berdina erabiltzen dugu bonbak eta elektrobalbulentzat, batera aktibatu eta desaktibatu nahi ditugu eta.
Ezkerrean, erabili den DC motorea |
Azkenean, eta beste saiakera batzu eta gero, L293D batekin 5Vko Relay batzu aktibatzea aukeratu genuen. Relay-ak bi zati ditu, aktibatzekoa (alde batetik 5V eta bestetik 0V sartuz) eta aktuatzekoa (interruptore baten antzeko funtzionamendua du, alde bat 24Vra konektatzen dugu eta bestea motorearen alde batera). Motorea, alde batetik 24V baldin baditu eta bestetik 0V, martxan jarriko da.
4 - Nibel sentsoreak: Bi kameretan zenbateko ur nibela daukagun jakitea garrantzitsua da, batez ere "flotabilidade neutro" puntu hori lortzeko orduan. Esan beharra dago asko kostatu zitzaigula nahi edo behar genituen sentsore batzuk aurkitzea. Azkenean hauek aurkitu genituen.
SICen aforadorea - nibel sentsorea |
Potentziometro baten funtzionamendua dauka. Erdian ikusten den flotadore hori gora ta behera mugitzen da, ur nibela non dagoen arabera. 10 eta 180Ω bitarteko erresistentzi baten konportamendua du, gero eta gorago, geroz eta erresistentzi txikiagoa dauka. Praktikoki, beste 180Ωko erresistentzi bat seriean jarrita, hauek bien tartetik, zatitzaile erresistibo baten moduan funtzionaraziz, nibela (flotadorea) zein puntutan dagoen kokatuta jakingo dugu.
Lau puntu hauetaz gain, servoa ikusi daiteke eskeman, baina honek ez dauka misterio haundirik konektatzeko orduan. Hanka bat 5Vra doa, bestea GNDra eta bestea, seinalea, Arduinoko PWM pin batera.
PROGRAMAZIOA:
- Programazioan 3 puntu desberdin daude:
- Android: Tablet baterako aplikazio bat egingo da Eclipse programa erabiliz. Programa honekin bisualizatu ahal izango dugu RaspberryPi-ra bidaltzen dugun komandoa.
- RaspberryPi: Access point bezala konfiguratuko dugu WIFI puntu bat sortuz, tabletetik konektatu ahal izateko, Arduinora komandoak bidaliz TX pinetik.
- Arduino(Eclipse): RaspberryPi-tik komandoak jasoko ditu RX pinetik, beste pinetatik aktuadoreak aktibatuz
/* * ********************************************************* * ITSASPEKOA * Mikel Tife * * 2 Ur kamera * 2 Betetzeko bonba (13,11) * 2 Husteko bonba (12,10) * Lema mugitzeko servoa (9) * Propultsioko motoreen irteerak (8,7) * 2 nibel sentsore (A0,A2) * Azelerometroa. X ardatza (4) * * Flotabilidade neutroko puntua bilatu behar da. * Puntu horretan, itsaspekoaren dentsitatea, uraren berdina izango da * eta itsaspekoa ez da ez igko ezta jeitsiko ere. * *********************************************************** * * * * */ #include <Servo.h> //bonbak + elektrobalbulak int bomba1B = 13;//1 kamera betetzeko bonba - pin13 int bomba1H = 12;//1 kamera husteko bonba - pin12 int bomba2B = 11;//2 kamera betetzeko bonba - pin11 int bomba2H = 10;//2 kamera husteko bonbabonba - pin10 //servo int servo = 9;//lema mugitzeko servoa - pin9 Servo myservo;//servoaren izena int pos =1450;//servoaren posizioa, 1450 = erdia //motor de propulsion en pin 8 y 7// int aurrera = 8;//si esta a 1 y "atzera" a 0, avanzar int atzera = 7;//si esta a 1 y "aurrera" a 0, retroceder //Azelerometroa int ejeX = 4;//control ejeX del acelerometro en pin4 //variables para acelerometro int pulseX; float azelX; float inklinazioa; float arcoseno; float grados = 5; // graduak finkatu int flot_neutra_1;//flotabilidade neutroa gordetzeko int flot_neutra_2; //nibel sentsoreak int sensor1 = A0; // sensor de nivel camara 1 en pin A0 int sensor2 = A2; // sensor de nivel camara 2 en pin A2 int valor1; // valor que tendra el sensor1 int valor2; // valor que tendra el sensor2 //sentsoreen posizioa (0-9) int pos_sen_1=0; int pos_sen_2=0; //funtzioen deklarazioa// //propulsioa void motorea_aurrera(); // propulsion aurrera void motorea_atzera(); // propulsion atzera //servo void ezkerrera();// ezkerrera biratu -150 uS void eskubira();// eskubira biratu +150 uS void centrar_servo(); // lema erdiratu (1450 uS) //bonba void llenado_1(); // kamera1 eskuz bete void vaciado_1(); // kamera1 eskuz hustu void llenado_2(); // kamera2 eskuz bete void vaciado_2(); // kamera2 eskuz hustu void descender(); // 2 kamerak segundu batez bete void ascender(); // 2 kamerak hustu segundu batez void para_bombas(); //bonbak geldiarazi void goto_posicion(); // aukeratutako posiziora joan (0-9) void detener_motor();//propulsion motorea gelditzeko void stop_general();//motore guztiak gelditzeko //estabilizazioa - azelerometroa void estabilizatu (); // +-5 gradu baina gehiagoko inklinazioa ez izateko void finklinazioa ();//inklinazio graduak kalkulatzeko void posicionar(); //flotabilidad neutra void goto_flot_neutra(); void save_flot_neutra(); void setup () { //Irteerak pinMode(bomba1B, OUTPUT); pinMode(bomba1H, OUTPUT); pinMode(bomba2B, OUTPUT); pinMode(bomba2H, OUTPUT); pinMode(servo, OUTPUT); pinMode(aurrera, OUTPUT); pinMode(atzera, OUTPUT); //Sarrerak pinMode(ejeX, INPUT); pinMode (sensor1, INPUT); pinMode (sensor2, INPUT); myservo.attach (servo); myservo.write (pos);//Lehen pausua, servoa zentratzea da. // Hasteko, nibelaren posizioa hartzen du posicionar(); //myservo.writeMicroseconds (pos); Serial.begin(9600); //Serie portua 9600 baudiotan inizializatu } void loop () { while (!Serial.available()) //serietik ez badugu komandorik bidaltzen, bukle batean sartzen da, aurreko sentsorearen balorea gordez { valor1= analogRead (sensor1); Serial.print ("valor sensor1= "); Serial.println (valor1); } if (Serial.available()) // Serietik zerbait bidaltzen dugunean, funtzio baten barruan sartuko da { char c = Serial.read(); //Char aldakor batean sartzen dugu bidalitakoa switch (c) //switch komandoa, if baten antzera funtzionatzen du. Bidaltzen diogun komandoaren arabera, "case" hori aktibatuko dugu. { case 'a': motorea_aurrera();//motorea_aurrera funtzioari deitu break; case 'b': motorea_atzera();//motorea_atzera funtzioari deitu break; case 'c': ezkerrera();//ezkerrera funtzioari deitu break; case 'd': eskubira();//eskubira funtzioari deitu break; case 'e': llenado_1();//llenado1 funtzioari deitu break; case 'f': vaciado_1();//vaciado1 funtzioari deitu break; case 'g': llenado_2();//llenado2 funtzioari deitu break; case 'h': vaciado_2();//vaciado2 funtzioari deitu break; case 'i': goto_posicion();//posizio batera joan (0-9) break; case 'j': ascender(); //bi bonbak batera hustu segundu batez eta estabilizatu. Denbora hau aldatu daiteke beharren arabera break; case 'k': descender();//bi bonbak batera bete segundu batez eta estabilizatu. Denbora hau aldatu daiteke break; case 'l': detener_motor();//propultsioko motoreak gelditu break; case 'm': centrar_servo();//servoa erdira bidali break; case 'n': stop_general();//motore, bonba eta guztiak gelditu break; case 'o': estabilizatu();//"graduak" bariablearenarabera, gradu hoien barruan utzi submarinoa break; case 'p': goto_flot_neutra(); // flot_neutra puntura joan (hustu edo betez) break; case 'q': save_flot_neutra(); // flot_neutra puntua gorde break; } } } //funtzioak// void motorea_aurrera () // propulsioa aurrera, ibiltzen doan bitartean estabilizatzen joango da { digitalWrite (aurrera, HIGH); digitalWrite (atzera, LOW); estabilizatu(); } void motorea_atzera () // propulsioa atzera, ibiltzen doan bitartean estabilizatzen joango da { digitalWrite (aurrera, LOW); digitalWrite (atzera, HIGH); estabilizatu(); } void llenado_1 () // geldirik egin daiteke bakarrik. proako kamera BETE manualki segundu 1 { digitalWrite (bomba1B, HIGH); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); delay (5000); digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); estabilizatu(); posicionar(); } void llenado_2 ()// geldirik egin daiteke bakarrik. popako kamera BETE manualki segundu 1 { digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, HIGH); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); delay (5000); digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); estabilizatu(); posicionar(); } void vaciado_1() // geldirik egin daiteke bakarrik. proako kamera HUSTU manualki segundu 1 { digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, HIGH); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); delay (5000); digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); estabilizatu(); posicionar(); } void vaciado_2() // geldirik egin daiteke bakarrik. popako kamera HUSTU manualki segundu 1 { digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, HIGH); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); delay (5000); digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); estabilizatu(); posicionar(); } void goto_posicion () // posizio batera joankamerak hustu ala betez { while (Serial.available()) { Serial.read();//buffera hustu } while (!Serial.available()); { } char n = Serial.read(); //zenbakia sartu nahi den posiziora joateko Serial.println (n); switch (n) { case '0': posicion0(); break; case '1': posicion1(); break; case '2': posicion2(); break; case '3': posicion3(); break; case '4': posicion4(); break; case '5': posicion5(); break; case '6': posicion6(); break; case '7': posicion7(); break; case '8': posicion8(); break; case '9': posicion9(); break; } } void descender()//segundu batez bi kamerak bete { digitalWrite (bomba1B, HIGH); digitalWrite (bomba2B, HIGH); digitalWrite (bomba1H, LOW); digitalWrite (bomba2H, LOW); delay (1000); // balore hau aldatu, bonbak denbora gehio irauteko irekita digitalWrite (bomba1B, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2H, LOW); estabilizatu(); posicionar(); } void ascender () //segundu batez bi bonbak hustu { digitalWrite (bomba1B, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba1H, HIGH); digitalWrite (bomba2H, HIGH); delay (1000); // balore hau aldatu, bonbak denbora gehio irauteko irekita digitalWrite (bomba1B, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2H, LOW); estabilizatu(); posicionar(); } void detener_motor () // propulsio motoreak gelditu. beste zeoze martxan badago, jarraituko du { digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); } void stop_general () // propulsio motoreak eta bombak geldiarazten ditu funtzio honek { digitalWrite (aurrera, LOW); digitalWrite (atzera, LOW); digitalWrite (bomba1B, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba2H, LOW); } void eskubira() // servoa eskubira mugitu. { pos= pos+150; myservo.writeMicroseconds (pos); } void ezkerrera () // servoa ezkerrera mugitu. EGITEKOTAN { pos= pos-150; myservo.writeMicroseconds (pos); } void centrar_servo () // servoa zentratu. EGITEKOTAN { pos= 1450; myservo.writeMicroseconds (pos); } void estabilizatu () // funtzio honek ez du utziko itsaspekoari guk nahi degun gradu konkretu batzutik gora edo behera inklinatzea { finklinazioa(); // finklinazioa funtzioari deia while (inklinazioa>grados) // proa popa baino altugo { digitalWrite (bomba1B, HIGH);//proako kamera bete digitalWrite (bomba1H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); finklinazioa(); } para_bombas(); //bombak gelditu while (inklinazioa < -grados) // popa proa baino altugo { digitalWrite (bomba1B, LOW); digitalWrite (bomba1H, HIGH); // popako kamera bete digitalWrite (bomba2B, LOW); digitalWrite (bomba2H, LOW); finklinazioa(); } para_bombas(); delay (100); } void para_bombas() { if (inklinazioa > -grados && inklinazioa <grados) // estabilizatua dagoenean, itzali bonba guztiak { digitalWrite (bomba2H, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); digitalWrite (bomba2B, LOW); } delay(100); } void finklinazioa () // zelako inklinazioa dagoen jakiteko funtzioa { pulseX = pulseIn(ejeX,HIGH); // azelerometroak X ardatzan ematen duen pultsuaren iraupena mikrosegundutan // Serial.print ("pulso X = "); //Serial.println (pulseX); azelX = ((pulseX / 10) - 500) * 8; // azelerazioa milig-tan Serial.print ("azel = "); Serial.println (azelX); arcoseno= asin(azelX/1000); // inklinazioa radianetan Serial.print ("arcoseno = "); Serial.println (arcoseno); inklinazioa= (360/6.2832)*arcoseno; // inklinazioa gradutan Serial.print ("inklinazioa = "); Serial.println (inklinazioa); // inklinazioa seriez erakutsi. Serial.println (""); } /* * * posizioen funtzioak. * posizio batera joateko esaten zaionean, sentsoreak ze posizion dauden dakitenez, * eskatutako posiziora joateko, kamerak hustu ala beteko ditu * */ void posicion0() { while (pos_sen_1!=0 || pos_sen_2 !=0){ while (pos_sen_1>0 && pos_sen_2>0) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba2H,HIGH); digitalWrite (bomba1B, LOW); digitalWrite (bomba2B,LOW); posicionar(); if (pos_sen_1==0){ digitalWrite (bomba1H,LOW); digitalWrite (bomba1B,LOW); } if (pos_sen_2==0){ digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } } if (pos_sen_1==0 && pos_sen_2==0) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); digitalWrite (bomba2H,LOW); digitalWrite (bomba2B,LOW); } while (pos_sen_2>0 && pos_sen_1==0) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_2==0) digitalWrite (bomba2H,LOW); } while (pos_sen_2==0 && pos_sen_1>0) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); } if (pos_sen_1==0 && pos_sen_2==0){} estabilizatu(); } } void posicion1() { while (pos_sen_1 !=1 || pos_sen_2 !=1) { while (pos_sen_1<1 && pos_sen_2<1) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); digitalWrite (bomba2H,LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_1==1) digitalWrite (bomba1B,LOW); if (pos_sen_2==1) digitalWrite (bomba2B, LOW); } while (pos_sen_1==1 && pos_sen_2<1) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); if (pos_sen_2==1) digitalWrite (bomba2H, LOW); posicionar(); } if (pos_sen_1<1 && pos_sen_2==1) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); if (pos_sen_1==1) digitalWrite (bomba1H, LOW); posicionar(); }/// if (pos_sen_2>1 && pos_sen_1>1) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2==1) digitalWrite (bomba2H,LOW); } if (pos_sen_2==1) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<1) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2==1) digitalWrite (bomba2B, LOW); } if (pos_sen_1==1 && pos_sen_2==1){} estabilizatu(); } } void posicion2() { while (pos_sen_1 !=2 || pos_sen_2 !=2) { while (pos_sen_1>2) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1==2) { digitalWrite (bomba1H,LOW); break; } } while (pos_sen_1<2) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); Serial.println (pos_sen_1); if (pos_sen_1==2) { digitalWrite (bomba1B, LOW); break; } }/// if (pos_sen_1==2) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); break; } if (pos_sen_2>2) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2==2) digitalWrite (bomba2H,LOW); } if (pos_sen_2==2) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<2) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2==2) digitalWrite (bomba2B, LOW); } if (pos_sen_1==2 && pos_sen_2==2){} estabilizatu(); } } void posicion3() { if (pos_sen_1>3) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1==3) digitalWrite (bomba1H,LOW); } if (pos_sen_1==3) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<3) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1==3) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>3) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2==3) digitalWrite (bomba2H,LOW); } if (pos_sen_2==3) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<3) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2==3) digitalWrite (bomba2B, LOW); } if (pos_sen_1 ==3 && pos_sen_2==3){} estabilizatu(); } void posicion4() { if (pos_sen_1>4) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1==4) digitalWrite (bomba1H,LOW); } if (pos_sen_1==4) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<4) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1==4) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>4) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2==4) digitalWrite (bomba2H,LOW); } if (pos_sen_2==4) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<4) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2==4) digitalWrite (bomba2B, LOW); } if (pos_sen_1 ==4 && pos_sen_2==4){} estabilizatu(); } void posicion5() { if (pos_sen_1>5) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1==5) digitalWrite (bomba1H,LOW); } if (pos_sen_1==5) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<5) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1==5) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>5) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2==5) digitalWrite (bomba2H,LOW); } if (pos_sen_2==5) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<5) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2==5) digitalWrite (bomba2B, LOW); } if (pos_sen_1==5 && pos_sen_2==5){} estabilizatu(); } void posicion6() { if (pos_sen_1>6) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1==6) digitalWrite (bomba1H,LOW); } if (pos_sen_1==6) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<6) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1==6) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>6) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2==6) digitalWrite (bomba2H,LOW); } if (pos_sen_2==6) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<6) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2==6) digitalWrite (bomba2B, LOW); } if (pos_sen_1==6 && pos_sen_2 ==6){} estabilizatu(); } void posicion7() { if (pos_sen_1>7) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1=7) digitalWrite (bomba1H,LOW); } if (pos_sen_1=7) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<7) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1=7) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>7) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2=7) digitalWrite (bomba2H,LOW); } if (pos_sen_2=7) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<7) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2=7) digitalWrite (bomba2B, LOW); } estabilizatu(); } void posicion8() { if (pos_sen_1>8) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1=8) digitalWrite (bomba1H,LOW); } if (pos_sen_1=8) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<8) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1=8) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>8) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2=8) digitalWrite (bomba2H,LOW); } if (pos_sen_2=8) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<8) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2=8) digitalWrite (bomba2B, LOW); } estabilizatu(); } void posicion9() { if (pos_sen_1>9) { digitalWrite (bomba1H, HIGH); digitalWrite (bomba1B, LOW); posicionar(); if (pos_sen_1=9) digitalWrite (bomba1H,LOW); } if (pos_sen_1=9) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, LOW); } if (pos_sen_1<9) { digitalWrite (bomba1H, LOW); digitalWrite (bomba1B, HIGH); posicionar(); if (pos_sen_1=9) digitalWrite (bomba1B, LOW); }/// if (pos_sen_2>9) { digitalWrite (bomba2H, HIGH); digitalWrite (bomba2B, LOW); posicionar(); if (pos_sen_2=9) digitalWrite (bomba2H,LOW); } if (pos_sen_2=9) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, LOW); } if (pos_sen_2<9) { digitalWrite (bomba2H, LOW); digitalWrite (bomba2B, HIGH); posicionar(); if (pos_sen_2=9) digitalWrite (bomba2B, LOW); } estabilizatu(); } void posicionar() // sentsorea ze posizioan dagoen gordetzen du { valor1=analogRead (sensor1); if (980<valor1<1012) pos_sen_1=0; if (890<valor1<980) pos_sen_1=1; if (800<valor1<890) pos_sen_1=2; if (720<valor1<800) pos_sen_1=3; if (660<valor1<720) pos_sen_1=4; if (630<valor1<660) pos_sen_1=5; if (605<valor1<630) pos_sen_1=6; if (565<valor1<605) pos_sen_1=7; if (510<valor1<656) pos_sen_1=8; if (valor1<510) pos_sen_1=9; // Serial.println ("valor1: "); //Serial.println (valor1); valor2=analogRead (sensor2); if (980<valor2<1012) pos_sen_2=0; if (890<valor2<980) pos_sen_2=1; if (800<valor2<890) pos_sen_2=2; if (720<valor2<800) pos_sen_2=3; if (660<valor2<720) pos_sen_2=4; if (630<valor2<660) pos_sen_2=5; if (605<valor2<630) pos_sen_2=6; if (565<valor2<605) pos_sen_2=7; if (510<valor2<656) pos_sen_2=8; if (valor2<510) pos_sen_2=9; } void save_flot_neutra() //flotabilidade neutroa aurkitzean, sentsorearen posizioa beste bariable batean gordetzen dugu { flot_neutra_1=pos_sen_1; flot_neutra_2=pos_sen_2; } void goto_flot_neutra()//aurreko bariablean gordeta dagoen zenbakiko posiziora joan { switch (flot_neutra_1) // { case 0: posicion0(); break; case 1: posicion1(); break; case 2: posicion2(); break; case 3: posicion3(); break; case 4: posicion4(); break; case 5: posicion5(); break; case 6: posicion6(); break; case 7: posicion7(); break; case 8: posicion8(); break; case 9: posicion9(); break; } }
RaspberryPi, plaka bakarreko kostu txikiko ordenagailu bat da (SBC), eskoletan, konputazio zientzien irakaskuntzak suspertzeko, Erresuma Batuan RaspberryPi Fundazioak sortua.
RaspberryPi (ezkerrean) + Arduino Uno (eskuinean) |
Eclipse software librearekin, javarekin programatzen, itsaspekoaren kontrolaren interfaz-a sortu dugu. Hauetako botoi bat pultsatuz, komando bat bidaltzen diogu RaspberryPi-ari, honek exekutatu dezan.
Programa deskargatzeko linka hemen.
App-aren interfazea |
PROIEKTUAREN ETORKIZUNA:
Proiektuaren lehenengo urtea izan da, baina horrek ez du esan nahi dena hemen bukatzen denik.
Hasieran esan bezala, funtzio gehiago ipini ahal zaizkio itsaspekoari, adibidez, kamera bat. Horretarako prest daukagu RaspberryPi-a. Hemen enlazea. Honen arazoa, kamera guztiz estankoa (urik ez sartzea) izatea beharrezkoa dela, eta izan dugun denborarekin ezinezkoa izan dela hau lortzea. Beste aukera bat, goPro kamera bat jartzea izan liteke... baina aurrekontua asko igotzen zitzaigun. Halere, hona hemen tutorial bat goProa eta raspberryPi-a batera konektatzeko. Kamerarekin batera, argi bat jartzea interesgarria izango zen, itsas hondoan argi gutxi dagoenez, zaila izango zelako irudi onak ateratzea.
Beste gehigarri bat, ultrasoinuko sentsoreak ipintzea izango litzateke, bai azpikaldean, itsas hondora zenbat distantzia dagoen jakiteko, edota aurrean, atzean eta aldetan, oztopo batekin aurkitzen bada, talka egin aurretik, itsaspekoa geldiarazteko adibidez.
Buia nola kendu eta itsaspekoa libre uretan ibiltzea interesgarria izango zen, ultrasoinuen bidez urazpitik kontrolatruz edota beste modu batez.
Bestelako ideiak badaude, adibidez RFID irakurgailu batekin, objektuak edota pertsonak bilatzeko balioko zuen, elurretan bezala, itsasoan dabilen jendea (arrantzaleak, urpekariak, etab.), RFID TAG bat izango bazuten errazagoa izango zen horrelako herraminta batekin jendea itsaso azpian aurkitzea, urpekari bat uretara sartzea arriskutsua izan daiteken kasuetan (adibidez, 2014ko martxoan desagertutako Maylasia Airlineseko hegazkina galdu zenean, Bluefin-21 itsaspekoa hondoratu zuten, hegazkina eta jendearen gorpuak aurkitzeko).
Bestelako ideiak badaude, adibidez RFID irakurgailu batekin, objektuak edota pertsonak bilatzeko balioko zuen, elurretan bezala, itsasoan dabilen jendea (arrantzaleak, urpekariak, etab.), RFID TAG bat izango bazuten errazagoa izango zen horrelako herraminta batekin jendea itsaso azpian aurkitzea, urpekari bat uretara sartzea arriskutsua izan daiteken kasuetan (adibidez, 2014ko martxoan desagertutako Maylasia Airlineseko hegazkina galdu zenean, Bluefin-21 itsaspekoa hondoratu zuten, hegazkina eta jendearen gorpuak aurkitzeko).
Bluefin-21 itsaspekoa |
Irudimena erabilita, hobekuntzak (bai programan, baita hardwarean ere) eta gehigarriak ipiniz, beste nibel sentsore batzuk bezala (zuzenak, diskretoen ordez, adibidez), proiektu ikaragarri batean bilakatu daiteke Itsaspekoa.
Mikel Tife (2ME3M)
IEFPS Don Bosco GLHBI
No hay comentarios:
Publicar un comentario