Näytetään tekstit, joissa on tunniste Arduino. Näytä kaikki tekstit
Näytetään tekstit, joissa on tunniste Arduino. Näytä kaikki tekstit

tiistai 20. maaliskuuta 2018

Leikkiminen Arduinojen ja micro:bitien kanssa jatkuu...

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".


Tinkercadillä piirretty kytkentäkuva servomoottorin ohjaamisesta potentiometrillä 

Tinkercadillä voi myös ohjelmoida ja ladata koodin ArduinoCC-tiedostona
Tämän näköistä koodia tästä generoitui:

#include <Servo.h>

Servo servo_3;

void setup()
{
  pinMode(A0, INPUT);
  servo_3.attach(3);

}

void loop()
{
  servo_3.write(map(analogRead(A0), 0, 1023, 0, 180));
  delay(100); // Wait for 100 millisecond(s)
}

Tässä vielä kuva kytkennästä:

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

perjantai 2. maaliskuuta 2018

micro:bit:in ohjelmointia ArduinoCC:llä

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ä :-)

Tässä kuitenkin koodi:

#include <microbit_Screen.h>

const int POTIKKA = 0;
const int SUMMERI = 1;
const int RGB_R = 8;
const int RGB_B = 3;
const int RGB_G = 16;

void setup() {
  SCREEN.begin();
  pinMode(RGB_R, OUTPUT);
  pinMode(RGB_B, OUTPUT); 
  pinMode(RGB_G, OUTPUT); 
  pinMode(SUMMERI, OUTPUT);
  pinMode(POTIKKA, INPUT);
}

void loop() {
    int sensorvalue = analogRead(POTIKKA);   // P1: 0 - 1024 
    SCREEN.showString(String(sensorvalue));
  //    tone(SUMMERI, sensorvalue);
    if(sensorvalue <= 340){
        digitalWrite(RGB_R, HIGH);
        digitalWrite(RGB_B, LOW);
        digitalWrite(RGB_G, LOW);        
        } else if(sensorvalue > 340 && sensorvalue <=680){
          digitalWrite(RGB_R, LOW);
          digitalWrite(RGB_B, HIGH);
          digitalWrite(RGB_G, LOW);
          } else {
            digitalWrite(RGB_R, LOW);
            digitalWrite(RGB_B, LOW);
            digitalWrite(RGB_G, HIGH);
            }
  delay(10);
}

Testikytkentä: potentiometri, RGB-ledi, summeri ja ledinäyttö

tiistai 20. helmikuuta 2018

Ohjelmoinnin valinnaiskurssi: Arduino-ohjelmointia (osa 3)

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:

Vout = 10mV/°C * T    (LM35 datasheet)

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:

T(x) = (5.0 * x * 100.0) / 1024   (Arduino Playground)

Seuraavaksi teimme apufunktion (arvoLampotilaksi), joka muuttaa raaka-arvon lämpötilaksi.

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;
double lampotila = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

double arvoLampotilaksi(int x){
  double temp = 0;
  temp = (5.0*x*100)/1024;
  return temp;
}

void loop() {
    arvo = analogRead(SENSORI);  
    lampotila = arvoLampotilaksi(arvo);
    Serial.println(lampotila);
}

Seuraavaksi otimme käytöön ehtolauseen ja summerin. Jos lämpötila nousee riittävän suureksi, summeri alkaa soida.

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;
double lampotila = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

double arvoLampotilaksi(int x){
  double temp = 0;
  temp = (5.0*x*100)/1024;
  return temp;
}

void loop() {
    arvo = analogRead(SENSORI);  
    lampotila = arvoLampotilaksi(arvo);
    Serial.println(lampotila);

    if(lampotila > 27){
      tone(SUMMERI, 2000);
      delay(2); 
    } else {
      noTone(SUMMERI);
    }
}

Summerin ääni ei järin korvia huumaa, joten kokeilimme myös mallikoodin mukaista hienompaa hälyytysääntä. Tosin tämän koodaaminen olikin jo hieman haastavampaa monelle ja koodin aukiselittäminenkin jäi tasolla "summerin sisääntuloa vaihdellaan for-loopin avulla"...

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;
double lampotila = 0;
float sinVal = 0;
int toneVal = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

double arvoLampotilaksi(int x){
  double temp = 0;
  temp = (5.0*x*100)/1024;
  return temp;
}

void loop() {
    arvo = analogRead(SENSORI);  
    lampotila = arvoLampotilaksi(arvo);
    Serial.println(lampotila);

    if(lampotila > 27){
      for(int x = 0; x < 180; x++){
            sinVal = (sin(x*(3.1412/180)));
            toneVal = 2000+(int(sinVal*1000));
            tone(SUMMERI, toneVal);
            delay(2); 
     }   
    } else {
      noTone(SUMMERI);
    }
}
Temperature Alarm - kytkentä näyttää tältä

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.




maanantai 19. helmikuuta 2018

Ohjelmoinnin valinnaiskurssi: Arduino-ohjelmointia (osa 2)

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.

Serial Plotter, käynnistys
Valovastuksen antamia jännitearvoja, alimmat arvot kirkkaalla valolla
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);
}      


Auto Light - kytkentä näyttää tältä

Ohjelmoinnin valinnaiskurssi: Arduino-ohjelmointia (osa 1)

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:

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() {
  for(int i=0; i<= 2; i++){
    vilkutus(LYHYT);
    } 
  for(int i=0; i<= 2; i++){
    vilkutus(PITKA);
  }
  for(int i=0; i<= 2; i++){
    vilkutus(LYHYT);
  }
} 


SOS Beacon kytkentä näyttää tältä

maanantai 6. helmikuuta 2017

DFROBOT Beginner Kit for Arduino - testauksessa

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.


Laatikollinen leluja

1. Harjoitus: lataa koodi


Lataa kaikki mallikoodit: lataa koodi (zip)

torstai 17. joulukuuta 2015

Lietsun koodauskerhon syksy 2015

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ää!

perjantai 27. marraskuuta 2015

Programming Arduino UNO with Racket

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))

(big-bang #f
          (on-key key1)
          (on-release key2)
          (to-draw draw-image))


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.

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...).