PICAXE - Analogiset anturit ja servot aloittelijoille

[b]Tämän artikkelin tarkoituksena on tutustuttaa lukijaa PICAXE-mikrokontrollereihin. Artikkelissa on kolme osaa.

  1. Uuden 8m2 mikrokontollerin ja suositun 28 pinnisille picaxeille tarkoitetun projektilevyn esittely.

  2. Opetella kytkemään lämpö- ja valovastus picaxeen ja lukemaan analogisia inputteja.

  3. Opetella ohjaamaan servoa.[/b]

    [size=150]
    1. 8M2 ja 28x1 picaxet[/size]

Typpi on esitellyt ansiokkaasti picaxe-piirin alkeita artikkelissaan. Haluaisin ensin esitellä 8 pinnisen picaxen uudemapaa versiota johon Typpi viittasi artikkelissaan. Tämä piiri on nimittäin mielestäni halpaan hintaansa nähden aika monipuolinen kapistus.
8m2 on ominaisuuksiltaa huomattavasti aiempia 8 pinnisiä picaxeja kehittyneempi, mutta hinnaltaan yhtä halpa (1,8 £ valmistajalta ja 2,62 e kouluelektroniikasta). Lisäksi piiriin toimintaan vaaditaan tosiaan minimissään vain kaksi vastusta joten helpolla pääsee virittelemään mikrokontrollerin kanssa.
Enemmän kuin muutama sata sanaa kertoo taulukko 8m2 ominaisuukista. Mielekiintoista on mielestäni vaikkapa kyky I2c protokollaan. Olen esimerkiksi itse onnistunut lukemaan 8m2 picaxella tälläkin sivustolla esitelyjä nunchuk ohjaimia. Vosin sitäkin joskus esitellä jos jotakin kiinnostaa.

Ajattelin myös esitellä erittäin helpon ja monipuolisen, joskin hieman kalliimman ratkaisun picaxen kokeilulle. Techsupplies myy valmista kasattua 28 pinnistä projektilevyä johon on valmiiksi rakennettuna valmius moottorinohjauspiirille. Tällä piirillä pystyy helposti hyvin vähillä juotteluilla lukemaan 4 analogista 8 digitaalista inputtia ja ajamaan 8 eri lähtöä (esim. servoja) Jos käyttää moottorinohjauspiiriä jolla voi pyöritellä kahta DC moottoria kahteen suuntaan, vie se outputeista 4 joten sen lisäksi jää nuo 4 outputtia äänen/valojen/servojen yms ohjailuun.
Tälle projektilevylle löytyy myös paljon mukavia malliprojekteja ja tutoriaaleja osoitteesta letsmakerobots.com
Picaxesta innostuneille tai siihen tutustumista harkitseville voisin sanoa rohkaisuksi, että joskus esiintyvä käsitys ettei sille ei löytyisi käyttäjäyhteisön tukea, ei pidä mielestäni paikkaansa. Osoitteessa picaxe.com löytyy paljon informaatiota ja peruskytkenöjä. Sivuston foorumilla on paljon keskusteluja ja raportoituja projekteja laidasta laitaan. Sivuston moderaattorit ja seniorikäyttäjät vastaavat nopeasti ja perusteellisesti kysymyksiin, ja jos osaa käyttää sivuston hakukonetta useimpiin on jo olemassa vastaus. Lisäksi foorumilta löytyy sivuolkulla valmiita pikku koodinpätkiä moneen tarpeeseen.Aktiivista ja ystävällistä tukea saa myös vaikka letsmakerobotsista ja varmasti ruuvipenkistäkin. Jos tuo picaxen USB kaapelin kalleus karvastaa (kerran se vain kirpaisee) niin tutustukaa tähän linkkiin jossa kerrotaan miten halvat perus FTDI kaapelit saadaan toimimaan picaxella joka vaatii invertoitua signaalia. gadgetgangster.com/news/45-desig … cable.html

Alkoipa tutustumaan mihin tahansa picaxeen kannatta lukea erittäin hyvät dokumentaatiot valmistajalta. Manual 1 pitää sisällään tiedon mitä kunkin picaxen milläkin pinnillä voi tehdä. Manual 2 kattaa yksityiskohtaisesti kaikki picaxen basic kielen käskyt ja picaxen erityispiirteet ja manual 3 esittelee miten yleisemmät sensorit ja laitteet kyteketään picaxeen. Manuaalit löytyvät picaxe.com sivuilta ja program editorin valikosta. Itse olen koonnut 28 pinnistä mikrokontrollereista ja projektilaudasta oleellisimmat tieodot yhteen kuvaan joka löytyy tästä artikkelista.

[size=150]
2. Jänniteen lukeminen picaxen analogisella inputilla[/size]

Varsin monet sensorit toimivat siten että ne antavat mikrokontrollerille mitattavan suureen muuttuessa vastaavasti muuttuvan jännitteen. Yksinkertaisimmillaan ja halvimmillaan sensorina voidaan käyttää vastusta jonka resistanssi vaihtelee valon, lämmän etc mukaan. Tällaista vastusta voidaan käyttää sensorina jänniteenjaon kautta joka on elektroniikan klassissia kytkentöjä. Kuvassa on jännitteen jako kytkennällä picaxeen liitetty valovastus (LDR).
Kun vastus altistuu valolle sen resistanssi pienenee. Kytkennästä picaxen analogiseen pinniin vaikuttava jännite saadaan kaavasta 10k/(10k+LDR)x5(käyttöjännite v1) eli R2/(R1+R2)xU.
Jos LDR:n resistanssi on vaikkapa 10k vaikuttaa analogiseen pinniin 10/(10+10)x 5 = 2.5 v. Jos valaistus voimistuu ja LDR:n resistanssi pienenee ja inputtiin menevä jännite kasvaa. Vastaavasti jos hämärtyy, jännite inputissa pienenee. Tästä voi nokkelasti päätellä että vastus R2 kannattaa mitoittaa siten, että resitanssi on saman suuruinen kuin arvoaan muuttavalla vastuksella sen oletustilassa, jolloin jännite asettuu puoleen väliin käyttöjännitettä ,ja se voi kasvaa tai pienentyä.

Nyt pitäisi saada picaxe lukemaan tätä jännitteen vaihtelua. Se on helppoa. Esimerkkikoodi picaxe 28x1 piirille:

Main:

readadc 0, b1 	'luetaan jännite pinnissä A.0 muuttjaan b1
debug		'lähetetään program editoriin tieto muuttujasta
pause 500	     'odotellaan puoli sekunttia, ei pakollinen
goto main

Debug ikkunasta nähdään että arvot vaihtelevat välillä 0-255, eli picaxe lukee jännitettä 8-bittisellä ADC muuntimella. Jos halutaan tarkempaa lukemaa voidaan käyttää 10-bittistä komentoa readadc10 (pinni), sanamittainen muuttuja esim. readadc10 0, w1.
Huom. JOs käytät uudempia m2 tai x2 sarjan picaxeja joissa lähes mikä tahansa pinni voi olla analoginen pitää pinni määritellä sen nimellä esim A.1 tai C.2. Manual 1 kertoo mitä pinnejä voi käyttää tällä komennolla eri picaxeissa. Samalla komennolla voidaan lukea mitä tahansa analogista muutujaa ei Sharpin infrapunalla toimivia etäisyyssensoreita. Picaxe käyttää referenssinä käyttöjännitettä mutta edistyneempi käytäjä voi määritellä ulkoisen vertailujännitteen. Monista picaxeista löytyy myös DAC, tosin vain 5-bittinen.
8m2 piirissä voit käyttää C.1, C.2 tai C.4 pinnejä (esim. readadc c.1, b1). Jos taas käytät x2 sarjaa sinun pitää alustaa pinni analogiseksi komennolla adcsetup, lisätietoja antaa manual 2.
Valovastuksen tilalle voit laittaa minkä tahansa vastuksen jonka muutosta haluat lukea.

[size=150]
3. Servon heiluttelu[/size]

Kun innokas mutta infantiili robottimme osaa nyt lukea jännitettä, olisi kiva antaa sille kyky manipuloida ympäristöään. Tähän on yksinkertainen vaihtoehto käyttä servoja. Servoihin voi perehtyä paremmin jonkun ekspertin opastuksella. Lyhyesti ne ovat alennusvaihteistollisia moottoreita joissa on aika paljon vääntöä ja ne tietävät oman asentonsa. Servolle syötetään lyhyitä pulsseja noin 20 ms välein. Nämä pulssit ovat kestoltaan n. 0.75-2.25 ms.Pulssin pituuden mukaan servo kääntää itesensä johonkin asentoon, ääripäiden ollessa noin 180-200 astetta. Joka kerta kun servo saa pulssin se tarkastaa onko se pulssin mukaisessa asennossa ja liikkuu kohti tavoiteasentoa jos se on sivussa. Tyypillisesti 1,5ms pulssilla servo asettuu keskelle, mutta poikkeuksia löytyy kaikkien esitettyken faktojen osalta.
Picaxe osaa jatkaa tätä servojen pulssitusta muun koodin taustalla, joskin monimutkaiset servon kanssa samaa ajastinta käyttävät komennot voivat häiritä servojen toimintaa. Useimmat picaxe pystyvät ajamaan 8 servoa yhtäaikaa ja pienin 8m2 kolmea servoa(mahdollisesti neljää, en ole kokeillut kuin kolmella) . Se tapahtuu seuraavasti:

Servo kytketään 28 pinniseen projektilevyyn kuvan mukaisesti. Picaxen valmistaja suosittelee että outputin ja servon signaalikaapelin väliin laitetaan 330 vastus mutta tämä ei ole käytännössä pakollista (en ota kuitenkaan vastuuta tästä :slight_smile:). Samoin suositellaan erillistä virtalähdettä ja kondensaattoreita mutta ne eivät myöskään ole välttämättömiä jos ei ole kovin montaa servoa rajussa käytössä. Itse olen ihan hyvällä menestyksellä kytkenyt pieniä servoja käyttöjännitteeseen.
Komento on: servo (pinni), asento. Kun servo jossakin pinnissä on kerran alustettu tällä komennolla, käytetään sen jälkeen servopos komentoa joka vain muuttaa pulssin mittaa.

servo 0, 150 'asetetaan outputpinniin B.0 kytketty servo keskelle
pause 1000 'odotetaan että servo kääntyy

Main:
servopos 0, 75	'käännetään toiselle puolelle.
pause 1000
servopos 0, 225	'sitten toiselle
pause 1000
servopos 0, 150	'keskelle
pause 3000	'vuotellaan vähän pitempään, tässä keskellä on niin hyvä olla
goto main

8m2 piirillä homma menee siten että servon power ja maa laitetaan mihin tahansa poweriin tai groundiin ja servon input johonkin 8m2 outputtiin (C.0, C.1, C.2 tai C.4)
Manual kakkosesta löytyy tietoa miten x2 picaxeissa pystyy säätämään pulssien väliä. Jos käyttää muuta kuin oletuksena olevaa kellotaajuutta niin tiedoksi että servokomennot toimivat m2 ja x1 sarjalla vain 4 ja 16 mhz taajuuksilla ja x2 sarjalla 8 ja 32 mhz taajuuksilla.

Servoilla on aika mukava tehdä robotiikkahenkisiä viritelmiä. Jos budjetti on tiukka, kannattaa aloittaa vaikkapa HXT900 tai SG90 merkkisillä pienillä 9g painavilla servoilla jotka jaksavat heilutella sentin varrella helposti yli kilon taakkaa. Niiden hinta on pari euroa kappale. Näitä voi katasella vaikka täältä: dealextreme.com

Ruuvipenkistä löytyy ohjeita miten servon voi muuttaa täydenkierroksen moottoriksi. Laittakaa reippaasti palautetta niin artikkelia voi parannella tai uusiakin laatia yleisön mielenkiinnon mukaan

Lopuksi vielä pieni esimerkki miten lämpöanturin tai valovastuksen lukemia voi käyttää ohjaamaan servoa. Seuraavassa koodi kääntää servon suunnilleen keskelle ja kun esimerkiksi lämpövastusta kuumennetaan servo kääntyy toiselle puolelle ja viilentyessä taas toiseen suuntaan, ikäänkuin karkea lämpömittari. Huomatkaa näppärä min ja max toiminto…

[code]symbol anturi =b1 'nimetään muuttjat anturin antamalle lukemalle
symbol asento =b2 'ja servon asennolle

init: servo 2, 150 'servo keskelle
Main:
readadc 0, anturi 'luetaan input 3
let asento = anturi MIN 75 MAX 225 'luetaan anturin lukema asento muuttujaan
'75-225 a rajoitetaan se välille jolla servo liikkuu
servopos 2, asento 'ajetaan servo anturin osoittamaan asentoon
pause 20
goto main

'jos haluaa etteivät anturin arvot leikkaudu niin pahasti ylä ja alapäistä
'voi koettaa skaalata korvaamalla let asento-rivin esim:
’ let asento = anturi*10/15+75 MAX 225
'tämä skaalaa ensin luvut välille 75-245 ja sitten rajaa yläpäätä vähän
'joku varmaan keksii sofistikoituneemmankin skaalaimen
[/code]

Video tästä viritelmästä.
youtube.com/watch?v=zpsgMSyo … e=youtu.be

Hyvä artikkeli, jos viitsit niin tee vaikka esimerkkikoodi sovellukselle jossa servon päässä olisi tuommonen LDR ja sen peittyessä kääntäisi servoa kunnes saa taas valoa. Antaisi hyvän käytännön esimerkin aloittavalle ohjelmoitsijalle. Näkisi siinä vähän miten sitten yhdistellä näitä kahta tietoa keskenään :slight_smile: Kannattaa myös pistää nuo esimerkkikoodit ylärivistä löytyvään code-tagiin.
Jos olet tuolle alustalle kytkennän tehnyt, niin ota siitä ihmeessä kuva! aivan sama näyttääkö se hämähäkin pesältä, kuitenkin siitä näkee miltä kytkennät todellisuudessa näyttää :slight_smile:

Hyviä ideoita. Olikin tarkoitus laittaa vähän kuvia jahka kerkeää valokuvailemaan. Tuo koodiesimerkki oli hyvä idea. Ajattelin laittaa videon tekemästäni 8m2 ohjaamasta 6-jalkaisesta pikku robosta joka lukee sharpin etäisyyssensoria. Siinä tulis näitten kombo. On vaan vähän rujon näköinen laite :slight_smile: kasattu puuväreistä, pyykikuivatustelineen pinnoista ja polymorfista…

Sehän on vaan hyvä!
Näkee aloittelijakin, että vaikkei omista vielä kauheaa varastoa kaikennäköisiä himmeleitä niin voi improvisoida ja käyttää niitä mitä löytyy! :slight_smile:
Itsellekin toivottavasti huomenna kolahtaa Picaxe 20M2 postiluukusta ja turun reissulla käyn elfasta hakemassa pari pistematriisinäyttöä sekä sekalaisia himmeleitä niin varmaan kirjoittelen kokemuksista lisää :slight_smile:

Nonih, nyt on sitten oikein kuvat ja videonpätkäkin.

Mielettömän hyvä juttu!
Todella hyvä tuo esimerkkisi lämpöanturin käytöstä videoineen päivineen!
Tuo MIN MAX käsky onkin näköjään kätevä tapa rajoittaa minimi tai maksimiarvoja helposti, säästää pari if-käskyä heti kättelyssä :slight_smile: