Kaj je FLIR kamera? Akronim FLIR pomeni »naprej usmerjeno infrardeče« (gledanje), zato takšne kamere zaznavajo infrardečo energijo. Infrardeča energija je v bistvu merilo, koliko toplote oddaja predmet. FLIR senzorje je prvotno zasnoval Kirby Taylor iz podjetja Texas Instruments leta 1963. Njihove prve aplikacije so bile za vojaške namene – bile so drage in so bile torej praktične samo za vojsko, ki porabi veliko za vso svojo tehnologijo. Sčasoma pa so se stroški teh senzorjev dovolj znižali, da so postali praktični za komercialno / potrošniško uporabo.
Infrardeča svetloba spada v dve območji – dolgovalovno in srednjevalovno IR območje. Senzorji za dolgovalovne IR lahko zaznavajo telesno toploto in toploto, ki jo proizvajajo elektronske komponente itd., vendar delujejo le na omejeni razdalji (kar je na splošno v redu za predvideni namen). Srednjevalovni IR senzorji imajo še nekaj drugih prednosti, je pa senzorje na splošno potrebno ohladiti na kriogene temperature.
Ta vsebina je samo za naročnike
Sodobni senzorji IR kamere spadajo v tri široke skupine:
- Zelo nizka ločljivost tipala, ki naj bi le nejasno zaznavala obliko predmeta s svojim toplotnim podpisom, na primer na montažni liniji. Primer tega bi lahko bil infrardeči senzor Panasonic AMG8833 Grid-EYE®, ki ima ločljivost le 8 x 8 slikovnih pik.
- Senzorji zmerne ločljivosti proizvajalca Melexis. Senzor MLX90640 ima ločljivost 32 x 24 slikovnih pik in ga je enostavno povezati prek I2C. Pri ceni približno 40 €, so ti senzorji dobra izbira za domače projekte.
- Senzorji visoke ločljivosti, ki jih je izdelal Lepton. Izraz visoke ločljivosti je seveda relativen. V polju IR kamere se ločljivost tipal Lepton 160 x 120 pik šteje za “visoko ločljivost”. Kamera našega mobilnega telefona skoraj ne bi štela za visoko ločljivost, če bi zahtevala te specifikacije. Ti so precej dražji, približno 170 €, a če upoštevate stroške na piko, so povsem razumni. Na fotografiji 2 je prikazan Leptonov senzor.
Odločil sem se, da je Melexis MLX90640 dober izbor za moje namene, zato sem zasnoval projekt okoli njega. Tu v Kanadi sem si ga kupil pri podjetju Digi-Key. Ker je Melexis s sedežem v Belgiji, bi ga morali bralci revije Svet elektronike enostavno dobiti od regionalnih distributerjev v EU.
MLX90640 IR slikovni senzor
MLX90640 ima še eno prednost pred nizko ceno – nameščen je v istem TO39 ohišju, ki so ga v preteklosti uporabljali za številne tranzistorje. Vsebuje 4 priključke in jih je enostavno pritrditi na razvojno ploščo z rasterjem 0,1 ”. Na voljo je v dveh različicah z vidnim poljem (FOV) bodisi 55˚ x 35˚ (oznaka BAB) bodisi 110˚ x 75˚ (oznaka BAA). Konfiguracija BAB je nekoliko nižja in je ta, ki sem jo izbral. Na fotografiji 3 je prikazan MLX90640 senzor, ki sem ga kupil – možnost BAA je videti podobno, le da je njegov črni kolimator nekoliko krajši in ima večji premer.
Ti senzorji so tovarniško umerjeni. To pomeni, da so odčitki temperature natančni. Prav tako je pomembno, da se ujemanje vseh 768 posameznih tipal izvede s pomočjo koeficientov, shranjenih v tabelah EEPROM znotraj naprave. Zato, če bi kamero usmerili na nekaj, kar je izotermično po celotni površini, na dobljeni sliki ne bi videli vročih ali hladnih madežev. Sumim, da tovarniški kalibracijski faktorji bistveno vplivajo na ceno enote.
Ti senzorji so sposobni relativno hitro osveževati. Hitrost osveževanja je mogoče nastaviti v območju od 0,5 do 64 Hz. Pri mojem projektu je bil omejujoč dejavnik to, kako hitro sem lahko osvežil TFT displej, ki se je izkazal da je 4 sličice/sekundo.
MLX90640 deluje na 3,3 voltih, kar je priročno, saj je to napajalna napetost, ki je potrebna tako za MCU, ki sem ga izbral, kot tudi za TFT LCD displej. MLX90640 troši približno 20 mA toka, tako da ni pomembna obremenitev LiPo baterije, ki jo uporabljam.
V MLX90640 je 768 ločenih IR senzorjev. Vsi senzorji merijo temperaturo (tj. IR sevanje) glede na temperaturo podlage, na katero so senzorji nameščeni. Zato je v čip vključen notranji senzor temperature podlage (imenovan PTAT). Slika 1 prikazuje notranje elemente vezja.
Kaže, da ima vsak senzor svoj analogni ojačevalnik, preden se njegov signal vodi v ADC, za kar predvidevam, da mora biti en ADC z vhodnim multiplekserjem. ADC ima ločljivost 18 bitov, vendar je to mogoče spremeniti s programskimi ukazi.
Naprava vsebuje EEPROM matriko za shranjevanje veliko različnih tovarniško izmerjenih koeficientov kalibracije. Obstaja nekaj diskretnih koeficientov, kot so tisti, ki shranjujejo notranjo vrednost VDD in kalibracijo senzorja temperature okolice. Vendar je večina EEPROM prostora zasedena s koeficientnimi nizi, ki ustrezajo parametrom za vsakega od 768 senzorjev v matriki.
Naprava vsebuje natančno referenčno pasovno vrzel za analogno vezje ter pomnilno RAM polje, ki začasno shrani vsako vrednost pikslov, dokler jih ni mogoče serijsko prebrati preko I2C. Čeprav na sliki 1 ni prikazano, obstaja tudi MCU ali DSP, ki upravlja s celotnim pretokom podatkov, sinhroniziranim s 34 MHz RC taktom.
V preteklosti sem uporabljal IR vezje Melexis, ki vsebuje samo en senzor. Izmerili so tudi temperaturo glede na notranjo temperaturo substrata čipa. Za določitev temperature iz teh dveh vrednosti je bila potrebna formula (plus notranja napetost, kolikor se spominjam). V primeru MLX90640 so potrebni izračuni veliko bolj zapleteni. In s tem ne mislim samo, da ima vsak piksel svoj nabor kalibracijskih koeficientov – na splošno je potrebnih še veliko več izračunov.
Čeprav je bilo ohišje senzorja in priročen vmesnik I2C spodbudno, sem bil zaskrbljen zaradi zapletene matematike, potrebne za uporabo senzorja. Medtem ko je bil del tega moja skrb glede pisanja programa, sem se tudi spraševal, kako zahtevno bo MCU moral delovati, da bi “drobil številke”. Skrbelo me je tudi za količino potrebnega SRAM pomnilnika v MCU.
Melexis je očitno razumel to skrb – napisali so gonilnik za to vezje, ki ga vidno prikažejo na prvi strani svojega podatkovnega lista. To je na voljo na spletnem mestu Melexis GitHub (povezava je navedena v referencah). Sestavljen je iz API-ja, napisanega na „C“, in namenskega gonilnika I2C za vezje. Obstaja tudi PDF datoteka z naslovom “MLX90640 gonilnik”, ki opisuje različne funkcije API-ja, pa tudi sam opis I2C gonilnika.
To je dober prvi korak, toda skica z Arduino primerom bi bila še bolj uporabna. Našel sem takšno skico, ki jo je napisalo ameriško podjetje Sparkfun, ki oskrbuje ljubitelje elektronike. Prodajajo majhno razvojno ploščo, ki vsebuje ta senzor.
Poleg Arduino skice so napisali tudi Processing aplikacijo, ki deluje v osebnem računalniku in vam omogoča vizualizacijo slik, tudi če v svoj projekt ne vključite LCD zaslona. Slika 4 prikazuje primer slike kamere (s spletnega mesta GarkHub Sparkfun).
V svoj projekt sem nameraval vključiti TFT LCD zaslon, tako da dejansko še nisem preizkusil Processing aplikacije.
Moram omeniti, da čeprav je Sparkfun priskrbel Arduino skico za MLX90640, zaradi zgoraj omenjene kompleksne matematike ta skica ne bo delovala na nobeni Arduino plošči, ki temelji na M328, kot je na primer Uno. Za shranjevanje vseh potrebnih spremenljivk s plavajočo vejico je potrebnih 20.000 bajtov SRAM-a, kar je veliko več kot 2K na voljo v MCU-jih, kot je ATmega328. Tudi Arduino Mega 2560 vsebuje le 8K SRAM-a, zato tudi ta ni uporaben. Zato morate za projekt poiskati še en MCU, ki je združljiv z Arduino.
V zadnjih 5 letih uporabljam različne Teensy MCU module – Teensy 3.2, 3.5, 3.6 in v zadnjem času različice 4.0. Moduli Teensy uporabljajo različne Freescale (zdaj NXP) ARM procesorje. Zelo zanimivo v MCU družini Teensy je:
- So združljivi z Arduino (z uporabo dodatka Teensyduino k Arduino IDE).
- Obstaja izjemno aktiven in koristen forum Teensy, ki olajša proces razvoja.
- Na voljo je veliko knjižnic, ki so združljive z Arduino. Mnoge od teh so nameščene samodejno, ko je nameščen dodatek Teensyduino, veliko več pa jih obstaja na različnih spletnih mestih GitHub, ki so povezane na forumu.
- Različni Teensy moduli so cenovno ugodni glede na zmožnosti.
V Sparkfun priporočajo modul Teensy 3.2 za izvedbo svoje skice z MLX90640. Vendar sem se odločil, da bom uporabil najhitrejši Teensy modul, ki je bil na voljo takrat (Teensy 3.6), saj me je zanimalo, ali se LCD zaslon osveži pri najvišji možni hitrosti. Za primerjavo hitrosti ima Arduino Mega rezultat Coremark 7,03, Teensy 3.2 126,7, Teensy 3.6 pa ima Coremark 440.
Če bi danes delal projekt, bi morda preskočil Teensy 3.6 in naredil projekt z najnovejšim Teensy 4.0. Slednji je 2/3 cene Teensy 3.6, ker prihaja na veliko manjši PCB (z manj I/O priključki). Na Teensy 4.0 je za ta projekt še vedno dovolj vhodno/izhodnih priključkov, njegova ocena Coremark pa je 2313: 6x višja, kot pri že tako hitri Teensy 3.6. Teensy 3.6 pa ima prednost vgrajene vtičnice SD kartice, kar Izkoristim v tem projektu.
Shema
Na sliki 2 se nahaja shema vezja projekta. MLX90640 komunicira prek primarnih I2C vrat Teensy 3.6 (IO18 in IO19), obe liniji SCL in SDA pa sta preko 2,2k uporov povezani do Vcc. Uporabljam I2C hitrost 800 kHz, zato je pomembno, da uporabite te zunanje pull-up upore, ne pa da le omogočite notranje pull-up upore znotraj Teensy 3.6.
2,8-palčni barvni TFT zaslon na dotik je model velikosti 320 x 240, ki ga prodaja PJRC.com – isto podjetje, ki proizvaja in prodaja module Teensy. Ta uporablja SPI vmesnik in vsebuje priljubljen čip gonilnika displeja ILI9341. Ta displej je na voljo tudi pri različnih spletnih kitajskih prodajalcih in pri Amazonu. Čeprav sem njegovo funkcijo zaslona na dotik uporabljal pri drugih projektih, tukaj res ni bil potreben, saj je za uporabniški vmesnik poleg stikala za vklop potrebna le ena tipka.
Napajanje zagotavlja ena sama 2400 mAh LiPo celica, ki se priključi na Vin priključek v Teensy 3.6. Modul T3.6 vsebuje lastni 3,3-voltni LDO regulator, ki deluje dobro z izhodom 3,7 voltne LiPo celice. Dostop do te regulirane 3,3 V napetosti je zagotovljen na 3V priključku na T3.6, ki omogoča napajanje drugih zunanjih vezij. V tem projektu za napajanje osvetlitve zaslona TFT uporabljam samo 3,3-voltno napajanje Teensy 3,6, preostali del TFT zaslona pa napaja LiPo celica (TFT zaslon ima svoj 3,3V LDO).
Melexis opozarja uporabnike, naj za svoj MLX90640 senzor zagotovijo 3-voltni nizkošumni napajalnik. Odločil sem se za varno rešitev in vključil ločen Microchip MCP1700-3302E LDO regulator, ki bo napajal samo MLX90640. Nisem prepričan, ali je bilo to potrebno, toda sumim, da je na 3,3-voltnem izhodnem priključku modula T3.6 nekaj visokofrekvenčnega šuma, saj napaja ARM MCU.
Za status sem uporabil dvobarvno LED – to kaže na napredek pisanja med shranjevanjem datotek na SD kartico.
Na fotografiji 5 je prikazano vezje, nameščeno v ohišju. Vtičnica SD kartice je vidna na levem delu Teensy 3.6 modula. Teensy 3.6 se sprogramira prek vgrajenega zagonskega USB-ja, mikro USB vtičnica je na desni strani modula.
Imam ločeno LiPo polnilno enoto, zato odstranim LiPo baterijo, da jo napolnim. Na fotografiji 6 je prikazana uporabniška stran kamere, ki prikazuje zaslon TFT, stikalo za vklop in tipko za zajem zaslona.
Softver skice
Programska oprema je sestavljena iz Arduino skice. V Arduino IDE morate imeti nameščen Teensyduino dodatek. To je relativno “neboleč” postopek – samo sledite navodilom na naslednjem spletnem mestu PJRC:
https://www.pjrc.com/teensy/td_download.html
Na spletni strani revije Svet Elektronika sem priskrbel Arduino skico. Priskrbel sem tudi naslednje knjižnice, ki so potrebne:
- ILI9341_t3N-master
- SPIN-master
- MLX90640 knjižnične datoteke podjetja Melexis.
Oglejmo si te knjižnice za trenutek. Krmilnik ILI9341 se uporablja na TFT zaslonu. Verjetno najbolj priljubljena knjižnica za prikaze ILI9341 je knjižnica Adafruit ILI9341 Arduino. Na voljo je bila že zgodaj in so na začetku podprli AVR MCU. Čeprav je bil prenesen za delovanje s Teensy ARM MCU-ji, ni optimiziran za napredno ARM Teensy arhitekturo. Obstaja veliko podatkov, ki jih je treba pretočiti na zaslon, da se prikaže zaslon IR kamere, knjižnica Adafruit pa zagotavlja počasno osvežitev.
Ugotovil sem, da je knjižnica ILI9341-t3N, ki jo je napisal Kurt (starejši član foruma Teensy), veliko hitreje osvežila zaslon. Za uporabo te knjižnice potrebujete tudi knjižnico SPIN, ki transakcije SPI vrat obravnava drugače kot standardna SPI knjižnica, dobavljena z ID-jem Arduino / Teensyduino.
Končno dodajam tudi Melexis MLX90640 knjižnične datoteke:
- MLX90640-API.cpp in .h
- MLX90640_I2C_Driver.cpp in .h
Te 4 datoteke naj bodo postavljene v isto mapo, v kateri je Teensy_36_MLX90640_BM skica.
Ko sem prvotno napisal to skico, sem uporabljal različice njihovih Arduino/Teensyduino programov, ki so bile več različic starejše od tistih, kot jih trenutno uporabljam (vsa programska oprema dobiva nove različice vsakih nekaj mesecev!). Ko sem napisal kodo, sem v skico zapisal, da moram uporabiti možnost prevajalnika OptimizeFaster – Najhitrejše in LTO možnosti ne delujejo s knjižnico ILI9341_t3N. Morda boste morali preizkusiti različne stopnje optimizacije prevajalnika s svojo različico Arduino / Teensyduino ID-ja.
Če želite uporabiti MLX90640, morate ob vklopu najprej prenesti veliko matriko koeficientov iz EEPROM MLX90640 pomnilnika v SRAM Teensy 3.6. Vsi ti koeficienti so bili določeni / shranjeni v tovarni za vaš specifični MLX90640 senzor. To doseže naslednja koda:
uint16_t eeMLX90640[832]; status = MLX90640_DumpEE(MLX90640_address, eeMLX90640); if (status != 0) Serial.println("Failed to load system parameters"); status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
Melexis gonilnik pri branju EEPROM matrike uporablja privzeto I2C hitrost 400 kHz, po tem pa lahko povečate hitrost do 1 MHz. V Teensyju je 800 kHz najvišja hitrost, ki jo lahko konfigurirate in se nahaja pod 1 MHz.
EEPROM koeficienti se uporabljajo za generiranje več spremenljivih nizov, ki se uporabljajo pri izračunih za pretvorbo ADC vrednosti vhodnega senzorja v temperaturne vrednosti. Kot sem že omenil, je v API-ju knjižnice opravljenih veliko matematičnih izračunov s plavajočo vejico. Potrebne metode in formule so opisane v tehničnem priročniku vezja, ki se začne na strani 35 in konča na strani 46. V članku ni dovolj prostora za reprodukcijo vse te matematike, zato bom bralcu prepustil, da si priročnik pogleda, če ima željo vaditi svoje matematične spretnosti!
Ko so ti nizi enkrat nastavljeni, je pridobivanje slikovnih podatkov razmeroma enostavno, z uporabo naslednjih API funkcij:
int status = MLX90640_GetFrameData(MLX90640_address, mlx90640Frame); float vdd = MLX90640_GetVdd(mlx90640Frame,&mlx90640); float Ta = MLX90640_GetTa(mlx90640Frame, &mlx90640);
Upoštevajte, da sta temperatura substrata in Vdd senzorja zbrana za vsak okvir slikovnih podatkov in upoštevana v temperaturnih izračunih. Ko se zbere vsak okvir, se uporabi povprečna rutina z uporabo vrednosti iz predhodnih okvirov, odvisno od slikovnih pik. To pomaga zmanjšati šumne artefakte na sliki. Barva (odtenek) vsakega slikovnega zaslona TFT predstavlja temperaturo te točke na sliki. Minimalna in najvišja temperatura, ki sta prisotna v okvirju, sta določeni, ti dve vrednosti pa se uporabljata za merjenje barvnega preslikavanja slike, tako da dobimo kontrast. To se v kodi izvede na naslednji način:
for (int x = 0; x < 768; x++) { temps[x] = map(mlx90640Avg[x], tempMin-0.01, tempMax+0.01, 256, 0); // map tempMin to Blue and tempMax to Red }
Pri opisu MLX90640 senzorja sem omenil, da podpira do 64 Hz frekvenco okvirja. Vendar pa je bil tudi pri izjemno hitrem Teensy 3.6 MCU največja hitrost okvirja, ki sem jo lahko dosegel, zgolj 4 Hz. To ni omejeno s tem, kako hitro MCU lahko pridobi podatke iz kamere. Obstaja približno 834 16-bitnih vrednosti. Pri I2C hitrosti 800 kHz lahko prenašate 480 slik na sekundo:
800.000 bajtov / sek / (834 * 2) bajtov = 480 sličic
Ozko grlo je hitrost, s katero je mogoče osvežiti TFT zaslon, glede na to, da ga je treba opraviti preko SPI. SPI je veliko hitrejši od I2C, a čeprav ima senzor ločljivost le 32 x 24, ima zaslon ločljivost 320 x 240. To je 10 x 10-krat večja od ločljivosti senzorja, zato je veliko več podatkov, ki jih je potrebno poslati na zaslon.
16-bitni podatki o temperaturi, ki jih ponuja MLX90640, morajo biti pretvorjeni v informacije o barvi. TFT zaslon pričakuje, da bo prejel svoje slikovne pike v RGB formatu, pri čemer uporablja 5-bitov za rdečo in modro ter 6-bitov za zeleno. Za pretvorbo senzorskih podatkov v RGB format uporabljam funkcijo HSVtoRGB ().
Izdelal sem svojo preprosto rutino, s katero sem ekstrapoliral podatke 32 x 24 kamere in tako zapolnil zaslon velikosti 320 x 240. Deluje s povprečjem sosednjih slikovnih pik v ravninah X in Y, nato pa jih ekstrapolira, da ustvari gradient v ustreznem vodoravnem bloku z 10 pikami na zaslonu. To deluje dobro, kot je razvidno iz vzorčne slike, ki sem jo shranil. Odtlej sem bral o Gaussovem algoritmu zamegljenosti, ki verjetno deluje bolje, saj razdeli sliko na vseh 8 sosednjih pik z različno težo, zato dela veliko več izračunov. Sumim, da se ta algoritem uporablja v Sparkfun aplikaciji, ki deluje v računalniku (fotografija 4). V članku o referencah sem postavil povezavo do članka o Gaussovi interpolaciji. Spodnji del zaslona prikazuje barvno gradientno vrstico z oznakami na obeh straneh, ki označujeta najnižjo in najvišjo temperaturo.
Preostali del programske opreme obravnava zajem zaslona v datoteko SD kartice. Ker je slika le 320 x 240, sem se odločil, da mi ni treba uporabljati stiskanja (tj. pretvarjati v JPEG datoteko). Namesto tega sem samo shranil neobdelane podatke v Windows .BMP formatu. To ni bilo preveč težko – našel sem primerno Arduino skico, ki sem jo spremenil tako, da ustreza tej aplikaciji. Ker nisem hotel implementirati izpopolnjenega uporabniškega vmesnika, datoteke le shranim kot “IRCAMxx.BMP”, kjer je xx število, ki se samodejno poveča za vsak zajem v določeni seji. Fotografija 7 je dejanska datoteka za zajem zaslona v BMP formatu.
Zaključki
Ta projekt je dober primer modrosti uporabe Arduino programskega okolja kot izbranega IDE. Skica ni posebej dolga ali težko sledljiva, saj uporablja veliko različnih standardnih in prilagojenih knjižnic, ki izvajajo vse “težko delo”. Zapletenost izračunov, potrebnih za obdelavo neobdelanih podatkov MLX90640 senzorja pregledno obravnava Melexisova Arduino kompatibilna knjižnica. Če te knjižnice ne bi bilo, bi me to dejstvo verjetno odvrnilo od tega, da bi se lotil projekta, ker bi bil prisiljen sam vse to napisati.
Prav tako bi poudaril, da standardnega Arduino IDE ne uporabljam več neposredno. Zdaj uporabljam kombinacijo Microsoft Visual Studio in dodatka Visual Micro za svoje razvojno delo. Ta kombinacija VS/VM deluje kot inteligenten “ovitek” okoli Arduino/Teensyduino paketa orodij, kar ima za posledico veliko bolj profesionalen IDE s funkcijami, kot sta Intellisense in enostaven dostop za pregled osnovne knjižnične kode.
Viri
- MLX90640 senzor- Melexis Technologies NV.
https://www.melexis.com/-/media/files/documents/datasheets/mlx90640-datasheet-melexis.pdf - Knjižnica gonilnika:
.com/melexis/mlx90640-library.git - Teensy 3.6 Modul- PJRC.com
https://www.pjrc.com/store/teensy36.html - 2.8” TFT Displej občutljiv na dotik – PJRC.com
https://www.pjrc.com/store/display_ili9341_touch.html - Kompaktna Gaussova Interpolacija članek:
http://blog.dzl.dk/2019/06/08/compact-gaussian-interpolation-for-small-displays/ - Sparkfun MLX90640 primeri programov:
https://github.com/sparkfun/Qwiic_IR_Array_MLX90640
2020_285_51
Avtor: Brian Millier
Brian_IR camera