lauantai 23. toukokuuta 2015

Käsityökerho Robotin Arduino - kurssi 16.5.

Osallistuin Käsityökerho Robotin Arduino-kurssille lauantaina 16.5. Kurssi pidettiin Espoossa taidekeskus Aurorassa sijaitsevissa Käsityökerho Robotin tiloissa. Kurssin vetäjänä toimi Tomi Dufva, toinen Käsityökerho Robotin perustajista.

Arduino Uno, ledejä ja koekytkentälevy
En ollut aikaisemmin tehnyt mitään Arduinoilla, olin toki nähnyt niitä ja tiesin, että niiden avulla voi rakennella pieniä robotteja, kuten OpinSys Nallen tai viivanseuraajarobotin. Ennen kurssia latasin valmiiksi Arduinon ohjelmointiympäristön täältä. Arduinoja voi ohjelmoida myös selaimen kautta Codebenderillä.

Lähdimme tietysti liikkeelle ledin vilkuttelusta. Kiinnitimme yhden ledin pinniin 13 ja pistimme sitä päälle ja pois (pinniin 13 voi kytkeä ledin suoraan ilman vastusta). En ollut aikaisemmin ohjelmoinut ledejä vilkkumaan (saati tehnyt elektronisia kytkentöjä) joten riemu oli suuri kun se todellakin rupesi vilkkumaan. Kytkentä oli siis näin yksinkertainen (piirretty 123D Autodesk Circuit - palvelussa):

Yksi led pinnissä 13
Ja käytetty ohjelmakoodi oli näin yksinkertainen:

// yhden valon vilkutus

// vakiot


int led1 = 13; //led on pinnissä 13 (pitkä haara), lyhyt on GND:ss
 
void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT); // pinnissä 13 on "ulostulo"

}

void valonVilkutus(int pinni){
  digitalWrite(pinni, HIGH);
  delay(1000);       //
aika mikrosekunneissa, yksi sekunti
  digitalWrite(pinni,LOW);
  delay(1000);

}
    
void loop() {
  // put your main code here, to run repeatedly:
  valonVilkutus(led1);   // kaikki koodi laitetaan "loop":in sisään

}

Ledin sai vilkkumaan satunnaisesti tällä koodilla:

void randomValo(int pinni){
  digitalWrite(pinni, HIGH);
  delay(random (1000));            

  digitalWrite(pinni,LOW);
  delay(1000);
  }


Ledin himmentäminen ja kirkastaminen automaattisesti menee näin (ledin pitää olla kiinni ~merkin omaavassa pinnissä, jotta himmentämisessä tarvittava PWM = Pulse Width Modulation toimii). Kykentä tehdään näin:
Himmennettävä led kiinnitetään pinniin, jossa on ~
Ja koodissa ledin arvo asetetaan analogWrite:lla (ei digitalWrite:lla):

// ledin himmennys ja kirkastus

// vakiot
int kirkkaus = 0;  // kuinka kirkas led on
int lisays = 5;    // paljonko kirkkaus lisääntyy (255 maksimi)
int led1 = 11;     // tukee PWM:ää

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);    // kytkentälevyn led1
}

 
void himmennys(int pinni){
  analogWrite(pinni, kirkkaus);
  kirkkaus = kirkkaus + lisays;
 

  if (kirkkaus == 0 || kirkkaus == 255){
  lisays = -lisays;
  }
  delay(30);

}
     
void loop() {
  // put your main code here, to run repeatedly:
  himmennys(led1);
}


Yksinkertaisen kytkimen voi tehdä kahden johtimen kanssa näin (johtimet yhdessä -> valo palaa, johtimet irti valo sammuu):

Oikealla olevat punaiset viivat esittävät irtonaisia johtimen päitä, joilla voi sulkea virtapiirin
// kytkin

// vakiot

int led1 = 11;
int kytkin = 7;
int kytkimentila = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(kytkin, INPUT_PULLUP);
/* PULLUP=alasvetovastus, jännite jää alas */ 
}
 
void valokytkin(int pinni){
  kytkimentila = digitalRead(kytkin);
  if (kytkimentila == LOW)  {  // jos johdot koskevat eli maadotettu
    digitalWrite(pinni, HIGH);
    }
    else {
      digitalWrite(pinni, LOW);
    }

}
   
void loop() {
  // put your main code here, to run repeatedly:  

  valokytkin(led1);
}

Ledin himmentäminen valovastuksen avulla onnistuu tällä koodilla. Valovastus kytkettiin vastuksen kanssa niin, että jännite otetaan ulos niiden välistä. Eri komponenttien kytkentätavat voi katsoa esim. Autodesk 123D Circuits sivuilta. Siellä voi myös simuloida Arduino koodin toimintaa. Toinen vastaava ohjelma on Fritzing (tosin se vaatii asentamisen).

Valovastuksella himmennetty led
Tässä koodin pätkässä käytetään myös sarjamonitoria lukemaan valovastuksen arvoja sekä seuraamaan skaalauksen tulosta:

int valoisuus = 0;
int skaalattu = 0;
int valovastus = A2;    // analoginen sisääntulo
int led1 = 11;          
String vakioteksti1 = " valovastus = ";
String vakioteksti2 = " skaalattu = ";

void setup() {
  Serial.begin(9600);    // otetaan sarjamonitori käyttöön
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(valovastus, INPUT);
}
 

void himmennin(int pinni){
  valoisuus = analogRead(valovastus);
  Serial.println(valoisuus);    // "serial print line"
  delay(30);

  // mäppää arvot välille 0 - 255 (alussa 20 - 800)  

  skaalattu = map(valoisuus, 20, 800, 0, 255);   
  Serial.println(vakioteksti1 + valoisuus);       
  Serial.println(vakioteksti2 + skaalattu);
  analogWrite(pinni, skaalattu);  // skaalattu on välille 0-255



void loop() {
  // put your main code here, to run repeatedly:
 himmennin(led1);
}

Huomaa valovastuksen kytkentä!
Tässä käytetään valovastuksen arvoa sytyttämään yksi led kun on kirkasta, kaksi kun on vähän hämärämpää ja kolme kun on pimeää:

Kolme lediä ja valovastus
int valoisuus = 0;
int valovastus = A2; // analoginen
int led1 = 11;
int led2 = 12;
int led3 = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(valovastus, INPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  valoisuus = analogRead(valovastus);  

  delay(30);
 
  if (valoisuus > 700){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    }
   else if(valoisuus > 100 && valoisuus < 700) {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
     } else
     {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    }

Normaalissa valaistuksesssa palaa kaksi lediä
Tällä koodilla säädellään ledin vilkkumisnopeutta valoisuuden mukaan (kirkkaassa valossa hidas vilkkuminen, pimeässä ei vilkuta ollenkaan ja normaalissa valaistuksessa nopeasti). Tässä voidaan käyttää samaa kytkentää kuin valovastuksella himmennetyssä ledissä (kytkennän ja koodin toiminta  on simuloitu 123D Autodesk Circuit - palvelun avulla):


int valoisuus = 0;
int valovastus = A2; // analoginen
int led1 = 11;

void setup() {
  // put your setup code here, to run once:
  pinMode(led1, OUTPUT);
  pinMode(valovastus, INPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  valoisuus = analogRead(valovastus);
  delay(30);

 
  if (valoisuus > 700){
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
    delay(1000);
    }
   else if(valoisuus > 100 && valoisuus < 700) {
     digitalWrite(led1, HIGH);
     delay(100);
     digitalWrite(led1, LOW);
     delay(100);
     } else
    digitalWrite(led1, LOW);
}


Ja tältä se ledien vilkuttelu sekä valovastuksen toiminta sitten näyttää livenä (kuvassa näkyy Arduino Uno, koekytkentälevy sekä käytetyt komponentit: vastukset, ledit, johtimet sekä valovastus):


Tässä linkkejä, joista voi olla apua kun lähtee suunnittelemaan omia projekteja:
Voisin kuvitella, että 9. luokan sähköopin opiskelun yhteydessä voisin hyvinkin käyttää Arduinoja sekä koodauskerhon touhuissa. Nyt pitäisi vain ostaa sellainen itselle, että pääsisi kokeilemaan kurssilla opittua. Toinen kurssi olisi vielä tarpeen, että osaisi ohjata mottoreita (että aukeaisi mikä se mystinen H-silta ja shield-juttu ovat...).

2 kommenttia:

  1. Moi!

    Hieno kirjoitus kurssin sisällöstä, kiitos siitä. Tutkiskelen parhaillaan onko Kainuun alueella vastaavia kursseja ja minkä hintaisia ovat. Ihan vain esitutkimusta, koska itselläni on mielessä, että saattaisin niitä alkaa järjestämään. Hyvä että ihmiset kirjoittelee kurssien sisällöistä. Kuinka pitkä (ajallisesti) tuo kurssi oli? Entä hinta?

    VastaaPoista
  2. Kiitos. Kurssi oli yhden päivän intensiivikurssi (6h) ja hinta taisi olla 90€. Tässä linkki kurssimainokseen:
    http://www.kasityokoulurobotti.fi/robotin-tyopajat-kasvattajille-kevat-2015/
    Aika tiivis kurssi, varsinkin jos ei ole koodannut C:llä aikaisemmin...

    VastaaPoista