Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Berätta om dina pågående projekt.
Användarvisningsbild
manicken
Inlägg: 91
Blev medlem: 10 februari 2006, 14:20:59
Ort: DEGEBERGA

Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av manicken »

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:
PrintAllToCompare.png
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
frontside.jpg
är bygg i en återanvänd box ifrån gammal testutrustning för gamla mobiler (sony ericsson)
backside.jpg
inside.jpg
display_direct_solder.jpg
main_board_underside.jpg
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 :vissla:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av GeekJoan »

Snyggt jobbat.

Fick lov att göra en gradient...
gradient.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Oskar
Inlägg: 1804
Blev medlem: 6 september 2005, 15:11:36
Ort: Storsjö, Sorsele

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av Oskar »

Imponerande projekt! Riktigt kul att läsa :tumupp:
Användarvisningsbild
grym
EF Sponsor
Inlägg: 16719
Blev medlem: 16 november 2003, 12:22:57
Ort: i det mörka småland

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av grym »

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
Användarvisningsbild
Glenn
Inlägg: 33667
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av Glenn »

Vad blir ungefärligt totalpris för varianten med mobil och varianten med stor display ?
Användarvisningsbild
manicken
Inlägg: 91
Blev medlem: 10 februari 2006, 14:20:59
Ort: DEGEBERGA

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av manicken »

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".
Användarvisningsbild
manicken
Inlägg: 91
Blev medlem: 10 februari 2006, 14:20:59
Ort: DEGEBERGA

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av manicken »

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.
Användarvisningsbild
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)

Inlägg av JimmyAndersson »

Mycket intressant projekt. :tumupp:
Gimbal
Inlägg: 7878
Blev medlem: 20 april 2005, 15:43:53

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av Gimbal »

Japp, imponerande. :tumupp:
Användarvisningsbild
manicken
Inlägg: 91
Blev medlem: 10 februari 2006, 14:20:59
Ort: DEGEBERGA

Re: Värmekamera (Teensy 4.0, MLX90640, ILI9341)

Inlägg av manicken »

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
Skriv svar