30.5.2016

Valmis!!!

Valojen prototyyppi on valmis!

Valot syttyvät kun pyörä on liikkeessä pimeällä. Kiihtyvyysanturi havaitsee myös stepperien tärinää, joten se sytyttää valot lopussa, vaikka varsinainen liike loppuu.


Katso linkki:


https://youtu.be/v0M95Jqieoo

Kohta se on valmis

Pienen pohdinnan jälkeen, kaikki komponentit löysivät paikkansa piirilevyltä. Circuit wizard -ohjelman uusi versio ei tukenut enää vanhaa piirustustamme, joten paikat piti katsoa pohtimalla.

Koodi syötettiin arduinoon, minkä jälkeen koodia testattiin koekytkennällä.
Samalla valoille tehtiin 3D-tulostimella pidikkeet, jotka saatiin kiinni steppereihin.



Komponentit juotettiin paikoilleen piirilevylle, minkä jälkeen osia alettiin kiinnittämään laatikkoon.


Valmis koodi

Koodi valmistui pääsiäisenä 2014. Projektia pääsimme jatkamaan keväällä 2016. Heh.


Tässä valmis koodimme:




//21.4.-14 Looppiin tehty erilliset funktiot


//23.5.-16 Koodi ladattu Arduinoon


 


#include <Stepper.h>


//Valovastukset


int analogInput1 = A4; // Potentiometrin keskimmäinen jalka kytketään tähän pinniin


int analogInput2 = A5; // Potentiometrin keskimmäinen jalka kytketään tähän pinniin


int arvo1 = 0; // jännitteen arvo tallennetaan tähän muuttujaan


int arvo2 = 0; // jännitteen arvo tallennetaan tähän muuttujaan


int keskiarvo = 0; // jännitteen arvo tallennetaan tähän muuttujaan




//Kiihtyvyysanturi


int xPin = 1;


int yPin = 2;


int zPin = 3;


int arvo;


int vanhaArvo;


int laskuri = 0;


 
//Ledit


const int ledPin = 9;





//Askelmoottorit


const int stepsPerRevolution = 200;


Stepper myStepper(stepsPerRevolution, 2,4,3,5);           


int digitalPin1 = 7;


int digitalPin2 = 8;


 


void setup(){


 


    pinMode(ledPin, OUTPUT);


    pinMode(7, INPUT);


    pinMode(8, INPUT); 


    // set the speed at 60 rpm:


    myStepper.setSpeed(60);


    // initialize the serial port:


    Serial.begin(9600);


}


 


void loop() {


    valovastus();


    stepperi();


}


 


void valovastus() {


    arvo1 = analogRead(analogInput1);


    arvo2 = analogRead(analogInput2);


    keskiarvo = (arvo1+arvo2)/2;


    // Tulostetaan saalis sarjaporttiin:


    Serial.print("Jännite = " );


    Serial.println(keskiarvo); // "Serial.println" komento vaihtaa riviä tulostuksen jälkeen


    if (keskiarvo<500) {


        kiihtyvyysanturi();


    }


    else if (keskiarvo>500) {


        digitalWrite(ledPin, LOW);


    }


}


 


void kiihtyvyysanturi() {


    int xRead = analogRead(xPin);


    int yRead = analogRead(yPin);


    int zRead = analogRead(zPin);


    int arvo = xRead+yRead+zRead;


 


    Serial.print("x: ");


    Serial.print(xRead);


    Serial.print(" | y: ");


    Serial.print(yRead);


    Serial.print(" | z: ");


    Serial.println(zRead);


    Serial.print("arvo ");


    Serial.println(arvo);


 


    delay(3);


    if (laskuri < 1) {


        if(abs(arvo-vanhaArvo) > 100) { //abs on itseisarvo, joka tekee laskun miinusmerkkisestä luvusta plusmerkkisen. >100 kynnysarvo liikkelle, mikä määrää syttyykö valo vai ei.


            digitalWrite(ledPin, HIGH); // sytyttää ledin.        


            laskuri = 100; // laskuri määritetään arvoksi 100, jolloin ledit ovat päällä 100 silmukan kierrosta. 


        }


        else {


            digitalWrite(ledPin, LOW); //sammuttaa ledit.           


            laskuri = 0; //laskuri määritetään arvoksi 0.


        }


    }


    laskuri--; //vähentää laskurin arvosta 1.


    vanhaArvo = arvo; //tallennetaan arvo seuraavan kierroksen arvoksi.


}


 


void stepperi() {


    if (digitalRead(digitalPin1)==HIGH) {


        // step one revolution  in one direction:


        Serial.println("clockwise");


        myStepper.step(50);


        delay(5);


    }


    if (digitalRead(digitalPin2)==HIGH) { 


        // step one revolution in the other direction:


        Serial.println("counterclockwise");


        myStepper.step(-50);


        delay(5);


    }


}

22.4.2014

(abs(arvo-vanhaArvo)>100)

Olemme tässä kuukauden verran tuskailleet kiihtyvyysanturin kanssa. Koodia emme tahtoneet millään saada tehtyä ja kysymyksiä itse komponentista tuli koko ajan lisää. 

Muun muassa tällaisia kysymyksiä pohdittiin: 
- miten koota koodi, kun anturilla ei ole nollakohtaa
- sytyttää valot, sammuttaa valot määritetyn ajan jälkeen -> ei jätä valoja päälle
- jos pyörä kaatuu/heiluu tuulessa -> sytyttää valot -> valot räpsyvät
- laskuri? Niin ku mikä? Miten määritellään? Mitä se tekee? Mihin sitä tarvitaan? Miten se laitetaan koodiin? Miksi?? 
- jos pyörä liikkuu tasaista tahtia, sammuvatko valot? 
- käyttöjännite 3,3V vai 5V ?  

Pääsiäisenä tapahtui ihme ja pääsiäispupu auttoi meitä tekemään koodia. 
Ihmeeseen kuului myös tuon laskurin ymmärtäminen. Saimme tehtyä kiihtyvyysanturille koodin, joka toimii. Pääsiäispupu auttoi myös ymmärtämään koodauskieltä, jolloin kiihtyvyysanturin koodi on nyt selvää karitsan lihaa. Kiitos Pääsiäispupu! :)

Pääsiäispupu neuvoi meitä myös, miten luodaan funktioita koodin sisälle. Kokosimme koodit yhteen niin, että valovastukset, kiihtyvyysanturi ja stepperit ovat omina funktioina. Tätä emme ole vielä kokeilleet käytännössä, mutta Arduino-ohjelma hyväksyi sen... 

Kiihtyvyysanturi ratkaistiin seuraavasti: 

void kiihtyvyysanturi() {
    int xRead = analogRead(xPin);
    int yRead = analogRead(yPin);
    int zRead = analogRead(zPin);
    int arvo = xRead+yRead+zRead;

    Serial.print("x: ");
    Serial.print(xRead);
    Serial.print(" | y: ");
    Serial.print(yRead);
    Serial.print(" | z: ");
    Serial.println(zRead);
    Serial.print("arvo ");
    Serial.println(arvo);
    delay(3);

    if (laskuri < 1) { 
        if(abs(arvo-vanhaArvo) > 100) { //abs on itseisarvo, joka tekee laskun miinusmerkkisestä luvusta plusmerkkisen. >100 kynnysarvo liikkelle, mikä määrää syttyykö valo vai ei.
            digitalWrite(ledPin, HIGH); // sytyttää ledin.         
            laskuri = 100; // laskuri määritetään arvoksi 100, jolloin ledit ovat päällä 100 silmukan kierrosta.  
        }
        else { 
            digitalWrite(ledPin, LOW); //sammuttaa ledit.            
            laskuri = 0; //laskuri määritetään arvoksi 0.
        }
    }
    laskuri--; //vähentää laskurin arvosta 1.
    vanhaArvo = arvo; //tallennetaan arvo seuraavan kierroksen arvoksi.
}

Liikkeen kynnysarvo täytyy vielä määritellä pyörän kanssa, samoin kuin laskurin arvot. 
Tästä on nyt hyvä jatkaa hyvällä fiiliksellä ja uudella innokkaalla motivaatiolla (joka kävi jo aika pohjalla). :)

- V & M 

17.3.2014

(arvo1+arvo2)/2;

Tänään kokeilimme uudestaan tuota valovastus+ledi -kompoa. Pienen pohdinnan jälkeen saimme lisättyä toisen valovastuksen ja toisen ledin samaan kytkentään. Koodiin lisäsimme toisen valovastuksen (arvo2) ja muutimme valovastuksen arvon lukemisen arvo1 ja arvo2 keskiarvoon.

Toisen ledin kytkimme ensimmäisen kanssa rinnan, samaan pinniin.

Toimii! :)

Piirrettiin myös kytkentäkaavio kahdesta valovastuksesta ja kahdesta ledistä..

- V & M

11.3.2014

Valovastus ja ledi - milloin on pimeää?

 Tässä on muutamaan otteeseen yritetty saada valovastuksen arvoilla ledi syttymään.
Siis: valovastuksen jännitteen arvo < x, jolloin ledi syttyy, muutoin ledi ei pala.
Tässä yksi monesta epäonnistuneesta versiosta:

Netistä löytyi muutama erilainen malli, joilla kytkentä on saatu toimimaan meidän vaatimalla tavalla tai siitä hieman poiketen.
Monien koodimuutosten (monta eri koodia tuli tehtyä) jälkeen päädyin tällaiseen:


    int analogInput = A0; // Potentiometrin keskimmäinen jalka kytketään tähän pinniin

    int arvo = 0; // jännitteen arvo tallentaan tähän muuttujaan
   
    const int ledPin = 12;

    void setup()
    {
     
    pinMode(ledPin, OUTPUT);

    // Seuraava komento avaa sarjaliikenteen tietokoneelle nopeudella 9600 bps:

    Serial.begin(9600);

    }

    void loop() {

    // Sitten luetaan jännite analogisesta inputista:

    arvo = analogRead(analogInput);

    // Tulostetaan saalis sarjaporttiin:

    Serial.print("Jännite = " );

    Serial.println(arvo); // "Serial.println" komento vaihtaa riviä tulostuksen jälkeen
   
    if (arvo<500)
    {
    digitalWrite(ledPin, HIGH);

    // pieni tauko:

    delay(5);
    }
   
else if (arvo>500)
  {
    digitalWrite(ledPin, LOW);
   
    delay(5);
  }
  
  }

Ja tältä tämä koodi näytti:

Seuraavaksi pitää pohtia, mikä tuo jännitteen raja-arvo on pimeälle. Tulee myös miettiä miten koodia ja kytkentää tulee muuttaa, että siinä on kaksi lediä (jotka toimivat samaan aikaan) ja kaksi valovastusta, joiden jännitteiden keskiarvoa arduino lukee.

- V (M on valloittamassa maailmaa, niittämässä mainetta ja kunniaa...)

28.2.2014

Askelmoottorit ja kytkin - ne toimivat !

Pari päivää tässä kokeilimme erilaisia variaatioita saada askelmoottorit toimimaan kytkimellä. Eilen saimme moottorit toimimaan omalla koodillaan ilman kytkintä, mutta kytkimen kanssa ei tapahtunut mitään. Itse kytkentään emme siis koskeneet.

Saimme hieman apua koodin muokkaamiseen, jonka jälkeen saimme pienillä säädöillä (koodin) kytkennän toimimaan. Tässä lopputulos:


Tässä vielä kytkentäkaavio:


- V & M