torsdag 22. oktober 2015

Tre uker med Arduino


Etter tre uker med arduino vil jeg skrible sammen noen av erfaringene mine fra den morsomme tiden.

Hva er en Arduino?

En arduino, eller en arduino-kompatibel enhet kjører som regel på en ATMEL-prosessor. Arduino er en IDE (et utviklingsmiljø) for små mikrokontrollere. Det fins også Arduino-kloner, samt det fins porting av Arduino til andre prosessorer som for eksempel esp8266 [Ekstern lenke].
Arduino Nano V3 er en kapabel men liten sak, relativt mange
digitale og analoge inputs. Her er den koblet opp med en
ultrasonisk sensor, microsd-kortleser og en barometrisk sensor
(trykk og temperatur).

Hva er forskjellen på alle Arduinoene?

Det er mange Arduinoer og kloner i alle former fra rund til avlang, kvadratisk. Noen har mer lagringsplass enn andre, noen har flere digitale og analoge inputs, noen har innebygd motorstyring, noen har mulighet for "shields" (moduler som utvider funksjonaliteten uten å kable noe). I tillegg er det noen som er mer strømsparende enn andre, noen er raskere, noen har dedikert "krystall" for bedre tidtaking, Noen Arduinoer har USB-grensesnitt, andre krever en adapterkabel og har bare seriell innebygd. Noen har dedikert USB-interface, andre ikke.
Arduino Romeo V2 er laget for å være en robot-kontroller,
dette betyr at den kan styre motorer og mye annet.
I tillegg har den en del lagringskapasitet, usb-grensesnitt, 5-veis knapper.
Her er det koblet på: XBee XRF trådløs kommunikasjon, barometrisk sensor
(trykk + temperatur), støvsensor, støvsensoradapter, lyssensor, temperatursensor.

Hva kan man koble på Arduino?

Man kan koble på veldig mye rart, fargesensorer, små oled-skjermer, lcd-skjermer, trådløs kommunikasjon (WiFi, 868Mhz osv), blåtann, MicroSD-adapter, Avstandsmålere, støvsensorer, barometriske sensorer, forskjellige typer gass-sensorer og mye annet. Det er veldig mye rart man kan koble på Arduino og mange løsninger leveres med ferdige moduler som betyr at man trenger bare å koble opp 4-6 kabler per modul. Mange moduler kobles mot analoge og/eller digitale pinner og 3V3 eller 5V. Noen kobles på i2C bussen som er en buss man kan koble flere enheter på og alle enhetene har da en unik adresse. OLED-skjermer kommer i flere former, der noen av de går på i2C. Det skal sies at i2C bussen er en anelse tregere, men for de fleste bruksområder er den bra nok. I tillegg må man være observant på at hvis man har mange sensorer på i2C, må man endre resistanseverdien for å få nøyaktig signal.

Dette er en ultrasonisk sensor, eller avstandsmåler som bruker
lyd. Den ene siden sender ut lyd, den andre siden måler hvor lang
tid det tar for lyden å komme i retur. Dette kan brukes for å måle avstand
nøyaktig opp til ca 3m avstand. Fint for selvkjørende roboter eller
kanskje for fysisk interaksjon. Denne kommer i to utgaver hvor
min har en pin for sending og en for mottak. Den andre typen
bruker samme pin og bytter på funksjonen. Biblioteket som følger
med Arduino IDE er laget for den andre typen. Men det krever
små endringer for å kjøre denne typen med dedikert målepin.






I likhet med en medalje, har også avstandssensoren en bakside.
Men denne baksiden vil jeg si er fin å se på :)





BMP180 er en barometrisk sensor som måler trykk og temperatur.
Ved å enten kalibrere den  ved sjønivå eller en gitt høyde, vil den
klare å måle differanse i høyde relativt nøyaktig. Den fungerer
fint med bibliotek fra både adafruit og sparkfun.
Dette er en i2C senso
r.




DHT11 er en temperatur og fuktsensor, men et bedre valg er nok
storebroren DHT22 som er en anelse mer nøyaktig og koster
ca. det samme. De bruker samme biblioteket og det
ligger klart i Arduino IDE.




Lyssensor er veldig enkelt å bruke, trenger ikke bibliotek.
analogRead(measureLightPin); er alt som trengs :-)
En fin dag gir gjerne måling på rundt 1000, så hvis man vil
dimme led basert på lys i rom, se eksempelkode nedenfor.

Eksempelkode for å dimme ledlampe basert på lys i rommet:
int measureLightPin = 5; // Analog pin for lyssensorint ledPin=13; // led pin (innebygget led i Arduinoen)float pwm = 0; // flyttallsvariabel for pulsviddemodulasjon 
void setup() { 
 }  
void loop() {  // hvert sekund 
    static unsigned long lastTime = millis(); 
        if (millis() - lastTime >= 1000) { 
            lastTime = millis();
            int l = analogRead(measureLightPin); // les lysnivå (ca. 0-1000)
            pwm = (l / 4); // Del på 4 for å få ca 1:1 mellom avlest lys og maks ledlysstyrke (1000/255 = 3,92  ~~ 4) 
           // dim led etter avlest lys
           analogWrite(ledPin, pwm); 
    } 
} 

Denne rakkaren er veldig liten, det er en microSD-leser.
Den kobles med fire pinner mot Arduino:
CS, SCK, MOSI, MISO, VCC (5V), GND.
De fleste Arduinoer har en ISCS-header som har alle pins
man må bruke, med unntak av en valgfri digital pin (eksempelvis D10).
Denne virker med innebygget bibliotek og eksempelkode fra
Arduino sin egen IDE. Det er veldig enkelt å lese og skrive til filer.
Biblioteket kan dog. ta opp relativt mye plass for de minste Arduinoene.

Dette er en støvsensor, den virker ikke uten videre rett på
Arduino da den trenger enten at man kobler opp motstand og
kondensator, eller kjøper adapter for kobling.
Sensoren kan måle PM10 og PM2.5 (svevestøv)
Den heter Sharp GP2Y10 og er en optisk sensor, det betyr
at den påvirkes av lysinntrengning. Den skal stå slik at kablene peker nedover
og den skal lage en naturlig luftlfyt ved at en resistor varmer opp kammeret.


Støvsensoradapteren kobles til støvsensoren. Kjøper man
støvsensoradapter fra DFRobot.com, får man med kabler.
Dette er jo kabler man sikkert husker fra CD-Rom tiden, men
utfordringen er at man gjerne har kastet de kablene for 15-20 år siden.
I motsetning til dupont kablene jeg bruker andre steder, vet jeg ikke hva
de kablene her heter en gang :-P Adapteren er et must have for de som vil
leke med støvsensoren :-)

Hvordan er det å jobbe med Arduino?

Det er egentlig veldig enkelt så fremt man velger en av de som har USB-grensesnitt. Maskinen finner drivere selv og Arduino IDE finner riktig COM-port. Man velger så COM-port og velger type arduino. Deretter kan man enten kjøre en av eksempelkodene, definere opp egne pins og teste, åpne konsollet og lese av verdier eller se på LED som dimmes for eksempel.

Man kan også bruke biblioteker fra tredjeparter som Adafruit, Sparkfun og andre. Man kopierer da inn biblotekene enten ved å ta sketch > import zip, eller kopiere de via utforskeren. Hvis man kopierer inn bibliotekene selv, må de legges på: ...\Arduino\libraries\.

I mange tilfeller ligger bilbioteker på github og har gjerne en -master ending, denne må fjernes fra biblitekenes mappenavn når de legges inn utpakket i libraries-mappen. De fleste bibliotekene har eksempelkode.

Alt i alt gikk det meste fint, det eneste man må være litt observant på er at Arduino Leonardo og Arduino Romeo er spesielle i måten USB virker på. Det er en virtuell ekstra Serial Port, som betyr at vanlig Serial ikke virker ut mot for eksempel XRF trådløs eller eventuell WiFi. Man må da bruke Serial1. Det er jo for det meste uproblematisk, men noen biblioteker er hardkodet for å kjøre mot Serial. Man kan dog skrive om på bibliotekene, man kan kopiere de opp for å lage egne versjoner osv. Så det er egentlig mer en ting å være observant på, enn at det er et problem sånn sett.

Når man har lekt litt med Arduino IDE og sett på litt sensorer, osv. tar det ikke mange sekunder å lage noe. Man kunne i teorien laget et dukkehus med lysstyring, ringeklokke osv. på veldig kort tid! Man kan lage alt mulig annet også. Jeg har en Arduino som kommuniserer med en Rasberry Pi over 868 Mhz (XRF), som sender videre data til Firebase skydatabase. Jeg kommer nok til å skrive litt mer om det prosjektet en annen gang.