keskiviikko, 18. maaliskuu 2015

Mikko 3000 V0.5!!!

Prototyyppimme on vihdoinki koottu, sekä onnistuneet testiajot suoritettu! Kertauksena vielä: Mikko 3000 on arduinolla kahvinkeittimen koteloon rakennettu robotti, jonka tehtävä on kaataa isäntänsä viskilasiin 4cl viskiä. Tämän tehtävän Mikko suorittaa hanaan kiinnitetyllä servomoottorilla. Lisäksi Mikko ilmaisee erivärisin ledein missä vaiheessa prosessia ollaan menossa.

Varsinaisen arduinoprotonhan olimme jo rakentaneet aikaisemmin, mutta tässä vielä kuva muistinvirkistykseksi:

mikko0_2.jpg


Seuraavaksi tämä kaunokainen tarvitsi tarpeeksi jykevän kotelon johon varsinaisen viskiastian saisi kiinnitettyä, sekä jonkin tavan annostella viskin virtausta. Päädyimme rakentamaan prototyyppimme kahvinkeittimen koteloon. Tyhjennettyämme kahvinkeittimen turhasta elektroniikasta, lähdimme rakentamaan laitetta alhaalta ylöspäin. Ensimmäisenä tarvitsimme painonapille paikan, johon viskilasin saisi asetettua. Tällaisen taitelimme näppärästi Finnfoamista:

P3160791.jpg


Toiseksi tarvitsimme tavan siirtää viski astiasta lasiin sekä säädellä viskin virtausta. Tähän tarkoitukseen sopii erinomaisesti sairaalasarjoista tutut nesteensiirtolaite sekä kolmitiehana. Nesteensiirtolaite toimii hanan ja säilytysastian välillä nimensä mukaisesti nesteen siirtämisessä. Huomattavana etuna pelkkään letkunpätkään nähden nesteensiirtolaite päästää säilytysastiaan ilmaa poistetun nesteen tilalle:

P3160790.jpg


Kolmitiehanalla taas pystytään estämään nesteen valtoin virtaaminen. Hanaa pyörittää servomoottori:

P3160794.jpg


Näin näppärästi arduino sujahti keittimen entiseen nestesäiliöön. Kuvassa näkyy myös ledit:

P3160795.jpg


Koodiammekaan ei hirveästi tarvinnut edellisistä versioista muokkailla, mutta tässäpä vielä kalibroitu vedos:


// Mikkokoodi V0.5 by Ana Rummukainen & Arto Hänninen

#include <Servo.h>
 
 Servo mikko;

// Alustamme muuttujat
 int pos = 0;
 int switchState = 0;
 
 int ledPunainen = 3;
 int ledKeltainen = 4;
 int ledVihrea = 5;
 
 void setup() {
 
   // Laitteen alustus
   mikko.attach(9);
   pinMode(3, OUTPUT);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   pinMode(2, INPUT);
 }
 
 void loop() {

   // Laitteen odotustila
   switchState = digitalRead(2);
   if (switchState == LOW) {
     digitalWrite(ledPunainen, HIGH);
     digitalWrite(ledKeltainen, LOW);
     digitalWrite(ledVihrea, LOW);
   }
   
   else {
     // Suoritustila aloittaminen
     digitalWrite(ledPunainen, LOW);
     digitalWrite(ledKeltainen, HIGH);
     digitalWrite(ledVihrea, LOW);
     for(pos = 1; pos < 90; pos += 1)
     {
       mikko.write(pos);
       delay(15);
     }
     
     // Suoritus, eli juomaa valuu
     mikko.detach();
     delay(20500);

     // Suoritus valmis, juoma valmis, muutamme ledien värejä
     digitalWrite(ledKeltainen, LOW);
     digitalWrite(ledVihrea, HIGH);
     
     // Paluu alku- eli odotustilaan
     mikko.attach(9);
     for (pos = 90; pos >= 1; pos -=1)
     {
       mikko.write(pos);
       delay(5);
     }

     while (digitalRead(2) != LOW) {
        delay(10);
     }
   }
 }


Tarjotaanpa Mikko-faneille vielä nannaa videon muodossa, elikäs ensimmäisiä Mikon valuttamia viskilasillisia!

https://www.youtube.com/watch?v=sEBQ7-bCC4M


keskiviikko, 4. maaliskuu 2015

Viikko 9 - Servotehtävä

Tunnin tehtävänä oli pelehtiä servojen kanssa. Teimme tehtävänannon ilman Servo.h-kirjastoa. Saimme servon suorittamaan halutun liikkeen, eli kääntymään 45 astetta ja sitten pysähtymään, jälleen kerran internetin avustuksella. Tähän asti olimme nimittäin käyttäneet servoa vain valmiin kirjaston avulla. Onneksemme vastaus tehtävään löytyi lopulta osoitteesta http://www.linuxcircle.com/2013/07/04/servo-manual-control-without-arduino-servo-library-on-raspberry-pi-and-gertboard/

Ohessa koodimme harjoitukseen:

#define SERVO_PIN 2

int lenMicroSecondOfPeriod = 25 * 1000;
int lenMicroSecondOfPulse = 1000;
int first = 0.7 * 1000;
int end = 3.7 * 1000;
int increment = 0.01 * 1000;
boolean runOnce = false;

void setup()
{
  pinMode(SERVO_PIN, OUTPUT);
}

void loop()
{
  int current = 0;
  if (!runOnce) {
    for (current = first; current < end; current+=increment) {
      digitalWrite(SERVO_PIN, HIGH);
      delayMicroseconds(current);
      digitalWrite(SERVO_PIN, LOW);
      delayMicroseconds(lenMicroSecondOfPeriod - current);
    }
  }
  runOnce = true;
}

Eipä tähän juuri lisättävää :) Terveisin Artsi ja Ana

PS: Tässä vielä videoita urotyöstämme: http://youtu.be/0KMpP2vLd3Y

keskiviikko, 25. helmikuu 2015

Input- ja output-tehtäviä sekä projektipäivitys

Saimme valita seitsemästä tehtävästä mielekkäimmän. Tehtävät 1 ja 2 vaikuttivat hyviltä, sillä ne liittyivät vahvasti omaan prototyyppiprojektiimme, joten teimme molemmat. Tehtävässä 1 täytyi rakentaa jatkuvasti pyörivä servo ja tehtävässä 2 painokytkimellä toimiva ledi. Päätimme yhdistää nämä yhdeksi laitteeksi. Mallia katsoimme "Arduino Projects Book" -kirjan luvuista 2 sekä 12. Ledejä laitteeseen tulikin loppujen lopuksi 3, ja servokin toimii hieman erilailla kuin tehtävänannossa sanottiin, sillä tämä kaikki edisti oman protomme suunnittelua. Kasattu laite näytti seuraavalta:

mikko0_2.jpg

 

Tämän jälkeen ryhdyimme työstämään koodia. Omaa projektiamme silmällä pitäen halusimme, että punainen ledi palaa kun painokytkin ei ole painettuna. Kun nappia painetaan, sammuu punainen ledi ja keltainen ledi syttyy. Servo aloittaa toimintansa ja kääntyy 179 astetta. Tämän jälkeen keltainen ledi sammuu ja vihreä ledi syttyy ilmaisten toiminnan olevan valmis. Servo kääntyy takaisin alkuperäiseen asentoonsa. Vihreä ledi sammuu ja punainen syttyy. Alla koodi:

 #include <Servo.h>
 
 Servo mikko;
 
 int pos = 0;
 int switchState = 0;
 
 void setup() { 
 
   mikko.attach(9);
   pinMode(3, OUTPUT);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   pinMode(2, INPUT);
 }
 
 void loop() {
   switchState = digitalRead(2);
   if (switchState == LOW) {
     digitalWrite(3, HIGH);
     digitalWrite(4, LOW);
     digitalWrite(5, LOW);
   }
   
   else {
     digitalWrite(3, LOW);
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
     for(pos = 0; pos < 179; pos += 1)
     {
       mikko.write(pos);
       delay(15);
     }
     
     mikko.detach();
     delay(2000);
     digitalWrite(4, LOW);
     digitalWrite(5, HIGH);
     
     mikko.attach(9);
     for (pos = 179; pos >= 1; pos -=1)
     {
       mikko.write(pos);
       delay(5);
     }
     delay(5000);
   }
 }

 

Tästä on hyvä jatkaa viskirobottiamme silmällä pitäen. Olemme myös hieman tutkineet vaihtoehtoja astialle jossa viski säilötään, sekä vertailleet kahta eri paksuista silikoniletkua viskin kaatoa varten. Tällä hetkellä 3mm ja 6mm letkuista paksumpi vaikuttaa paremmalta. Tässä vielä videota alkukantaisesta viskimikostamme: 

https://www.youtube.com/watch?v=UMYgdGcOFQk&feature=youtu.be

keskiviikko, 4. helmikuu 2015

Prototyyppi-idea

Hei Jukka!

 

Prototyyppi-ideamme on seuraava:

Aiomme rakentaa baarimikkoautomaatin. Mikko 3000. Tarkemmin sanottuna, viskilasi isketään automaattiin. Lasin paino painaa painokytkimen alas. Tämä aktivoi automaatin, joka servomoottorin avustuksella kaataa tähän lasiin silikoniletkun kautta neljä senttilitraa viskiä. Viinankaadon aikana lasin alla palavat punaiset ledit, ja kun riittävä määrä nautintoainetta on lasissa, syttyvät iloiset vihreät valot.

Isoin ongelma tässä on saada juuri oikea määrä elämän vettä lasiin. Leikittelimme ajatusta erilaisilla sensoreilla, esim. infrapunasensori, joka mittaa nesteen pinnan korkeuden. Päätimme kuitenkin ratkaista tämän probleeman seuraavalla tavalla: Säiliö, jossa haluttu tuote on, asetetaan lähes vaakasuoraan. Silikoniletku liitetään säiliön alimpaan pisteeseen. Off-tilassa letkun toisen pään korkein kohta on nesteen pinnan yläpuolella. Tällöin nesteen ei pitäisi valua valtoimenaan, kun sitä ei haluta. Kun painosensori painuu viskilasin painosta pohjaan, järjestelmä käynnistyy. Servomoottori kääntää letkun lasia kohden. Kun tietty aika on kulunut, servo kääntää letkun takaisin yläilmoihin. Näin saadaan melko tarkasti mitattua tämä neljä senttiä nestettä lasiin.

Lisälaitteita haluamme myös asentaa. Aluksi ainakin eriväriset ledit, jotka ilmaisevat missä vaiheessa prosessia ollaan. Tämän lisäksi voidaan lisätä ääntä tai visuaalisuutta, esimerkiksi LCD-näytöllä, mallia "Juomanne on nyt valmis, sir!".

 

#viski

terveisin Artsi ja Ana.

keskiviikko, 4. helmikuu 2015

Ultraäänisensori

Tehtävänanto:

 

”Tehtävä 2: Kokeile ultraäänisensoria ja valoisuussensoria. Tee if-lauseilla koodia, jos osaat, joilla pyydystät todennäköisiä virhearvoja. Ota tapaukseksi vaikka todeta heiluuko käsi sensorin edessä Dokumentoi kytkentäsi huolella, joko käyttäen Fritzing ohjelmaa (mieluiten) tai sitten piirtämällä. Opettaja haluaisi todeta, ketkä oppivat piirtämään ko. työkalulla. Tee vaaditut kytkennät ultra-äänisensorille.”

 

 

                      Lähdimme liikkeelle luonnollisesti itse laitteen kasaamisella. Internetistä löytyi hyvin ohjeita siihen kuinka kasata tämä yksinkertainen laite, ja pian vehje olikin jo valmiina.

DSC_0004.jpg

                      Tämän jälkeen täytyi luonnollisesti kirjoittaa ohjelma ja ladata se laitteelle. Turvauduimme jälleen internetin apuun, sillä tietotaitomme Arduinolle koodamisessa on melko rajallista. Hyvät ohjeet löytyivät jälleen helposti, tällä kertaa osoitteesta http://www.tautvidas.com/blog/2012/08/distance-sensing-with-ultrasonic-sensor-and-arduino/.

 

                      Jätettyämme koodista pois tuumamitat, lisättyämme maksimi- ja minimietäisyydet sekä yhden if-lauseen ohjelma näytti seuraavalta:

 

int maximumRange = 200;
int minimumRange = 0;

const int trigPin = 2;
const int echoPin = 4;

void setup() {
  
Serial.begin(9600);
}

void loop()

{
  
long duration, cm;
  
pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);
  
duration = pulseIn(echoPin, HIGH);

  cm = microsecondsToCentimeters(duration);
  if (distance >= maximumRange || distance <= minimumRange) {
    Serial.println("VIRHE!");
  }
 else {

  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(1000);
}

long microsecondsToCentimeters(long microseconds)

{
  return microseconds / 29 / 2;
}

 

 

                      Ohjelma siis käskee ultraäänisensoria lähettämään 10 mikrosekunnin ajan signaalia ja mittaamaan kauanko signaalilla kestää palata takaisin. Ohjelma myös muuttaa mikrosekunnit senttimetreiksi ja tulostaa ne ”serial monitoriin” sekunnin välein. Jos taas kohde on liian kaukana tai liian lähellä (määritellään heti ohjelman alussa maximumRange ja minimumRange) tulostaa ohjelma virheilmoituksen.

 

                      Ohjelma ja laitteisto toimivat hyvin. Sensori reagoi etäisyyden muutoksiin melko rankoilla poikkeamilla, mutta tasaantui nopeasti. Signaalien tai niiden välien pituudella ei tuntunut olevan suurta merkitystä mittaustuloksen kannalta. Alla vielä kuva kytkennöistä:

Shotti1.jpg