Preskoči na glavni sadržaj

Croduino - programiranje fizičkog svijeta

Tekst je u originalu objavljen za portal LinuxZaSve.

LEGO kockice u mladosti mnogima su bile omiljena igračka. S njima je zabava teško mogla postati dosadnom jer kad i dosadi, jedan sastavljeni oblik lako se mogao rastaviti i sastaviti neki posve novi, a samo je mašta bila granica. Dobro, ne samo mašta, nego i broj kockica koje su bile na raspolaganju.

Programiranje računala ima mnogo dodirnih točaka sa slaganjem LEGO kockica: na raspolaganju stoje različiti gradivni blokovi, ali je ovoga puta samo mašta granica jer su blokovi virtualni, pa ih na raspolaganju ima beskonačno. Programiranje nudi i veću fleksibilnost, pa je moguće stvoriti puno složenije strukture koje izvršavaju vrlo kompleksne zadaće i koje se mogu upotrijebiti u razne korisne svrhe. Ipak, ponekad se čini kao da nedostaje ono nešto što su imale popularne legice. Građevine napravljene od LEGO kockica impresionirale su i neupućene u građenje, dok računalni programi većinu ljudi ostavljaju ravnodušnima jer je sva kreacija zapravo skrivena od očiju korisnika ili promatrača - nalazi se u izvornom kodu koji redovito poznaje samo autor. Kao da je većina od složenih legica prekrivena zastorom, tako da je nitko ne može vidjeti u cjelini.

Kad bi programiranje nekako uključivalo intervenciju u fizički svijet, ukomponiralo bi možda u sebe i taj nedostajući dio. Spajanje računala na senzore, diode i elektromotore uistinu upotpunjuje zabavu programiranja jer sada program može posegnuti i za fizičkim svijetom: može isključivati svjetla u kući, stišavati zvuk glazbe kad zvoni telefon, zaključavati ulazna vrata prije spavanja... Pravo bespuće ideja.

Međutim, izlet u takvu vrstu programiranja, koje se često naziva fizikalno računarstvo, zahtijeva odviše muke. Niti je spajanje vanjskog sklopovlja na računalo trivijalno jer malo koja računala danas dolaze još sa serijskim ili paralelnim portom, niti kasnije programiranje takvog sklopovlja prolazi bez muke. Većini su te prepreke dovoljne da odustanu od daljnjeg fizikalnog računarstva, ma koliko privlačno izgledalo.

No ipak nije sve tako crno. Postoji puno lakši put do programiranja fizičkog svijeta, a dokaz je za to platforma Arduino. Kako objasniti što je Arduino? Službene stranice kažu:

Arduino je slobodna (open-source) elektronička prototipna platforma bazirana na fleksibilnom i jednostavnom-za-korištenje hardveru i softveru. Namijenjena je umjetnicima, dizajnerima, hobistima i svakome tko je zainteresiran za stvaranje interaktivnih objekata ili okruženja.

U osnovi Arduino se sastoji od mikrokontrolera koji može primati i slati signale u okolinu i iz okoline te softverske komponentne koja omogućuje jednostavno programiranje tog mikrokontrolera uz pomoć računala na bilo kojoj platformi (Linux, Mac, Windows). Glavni su aduti ove platforme već naglašena jednostavnost i u softveru i u hardveru, ali također tu je i sloboda (softverski je dio slobodan softver, a hardverska je specifikacija sasvim otvorena). Kao što obično biva sa slobodnim softverom i otvorenim specifikacijama, u cijenu Arduina nije uračunato intelektualno vlasništvo te drugi vlasnički nameti, što ga čini vrlo jeftinim.

Slobodna priroda ove platforme omogućuje varijacije i prerade, nešto što je dobro poznato u svijetu slobodnog softvera, pa ni ne čudi da Arduino ima mnoštvo derivacija.

Jednu takvu derivaciju dobili smo na recenziju. Radi se o hrvatskoj verziji Arduino pločice - Croduino, koja je posve kompatibilna s originalnim Arduinom. Iako elektronika ne spada baš u uže područje djelovanja ovog portala, radi isticanja slobodne kulture, Arduino zaslužuje prvoklasni tretman, a uzmemo li u obzir da je uložen i trud domaćih ljudi - ova je recenzija Croduina na portalu Linux Za Sve neizbježna.

Croduino pločica

Croduino Basic - hrvatska inačica Arduino pločice

Ekipa e-radionice iz Đakova, koja stoji iza hrvatske inačice Arduina i koja nam je poslala jedan primjerak, pokrenula je projekt Croduino da bi, kako sama kaže, približila Arduino kulturu, a samim time i elektroničku kulturu publici u Hrvatskoj. Konkretno, pločica Croduino Basic omogućuje sve što i standardna Arduino pločica, s time da ima više analognih ulaza i ono što je najvažnije, može se lako nabaviti u Hrvatskoj za 120 kn uz što se dobije i Mini USB kabel.

Teško je samo mahanjem rukama objasniti o čemu je riječ, zato je dobro odmah uskočiti s primjerima i upotrebom.

Arduino IDE

Sučelje kroz koje se piše kod, odnosno shema za Arduino

Sučelje kroz koje se piše kod za Arduino i šalje na pločicuInstalacija i postavljanje uređaja za programiranje gotovi su za par minuta: potrebni paketi (SDK) za Arduino mogu se pronaći u repozitoriju gotovo svake distribucije; sistemski korisnik, kojim se planira pristupati pločici, mora biti u grupi koja ima ovlasti nad USB uređajima (u Fedori dialout i lock); u IDE-u Arduinoa treba odabrati "Arduino Duemilanove w/ ATmega328" da bi IDE mogao ispravno poslati skicu (kod programa) u Croduino.

David iz e-radionice lijepo je izložio sve potrebne korake u prvom vodiču za Croduino - isključivanje i uključivanje ugrađene ledice. Da ne bi bilo sasvim isto, ovdje ćemo napraviti varijaciju da ugrađena ledica "diktira" Fibonaccijev niz. Ako planirate pomoću Arduina slati signal u svemir pokazujući da na Zemlji ima inteligentnog života, Fibonacci daje dobru šansu da će ga izvanzemaljci prepoznati. :-)

U programskom jeziku, čija je sintaksa slična C-ovskoj, u Arduinov IDE napišemo sljedeći kod:

int led = 13; // digitalni pin 13
int wait = 200; // ms
int F[3] = {0, 1, 1}; // pocetne vrijednosti niza
int n = 2;

// pokrece se samo jednom na pocetku
void setup(){
    // inicijalizacija pina 13 kao izlazni pin
    pinMode(led, OUTPUT);
}

// beskonacna petlja u kojoj se desava sva akcija za vrijeme rada
void loop(){
    // definicija Fibonnacijevog broja
    F[n] = F[n-1] + F[n-2];
    F[n-2] = F[n-1];
    F[n-1] = F[n];

    // broj blinkanja LED-ice u ovisnosti o F[n]
    for ( int i = 0; i < F[n]; i++ ){
        digitalWrite(led, HIGH);
        delay(wait);
        digitalWrite(led, LOW);
        delay(wait);
    }
    // cekanje prije novog ciklusa
    delay(wait*5);
}

nakon čega ga pošaljemo (uploadamo) na Arduino USB kablom. Arduino će nas plavom ledicom obavijestiti da je postupak uspješno okončan.

Ugrađena ledica na pločici pridružena je pinu (digitalnom izlazu/ulazu) 13. Zato napravimo varijablu u koju ćemo spremiti tu vrijednost i kasnije je postavljati kao argument funkcijama za kontrolu tog digitalnog izlaza. Varijable n i F služe za potrebe definicije niza, a dvije funkcije: setup() i loop() nužne su u svakom programu koji se planira poslati na Arduino pločicu. Prva, setup(), predstavlja inicijalizaciju i pokreće se samo jednom pri startu, a druga, loop() zapravo je beskonačna petlja koja se neprekidno izvodi dok je pločica pod naponom. U setup() je inicijaliziran pin 13 kao izlazni pin ("šalje napon"). U loop() je iskorištena klasična C-ova for-petlja unutar koje se nalaze funkcije digitalWrite(), što predstavlja slanje napona na pin 13: prvo visoki napon (HIGH, 5V), a onda niski napon (LOW, 0V). Između je iskorištena funkcija delay() koja predstavlja pauzu u programu izraženu u milisekundama. Za detaljniji opis preporučam spomenuti Davidov video.

Drugi je primjer malo originalniji i korisniji, ali još uvijek elementaran jer još nisam dobavio dovoljno hardverskih komponenata da bih napravio nešto kompliciranije. Iskoristio sam analogni ulaz (A0) na kojem potenciometorom reguliram napon, što Croduno očitava funkcijom analogRead(). Vrijednost se normalizira uz pomoć minimalne i maksimalne vrijednosti da bi se u konačnici poslala preko serijskoga kanala (fizički je to isti USB koji se koristi i za programiranje pločice) računalu. Na računalu sam napisao kratku skriptu u Pythonu, tzv. wrapper, (kad već imamo aktualan serijal članaka o Pythonu na portalu) koja prosljeđuje putem DBusa vrijednosti očitane s Arduina KDE-ovom KMixu. Na taj način mogu pomoću potenciometra stišavati i pojačavati zvuk na računalu. Nije velika stvar, ali čovjeka veseli. :-)

Skica za Arduino:

int sensorPin = A0; // 1. analogni pin
int sensorValue = 0, oldValue = 0; // pocetne vrijednosti potenciometra
int treshold = 10; // tek veci pomak potenciometra salje signal racunalu
int minVol = 825; // okvirna doljnja vrijednost senzora
int maxVol = 245; // okvira gornja vrijednost senzora
int scale = maxVol - minVol; // normalizacija na skalu od 0-1

void setup(){
    // inicijalizacija serijskog kanala
    Serial.begin( 9600 );
}

void loop(){
    // ocitavanje analognog pina
    sensorValue = analogRead(sensorPin);

    if( abs(oldValue - sensorValue) > treshold ){
    // slanje rezultata racunalu preko serijskog kanala
    Serial.println( 100.0 * (sensorValue - minVol) / scale );
    oldValue = sensorValue;

    // korekcija minimalne i maksimalne vrijednosti
    // da skala ne ide ispod 0% i iznad 100%
    if( minVol > sensorValue ){
        minVol = sensorValue;
        scale = maxVol - minVol;
    }
    if( maxVol < sensorValue ){
        maxVol = sensorValue;
        scale = maxVol - minVol;
    }
    delay(100);
}

Wrapper napisan u Pythonu:

import serial
import dbus

# port na kojem se nalazi Arduno
arduino = serial.Serial( '/dev/ttyUSB0', 9600 )
# stream kojem se zeli kontrolirati glasnoca (naci uz pomoc qdbusviewera)
kmix_stream = '/Mixers/PulseAudio__Playback_Devices_1/alsa_output_pci_0000_00_1b_0_analog_stereo'

bus = dbus.SessionBus()
kmix = bus.get_object( 'org.kde.kmix', kmix_stream )
kmixprop = dbus.Interface( kmix, 'org.freedesktop.DBus.Properties' )

while True:
    vol = float( ( arduino.readline().strip() ) )
    kmixprop.Set( 'org.kde.KMix.Control', 'volume', vol )
Croduino u akciji

Croduino uparen s potenciometrom da bi kontrolirao glasnoću zvuka na računalu

Iako ova dva primjera ne mogu ilustrirati sav potencijal platforme, vjerujem da vam mogu dati neke ideje što biste vi sami njime mogli napraviti. Ono što se uistinu može uz pomoć Arduina, pogledajte na ovom linku. Zamislite što bi se sve moglo napraviti kada bi se Arduino upario s mini-računalom Rapsberry Pi, čime bi bio posve neovisan od "velikog" računala!

Općenito sam oduševljen cijelom idejom i realizacijom, pogotovo gomilom dokumentacija i primjera na internetu, a jedina stvar koja me živcirala bio je rudimentarni tekstualni editor unutar IDE-a u kojemu se piše programski kod. Za ozbiljnije hakiranje potreban je i ozbiljniji editor. Možda postoji plugin za VIM ili Emacs? :-)

Svi oni koji su već ishakirali Linux "uzduž i poprijeko" te bi željeli nešto novo (nešto divlje) - preporučam da prijeđu malo i na opipljive stvari, da se vrate jednostavnosti i šarmu LEGO kockica, odnosno da isprobaju Arduino, koji je za to i stvoren. Kroz zagarantiranu zabavu možda iznikne i neki upotrebljiv izum ili umjetnička instalacija.

Hvala ekipi iz e-radionice koja je ustupila LZS-u jedan primjerak Croduina. Pored toga zaslužuju i veliki naklon na realizaciji projekta hrvatske verzije Arduina s nadom da će osvanuti više dokumentacije i vodiča na hrvatskom jeziku.