jueves, 26 de marzo de 2015

ITSASPEKOA

SARRERA:


Don Boscon, departamentu bat baino gehiagoren artean eginiko proiektu bat da oraingoan azalduko duguna.

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:

Itsaspekoa montatzen hasterakoan


Ikusi daiteken bezala, erdialdea bi zatitan bananduta dago: Goiko zatian bateriak, elektronika, bonbak, elektrobalbulak etab. joango dira, eta beheko aldea beste bi zatitan bananduta dago, urez beteko diren bi kamerakin.

Gure helburua, itsaspekoa WIFI bitartez kontrolatu ahal izatea izan da. WiFi bitartez tablet batetik antena batera egingo da komunikazioa. Antena hori, momentuz, buia batean egongo da eta bertatik RaspberryPi batera joango da seinalea. RaspberryPi-a, serie bitartez, Arduino batekin komunikatuko da, mikrokontroladoreak itsaspekoa kontrolatu dezan.

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.

Proiektu irekia da, hurrengo urteetan hobetu ahal izateko. Adibidez, RaspberryPi-a kamera bat jarri ahal izateko prest dago. Ez dugu kamera hori estankoa uztea lortu (ura sartu ez dadin), baina egin ezkero, kamera jarri ahal zaio. Aurrerago aztertuko ditugu proiektuak izan ditzazken hobekuntza eta berritasunak.

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.

3 - Propultsio motorea: Gure kasuan hemen izan ditugu aldaketa gehienak, hasieran 12Vkoa zen, 5206 driver-a erabili behar genuen hasiera batean, baina gero aldaketak egon ziren eta 24Vko DC motore bat jartzea proposatu zen.

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.

Beranduago konturatu ginen ez ditula balore guztiak ematen, diskretoa dela eta 10 balore desberdin ematen ditula, horregatik Arduinon jarri ditugun 10 posizioak. Esan beharra dago, sentsore honek balore guztiak eman beharko zituela askoz erosoago eta hobeto egiteko flotabilidade neutroaren kalkulua.






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:

  1. Android: Tablet baterako aplikazio bat egingo da Eclipse programa erabiliz. Programa honekin bisualizatu ahal izango dugu RaspberryPi-ra bidaltzen dugun komandoa. 
  2. RaspberryPi: Access point bezala konfiguratuko dugu WIFI puntu bat sortuz, tabletetik konektatu ahal izateko, Arduinora komandoak bidaliz TX pinetik. 
  3. Arduino(Eclipse): RaspberryPi-tik komandoak jasoko ditu RX pinetik, beste pinetatik aktuadoreak aktibatuz


Arduino

Arduino, erraz erabili daitezken Software eta Hardware malgutan oinarrituta, prototipoak sortzeko plataforma elektroniko irekia da. Lenguaia propio bat erabilita programatzen da. Hala ere, beste programazio lenguaiak erabili daitezke. Informazio gehiago, beraien web orrian, eta hemen deskargak.

Programa osoa hemen behean ikusi daiteke komentatua. Hasteko, esan beharra dago, programa gaur egiten hasiko bagina, agian beste modu batean planteatuko genukela, asko optimizatu daitekelako.


  /*
 *
 *********************************************************
 * 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

RaspberryPi, plaka bakarreko kostu txikiko ordenagailu bat da (SBC), eskoletan, konputazio zientzien irakaskuntzak suspertzeko, Erresuma Batuan RaspberryPi Fundazioak sortua.

Diseinuak System-on-a-chip Broadcom bat darama, ARM1176JZF-S 700MHzko prozesadore zentral bat daukana, VideoCore IV prozesadore grafiko bat eta 512MiB-eko memoria RAM bat.

Diseinuak ez du diska gogorrik, SD txartel bat erabiltzen bait da beharrezko datuak biltegiratzeko.

RaspberryPi-a, access point bezala funtzionarazten dugu, WIFI portu bat sortzeko eta gure tabletetik, inalanbrikoki komunikatu ahal izateko. Django zerbitzari bat instalatu da API-REST bat sortzeko. API-REST-a http bidezko petizioak filtratzen dituen funtzio-URL-en multzoa da.

Google Drive-n uzten ditugu jarraitu beharrezko pausuak Access Point-a lortzeko: hemen.




RaspberryPi (ezkerrean) + Arduino Uno (eskuinean)




Android (Eclipse)

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).



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