Robotti puutarhassa

Jokainen on varmasti törmännyt rautakaupan mainoksissa robottiruohonleikkureihin tai pölyä pyöritteleviin robotti-imureihin. Liikkuvat, surisevat ja pärisevät omatoimiset laitteet vastaavat parhaiten mielikuvaamme roboteista, mutta moni unohtaa, että vaikkapa ohjelmavalitsimella varustettu astianpesukone on meille hyvin läheinen robotti.



Yksi tällainen mikrokontrolleri on avoimesti ohjelmoitava Arduino. Arduino itsessään sisältää vain tuon osan, joka määrää robotin toimintaa esimerkiksi tiskikoneen ohjelman ajastusta. Arduinoon on mahdollista lisätä toimintoja tekeviä komponentteja, esim:



    • LED-valoja, moottoreita, LCD-näyttöjä, nappeja, summereita tai kaiuttimia
    • Ympäristöä mittaavia sensoreita, kuten valo-, kosteus- tai lämpötila-anturi
    • Viestintälisäosia, joilla arduino saadaan lähettämään / vastaanottamaan keräämäänsä tietoa tai tallentamaan sitä. Bluetooth- tai wifi-lisäosan avulla arduinon ohjaaminen toimii langattomasti vaikkapa kännykällä.

      Omassa projektissani tänä kesänä hyödynsin Arduino UNO -mikrokontrolleria taimien kastelussa. Ongelmana oli saada taimien kosteus pysymään tasaisesti samana juoksematta itse koko ajan kastelukannu kädessä. Lyhyesti: Arduinoon on yhdistetty kosteusmittari ja letkun avaava moottori. Kun kosteus laskee riittävästi, avaa moottori letkun.

      Kouluissa robotiikkaa tulee lähestyä oppilaita yllättävästä suunnasta. Alakoulussa opetuksen päätavoite on laajentaa käsitystä robotiikasta ja ohjata oppilaat löytämään robotiikalle uusia käyttötarkoituksia heidän omasta elämästään ja arjestaan. Robotiikan opetus kannattaa yhdistää esimerkiksi luonnontieteiden kanssa monialaiseen oppimiskokonaisuuteen säähavaintoasemana tai vaikkapa äidinkielessä näytelmän osaksi. Tällä tavoin robotiikka löytää tiensä ihmisten arkeen ja avartaa ymmärrystä ympärillämme vauhdilla lisääntyvästä ilmiöstä.

      Alla on yksi esimerkki siitä, kuinka oman arjen ongelmia voi ratkaista robotiikkaa hyödyntäen. Esimerkki sopii parhaiten yläkouluun haastavan koodin vuoksi.

      Arduino UNO -kastelurobotti


      Video1: Järjestelmän perusesittely


        
      Haarukka-anturi on maassa ja moottori kiinni hanassa. Hana aukeaa, kun maa kuivuu tarpeeksi. Jatkojohtona sensoriin, valoihin ja moottorille käytin vanhaa verkkokaapelia. Siinä on helposti eri värein monta pientä johdinta. Kolvasin johdon päät pikaliittimiin, jotta komponentit on helpompi irrottaa esim. talven tullen. Led-matriisin ja arduinon rakensin muovisen pakasterasian sisään. Sen kansi pitää pahimman kosteuden ulkona.

      Vesi valuu sadevesitynnyristä painovoiman avulla rei'itettyä muoviputkea pitkin niin, että kasvien kohdalla vesi lorisee tasaisesti putkesta. Reikiä täytyy säätää teipillä ja putken tasapainoa kääntelemällä ylös alas, muuten vesi valuu vain yhdelle tai kahdelle kasville. Putken kiinnitykseen käytin avattavia nippusiteitä, joiden avulla on helppo säätää putken kaltevuutta.



      Kytkentäkaavio


      • Servo on kiinni digital out 9:ssä, maassa ja 5V virrassa.
      • Kosteusanturi kiinni maassa, virrassa (digital out 7) ja analog 0 sisääntulossa.
      • Ledimatriisi, joka kuvaa kosteuden määrää, on kiinni maassa sekä pinneissä 2-6 ja 9 (0 ja 1 pinnejä ei kannata käyttää juuri koskaan).


      Video 2: Ledimatriisin kokeilua

      Koodi, joka on leikkailtu, liimailtu ja kirjoiteltu itse kasaan.
      #include <Servo.h> //servo needs library to run
      Servo myservo;  // create servo object to control a servo
      int pos=0;    // variable to store the servo position
      int val=0; //value for storing moisture value
      int soilPin=A0;//Declare a variable for the soil moisture sensor
      int soilPower=7;//Variable for Soil moisture Power
      int LED1=8; //LED valojen ulostulopinnit
      int LED2=2;
      int LED3=3;
      int LED4=4;
      int LED5=5;
      int LED6=6;

      //Rather than powering the sensor through the 3.3V or 5V pins,
      //we'll use a digital pin to power the sensor. This will
      //prevent corrosion of the sensor as it sits in the soil.


      //tämä luuppi käydään vain kerran kun kone käynnistyy
      void setup()
      {
      myservo.attach(9);  // attaches the servo on pin 9 to the servo object
      Serial.begin(9600);   // open serial over USB
      pinMode(soilPower, OUTPUT);//Set D7 as an OUTPUT
      digitalWrite(soilPower, LOW);//Set to LOW so no power is flowing through the sensor
      pinMode(LED1, OUTPUT);
      pinMode(LED2, OUTPUT);
      pinMode(LED3, OUTPUT);
      pinMode(LED4, OUTPUT);
      pinMode(LED5, OUTPUT);
      pinMode(LED6, OUTPUT);
      }

      //This is a function used to get the soil moisture content
      int readSoil()
      {
         digitalWrite(soilPower, HIGH);//turn D7 "On"
         delay(10);//wait 10 milliseconds
          val=analogRead(soilPin);//Read the SIG value form sensor
         digitalWrite(soilPower, LOW);//turn D7 "Off"
         return val;//send current moisture value
      }

      // tässä luupissa määritellään millä kosteusarvolla mikäkin ledi syttyy
      void LEDloop()
      {
          if (val <= 250)
         {
           Serial.println("pun");
           digitalWrite(LED1, HIGH);
           digitalWrite(LED2, LOW);
           digitalWrite(LED3, LOW);
           digitalWrite(LED4, LOW);
           digitalWrite(LED5, LOW);
           digitalWrite(LED6, LOW);
         }
         else if ( (val > 250) && (val <= 300) )
         {
           Serial.println("pun,kel");
            digitalWrite(LED1, HIGH);
           digitalWrite(LED2, HIGH);
           digitalWrite(LED3, LOW);
           digitalWrite(LED4, LOW);
           digitalWrite(LED5, LOW);
           digitalWrite(LED6, LOW);
         }
         else if ( (val > 300) && (val <= 340) )
         {
           Serial.println("pun,kel,vih");
            digitalWrite(LED1, HIGH);
           digitalWrite(LED2, HIGH);
           digitalWrite(LED3, HIGH);
           digitalWrite(LED4, LOW);
           digitalWrite(LED5, LOW);
           digitalWrite(LED6, LOW);
         }
         else if ( (val > 340) && (val <= 370) )
         {
            Serial.println("pun,kel,vih, vih");
            digitalWrite(LED1, HIGH);
           digitalWrite(LED2, HIGH);
           digitalWrite(LED3, HIGH);
           digitalWrite(LED4, HIGH);
           digitalWrite(LED5, LOW);
           digitalWrite(LED6, LOW);
         }
         else if ( (val > 370) && (val <= 400) )
         {
           Serial.println("pun,kel,vih, vih, vih");
            digitalWrite(LED1, HIGH);
           digitalWrite(LED2, HIGH);
           digitalWrite(LED3, HIGH);
           digitalWrite(LED4, HIGH);
           digitalWrite(LED5, HIGH);
           digitalWrite(LED6, LOW);
         }
         else if ( val > 400  )
         {
           Serial.println("pun,kel,vih, vih, vih,vih");
            digitalWrite(LED1, HIGH);
           digitalWrite(LED2, HIGH);
           digitalWrite(LED3, HIGH);
           digitalWrite(LED4, HIGH);
           digitalWrite(LED5, HIGH);
           digitalWrite(LED6, HIGH);
         }
      }

      //tämä on pääluuppi jota kontrolleri pyörittää jatkuvasti, se sisältää muut luupit lukuun ottamatta setup luuppia
      void loop()
      {

      Serial.print(" Kosteusarvo=");    
      //get soil moisture value from the function below and print it
      Serial.println(readSoil());
      LEDloop();
      //This 1 second timefrme is used so you can test the sensor and see it change in real-time.
      //For in-plant applications, you will want to take readings much less frequently.
      delay(1000);//take a reading every second

       if (val < 300)
       { // Kastelu luuppi, kosteusarvoa voi säätää tässä
         Serial.println("Maa liian kuiva");
         for ( pos=720; pos >= 0; pos -=1)
         {
         myservo.write(pos);
         delay(20);
         }
         
          Serial.println("hana auki");
          for ( int x=0; x < 20; x++ )
          {
            digitalWrite(LED1, HIGH); // tässä kaikki valot vilkkuu kun kastelu on päällä
           digitalWrite(LED2, HIGH);
           digitalWrite(LED3, HIGH);
           digitalWrite(LED4, HIGH);
           digitalWrite(LED5, HIGH);
           digitalWrite(LED6, HIGH);
             delay(1000);
           digitalWrite(LED1, LOW);
           digitalWrite(LED2, LOW);
           digitalWrite(LED3, LOW);
           digitalWrite(LED4, LOW);
           digitalWrite(LED5, LOW);
           digitalWrite(LED6, LOW);
            delay(1000);
          }
        
         
         for ( pos=0; pos <= 720; pos += 1)
         {
          myservo.write(pos);
         delay(15);
         }
         Serial.println("hana kii");
       }
      }


      - Miika Anundi, 2017



      Kommentit