Alkusanat
Tässä
artikkelissa opetetaan kuinka tehdään Raspberryyn graafinen ohjelma,
jolla luetaan ja lähetetään tietoa Arduinolle. Grafiikkapuolta hoitaa
Gambas3 joka muistuttaa hyvin pitkälti Visual Basic 6:sta. Gambasia ei
ole saatavilla Windowsille, joten ne joilla ei ole omalla koneella
Linuxia, joutuvat ohjelmoimaan suoraan Raspberryssä. Artikkelissa
rikotaan vain jäävuoren huippua, mutta toivottavasti tästä on jollekkin
hyötyä. Arduino sekä Gambas3 ohjelmat kirjoitan PC:llä sekä ohjelmoin
Arduinon. Nämä toki voi suorittaa RPI:lläkin mutta tässä artikkelissa ei
käsitellä Arduino Iden asentamista RPI:lle.
Artikkelilin
ymmärtämiseksi on hyvä että osaat vähän ohjelmoinnin perusteita. Osaat
ajaa ohjelman Arduinolle, sekä osaat käynnistää Raspberryn. Toki kaiken
voi suorittaa ilman RPI:tä, mikäli tietokoneellasi on Linuxin
käyttöjärjestelmä.
Laitteisto
-Raspberry Pi (minun tapauksessa 256Mb)
-jokin näyttö
-Arduino Uno ja USB kaapeli
-2x Potikka 10K
-Vastus ja ledi
-Hyppyjohtoja
-USB näppis ja hiiri
Aloitus
Gambas3
löytyy Debianin paketeista RPI:stä suoraan, mutta mitä olen
intternettiä lukenut, niin siinä on jotain ongelmia kansioiden
sijoittelussa tai jotain. No ei siitä sen enempää. Netistä löytyy
suoraan käännetty versio jossa on Gambas3 valmiiksi asennettuna, joten
käytämme sitä.
http://dl.dropbox.com/u/97096067/2012-07-15-wheezy-gambas3.zip
Asennamme imagen muistikortille ohjeet löytyy Ruuvipenkistä
http://www.ruuvipenkki.fi/foorumi/viewtopic.php?f=15&t=682
Nyt
meillä pitäisi olla toimiva versio jossa on Gambas3 valmiiksi
asennettuna. Ensimmäisellä käynnistyskerralla kirjaudutaan sisään (pi,
raspberry) ja käynnistetään x
startx
Arduino
Teemme
Arduinoon yksinkertaisen kytkennän, johon lisäämme kaksi
potentiometriä, sekä yhden ledin. Näin ollen pystymme fyysisesti
toteamaan ohjelman toiminnallisuuden.
- Koodi:
void setup()
{
Serial.begin(9600); // serialin asetukset
pinMode(2, OUTPUT); // Ledin pinni outputiks
digitalWrite(2, LOW); // Ledi alas
}
void loop()
{
int data; // data muuttuja serialille
if (Serial.available()) { // jos seriali on saatavilla
data=Serial.read(); // data muuttujaan serialilta tieto
if (data==49){ // jos saapuva data on 1 keyascii 49
digitalWrite(2, HIGH); // Ledi päälle
}
if (data==48){ // jos saapuva data on 0 keyascii 48
digitalWrite(2, LOW); // Ledi pois päältä
}
data=0; // kun seriali on lukenut data=0
}
Serial.print("POT1A"); // lähetetään serialiin "POT1A"
Serial.print(analogRead(0)); // lähetetään serialiin A0:n arvo
Serial.print("F"); // lähetetään serialiin lopetus "F"
Serial.print("POT2A"); // lähetetään serialiin "POT2A"
Serial.print(analogRead(1)); // lähetetään serialiin A1:n arvo
Serial.print("F"); // lähetetään serialiin lopetus "F"
delay(100); // viive jotta seriali pysyy perässä
}
Tutkitaan hieman koodia:
if (data==49){
Mistä
tämä 49 oikeen muodostuu? Se on KeyAsciita. Eli Gambas lähettää numeron
1 joka muutetaan KeyAscii muotoon ja siitä tulee 49. Kaikki merkit
löytyvät osoitteesta:
http://www.asciitable.com/
Serial.print("POT1A");
Miksi lopussa iso
"A"?
No tämä voisi olla vai "x" tai mikä tahansa merkki. Tämä kuitenkin
siksi että se helpottaa Gambas koodia. Seriaalista tuleva tieto on
kirjoitettu yhteen pötköön, niin Gambas tietää että kun tulee iso "A"
niin seuraavaksi tulee anturin arvo.
Serialissa liikkuu tämännäköistä tietoa:
POT1A453FPOT2A678FPOT1A443FPOT2A578F....
Serial.print("F");
"F" lähetetään Serialiin niin Gambas tietää milloin anturin arvo on luettu loppuun asti.
käännetään ohjelma ja ajetaan se Arduinoon PC:n avulla.
Gambas
Käynnistämme Gambasin, jonka jälkeen vasemmalta
"New project.." avautuu seuraavanlainen näkymä
Valitaan
"Qt graphical application" ja painetaan
"Next", valitaan kansio johon ohjelma luodaan ja painetaan
"Next", lopuksi annetaan ohjelmalle nimi ja vielä
"Ok"
Tässä on kuvattu tärkeimpiä kohteita ohjelmasta. Tässä
artikkelissa ei opeteta Gambas ohjelmointia muutakuin vaadittavan
verran, jotta esimerkin pystyy toteuttamaan.
1. Seriali kirjaston lisääminen
Ensimmäiseksi
tarvitsemme kirjaston jolla käsitellään Serialia. Tässä kirjastossa on
muutakin, mutta tarvitsemme vain sarjaporttia. Tämä löytyy yläpalkista
"Project -> Properties.."
Selataan listaa ja laitetaan ruksi kohtaan
"gb.net". Nyt meillä on kirjasto käytössä.
2. Graafinen käyttöliittymä
Formia
voi venytellä haluamansa kokoiseksi, samoin yleensä kaikkia
komponenttejä. Lisätään Formille kolme Buttonia eli nappia sekä kaksi
LCDNumberia. Komponenttien lisääminen tapahtuu ihan hiirellä vetämällä
ja pudottamalla Formille. Clikataan Ensimmäistä LCDNumberia ja muutetaan
sen arvoa "Digits" ja annetaan arvoksi 4, koska Arduinolta saatava
potentiometrin tilatieto on maksimissaan neljä numeroa eli 1023. Tehdään
sama toiselle LCDNumberille. Buttoneiden tekstejä voi muuttaa
klickaamalla haluttua nappia ja muuttamalla arvoa "Text".
Lopuksi lisäämme Formille "SerialPort1":n.
Nyt käyttöliittymä on valmis.
3. Ohjelmakoodi
Ohjelmakoodi
on alla. Sen voi kirjoittaa Gambasiin kun tuplaclikkaa jotain
komponenttia formilla, tai painaa formin yläpuolella olevaa valkoista
nappia, jossa lukee
"Code" kun
hiiren cursorin vie sen päälle. Pyyhi valmiiksi tullut koodi ja kopio
koodi alapuolelta. En rupea Iden käyttöä käymään tässä läpi tarkemmin.
En tiedä onko Gambasista kirjoitettu mitään suomenkielistä opasta, mutta
Visual Basic 6 löytyy ainakin ja niillä pääsee aika pitkälti alkuun.
Muutamia eroavaisuuksia toki on mutta niistä lukee ohjelman
kotisivuilla.
- Koodi:
' Gambas class file
Public Luettu As String 'Muuttuja
Public Sub SerialPort1_Read() 'Kun Serialportti lukee se suorittaa kyseisen function
Dim Kirjain As String 'Luettu kirjain Serialista
Dim Katkottu As New String[] 'Taulu johon kirjaimet luetaan, tauluja on niin monta kuin Arduino lähettää
Read #SerialPort1, Kirjain, 1 'Luetaan kunnes ei ole mitään luettavaa
If Kirjain <> "F" Then 'niin kauan kunnes tulee F joka tarkoitti että tulee seuraavan anturin tieto
Luettu &= Kirjain 'lisätään Luettu muuttujaan Kirjain muuttujan arvo
Else
Katkottu = Split(Luettu, "A") 'katkotaan Luettu A:n kohdalta
If Katkottu[0] = "POT1" Then ' jos kyseessä on POT1
LCDNumber1.Value = Val(Katkottu[1]) 'Asetetaan LCDNumber1 valueksi arvo joka saatiin arduinolta
Endif
If Katkottu[0] = "POT2" Then
LCDNumber2.Value = Val(Katkottu[1])
Endif
Luettu = "" 'Tyhjennetään Luettu
Endif
End
Public Sub Yhdista()
'tämä functio hoitaa Arduinon yhdistämisen
'
If SerialPort1.Status = Net.Active Then 'Mikäli yhteys on jo muodostettu
Close SerialPort1 'suljetaan yhteys
Else 'muuten hoidetaan yhteys kuntoon
SerialPort1.portname = "/dev/ttyACM0" ' osoite jossa Arduino sijaitsee
SerialPort1.Speed = 9600
SerialPort1.parity = SerialPort.none
SerialPort1.databits = SerialPort.Bits8
SerialPort1.StopBits = SerialPort.Bits1
SerialPort1.FlowControl = SerialPort.none
Try SerialPort1.Open() 'yritetään avata yhteys
If Error Then Message.Error("Ongelmia yhdistäessä laitteistoon") 'jos ei onnistu annetaan virhe
Endif
End
Public Sub Arduino(viesti As String)
'Tällä functiolla lähetetään tietoa Arduinolle
Try Print #SerialPort1, viesti 'lähetetään tietoa serialille
If Error Then 'jos virhe
Message.Error("Viestin lähettäminen ei onnistunut") 'tulostetaan virhe
Endif
End
Public Sub Button1_Click()
'kun Button1 clicataan, niin tämä koodi suoritetaan
Arduino("1") 'kutsutaan functiota Arduino ja lähetetään viesti 1
'joka Arduinonkoodissa tarkoittaa että sytytetään led
End
Public Sub Button2_Click()
'kun Button2 clicataan, niin tämä koodi suoritetaan
Arduino("0") 'kutsutaan functiota Arduino ja lähetetään viesti 0
'joka Arduinonkoodissa tarkoittaa että sammutetaan led
End
Public Sub Button3_Click()
Yhdista 'suljetaan yhteys
Quit 'suljetaan ohjelma
End
Public Sub Form_Open()
'tämä koodi suoritetaan kun formi käynnistyy
Sleep 1 'odotetaan sekuntti
Yhdista 'yhdistetään seriali
End
Public Sub Form_Close()
'tämä koodi suoritetaan kun ohjelma suljetaan ruksista
Yhdista 'suljetaan jos yhteys on päällä
End
Olen kommentoinut ohjelmakoodia parhaani mukaan.
4. Ohjelman kääntäminen
Ohjelmaa
voi ajaa yläpalkissa olevalla vihreällä nuolella. Seuraavaksi käännämme
ohjelman yhdeksi ajettavaksi tiedostoksi. Tämän jälkeen ohjelman voi
käynnistää suoraan päättestä.
Ylävalikosta
"Project -> Make -> Executable..." Nimi ja ok. Nyt meillä on tiedosto jota voi ajaa ettei Gambasia tarvitse käynnistää.
5. Kopio
Kopioidaan
kansio, jonka alussa loimme uuden Gambas projektin luomisen yhteydessä
ja liitämme kansion Raspberrylle. Tämän voi suorittaa USB muistitikulla
tai vaihtoehtoisesti siirtämällä kansio suoraan muistikortille, omaan
kotikansioon. Kytketään Arduino USB-kaapelilla Raspberryyn. Ohjelman
ajaminen tapahtuu kohdekansiossa päätteellä
- Koodi:
./Ohjelmannimi.gambas
tai tiedostojenhallinnassa tuplaclikkaamalla Ohjelmannimi.gambas tiedostoa.
Loppusanat
Mitä
tällä voi tehdä? Mahdollisuudet ovat tietysti rajattomat. Gambas tuntuu
olevan vielä aika vieras monelle, joten halusin luoda arttikkelin jossa
hiukan raapaistaan pintaa ja saisi harrastelijat huomaamaan että
graafisen käyttöliittymän tekeminen ei vaadi ihmeitä ja kymmenien rivien
kirjoittamista, että saa muutaman napin näytölle. Joten raja on nyt
laskettu niin alas kuin mahdollista -> nyt koodaamaan!