Home automation

image_pdfimage_print

Jeg tror enhver nørd drømmer om det store sindsygt smarte og fuldt integrerede home automation system. Med alarm, lysstyring, musik, videoovervågning, ventilation, varme, dørlåse og alt hvad man ellers kan komme i tanke om…

IMG_3585

Og ja – også jeg. Måske mere end de fleste. I 2006 var jeg med en kammerat, Søren, i gang med at udvikle et home automation system der skulle konkurrere med IHC ved at være bedre egnet til renovering af boliger, og ved at være opbygget decentralt så man kunne komme i gang uden at købe en dyr dims til at styre det hele. Vores første enhed skulle være en dobbelt lysdæmper til montering direkte i loftdåser.IMG_3595IMG_3704 Der var den centralt placeret til at modtage “tryk” fra afbrydere (der skulle opgraderes med en fjeder) og havde adgang til lamperne der skulle styres. Mock-up og prototyperne på billederne er af dette modul. Vi designede et ret fedt koncept hvor printene fungerede både som køleflader og stik-forbindelser.
Vi stoppede da det trådløse IHC-system blev introduceret. Bagefter må vi nok erkende at det var lidt heldigt at vi fik stoppet der – med finanskrisen lige om hjørnet kunne vi virkelig have brændt fingrene. Men jeg synes nu stadig at vi havde fat i noget af det rigtige. Især konfiguration af funktionaliteten mener jeg vi havde fat i den lange ende af…

IMG_3594 (2)

Nytårsaften ’15-’16 blev fejret i gode venners lag… Og ja – der går altid nørd i den når Steffen og jeg mødes… Med tiden har emnerne skiftet lidt… Der kommer både lidt teknik og ledelse ind i snakken 🙂

Meeen – Nu er det altså tekniknørderi det gælder.

Steffen har i mange år leget med et home automation system baseret på HomeSeer og X10 baserede enheder. X10 er en protokol der oprindeligt blev udviklet til power line kommunikation (altså kommunikation på 230V nettet) men der er nu også defineret en trådløs variant. HomeSeer er en kommerciel home automation controller. 20160213_101811Controlleren er det lim der binder de forskellige sensorer, relæer, lysdæmpere osv. sammen. Steffen havde fundet ud af at der findes en masse sensorer og udgange (og radiomoduler) som er designet til at blive tilsuttet til en Auduino. OG de kan fås på Ebay og AliExpress til nærmest ingen penge (1-2 USD per dims). Der er et system til at kæde dem trådløst sammen der hedder MySensors. Endelig er der også open source alternativer til HomeSeer (som jeg synes er for pebret).

9d19310763171b0d958d23a18b3d7e1c_400x400Og – så var jeg hooked 🙂

Så jeg brugte nogle timer på ebay i julen. Sørger man for at holde hver ordre under 80 kr incl fragt så er der ingen told og moms på – og det kan man sagtens når der på de fleste dele er med fri fragt og koster 0,5-2 USD per styk.

Arduino

20160213_101918Det første man skal have styr på er selve Arduino’en. Der findes et hav af forskellige modeller. Jeg har valgt at fokusere på Arduino Uno og Arduino Nano – begge baseret på Atmel ATmega328 microprocessoren. Uno er fysisk større og har USB-stik on-board og er derfor fin til test og udvikling. Nano er fin til de sensorer der bygges, da den er mindre og kan klemmes ind hvor de nu skal bruges.

ArduinoUno_R3_Pinouts_600Arduino er et “format” som reelt bare dækker over en Atmel ATmega processer hvor det grundlæggende (oscillator og forsyning) ligger på boardet og alle pins er ført ud til pinheaders så det er nemt at slutte andre enheder til.
Da placeringen af headerne er standardiseret findes der et hav af “shields” – altså print der bare skal presses ned over moder-printet som giver alverdens funktioner: Display, ekstra hukommelse, real time clock, fugt/tenmperatur sensor og 100 andre.

Atmel laver en meget stor familie af nogle ret gode og billige processorer. De starter i ATtiny til et par kroner og op til ATmega til 120 kr. Ved Digikey koster en ATmega328 ca. 8 kr. Hvordan kineserne på ebay så er i stand til at lave en Arduino Uno til ca. 22 kr og en Nano til 10 kr er mig absolut en gåde…

genuinobrandStifterne bag Arduino røg for nogle år siden i totterne på hinanden. Det var noget med at de hver især mente at eje domæne og registrerede varemærker. Så i dag kan Arduino også købes under navnet Genuino…

Arduino modellerne begge baseret på den samme microcontroller (ATmega328) – så de har de samme ben og funktioner. Mange ben kan bruges til flere ting så man har både interrupt inputs, analoge inputs, pwm outputs, capture inputs (kobles til timere) og sikkert mere jeg ikke lige kan komme i tanke om. Der er 15 digitale pins samt 6 analoge inputs der også kan bruges som digitale ind-/udgange. En lidt spøjs ting er at Arduino’s benævnelse af benene. Det er lidt forvirrende at de ikke bruger de samme betegnelser som Atmel. Port D (altså D0-7) svarer til ben 0-7 på Arduino. Port B (B0-5) svarer til ben 8-13 på Arduino. Port C (C0-5) svarer til A0-5 på Arduino.

Micro’en har 2KB ram (der glemmer ved power off), 1KB eeprom (der kan huske også selvom strømmen afbrydes og som er nem at skrive til i applikationen) og 32 KB flash (kode memory). Den kører med en 16MHz clock.

Mega2-900Arduino giver faktisk ret meget for pengene. Og kan man ikke være i formatet kan man skifte til Arduino Mega2560 der er baseret på ATmega2560. Den har  16 analoge inputs og 54 digitale i/o. Det kan man hurtigt få lyst til hvis man begynder at sætte display, 2-3 temperatursensorer, relæudgange og andet sjov på samme controller…

Udviklingsmiljø (IDE)

Der er forskellige udviklingsmiljøer til arduino. Dels de originale fra Arduino som kan hentes på arduino.cc (link) og dels et online miljø på codebender.cc (link). Jeg har leget med begge dele – og havde jævnt mange problemer med codebender.cc. Men Steffen bruger det så det må kunne bringes til at makke ret… Det fede ved codebender er at der er utroligt nem adgang til alle de andre udvikleres kode og der er et hav af officielle libraries. Jeg har på grund af problemerne valgt miljøet fra arduino.cc. Det skal dog ikke hindre mig i at stjæle med arme og ben fra det kode der ligger på codebender…

2016-02-13Uanset hviket miljø man vælger er der utroligt mange ting der bare virker “out of the box”. Ting man som traditionel udvikler selv må klare – såsom biblioteker med adgang til hardwaren og håndtering af interrupts etc. Alt det og meget mere er der taget hånd om – men som gammel embedded udvikler kræver det altså lidt tilvænning ikke at have indflydelse på alting 🙂

Et første forsøg…

Jeg vil rigtigt gerne lægge links til ebay her… Meeen – ebay linkene har en tendens til at gå tabt kort efter kort tid. Så i stedet vil jeg skrive de nøgleord som man kan bruge til at søge stumperne efter. 2016-02-07 (1)Et lille tip til brug af ebay… Hvis du vælger “Lowest price + P&P” så får du alle dem med gratis fragt 🙂 først i listen.

Stumperne i dette indlæg er: “arduino nano 328 5v”; “arduino ft232rl usb to serial adaptor”; “arduino led breakout board”; “Male To Female Jumper Wire”; “Male To Female Jumper Wire”.

Efter jeg modtog de første stumper skulle den første prøve stå…

2016-02-07 (2)Nano har ikke indbygget USB-adaptor – så det første var at slutte USB-serial port til. Det var ret nemt 🙂 – 6 ben lige igennem. Det er her “female to female jumper cables” kommer i brug. Det er en dejligt nem måde at klaske ting sammen på. Ikke egnet til den endelige applikation men fin til test.

Step to var at forbinde lysdioderne. De har et stelben og 6 lysdiodeben. Det passer så fikst at de kan sættes på GND og ben 2-7 der ligger lige ved siden af hinanden.20160211_212708

Mit første eksempel fandt jeg på codebender – en simpel LED blink test. Jeg modificerede den lidt så den laver et løbelys på det eksterne lysdiodepanel 🙂


// the setup routine runs once when you press reset:
void setup()
{
 // initialize the digital pin as an output.
 pinMode(13, OUTPUT);
 DDRD = 0b11111100; //set direction for D2-7 pins as output
}

// the loop routine runs over and over again forever:
void loop()
{
 static int index=0b100; //start with bit 3 -> pin 3 on

 index = index<<1; //move the "light" one step left
 index = index>0b10000000?0b100:index; //if light moved out to the right start a new wave
 PORTD = index; //output the to the LEDs on pin 0-7
 
 digitalWrite(13, HIGH); //Set the LED pin to HIGH. This gives power to the LED and turns it on
 delay(100); //Wait 100ms
 digitalWrite(13, LOW); //Set the LED pin to LOW. This turns it off
 delay(100); //Wait 100ms
}

Hent eksemplet her: Invalid download ID.

Voila – oppe at køre… 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.