Trådlöst sensor "nätverk"
Postat: 17 augusti 2013, 14:20:25
Det här hobbyprojektet startade nångång i början av året. Vi har odlat i växthus två somrar, dessutom har vi våra två sköldpaddor i växthuset sommartid tills det blir för kallt på nätterna. Av den orsaken har jag fantiserat om att bygga ett trådlöst loggande sensorsystem, var vi kunde övervaka många sensorer från ett och samma ställe. Temperatur och luftfuktighet primärt, men kanske även andra saker i framtiden som t.ex. lufttryck och husets elförbrukning.
Efter en hel del letande fastnade jag för en 433 MHz radiomodul från HopeRF; RFM22B. Öppen kod fanns i form av ett Arduino bibliotek: http://www.hoperf.com/rf_fsk/fsk/RFM22B.htm

Som temperatursensor övervägde jag inte ens DS1820, den är för onogrann, långsam och drar för mycket ström. Istället fastnade jag för STS21 från Sensirion. Bra nogrannhet, relativt snabb och låg strömförbrukning. Faktiskt en mycket bra sansor för pengarna! Enda negativa är att dess I2C adress är hårdkodad, dvs två sådana sensorer kan inte samsas på samma buss.
För luftfuktighet föll valet på HIH6121 från Honeywell. Digitala fuktsensorer är generellt dyra. Den här ligger någolunda okay i pris, och dess nogrannhet är "best in class", enligt Honeywell. Sensorns pris har dock stigit två gånger (Farnell) bara det senaste halvåret vilket inte är så trevligt.
Som processor på sensor noderna finns mycket mer lämpliga kandidater när det gäller låg strömförbrukning i sleep, än den jag valde. Dock är det JOBBIGT att lära sig en ny processor. Renesas R8C/21 kan jag från tidigare så det fick bli den.
Beställde ett 5-pack av RFM22B radiomodulerna på e-bay. Etsade "breakout" kort till två av dem och satte igång med radiolänken. Här en bild med två radiomoduler kopplade till samma processor. Går att skicka "Hello world!" om än kommunikationen är ganska ostabil.
Eftersom jag inte har nån C++ kompilator till min processor, "portade" jag Arduino C++ biblioteket till C. Inte snyggt, men det fungerade, till sist. Hittade några buggar i biblioteket på vägen:

Efter att koden någolunda fungerade i R8C/21 miljön flyttade jag ena radiomodulen till en ARM Cortex M4 processor som agerar basstation.

Radiolänken fungerar och det var tid att se på sensorerna. Båda kör I2C. I2C stödet i R8C/21 processorn är hiskeligt dåligt implementerat. Verkar vara nån sommarvikarie vid Renesas utan någon praktisk erfarenhet överhuvudtaget som implementerat I2C blocket. Efter en veckas knåpande gav jag upp och implementerade fungerande I2C i mjukvara, på en kväll!
Sensorerna sitter på kontakter så att de med förlängningskabel kan kalibreras och justeras genom att sänkas ner i ett dryblock (kalibreringsugn). Jag hoppas uppnå bättre absolut nogrannhet än databladet anger genom att kalibrera dem och linearisera i mjukvara. Fuktsensorn har jag inte möjlighet att kalibrera dock.

Förutom att allt skall fungera måste sensor noderna dra lite ström! Målet från början var att noderna skulle klara sig över ett år på 3V CR2450 knappcell batteri. Även om prcessorn inte är lämplig, lyckades jag komma ner i ca 2.7 uA sleep. Detta genom att stoppa processorn helt och låta radiomodulen väcka den till liv när det är dags att jobba. Radiomodulen har bra sleepläge med wakeup timer och interruptpinne som väcker processorn. Alla komponenter i designen har nogrannt utvärderats med tanke på strömförbrukning. Processorn kör på 8 MHz med sin intera RC-ocillator.

De olika delarna i mjukvaran fungerar, strömförbrukningen är under kontroll så det var tid att etsa fram en prototyp. Lite lättare att utvärdera radiolänken då också. Det visade sig vara svårt att hitta en lämpligt liten låda med rätt proportioner som kretskort med knappcell skulle passa i. Designar man för knappcell vill man ju ha liten låda också. Slutligen föll valet på 40x20 mm aluminium fyrkantrör men ändpluggar av plast. I det formatet fick större batterier plats, 2 st AAA. Kretskortet format är anpassat helt efter denna "låda". Kortet är 1mm tjockt istället för "standard" 1,6mm för att ge tillräckligt mycket frigång mellan komponenter och lådvägg. Kretskortet lackas för att motstå fukt och korrosion.




Små justeringar gjordes på layouten och en bunt kretskort beställdes från PCBCart i Kina. Jag kan ju egentligen inte designa kort som har med HF att göra, men jag satsade på så stort och kontinuerligt jordplan som möjligt. Anslöt top och boten jordplan med många vior. Processorpinnar valdes så att inga signalbanor behövde gå i Bottom layer.

Lödpasta och komponenter på:

Grillas i ugnen. Radiomodulen löder jag för hand. Vill inte riskera att den går sönder.

Färdigt:

Temperatur och fuktsensor på plats i kontakten. Ett antal oanvända pinnar till processorn hittas också i kontatkten, för framtida behov.

Förlängningskabel till sensor kalibraring. För att få riktigt bra kalibrering kommer jag nog att av ett lagom tjockt metallrör, gjuta in kabeln så att sensorn kan pluggas in på ändan av "röret" och sänkas ner i kalibreringshålet.

Lite serieproduktion av "lådor".

Och såhär långt har jag kommit med projektet idag. Basstationen är fortfarande på breadboard och jag kan se inkommande mätvärden via debuggern på PC'n. Mjukvaran i sensor noderna är 95% färdiga. Noderna har kommandointerface via radiogränssnitet var alla relevanta parametrar kan ändras, varefter de sparas i flash, som t.ex. sändareffet, max omsändningar, adresser, mätintervall, justeringsparametrar för sensorerna, osv.
En pinne i kontakten är dedikerad för "safe-mode", dvs när pinnen byglas till GND använder processorn bestämda "säkra" parameterar, ifall man konfigurerat den galet så att man inte får kontakt med den över radiolänken.
Nästa halva av projektet är att bygga "basstationen".
Efter en hel del letande fastnade jag för en 433 MHz radiomodul från HopeRF; RFM22B. Öppen kod fanns i form av ett Arduino bibliotek: http://www.hoperf.com/rf_fsk/fsk/RFM22B.htm

Som temperatursensor övervägde jag inte ens DS1820, den är för onogrann, långsam och drar för mycket ström. Istället fastnade jag för STS21 från Sensirion. Bra nogrannhet, relativt snabb och låg strömförbrukning. Faktiskt en mycket bra sansor för pengarna! Enda negativa är att dess I2C adress är hårdkodad, dvs två sådana sensorer kan inte samsas på samma buss.
För luftfuktighet föll valet på HIH6121 från Honeywell. Digitala fuktsensorer är generellt dyra. Den här ligger någolunda okay i pris, och dess nogrannhet är "best in class", enligt Honeywell. Sensorns pris har dock stigit två gånger (Farnell) bara det senaste halvåret vilket inte är så trevligt.
Som processor på sensor noderna finns mycket mer lämpliga kandidater när det gäller låg strömförbrukning i sleep, än den jag valde. Dock är det JOBBIGT att lära sig en ny processor. Renesas R8C/21 kan jag från tidigare så det fick bli den.
Beställde ett 5-pack av RFM22B radiomodulerna på e-bay. Etsade "breakout" kort till två av dem och satte igång med radiolänken. Här en bild med två radiomoduler kopplade till samma processor. Går att skicka "Hello world!" om än kommunikationen är ganska ostabil.
Eftersom jag inte har nån C++ kompilator till min processor, "portade" jag Arduino C++ biblioteket till C. Inte snyggt, men det fungerade, till sist. Hittade några buggar i biblioteket på vägen:

Efter att koden någolunda fungerade i R8C/21 miljön flyttade jag ena radiomodulen till en ARM Cortex M4 processor som agerar basstation.

Radiolänken fungerar och det var tid att se på sensorerna. Båda kör I2C. I2C stödet i R8C/21 processorn är hiskeligt dåligt implementerat. Verkar vara nån sommarvikarie vid Renesas utan någon praktisk erfarenhet överhuvudtaget som implementerat I2C blocket. Efter en veckas knåpande gav jag upp och implementerade fungerande I2C i mjukvara, på en kväll!
Sensorerna sitter på kontakter så att de med förlängningskabel kan kalibreras och justeras genom att sänkas ner i ett dryblock (kalibreringsugn). Jag hoppas uppnå bättre absolut nogrannhet än databladet anger genom att kalibrera dem och linearisera i mjukvara. Fuktsensorn har jag inte möjlighet att kalibrera dock.

Förutom att allt skall fungera måste sensor noderna dra lite ström! Målet från början var att noderna skulle klara sig över ett år på 3V CR2450 knappcell batteri. Även om prcessorn inte är lämplig, lyckades jag komma ner i ca 2.7 uA sleep. Detta genom att stoppa processorn helt och låta radiomodulen väcka den till liv när det är dags att jobba. Radiomodulen har bra sleepläge med wakeup timer och interruptpinne som väcker processorn. Alla komponenter i designen har nogrannt utvärderats med tanke på strömförbrukning. Processorn kör på 8 MHz med sin intera RC-ocillator.

De olika delarna i mjukvaran fungerar, strömförbrukningen är under kontroll så det var tid att etsa fram en prototyp. Lite lättare att utvärdera radiolänken då också. Det visade sig vara svårt att hitta en lämpligt liten låda med rätt proportioner som kretskort med knappcell skulle passa i. Designar man för knappcell vill man ju ha liten låda också. Slutligen föll valet på 40x20 mm aluminium fyrkantrör men ändpluggar av plast. I det formatet fick större batterier plats, 2 st AAA. Kretskortet format är anpassat helt efter denna "låda". Kortet är 1mm tjockt istället för "standard" 1,6mm för att ge tillräckligt mycket frigång mellan komponenter och lådvägg. Kretskortet lackas för att motstå fukt och korrosion.




Små justeringar gjordes på layouten och en bunt kretskort beställdes från PCBCart i Kina. Jag kan ju egentligen inte designa kort som har med HF att göra, men jag satsade på så stort och kontinuerligt jordplan som möjligt. Anslöt top och boten jordplan med många vior. Processorpinnar valdes så att inga signalbanor behövde gå i Bottom layer.

Lödpasta och komponenter på:

Grillas i ugnen. Radiomodulen löder jag för hand. Vill inte riskera att den går sönder.

Färdigt:

Temperatur och fuktsensor på plats i kontakten. Ett antal oanvända pinnar till processorn hittas också i kontatkten, för framtida behov.

Förlängningskabel till sensor kalibraring. För att få riktigt bra kalibrering kommer jag nog att av ett lagom tjockt metallrör, gjuta in kabeln så att sensorn kan pluggas in på ändan av "röret" och sänkas ner i kalibreringshålet.

Lite serieproduktion av "lådor".

Och såhär långt har jag kommit med projektet idag. Basstationen är fortfarande på breadboard och jag kan se inkommande mätvärden via debuggern på PC'n. Mjukvaran i sensor noderna är 95% färdiga. Noderna har kommandointerface via radiogränssnitet var alla relevanta parametrar kan ändras, varefter de sparas i flash, som t.ex. sändareffet, max omsändningar, adresser, mätintervall, justeringsparametrar för sensorerna, osv.
En pinne i kontakten är dedikerad för "safe-mode", dvs när pinnen byglas till GND använder processorn bestämda "säkra" parameterar, ifall man konfigurerat den galet så att man inte får kontakt med den över radiolänken.
Nästa halva av projektet är att bygga "basstationen".