Tänään paneuduin pitkästä aikaa virtapiirien kytkentäkuvien piirtämiseen ja huomasin, että aikaisemmin käyttämäni circuits.io:n Electronics Lab olikin vaihtunut Tinkercad:ksi. No, hyvin näytti tämänkin toimivan. Koodi oli helppoa tehdä blokkieditorilla ja simulointi toimi mainiosti. Uutta oli myös se, että johtimet sai piirrettyä hienosti kaareviksi. Simuloinnin lisäksi koodin saa myös ladattua omalle koneelle ArduinoCC-tiedostona! Eipä hullumpaa.
Tässä ensimmäinen kokeiluni, servomoottorin ohjaaminen potentiometrillä. Simulaation käynnistämisen jälkeen tartu hiirellä potentiometriin ja liikuttele sitä niin saat servon kääntymään. Jos haluat tutkia koodia, sen saa näkyviin valitsemalla "Code".
Arduino kytkettynä potentiometriin ja servomoottorin
Vastaava toiminta micro:bit:illä ei toiminut aivan näin hyvin. Simulaatioon ei voi itse lisätä komponentteja, servo kyllä ilmestyy siihen automaattisesti kun koodiin valitsee servoblokin, potentiometriä ei voi lisätä mutta sitä voi mallintaa klikkailemalla P1-pinniä. Ensimmäinen versio koodista ei toiminut. Ilmeisesti vika on siinä, että koska JSBlocks ei tue liukulukuja jakolasku pyöristyy nollaksi...
Hyvältä näyttää mutta ei toimi...
Kun laskujärjestyksen muuttaa niin, että kertolasku suoritetaan ensin, homma lähtee toimimaan. Aika kinkkistä...
Tämä versio koodista toimii
Tässä linkki projektiin. Microbit:iin ladattuna koodi ei kuitenkaan toimi yhtä hyvin kuin Arduino:ssa, servo pörisi ja nyki epäilyttävästi. Tämä johtuu micro:bit:in alemmasta käyttöjännitteestä (Arduino 5V, micro:bit 3,3V).
Tässä vielä vertailun vuoksi sama koodi ohjelmoituna C++:lla ja mbed:llä:
#include "MicroBit.h"
MicroBit uBit;
int main()
{
uBit.init();
while(1){
int potikka = uBit.io.P1.getAnalogValue(); //P1: 0-1024
int moottori = (int(potikka/1024.0*180));
uBit.io.P0.setAnalogValue(moottori); //P0: 0-180
uBit.sleep(10);
}
}
Myös mbed:llä ohjelmoidessa kokonaislukujen jakolaskun kanssa pitää olla tarkkana ja muistaa muuttaa ainakin toinen liukuluvuksi (vrt. 1024.0 yllä olevassa koodissa) ettei tulos pyöristy tässäkin nollaan.
Tämän kytkennän sai toimimaan ilman kondensaattoria Arduinon kanssa mutta micro:bit:illä ei (moottori jämähti välillä paikoilleen). Kondensaattorin tarkoitus on tässä tasailla moottorin käynnistämisen aiheuttamia virtapiikkejä, ja ilmeisesti alemmalla käyttöjännitteellä tasaaminen auttaa pitämään moottorin käynnissä paremmin. micro:bit:in kanssa pitäisi ilmeisestikin käyttää ulkoista jännitelähdettä servolle, ja se taas johtaisi paljon monimutkaisempaan kytkentään...
micro:bit kytkettynä potentiometriin ja servomoottoriin
Koska seinä nousi pystyyn summerin soitossa mbed:in kanssa, päätin kokeilla toista C/C++ tyylistä ohjelmointiympäristöä ArduinoCC:tä micro:bit:in ohjelmointiin. micro:bit ei ole suoraan tuettu ArduinoCC:ssä (korttivalikosta ei löydy heti heittämällä micro:bit:iä), mutta sen voi ladata helposti. Valitse Tiedosto -> Asetukset ja lisää kohtaan "Additional Boards Managers URL"-kohtaan: https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json ja valitse ok. Tämän jälkeen avaa Työkalut -> Kortti -> Boards manager ja kirjoita hakukentään nRF5, valitse Nordic Semiconductors by Sandeep Mistry ja paina "asenna". Nyt voit käydä valitsemassa Työkalut -> Kortti -listasta micro:bit:in, muista myös valita oikea COM-portti kuten Arduinonkin kanssa. Valitse vielä Työkalut -> Softdevice valikosta "S110". Nyt sinulla on yhteys micro:bit:iin ja voit ohjelmoida sitä kuin Arduino:a. Koodi latautuu suoraan micro:bit:iin, eli sitä ei tarvitse erikseen siirtää kuten mbed:in tai JS Blocks:in kanssa.
micro:bit - tuen lisääminen ArduinoCC:hen (ensimmäinen vaihe)
micro:bit - tuen lisääminen ArduinoCC:hen (toinen vaihe)
Tässä pieni koodin pätkä, jossa ohjataan ledinäytön vasemman yläkulman lediä. Kun A-napista painetaan ledi alkaa vilkkua, kun napista B painetaan se pimenee ja kun mitään ei paineta, se palaa koko ajan.
const int COL1 = 3; const int LED = 26; const int buttonA = 5; // the number of the pushbutton pin const int buttonB = 11; // the number of the pushbutton pin void setup() { pinMode(COL1, OUTPUT); digitalWrite(COL1, LOW); pinMode(LED, OUTPUT); pinMode(buttonA, INPUT); pinMode(buttonB, INPUT); } void loop() { if (! digitalRead(buttonA)) { digitalWrite(LED, HIGH); delay(500); digitalWrite(LED, LOW); delay(500); } else if (! digitalRead(buttonB)) { digitalWrite(LED, LOW); } else { digitalWrite(LED, HIGH); } delay(10); }
Koska ledi näytön 25 lediä ohjataan 12 pinnillä oman logiikkansa mukaisesti (ledit multipleksattu, katso lisätietoa), sen käyttäminen ilman apukirjastoa on hieman sekavaa ja työlästä. Onneksi näytön ohjaamiseen on tarjolla kirjasto ja sen asentaminen onnistuu yhtä vaivattomasti kuin edellinenkin laajennos. Lataa github:ista seuraava zip-tietosto: https://github.com/ht-deko/microbit_Screen/archive/master.zip ja avaa valikosta Sketsi -> Sisällytä kirjasto -> Tuo .ZIP kirjasto.
Kirjaston asentaminen ArduinoCC:hen
Valitse lataamasi .ZIP - tiedosto, jonka jälkeen voit lisätä sen koodiisi valikosta Sketsi -> Sisällytä kirjasto -> microbit_Screen-master. Tämän jälkeen koodiisi ilmestyy seuraava rivi koodia, joka ottaa kirjaston käytöön: #include <microbit_Screen.h>
Tämän kirjaston avulla ledinäytölle saa vaivattomasti tekstiä, esimerkkinä se kuuluisa "Hello World!":
#include <microbit_Screen.h> void setup() { SCREEN.begin(); } void loop() { SCREEN.showString("Hello,World!"); }
Vielä täytyy testata miten sen potentiometrillä ohjattavan RGB:n ledin ja summerin koodi oikein ArduinoCC:llä taittuisi... ja eihän se sitten lopulta toiminut. tone - funktiota ei löytynyt micro:bit:ille ja muutenkin koodin toiminta "pätki" eli ledi ei reagoinut reaaliajassa potentiometrin pyöritykseen kuten mbed:in kanssa. 1-0 mbed:ille ja 0-0 summerin käytössä :-)
Jatkoimme sensoreihin tutustumista tekemällä kytkennän Project 7: Temperature Alarm. Tässä lämpötilasensorin antama jännitearvo muunnetaan ensin celsiusasteiksi, jota sitten käytetään ehtolauseessa. Ledin tilalle otetaan summeri, joka laitetaan soimaan kun lämpötila nousee riittävän korkeaksi. Rakensimme kytkennän tämän ohjeen mukaisesti:
Project 7: Temperature Alarm
image source: http://image.dfrobot.com/image//Blog/
Tätäkin kytkentää lähdimme tutkimaan sensori edellä, eli katsoimme ensin sarjamonitorin avulla, millaisia arvoja lämpötilasensori syöttää meille.
int SUMMERI = 8; int SENSORI = 0; int arvo = 0; void setup() { pinMode(SUMMERI, OUTPUT); Serial.begin(9600); } void loop() { arvo = analogRead(SENSORI); Serial.println(arvo); }
Lämpötilan sensorin raaka-arvot liikkuivat 50 (huoneen lämpötila) ja 60 välillä (uloshengitys).
LM-35 lämpötilasensori on toimii lineaarisesti, eli kun lämpötila kasvaa asteella, sensorin jännite kasvaa 10mV. Sen yhtälö on siis:
Koska käytämme 5.0V jännitettä ja analogRead muuntaa jännitearvot kokonaisluvuiksi välille 0-1024, sensorin antama raaka-arvo (x) voidaan muuttaa celsiusasteiksi seuraavan kaavan avulla:
NOTE: Tämän projektin kanssa hämmennystä aiheutti summerin + merkki, joka näytti olevan väärällä puolella summeria ja tästä johtui se, että alkuun ääntä ei tullut lainkaan.
Toiseksi projektiksi valikoitui Project 9: Auto light, koska siinä otetaan käyttöön ensimmäinen sensori ja sen avulla päästään harjoittelemaan ehtolauseen käyttämistä. Tässä projektissa hyödynnetään aikaisempia tietoja ledeistä ja lisäksi tutustutaan arvon lukemiseen analogisesta pinnistä sekä muutosten seuraamiseen sarjamonitorin avulla.
Kytkentä tehtiin kytkentäkortin Project 9: Auto light avulla (Light sensitive LED):
Project 9: Auto light
image source: http://image.dfrobot.com/image//Blog/
Ensimmäiseksi lähdimme tutkimaan valovastuksen toimintaa sarjamonitorin avulla. Jotta ehtolauseita voitaisiin muodostaa, olisi tiedettävä millaisia arvoja vastus tuottaa. Tämän koodin avulla pystyy monitoroimaan valovastusta:
int LED = 13; int SENSORI = 0; int arvo = 0; void setup() { pinMode(LED,OUTPUT); Serial.begin(9600); } void loop() { arvo = analogRead(SENSORI); Serial.println(arvo); delay(10); }
Sarjamonitorissa on kaksi toimintoa, lukuarvojen monitorointi sekä serial plotter. Tässä tapauksessa visuaalisempi plotter toimii hyvin, kun valovastusta valaisee kännykän lampulla arvot muuttuvat selvästi. Plotter käynnistetään valikosta: Työkalut : Serial Plotter.
Nyt kun valovastuksen toiminnasta on jonkinlainen käsitys, pääsimme tekemään ehtolauseita ledin vilkuttelua varten. Ensimmäinen tehtävä oli tehdä yksi ehtolause, joka sammutaa ledin kun valaistusolosuteet ovat riittävän kirkkaat.
int LED = 13; int SENSORI = 0; int arvo = 0; void setup() { pinMode(LED,OUTPUT); Serial.begin(9600); } void loop() { arvo = analogRead(SENSORI); Serial.println(arvo); if(arvo < 1000){ digitalWrite(LED, LOW); } else{ digitalWrite(LED, HIGH); } delay(10); }
Lisätehtävänä oli tehtä sisäkkäiset ehtolauseet niin, että ledi vilkkuu kolmella eri tavalla riippuen valaistuksesta. Tässä yksi malliratkaisu:
int LED = 13; int SENSORI = 0; int arvo = 0; void setup() { pinMode(LED,OUTPUT); Serial.begin(9600); } void loop() { arvo = analogRead(SENSORI); Serial.println(arvo); if(arvo < 1000){ digitalWrite(LED, LOW); } else{ if(arvo > 1010){ digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); }else{ digitalWrite(LED, HIGH); } } delay(10); }
Tänä vuonna pääsimme ensimmäistä kertaa käyttämään kunnolla DFRobot:in Beginner Kit for Arduino - paketteja 8.luokan ohjelmointikurssin kanssa. Teimme paketin mukana tulleiden kytkentäkorttien avulla demoprojekteja, ja koodasimme niihin toimivat ohjelmat. Ryhmässä oli 14 oppilasta ja 10 Arduino Kit:iä, joten osa teki pareittain ja osa yksin. Kolme ensimmäistä projektia toimivat hyvin ja ne saatiin pääpiirteissään tehtyä yhden kaksoistunnin aikana. Ryhmällä oli aikaisempaa kokemusta Arduinoista, joten rakentaminen sujui ilman isompia ihmettelyjä ja yritimme keskittyä enemmän ohjelmointiin. Ainoa hämminkiä aiheuttanut asia oli se, että kyntkentäkortien kuvissa oli vähemmän vihreitä sekä punaisia pinnejä kuin itse laitteessa. Tästäkin selvittiin kun oli tarkkana ja muisti laskea pinnit pienimmästä suurimpaan (ja jättää lopusta kaksi pinniä tyhjäksi).
Project 2: SOS Beacon
Ensimmäinen tavoite oli saada ledi ylipäätään vilkkumaan.
Project 2: SOS Beacon
image source: http://image.dfrobot.com/image//Blog/
Ohjelmakoodi ledin vilkuttamiseen on hyvin yksinkertainen:
int LED = 10; void setup() { pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); }
Jotta koodin voi ladata Arduinoon, pitää muistaa valita oikea sarjaportti USB-kaapelille:
Valitse Työkalut-valikosta oikea portti Arduinolle, ennen koodin lataamista siihen
Seuraava tehtävä olikin saada ledi vilkkumaan nopeammin sekä niin että yksi vilkutus on pidempi ja toinen lyhyempi. Kun oppilaat olivat tämän hoksanneet, niin lopullinen tehtävä oli saada aikaan S.O.S morseaakkosilla eli ... --- ...
Tämä onnistui kopioimalla monta riviä koodia. Osalla rivit alkoivat mennä sekaisin, joten totesimme, että on ehkä kätevämpää tehdä apuohjelma, joka suorittaa yhden vilkutuksen. Koska vilkutuksen pituus vaihtelee, se asetettiin muuttujaksi (pituus).
int LED = 10;
int LYHYT = 200;
int PITKA = 500;
void setup() {
pinMode(LED, OUTPUT);
}
void vilkutus(int pituus){
digitalWrite(LED, HIGH);
delay(pituus);
digitalWrite(LED, LOW);
delay(500);
}
void loop() {
vilkutus(LYHYT);
vilkutus(LYHYT);
vilkutus(LYHYT);
vilkutus(PITKA);
vilkutus(PITKA);
vilkutus(PITKA);
vilkutus(LYHYT);
vilkutus(LYHYT);
vilkutus(LYHYT);
}
Tämä versio koodista todettiin aika selkeäksi, tosin hieman turhaa toistoa sisältäväksi. Lopullinen koodi optimoitiin for-looppien avulla tällaiseksi:
Nyt testauksessa DFROBOT:n Beginner Kit for Arduino -setti.
Ensimmäinen LED:in vilkutus ainakin toimi, joten ensiviikolla sitten
oppilaiden kanssa tekemään.
Ajatuksena oli seurata tämän tutoriaalin juttuja ja kopioida valmiita koodeja ja tehdä siitä sitten eteenäin. Katsotaan miten käy.
Tänä syksynä kerhon aloitti huimat 21 kerholaista (luokilta 5 - 8). Joulukuussa mukana oli vielä 13 innokasta koodaria. Syksyn aikana kerholaiset ovat saaneet valita erilaisia projekteja oman kiinnostuksensa mukaan. Tässä niistä muutamia.
Lego-robotit
Kerhossamme on rakennettu ja koodattu syksyn aikana mm. kolmea sumo-robottia, yhtä koirarobottia, kahta viivan seuraajaa, yhtä musiikkia soittavaa robottia sekä yhtä "fantasia-ajoneuvoa". Viivan seuraajat eivät vielä seuraa viivaa, mutta yritys on kova. Tässä pieni pätkä toisen viivan seuraajan koodia:
EV3:n ohjelmointi ympäristö on graafinen
Tässä sumorobotit ottavat toisistaan mittaa:
Ja tässä robottikoira yrittää kävellä (tosin vähän hassusti käy):
Racket - koodaus
Racket:llä syntyi syksyn aikana nämä hienot kuvat (osa vaati jopa rekursiivisen funktiokutsun ja listojen käyttämisen!). Myös yksi Packman animaatio/peli on hyvässä vauhdissa.
Death Pack Crystal
Death Pack Ellipse
Juuson talo
Death Star 2.0
Crazy Pixel
3D - mallinnus
Kaksi kerholaista teki 3D - malleja, sekä Blenderillä että SketchUp:illa. Myös ensimmäinen kerhossa mallinnettu esine tulostettiin 3D - tulostimella (lentokone).
Tässä kerhossa tehtyjä SketchUp - malleja:
Ilves - logo
Näsinneula
Laurin talo
Arduino - koodaus
Tänä syksynä kokeilimme ensimmäisen kerran ohjelmoida Arduinoa ja saimme ledit vilkkumaan. Teimme sen DrRacket - ohjelmalla käyttämäll ASIP - protokollaa:
Keväällä jatkuu
Keväällä onkin edessä sitten osallistuminen Tampereen Innokas kick-off:in näytöslajeihin sekä toimiminen tutoreina opettajien työpajoissa. Toukokuussa osallistumme myös Helsingissä järjestettävään Robocup Junior SM - kisoihin. Jännittävää!
Some weeks ago I found out about this Arduino-RaspberryPi robot that you can program using Racket language and DrRacket. I contacted the creators and got some Arduino boards and accessories to play with.
Normally you would program Arduino using C/C++ and their own development environment. Since I have chosen to use Racket for teaching programming in my math class and other computer science classes, to make it easier to me and my students I would prefer to use Racket also in my physics class. And thanks to Mr Raimondi and Mr Margolis now I can!
In addition to DrRacket installation you need to install Arduino UNO USB driver to your laptop. It comes with the Arduino IDE. Arduino UNO needs to have the ASIP firmware installed, also you need to include one Racket - file "AsipMain.rkt" and you are good to go.
Here are our first two working demos:
First one blinks two leds:
(require "AsipMain.rkt") (define LED 13) (define LED2 12)
(open-asip)
(set-pin-mode! LED OUTPUT_MODE) (set-pin-mode! LED2 OUTPUT_MODE)
(define (my-program) (begin (digital-write LED HIGH) (sleep 0.2) (digital-write LED LOW) (digital-write LED2 HIGH) (sleep 0.2) (digital-write LED2 LOW) (my-program)))
(my-program)
And in the second one the led is controlled from the laptop's keyboard (spacebar):
(require "AsipMain.rkt") (require 2htdp/universe) (require 2htdp/image) (define LED 13) (open-asip) (set-pin-mode! LED OUTPUT_MODE)
(define (draw-image y) empty-image)
(define (key1 y n) (if (key=? n " ") (begin(digital-write LED HIGH) #t) y))
(define (key2 y n) (if (key=? n " ") (begin(digital-write LED LOW) #f) y))
One of my students, 13 year old Lauri wrote a big part of this code and connected the wires for the demo. Thanks! We will develop this further in the coming weeks. I'm planning to use this to teach physics and programming this spring.
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);
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...).