Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Tänkte dela med mig av mitt senaste projekt
https://github.com/manicken/ThermographicCamera
Detta började med att jag ville göra en kontrol av husets värmeförlust
och införskaffade MLX90614 för att kunna göra en 'sweep'-scan
med två servos, men den var långsam och mina servon var dåliga
i väntan på att jag skulle använda större servon så las det projektet på is
men sen såg jag ett inlägg
https://forum.pjrc.com/threads/66816-ML ... Teensy-4-0
och insåg att MLX90640 var relativt billig, efter massa tänkande så bestämde jag äntligen att köpa en sådan sensor
hittade en svensk sida som sålde den.
https://hitechchain.se/
'finns' även på mouser men då tillkommer frakt o moms + tull?
så det blir nog samma pris i slutändan
Nu med den nya sensorn
Så började jag först med en Raspberry Pi Pico + circuit python
då det fanns ett färdigt exempel som var mycket basic
men det är ganska långsamt ~1fps
Det slutade med att jag beslutade att köra med en Teensy 4.0 istället och skriva koden i c/c++
Kör med VSCODE + PlatformIO med Arduino Framework
och det var egentligen inga problem, så att köra python var egentligen bortkastad tid
kanske python kan vara bra om man vill kunna testa något smått bara för att se att det funkar.
Och det finns även libraries färdiga ifrån Adafruit
både till sensorn och LCD:n + exempelkod som jag testade individuellt
för att sedan basera koden på display:ns exempel, då den var mest "avancerad".
Efter ihopslagningen så körde jag bara förstorade pixlar utan någon interpolation
hade kunnat köra vanlig linjär interpolation men var inte nöjd med resultaten
och ville köra med bicubic interpolation (eller iallafall prova)
och efter en massa sökande så hittade jag kod ifrån exempel kod av Adafruit för en annan sensor
https://github.com/adafruit/Adafruit_AM ... lation.cpp
detta kunde köras med ~7fps vilket är ganska imponerande (skalan var då 1:7 för att jag körde ibörjan på en liten 1.3" 240x240 display)
sedan var jag inte helt nöjd med färgpaletten heller och ville testa några andra,
var mycket svårt att hitta några färgpaletter men hittade till slut ett annat DIY projekt
https://github.com/maxritter/DIY-Thermocam
där det fanns 18 st färgpaletter
men efterssom de tar rätt mycket plats (vilket kan kännas av när man omprogrammerar)
och har olika storlek så passar de inte riktigt in på skärmen heller
min tanke var att kunna generera dem ifrån basfärgerna istället
och då tar de inte mycket plats (kan nu klämma in 20 st paletter för utrymmet för 2st)
detta ledde till att jag hittade kod ifrån FastLED (rad:106)
https://github.com/FastLED/FastLED/blob ... rutils.cpp
gjorde en egen variant men deras är mycket bättre då den har högre upplösning (i själva genereringen)
testade först koden i javascript
https://github.com/manicken/Thermograph ... etteEditor
där printade jag även ut färgpaletterna ifrån "DIY-Thermocam"
för att kunna se hur de såg ut
sparade sedan dessa bilder för att kunna extrahera basfärgerna i paint
och använde sedan dessa basfärger för att kunna sätta ihop
"basfärg-paletterna" printade ut originalen tillsammans med de genererade för att kunna finjustera så de var i princip likadana
så här blev resultatet: dessa bas-färg paletter kan sedan generas med valfri storlek
för att passa in på display:n bättre
man skulle även kunna generara en extra färg-palette med fler färger som används för att visa själva "värme-bilden"
så att man inte är begränsad till skärmens storlek
(har dock inte gjort det ännu, då det minnet måste allokeras med malloc och så har jag haft andra prioriteringar)
Nu tyckte jag att 1.3" är lite för litet
Och eftersom Roboremo-app till mobilen har support för att kunna ta emot och visa bilder "Image"
och ansluting via OTG USB CDC
Först tänkte jag att det skulle vara slött, men den har inga problem att ta emot typ 7fps
så slängde in några knappar för att kunna styra färgpalett-valet exakt
+ en till bild för att visa själva färgpaletten
och även textrutor för att kunna visa temperaturerna
här är det nuvarande resultatet
men ville även ha denna storlek "standalone"
så jag köpte en ny större display 2.8" på electrokit
denna har även touch så om jag vill göra ett inställnings GUI så kan jag göra det sen.
Byter för nuvarande färgpalett med två knappar (I nuvarande box har jag inte ännu monterat dem, fanns bara på breadboard i prototyp-stadiet)
eller via Roboremo-app när den är inkopplad där, annars strömförsörjer jag "kameran" via en powerbank,
denna större display har större upplösning så nu är frameraten nere på 5,
och att efterssom MLX läsningar är med 1Mhz I2C hastighet så slösas mycket tid bara att vänta
teensy 4.0 kör i 700Mhz så det blir ju rätt mycket som kan utföras därimellan
tänkte att jag kunde göra I2C reads samtidigt som jag gör Bicubic interpolation
+ att jag nu även gör Gaussian interpolation ifrån http://blog.dzl.dk/2019/06/08/compact-g ... -displays/
samt ytterligare två extra interpolations för att (utjämna bilden och minska bruset)
det går till ungefär så här
1. sensorn:s 32x24 pixlar "Gaussian interpolation" till 64x48
2. Bicubic interpolation ifrån 64x48 till 160x120
3. Bicubic interpolation ifrån 160x120 till 32x24 (kanske onödigt att köra Bicubic här, men är enklast)
4. Bicubic interpolation ifrån 32x24 till 288x208
detta fungerar rätt bra och bilden blir mycket bättre
om någon har ett bättre förslag för att minska bruset så
är det mycket tacksamt.
För att göra multitaska så använder jag Teensy threads som körs i "Cooperative multitasking"
"preemptive" fungerade inte då det var svårt att ställa in time-slices,
Cooperative är även mycket bättre då det automatiskt fixar problemen med delade resurser
men kräver dock att man har yield i loopar eller där man väntar på t.ex. I2C reads
Först fungerade det inte men efter en massa pulande så kom jag på att det kanske hade något att göra med stack-size
och att först sätta den på 2kbyte så började det fungera, 4kbyte fungerade prefekt men mer slött än otrådat,
det visade sig att det fanns ett buffert array i MLX read var "dynamiskt" allokerat, och för att "task switch" ska fungera så kopieras hela denna buffer till stacken innan taskswitchen utförs
vilket både förbrukar minne samt en massa tid,
detta löses genom att jag deklarerade alla större array till static,
då gick allt mycket snabbare 7fps (precis som jag tänkt att det skulle vara med multitasking)
här är lite bilder är bygg i en återanvänd box ifrån gammal testutrustning för gamla mobiler (sony ericsson) några till videos
här testar jag att köra i min utökade version av "Audio System Design Tool++ for Teensy Audio Library"
som körs i en webbläsare
(ja egentligen kan man göra mycket mer än att göra audio designs nu, men huvudfunktionen är Audio)
Här utnyttjar jag den nya "Web Serial API" som stödjs av Chrome, Edge samt Opera
(uppdaterade nyligen Tool++ för att kunna ta emot och visa bilder i min UI_Image node, samt att kunna ta emot och tolka datat)
Att köra så här möjliggör att jag enklare kan utveckla "RemoteContol" funktionen utan att behöva koppla ifrån datorn för att sedan koppla in till mobilen,
och snabbar upp utvecklingen.
planerade funktioner
* knappar för att kunna snabbt välja färgpalett
* touch GUI settings
ja detta inlägg blev mitt i natten,
normalt sitter jag inte uppe så här sent
men började för typ 3 timmar sen
https://github.com/manicken/ThermographicCamera
Detta började med att jag ville göra en kontrol av husets värmeförlust
och införskaffade MLX90614 för att kunna göra en 'sweep'-scan
med två servos, men den var långsam och mina servon var dåliga
i väntan på att jag skulle använda större servon så las det projektet på is
men sen såg jag ett inlägg
https://forum.pjrc.com/threads/66816-ML ... Teensy-4-0
och insåg att MLX90640 var relativt billig, efter massa tänkande så bestämde jag äntligen att köpa en sådan sensor
hittade en svensk sida som sålde den.
https://hitechchain.se/
'finns' även på mouser men då tillkommer frakt o moms + tull?
så det blir nog samma pris i slutändan
Nu med den nya sensorn
Så började jag först med en Raspberry Pi Pico + circuit python
då det fanns ett färdigt exempel som var mycket basic
men det är ganska långsamt ~1fps
Det slutade med att jag beslutade att köra med en Teensy 4.0 istället och skriva koden i c/c++
Kör med VSCODE + PlatformIO med Arduino Framework
och det var egentligen inga problem, så att köra python var egentligen bortkastad tid
kanske python kan vara bra om man vill kunna testa något smått bara för att se att det funkar.
Och det finns även libraries färdiga ifrån Adafruit
både till sensorn och LCD:n + exempelkod som jag testade individuellt
för att sedan basera koden på display:ns exempel, då den var mest "avancerad".
Efter ihopslagningen så körde jag bara förstorade pixlar utan någon interpolation
hade kunnat köra vanlig linjär interpolation men var inte nöjd med resultaten
och ville köra med bicubic interpolation (eller iallafall prova)
och efter en massa sökande så hittade jag kod ifrån exempel kod av Adafruit för en annan sensor
https://github.com/adafruit/Adafruit_AM ... lation.cpp
detta kunde köras med ~7fps vilket är ganska imponerande (skalan var då 1:7 för att jag körde ibörjan på en liten 1.3" 240x240 display)
sedan var jag inte helt nöjd med färgpaletten heller och ville testa några andra,
var mycket svårt att hitta några färgpaletter men hittade till slut ett annat DIY projekt
https://github.com/maxritter/DIY-Thermocam
där det fanns 18 st färgpaletter
men efterssom de tar rätt mycket plats (vilket kan kännas av när man omprogrammerar)
och har olika storlek så passar de inte riktigt in på skärmen heller
min tanke var att kunna generera dem ifrån basfärgerna istället
och då tar de inte mycket plats (kan nu klämma in 20 st paletter för utrymmet för 2st)
detta ledde till att jag hittade kod ifrån FastLED (rad:106)
https://github.com/FastLED/FastLED/blob ... rutils.cpp
gjorde en egen variant men deras är mycket bättre då den har högre upplösning (i själva genereringen)
testade först koden i javascript
https://github.com/manicken/Thermograph ... etteEditor
där printade jag även ut färgpaletterna ifrån "DIY-Thermocam"
för att kunna se hur de såg ut
sparade sedan dessa bilder för att kunna extrahera basfärgerna i paint
och använde sedan dessa basfärger för att kunna sätta ihop
"basfärg-paletterna" printade ut originalen tillsammans med de genererade för att kunna finjustera så de var i princip likadana
så här blev resultatet: dessa bas-färg paletter kan sedan generas med valfri storlek
för att passa in på display:n bättre
man skulle även kunna generara en extra färg-palette med fler färger som används för att visa själva "värme-bilden"
så att man inte är begränsad till skärmens storlek
(har dock inte gjort det ännu, då det minnet måste allokeras med malloc och så har jag haft andra prioriteringar)
Nu tyckte jag att 1.3" är lite för litet
Och eftersom Roboremo-app till mobilen har support för att kunna ta emot och visa bilder "Image"
och ansluting via OTG USB CDC
Först tänkte jag att det skulle vara slött, men den har inga problem att ta emot typ 7fps
så slängde in några knappar för att kunna styra färgpalett-valet exakt
+ en till bild för att visa själva färgpaletten
och även textrutor för att kunna visa temperaturerna
här är det nuvarande resultatet
men ville även ha denna storlek "standalone"
så jag köpte en ny större display 2.8" på electrokit
denna har även touch så om jag vill göra ett inställnings GUI så kan jag göra det sen.
Byter för nuvarande färgpalett med två knappar (I nuvarande box har jag inte ännu monterat dem, fanns bara på breadboard i prototyp-stadiet)
eller via Roboremo-app när den är inkopplad där, annars strömförsörjer jag "kameran" via en powerbank,
denna större display har större upplösning så nu är frameraten nere på 5,
och att efterssom MLX läsningar är med 1Mhz I2C hastighet så slösas mycket tid bara att vänta
teensy 4.0 kör i 700Mhz så det blir ju rätt mycket som kan utföras därimellan
tänkte att jag kunde göra I2C reads samtidigt som jag gör Bicubic interpolation
+ att jag nu även gör Gaussian interpolation ifrån http://blog.dzl.dk/2019/06/08/compact-g ... -displays/
samt ytterligare två extra interpolations för att (utjämna bilden och minska bruset)
det går till ungefär så här
1. sensorn:s 32x24 pixlar "Gaussian interpolation" till 64x48
2. Bicubic interpolation ifrån 64x48 till 160x120
3. Bicubic interpolation ifrån 160x120 till 32x24 (kanske onödigt att köra Bicubic här, men är enklast)
4. Bicubic interpolation ifrån 32x24 till 288x208
detta fungerar rätt bra och bilden blir mycket bättre
om någon har ett bättre förslag för att minska bruset så
är det mycket tacksamt.
För att göra multitaska så använder jag Teensy threads som körs i "Cooperative multitasking"
"preemptive" fungerade inte då det var svårt att ställa in time-slices,
Cooperative är även mycket bättre då det automatiskt fixar problemen med delade resurser
men kräver dock att man har yield i loopar eller där man väntar på t.ex. I2C reads
Först fungerade det inte men efter en massa pulande så kom jag på att det kanske hade något att göra med stack-size
och att först sätta den på 2kbyte så började det fungera, 4kbyte fungerade prefekt men mer slött än otrådat,
det visade sig att det fanns ett buffert array i MLX read var "dynamiskt" allokerat, och för att "task switch" ska fungera så kopieras hela denna buffer till stacken innan taskswitchen utförs
vilket både förbrukar minne samt en massa tid,
detta löses genom att jag deklarerade alla större array till static,
då gick allt mycket snabbare 7fps (precis som jag tänkt att det skulle vara med multitasking)
här är lite bilder är bygg i en återanvänd box ifrån gammal testutrustning för gamla mobiler (sony ericsson) några till videos
här testar jag att köra i min utökade version av "Audio System Design Tool++ for Teensy Audio Library"
som körs i en webbläsare
(ja egentligen kan man göra mycket mer än att göra audio designs nu, men huvudfunktionen är Audio)
Här utnyttjar jag den nya "Web Serial API" som stödjs av Chrome, Edge samt Opera
(uppdaterade nyligen Tool++ för att kunna ta emot och visa bilder i min UI_Image node, samt att kunna ta emot och tolka datat)
Att köra så här möjliggör att jag enklare kan utveckla "RemoteContol" funktionen utan att behöva koppla ifrån datorn för att sedan koppla in till mobilen,
och snabbar upp utvecklingen.
planerade funktioner
* knappar för att kunna snabbt välja färgpalett
* touch GUI settings
ja detta inlägg blev mitt i natten,
normalt sitter jag inte uppe så här sent
men började för typ 3 timmar sen
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Snyggt jobbat.
Fick lov att göra en gradient...
Fick lov att göra en gradient...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)
priserna börjar bli låga nog för att fundera att ha dom som kombinerad pir och kamera för att vakta huset
klart intressant
klart intressant
Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Vad blir ungefärligt totalpris för varianten med mobil och varianten med stor display ?
Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Sensor MLX90640
@ https://hitechchain.se/iot/mabee-mlx906 ... mal-camera
699:-
Teensy 4.0
@ https://www.electrokit.com/en/product/teensy-4-0/
329:-
2.8" LCD (ili9341)
@ https://www.electrokit.com/en/product/l ... ouch-uext/
249:- (för nuvarande inte i lager, men kan hittas i alternativ form till vettiga priser på Amazon, kolla dock så att de verkligen skickas ifrån Amazon annars kommer de nog direkt ifrån Kina o då tillkommer ju avgifter)
Sen om man vill ha mer upplösning än
32x24
Och om man känner för att lägga ut lite mer pengar +1800:-
Så finns även
flir lepton 3.5
160x120
Att köpa ifrån mouser eller digikey
I två delar ( kamera & breakout )
ca: 2500:- inkl moms
Jag funderar faktiskt på att köpa det, men får tänka lite till.
Som jag skrivit innan
Ett projekt som använder just flir lepton 3.5
https://www.diy-thermocam.net/
https://github.com/maxritter/DIY-Thermocam
https://github.com/maxritter/DIY-Thermocam
Sen glömde jag skriva att det ska även finnas ett inbyggt li-ion i kameran, så att den blir helt "standalone",
om man tittar på bilderna så finns det ett litet utrymme kvar, det är också därför jag har lödat sladdarna direkt på display-kortet.
Detta kommer laddas med TP4056, och kommer ha seperat laddningsuttag, alternativt en switch för att kunna ladda via det befintliga teensy micro USB.
Har du/ni använt Roboremo tidigare?
För att göra det oberoende ifrån Roboremo så
försökte jag även göra en app i "mit appinventor" men prestandan är fruktansvärd, bara att uppdatera en bild tar flera sekunder, och att läsa in data ifrån USB CDC tar ytterligare massa tid.
Hade säkert kunnat skriva bättre o mer anpassade extensions, både för att uppdatera bilder och läsa ifrån USB, men kände att jag redan spenderat för mycket tid på detta, försökte mig även på att skriva en riktig app men då var motivationen redan slut, och ville fortsätta med optimeringen/utveckling av "firmware".
@ https://hitechchain.se/iot/mabee-mlx906 ... mal-camera
699:-
Teensy 4.0
@ https://www.electrokit.com/en/product/teensy-4-0/
329:-
2.8" LCD (ili9341)
@ https://www.electrokit.com/en/product/l ... ouch-uext/
249:- (för nuvarande inte i lager, men kan hittas i alternativ form till vettiga priser på Amazon, kolla dock så att de verkligen skickas ifrån Amazon annars kommer de nog direkt ifrån Kina o då tillkommer ju avgifter)
Sen om man vill ha mer upplösning än
32x24
Och om man känner för att lägga ut lite mer pengar +1800:-
Så finns även
flir lepton 3.5
160x120
Att köpa ifrån mouser eller digikey
I två delar ( kamera & breakout )
ca: 2500:- inkl moms
Jag funderar faktiskt på att köpa det, men får tänka lite till.
Som jag skrivit innan
Ett projekt som använder just flir lepton 3.5
https://www.diy-thermocam.net/
https://github.com/maxritter/DIY-Thermocam
https://github.com/maxritter/DIY-Thermocam
Sen glömde jag skriva att det ska även finnas ett inbyggt li-ion i kameran, så att den blir helt "standalone",
om man tittar på bilderna så finns det ett litet utrymme kvar, det är också därför jag har lödat sladdarna direkt på display-kortet.
Detta kommer laddas med TP4056, och kommer ha seperat laddningsuttag, alternativt en switch för att kunna ladda via det befintliga teensy micro USB.
Har du/ni använt Roboremo tidigare?
För att göra det oberoende ifrån Roboremo så
försökte jag även göra en app i "mit appinventor" men prestandan är fruktansvärd, bara att uppdatera en bild tar flera sekunder, och att läsa in data ifrån USB CDC tar ytterligare massa tid.
Hade säkert kunnat skriva bättre o mer anpassade extensions, både för att uppdatera bilder och läsa ifrån USB, men kände att jag redan spenderat för mycket tid på detta, försökte mig även på att skriva en riktig app men då var motivationen redan slut, och ville fortsätta med optimeringen/utveckling av "firmware".
Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Sen finns ju bara kontakten till flir lepton att köpa seperat
https://www.mouser.se/ProductDetail/Mol ... GNjg%3D%3D
Tycker 700:- (inkl moms) för själva breakoutkortet är lite att ta i.
Borde inte vara något problem att göra ett eget kort då komponenterna: tre spänningsregulatorer och en ref. clock 25MHz
Inte ska kosta så mycket.
https://www.mouser.se/ProductDetail/Mol ... GNjg%3D%3D
Tycker 700:- (inkl moms) för själva breakoutkortet är lite att ta i.
Borde inte vara något problem att göra ett eget kort då komponenterna: tre spänningsregulatorer och en ref. clock 25MHz
Inte ska kosta så mycket.
- JimmyAndersson
- Inlägg: 26308
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)
Har nu uppdaterat kameran
så istället för Gauss smoothing + mitt tidigare försök att göra bilden mindre flimrig,
så kör den nu med medelvärde
den använder en mycket simpel cirkulär buffer
där de senaste (upp till 32 "hårdkodat")
"frames" tas med i beräkningen av medelvärdet
detta gör att updateringen känns snabbare
och det ger även en slags fade in/out effekt.
Har även implementerat pixelated mode för USB streaming.
Visar även hur det ser ut om man sänker uppdateringshastighen ifrån sensorn,
detta ger mindre flimmer/noise, men inte så bra som medelvärdet ger.
Här är en video som visar hur det ser ut
så istället för Gauss smoothing + mitt tidigare försök att göra bilden mindre flimrig,
så kör den nu med medelvärde
den använder en mycket simpel cirkulär buffer
där de senaste (upp till 32 "hårdkodat")
"frames" tas med i beräkningen av medelvärdet
detta gör att updateringen känns snabbare
och det ger även en slags fade in/out effekt.
Har även implementerat pixelated mode för USB streaming.
Visar även hur det ser ut om man sänker uppdateringshastighen ifrån sensorn,
detta ger mindre flimmer/noise, men inte så bra som medelvärdet ger.
Här är en video som visar hur det ser ut