Arduino

WakeWake- herätyskello by Iiro Nurmi & Aicha Haidara

Prototyyppimme:
wakewake

Johdanto

Käymme Tero Karvisen kurssia Prototyypin Rakentaminen. Kurssilla tulee rakentaa jonkinlainen prototyyppi haluamastaan asiasta. Halusimme rakentaa jotain, mitä tarvitsee jokapäiväisessä elämässä ja on tarpeellinen kaikille. Saimme idean herätyskellosta, mutta se kaipasi jotain muutakin kuin vain hälyttävän herätyskellon ominaisuuden. Herätyskello painesensorilla, joka lopettaa soimisen vasta kun tunnistaa, että herätettävä henkilö on noussut ylös sängystä. Tässä on projektimme vaihe vaiheelta.

Alkuvaiheet

Ensimmäiseksi lähdimme hahmottelemaan mitä kaikkea tarvitsemme prototyyppiä varten. Teimme listan tarvitsemistamme osista, tilasimme osia netistä, saimme lainaksi opettajalta, tai löysimme omasta takaa.

Tässä lista käyttämistämme osista:

      Pieni leipäpöytä (dealextreme,

dx.com

      )
      Vastus 18 kΩ (opettajalta)
      Summeri (partco oy,

Partco-Buzzer

      )

FlexiForce

      painesensori (opettajalta)
      Johtoja + yksi servojohto (opettajalta)
    Laatikko (oma, tehty Samsung Galaxy SII kotelosta)

Kun olimme tehneet hahmotelman tarvitsemistamme osista, aloitimme työn. Me käytimme aluksi Arduino Diecimileä, koska tilaamamme Arduino Uno ei ollut saapunut postista. Näiden kahden Arduinon toiminta on kuitenkin aika samanlainen keskenään. Teimme hello world – testin joka kerta kun otimme Arduinon käyttöön. Saimme FlexiForcen käyttöön jo alkuvaiheilla, mutta emme saaneet sitä toimimaan millään. Siirryimme ajastimen testaukseen.

Ajastimen testaus time = millis();

Päätimme kokeilla ajastimen käyttöä ledin avulla. Ennen kuin aloitimme testauksen, etsimme koodin, jonka avulla ajastus toimisi. Kellossamme ei siis näy nykyhetken aikaa, vaan hälytys toimii ajastimella. Asetamme ajan kahdeksaksi tunniksi. Eli kun henkilö on menossa nukkumaan, hän painaa nappia, (nappi johtaa Arduinon reset nappiin) ja ajastin alkaa laskea kahdeksan tuntia. Kun kahdeksan tuntia on kulunut, alkaa hälytys. Tässä vaiheessa testasimme hälytystä siis ledillä. Testissä käytimme paljon lyhyempää aikaa. Laitoimme ledin syttymään neljän sekunnin päästä ja sammumaan kun painaa resettiä.

Alla on koodi itse ajastimen testauksesta. Ajastin laskee eteenpäin, kunnes painaa reset -nappulaa, jolloin se alkaa alusta.

//Example from arduino.cc/Reference/Millis

long time;

void setup(){

Serial.begin(9600);

}

void loop(){

Serial.print(“Time: “);

time = millis(); //prints time since program started

Serial.println(time); // wait a second so as not to send massive amounts of data

delay(1000);

}

Alla on koodi testauksesta aikarajoituksen kanssa. Ajastin laskee eteenpäin, mutta neljän sekunnin jälkeen led syttyy päälle ja sammuu vasta resetoidessa.

long time;

int led = 13;

void setup(){

Serial.begin(9600);

pinMode(led, OUTPUT);

}

void loop(){

Serial.print(“Time: “);

time = millis(); //prints time since program started

Serial.println(time); // wait a second so as not to send massive amounts of data

delay(1000);

if(time >= 4000){

digitalWrite(led, HIGH);

}

}

Tässä on koodi viimeisestä testauksesta, jossa led syttyy päälle neljän sekunnin jälkeen ja samuu itsestään kahdeksan sekunnin jälkeen. Ajastin nollaantuu resetoidessa.

long time;

int led = 13;

void setup(){

Serial.begin(9600);

pinMode(led, OUTPUT);

}

void loop(){

Serial.print(“Time: “);

time = millis(); //prints time since program started

Serial.println(time); // wait a second so as not to send massive amounts of data

if(time >= 4000 && time <= 8000){

digitalWrite(led, HIGH);

}else{

digitalWrite(led, LOW);

}

}

Tässä vaiheessa ajastin toimii oikein. Seuraava vaihe oli Flexiforcen toimiminen ja sen ykytkeminen.

Flexiforce

Kokeilimme monia eri kiinnityksiä FlexiForcelle. Emme tienneet, että sen kytkemiseen tarvittiin vastus. Käytimme 18 kΩ vastusta. Kun saimme vastuksen kytkettyä, FlexiForce toimi oikein hyvin. Meidän käytössä olevassa FlexiForcessa on kolme pinniä. Kuitenkin vain kahta reunimmaista tulee käyttää. Vasemman puoleinen on GND ja oikea on 5v. Alla koodi FlexiForcelle.

int analogPin = A0;

void setup() {

Serial.begin(9600); // initialize serial communication at 9600 bits per second

}

// the loop routine runs over and over again forever:

void loop() {

// read the input on analog pin 0:

int sensorValue = analogRead(analogPin);

Serial.println(sensorValue);

delay(100); // delay in between reads for stability

}

Kun saimme flexiForcen toimimaan siirryimme seuraavaan vaiheeseen, joka oli siis summerin kytkentä ja sen testaus.

Summeri

Summerin käyttö ja kytkentä on erittäin yksinkertainen. Meidän käyttämässä summerissa on mukana kaksi johtoa, musta ja punainen. Musta menee GND:hen ja punainen digital pinniin. Summeri itsessään toimii Blink esimerkki koodilla.

buzzer

Yhdistäminen

Yhdistimme nyt summerin, FlexiForcen ja vastuksen leipäpöydän avulla Arduinoon.
FlexiForceandBuzzer
Tällä hetkellä testasimme prototyypin toimivuutta. Kun painaa FlexiForcea niin summeri rupeaa soimaan. Sen jälkeen testasimme ajan kanssa. Kun on kulunut tietty aika ja FlexiForce tuntee paineen summeri soi ja loppuu vasta kun päästää irti. Eli siirryimme seuraavaan vaiheeseen. Itse ulkoasuun.

Ulkoasu

Käytimme vanhaa Samsungin laatikkoa kotelona. Teimme tarvittavat reiät johtoja varten.

Making_Box
Making_button

Kokoamisen jälkeen päätimme tehdä vielä pari parannusta ulkoasuun ja koodin nähden.

Teimme testin tuolin avulla. Laitoimme FlexiForcen tuolin jalana alle. Niiden välissä hiirimatto pehmentäjänä. Kun tuolilla istui ja aika kului, hälytys laukesi ja loppui siihen, kun tuolilta nousi pois.

stoolandflexi

Logon suunnittelu

Halusimme boxillemme myös asiaankuuluvan logon, pienen suunnittelun jälkeen ja gimpillä rustailun jälkeen logomme näytti tältä:
WakeWake

Lopullinen koodi

Pitkän uurastuksen jälkeen saimme vihdoin kaiken valmiiksi.
Tässä lopullinen koodi herätyskellolle. Herätyskello on laitettu soimaan 8 tunnin ajan päästä, eikä se anna herätettävän mennä takaisin sänkyyn 30minuuttiin:

/* This is a final code for the annoying alarm clock, making robots and gadgets -course
This code runs timer until it is reseted. If the timer has a value between 28800000 Milliseconds (8hrs) and
30600000 Milliseconds (8.5hrs), and flexiforce has weight on it, buzzer will make annoying sound.
this code is free to use and change. It is under the MIT License (http://opensource.org/licenses/mit-license.php)
Iiro Nurmi
*/

int flexiForcePin = A0;

int buzzer = 12;

int flexiValue = 15; // if flexiforce reading is higher than this, buzzer will make noise change this to fit your own requirements

int timeMin = 28800000; // (8 hrs) minimum value for time to start the buzzer, change this to fit your own requirements

int timeMax = 30600000; // (8.5 hrs). maximum time, if this is passed the buzzer will not make sound change this to fit your own requirements

long time;

void setup(){

Serial.begin(9600); // bit/s

pinMode(buzzer, OUTPUT); // set buzzer as an output

}

void loop(){

int flexiReading = analogRead(flexiForcePin);

time = millis(); // time since the program started

Serial.println(flexiReading); // just for testing user can see values in serial monitor

Serial.println(time);

delay(100); // for easier reading

if(flexiReading >= flexiValue && time > timeMin && time < timeMax ){ // if flexiforce has pressure in timeMin – timeMax it the buzzer will make noise

digitalWrite(buzzer, HIGH);
}

if(flexiReading == 0){ // this ensures that if flexiforce has no pressure in it, the buzzer will be quiet

digitalWrite(buzzer, LOW);
}

}

Kytkentäkaavio:
Kytkentäkaavion resitori vastaa omaamme, eikä painesensori ole sama kuin käyttämämme(silti kelpaa vastaavaksi). Painesensori on kytketty groundiin ja analogpinniin vastuksella. Punainen johto menee V5:seen. Summeri kiinnitetään digitalpin 12 ja groundia on jatkettu painesensorin groundista.

Jatkokehitys
On myönnettävä, että herätyskellomme on tässä vaiheessa vielä todellisessa prototyyppivaiheessa. Näen kuitenkin siinä paljon potentiaalia ja kehitettävää. WakeWake olisi heti parempi, jos se olisi toteutettu langattomasti, prototyyppivaiheessa emme ehtineet lisätä enää patteria, joten demostraatiotilaisuus pidetään johto visusti tietokoneessa kiinni. WakeWake ei tällähetkellä ole käyttäjäystävällisin. Ilkeä ohjelmoija saattaa tehdä herätettävän olosta tukalan, sillä käyttäjä itse (ilman ohjelmointitaitoja), ei pysty säätämään kellon herätysaikaa (tämähän ei sinänsä ole huono asia!). Halusimme myös lisätä ledit, jotka kertovat onko hälytys käynnissä, voiko sänkyyn jo palata ilman että hälytys soi. Kuitenkin helpolta tuntunut lisäys ei prototyyppiimme tällä kertaa ehtinyt. Kritisoimme myös painesensorin tarpeellisuutta: loppujenlopuksi normaali kytkinkin olisi pienellä säädöllä kelvannut. Äänentoistoon voisi laittaa kaiuttimen summerin sijaan, mutta olemme tyytyväisiä tämänhetkiseen ärsyttävään ääneen.

Olen tyytyväinen, että päädyimme juuri kyseisen idean toteuttamaan. Projekti täytti kurssin aikatauluun nähden kriteerinsä. Yksinkertainen, mutta käytännöllinen, idea, jota ei oltu muualla toteutettu ja mistä koituisi hupia ja harmia käyttäjälleen. Jatkokehitystä voi viedä myös täysin omaan räätälöityyn muotoon.

Katso kuvia projektinvaiheista:
->Slideshow<-

Lähteet
Tehtävä pohjautuu Tero Karvisen kurssiin http://terokarvinen.com/2012/aikataulu-prototyypin-rakentaminen-bus4tn007-4-loppukevat-2013

How the Flexiforce works http://bildr.org/2012/11/flexiforce-arduino/

How the AnalogRead works http://arduino.cc/de/Reference/AnalogRead

Time millis reference: http://arduino.cc/en/Reference/Millis

Tämä dokumentti on myös luettavissa osoitteessa: http://cluedoblog.wordpress.com/2013/05/11/wakewake-heratyskello-by-iiro-nurmi-aicha-haidara/

Tätä dokumenttia saa kopioida ja muokata GNU General Public License (versio 2 tai uudempi) mukaisesti. http://www.gnu.org/licenses/gpl.html

Sarjaportilta viestejä tietokoneelle

Minulla oli käytössä pelkkä arduino uno, joten tein vain osan tehtävästä.

Kokeilin ensin, että serial monitor toimii. Laitoin serialmonitorin alkamaan 115200 bt/s, koska se on yleisin nopeus joka toimii useimmilla arduinoilla.
Koodi:

void setup(){

Serial.begin(115200);

}

void loop(){
Serial.print(”Hello! ”);
delay(100);
}

Monitorissa tulostui Hello! jatkuvasti.

Tietokoneelle viestejä serialmonitorilta

Linuxista löytyi python valmiina, joten tein uuden kansion mkdir puuton ja sinne nano tespuuton.py
Kirjoitin tiedostoon:

print(’Hello World!’)

Sitten komentokehotteessa vielä python tespuuton.py ja komentokehotteeseen tuli iloisesti Hello World!

muutin tespuuton tiedoston koodin seuraavaksi:

import serial

ser = serial.Serial(’/dev/ttyACM0’, 115200)

while 1:
try:
print ser.readline()
delay(100)

Koitin ajaa tiedostoni python tespuuton.py, mutta komentokehotteeseen tuli errorviesti:

serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 13] Permission denied: ’/dev/ttyACM0’

Koitin muuttaa oikeuksiani

sudo usermod -a -G dialout xubuntu

http://arduino-er.blogspot.fi/2013/03/serialserialutilserialexception-could.html

Tämäkään ei auttanut..
Vaivuin epätoivoon usean yrityksen jälkeen.
Koitin päivittää pythonin, ei auttanut sillä oli jo päivitetty.

Arduino: Sensorilla toimintoja

Tein tehtävän yhdessä Aicha Haidaran kanssa. Käytimme:
Arduino Diecimilea
2 led lamppua
Leipäpöytää
Nappia

Ensimmäinen vaihe on testata, että Hello World toimii. Kytkimme Arduinon leipäpöytään, johon oli kytketty yksi led lamppu. Arduinossa paloi kaikki oikeat merkkivalot ja led syttyi komentamallamme tavalla (pinmode output, high).

WP_000003

Siirryimme itse projetkiin.

Napin käyttö:

Default toimintona napin painallus katkaisee virran.

Testasimme sen toiminnon: kun nappia painaa ledistä ei tule valoa, kun taas ei paina, ledissä palaa valo normaalisti. Kytkimme kaksi uutta lediä leipäpöytään ja toiminto toimi edelleen hyvin. Ongelmana oli napin pysyvyys leipäpöydässä, joten jouduimme painamaan toisella sormella nappia leipäpöytään kiinni.

Kokeilimme aivan normaalia valojen vilkkumista koodilla:

int pinMaster = 12;

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

void loop() {
digitalWrite(pinMaster, HIGH);
delay(500);
digitalWrite(pinMaster, LOW);
delay(500);
}

Digital read
Kokeilin vielä omaksi projektiksi saada serial monitorille numeroita. Tällä koodilla serialmonitoriin laiton puolen sekunnin välein mittaamaan buttonin tilaa:

int button = 2; // set variable button as 2 for the pin 2

void setup() {
Serial.begin(9600);
pinMode(button, INPUT);
}
void loop() {

int buttonState = digitalRead(button); //read pin input
Serial.println(buttonState); // print to serial monitor buttons state
delay(500); // delay half second
}

Arduino: Servolla kokeilua

Tehtävään käytetyn tietokoneen tiedot löytyvät täältä.

Tehtävänä oli kokeilla servolla eri tavoilla, käyttäen esimerkiksi DigitalWrite -komentoa.

Aloitetaan päivittämällä paketit: $ sudo apt-get update
Asennetaan arduino: $ sudo apt-get install arduino
Lisätään käyttäjä ryhmään dialout: $ sudo adduser iiro dialout
Kirjaudutaan dialout ryhmään: $ newgrp dialout
Aloitetaan arduinon käyttö: $ arduino
Valitaan oikea arduino (arduino diecimila) ja oikea usb portti.

Servon käyttö
Servossa on kolme johtoa, väriltään ruskea punainen ja oranssi/keltainen (ainakin omassa mallissani). Ruskea johto yhdistetään groundiin, punainen sähkövirtaan (5volttia) ja oranssi on omavalintaiseen data-pinniin.
arduinoservo

Kun yhdistät arduinon tietokoneeseesi, kokeile ensin hello world!

Servon toimintaa voit kokeilla esimerkkikoodeista löytyvillä sweep ja knob koodeilla.
Servo.h
Servo.h on arduinon valmis kirjasto servon ohjailuun. Se lisätään komennolla #include
Kokeilin:
Ongelmaksi koitui että servo pyöri hallitsemattomasti, varmaankin sen takia,ettei tiennyt omaa ”sijaintiaan”.

#include

int myPin = 9;
Servo servoA;

void setup()
{
servoA.attach(myPin); //attach servo to pin 9 (myPin)
}
void loop (){ //this loops makes the servo to circle between 0 and 90 degrees
servoA.write(0);
delay(1000);
servoA.write(90);
delay(1000);
}

Etsi omaperäinen Arduino-projekti ja kuvaile se lyhyesti

Löysin nopealla selaillulla Arduino-projektin, jossa projektin tekijät olivat tehneet ledeillä kuution. Kun kuution laittaa päälle, se tekee erilaisia valo-efektejä, kuten valopallon joka liikkuu kuutiossa. Led-kuutio on tehty kolvaamalla sinisiä ledejä toisiinsa kiinni ja ne ovat yhdistetty yhteiseen jalustaan. Jalusta on puuta johon on tehty reiät, jonka kautta johdot kytketään kehikkoon. Koodi on ledien päälle laittamista ja sulkemista tietyssä järjestyksessä. Tähän tarvitsee jo hiukan taitoja. Nettisivuilla on todella syvällinen kokonaisuus projektin vaiheista, projektiin tarvittavista osista ja tietysti koodit.
Led Cube

Lähteet:

http://terokarvinen.com/2012/aikataulu-prototyypin-rakentaminen-bus4tn007-4-loppukevat-2013

http://www.instructables.com/id/Led-Cube-8x8x8/#intro

Arduinolla Hello World

Tein tehtävän haaga-helian labraluokassa.

Aloitetaan päivittämällä paketit: $ sudo apt-get update
Asennetaan arduino: $ sudo apt-get install arduino
Lisätään käyttäjä ryhmään dialout: $ sudo adduser iiro dialout
Kirjaudutaan dialout ryhmään: $ newgrp dialout
Aloitetaan arduinon käyttö: $ arduino

Das it work?
Jotta tiedettäisiin toimiiko arduino oikein (tai ylipäätään toimiiko) aloitetaan yksinkertaisella ohjelmalla. Tätä voidaan kutsua arduinon Hello Worldiksi.
Kopioin arduino -ohjelmistoon koodin (http://www.arduino.cc/en/Tutorial/BlinkingLED), joka sytyyää portin 13 ledin.
Yhdistän ledin miinuspään groundiin ja plussan porttiin 13.
WP_000579
Laitan usb-johdon tietokoneeseeni kiinni.
Painan arduino ohjelmassa upload.
Ja ledihän se sielä välkkyy sekunnin välein:
WP_000577

/* Blinking LED
* ————
*
* turns on and off a light emitting diode(LED) connected to a digital
* pin, in intervals of 2 seconds. Ideally we use pin 13 on the Arduino
* board because it has a resistor attached to it, needing only an LED

*
* Created 1 June 2005
* copyleft 2005 DojoDave <http://www.0j0.org&gt;
* http://arduino.berlios.de
*
* based on an orginal by H. Barragan for the Wiring i/o board
*/

int ledPin = 13;                 // LED connected to digital pin 13

void setup()
{
pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()
{
digitalWrite(ledPin, HIGH);   // sets the LED on
delay(1000);                  // waits for a second
digitalWrite(ledPin, LOW);    // sets the LED off
delay(1000);                  // waits for a second
}