Herstellung einer DIY-Wärmebildkamera basierend auf einem Raspberry Pi

Bild

Hallo allerseits!

Der Winter ist da und ich musste die Wärmedämmung meiner außerhalb der Stadt gelegenen Datscha überprüfen. Und es stellte sich heraus, dass ein berühmter chinesischer Marktplatz anfing, billige Wärmebildmodule zu verkaufen. Also habe ich beschlossen, es selbst zu bauen und eine ziemlich exotische und nützliche Sache zu bauen - ein Wärmevisier für zu Hause. Warum nicht? Zumal ich sowieso einen Raspberry Pi herumliegen hatte ... Das Ergebnis ist unten.

MLX90640. Was ist das


Dies ist eine Wärmekameramatrix mit einem integrierten Mikrocontroller, die von einer (mir) unbekannten Firma namens Melexis hergestellt wurde. Die Matrix ist 32x24 Pixel groß, was nicht viel ist, aber nach der Interpolation reicht es aus, allgemeine Trends zu bemerken.

Bild

Der Sensor ist in zwei Versionen erhältlich. Der einzige Unterschied besteht im Gehäuse und im FoV der Kamera. Das geerdetere A-Modell beobachtet die Welt mit 110 Grad horizontal und 75 Grad vertikal. Das B-Modell hat 55 bzw. 37,5 Grad. Das Gehäuse verfügt über vier Ausgänge - zwei für die Stromversorgung und zwei für die Kommunikation mit einem Steuergerät über I2C. Das Datenblatt finden Sie hier .

Was ist dann GY-MCU90640?


Unsere chinesischen Kollegen liefern den MLX90640-Chip auch mit einem anderen Mikrocontroller an Bord (STM32F103) aus, wahrscheinlich zur einfacheren Matrixsteuerung. Die gesamte Einheit heißt GY-MCU90640 und hat mich im Dezember 2018 rund 5.000 RUB (ca. 80 USD) gekostet. Es sieht so aus:

Bild

Wie wir sehen können, gibt es auch zwei Versionen dieses Modells mit unterschiedlichen Sensoren

Welches wird am besten funktionieren? Leider habe ich mir diese Frage erst gestellt, nachdem das Modul bestellt, versendet und empfangen wurde. Ich habe bei der Auswahl nicht darüber nachgedacht.

Die Weitwinkelversion eignet sich am besten für selbstfahrende Roboter oder CCTV-Systeme (da das Sichtfeld besser ist). Das Datenblatt sagt, dass es auch weniger laut und genauer ist.

Bild

Aber zur Visualisierung würde ich aus einem sehr wichtigen Grund das B-Modell mit den „Adleraugen“ empfehlen. Es kann (manuell oder über ein Laufwerk) gedreht werden, um kombinierte Bilder detaillierter als die Auflösung von 32 x 24 zu machen. Aber ich habe keine, also werde ich später über das breitwinklige A-Modell sprechen.

Anschließen an den Raspberry Pi


Wir können die Wärmebildkamera auf zwei Arten steuern:

  • Schließen Sie die „SET“ -Pins auf der Platine kurz und steuern Sie den MLX90640-Mikrocontroller mithilfe des I2C-Protokolls direkt
  • Lassen Sie die Pins und verwenden Sie den STM32F103-Controller über RS-232 oder eine ähnliche Schnittstelle.

Wenn Sie in C ++ codieren, ist es wahrscheinlich besser, den zusätzlichen Controller zu ignorieren, die Pins kurzzuschließen und die API des Herstellers zu verwenden, die Sie hier finden .

Bescheidene Pythonisten könnten auch die erste Option verwenden. Es scheint ein paar Python-Bibliotheken zu geben ( hier und hier ), aber keine hat für mich sofort funktioniert.

Fortgeschrittene Pythonisten könnten theoretisch ihren eigenen Controller-Treiber schreiben. Das Datenblatt erklärt, wie ein Frame daraus extrahiert wird. Sie müssen jedoch alle Kalibrierungsverfahren manuell beschreiben, was mir übermäßig schwer fällt. Also habe ich Option 2 verwendet. Es stellte sich heraus, dass es etwas kompliziert war, aber immer noch überschaubar.

Dank des chinesischen Einfallsreichtums (oder Glücks) erwies sich die Ausgabekonfiguration auf der Platine als sehr praktisch:

Bild

Alles was ich tun musste, war das Board in Raspberrys Port einzusetzen. Die Karte verfügt über einen eingebauten 5V-3V-Wandler, sodass die empfindlichen Rx- und Tx-Ausgänge des Pi nicht gefährdet sind.

Ich möchte auch hinzufügen, dass Sie es ähnlich anschließen können, während Sie Option 1 verwenden, aber Sie müssen äußerst vorsichtig und kompetent beim Löten sein. Die Platine muss auf der anderen Seite des Pi montiert werden (Beispiel auf dem Header-Foto).

Software


Der berühmte chinesische Marktplatz bietet diese majestätische Software für den Zugriff auf den GY-MCU90640:

Bild

Anscheinend muss es auch eine Beschreibung des Kommunikationsprotokolls geben, das für den Zugriff auf den Mikrocontroller verwendet wird, und nach einem kurzen Gespräch mit dem Verkäufer (großer Respekt vor ihm) hatte ich das Protokoll in meinen Händen. In PDF und in reinem, destilliertem Chinesisch.

Dank Google Translate und einer gesunden Portion Einfügen wurde das Protokoll etwa 90 Minuten später dekodiert. Ich habe es auf hochgeladen Bild Github Es stellte sich heraus, dass die Karte 6 grundlegende Befehle versteht, darunter einen zum Anfordern des aktuellen Frames über einen COM-Port.

Jedes Pixel der Matrix ist im Wesentlichen ein Messwert der Objekttemperatur. Der Temperaturwert wird in Grad Celsius multipliziert mit 100 (eine 2-Byte-Zahl) angegeben. Es gibt sogar einen speziellen Modus, in dem die Karte 4 Mal pro Sekunde automatisch Frames an den Pi sendet.

Das vollständige Skript zum Empfangen von Wärmebildern:
"""MIT License Copyright (c) 2019 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.""" import serial, time import datetime as dt import numpy as np import cv2 # function to get Emissivity from MCU def get_emissivity(): ser.write(serial.to_bytes([0xA5,0x55,0x01,0xFB])) read = ser.read(4) return read[2]/100 # function to get temperatures from MCU (Celsius degrees x 100) def get_temp_array(d): # getting ambient temperature T_a = (int(d[1540]) + int(d[1541])*256)/100 # getting raw array of pixels temperature raw_data = d[4:1540] T_array = np.frombuffer(raw_data, dtype=np.int16) return T_a, T_array # function to convert temperatures to pixels on image def td_to_image(f): norm = np.uint8((f/100 - Tmin)*255/(Tmax-Tmin)) norm.shape = (24,32) return norm ########################### Main cycle ################################# # Color map range Tmax = 40 Tmin = 20 print ('Configuring Serial port') ser = serial.Serial ('/dev/serial0') ser.baudrate = 115200 # set frequency of module to 4 Hz ser.write(serial.to_bytes([0xA5,0x25,0x01,0xCB])) time.sleep(0.1) # Starting automatic data colection ser.write(serial.to_bytes([0xA5,0x35,0x02,0xDC])) t0 = time.time() try: while True: # waiting for data frame data = ser.read(1544) # The data is ready, let's handle it! Ta, temp_array = get_temp_array(data) ta_img = td_to_image(temp_array) # Image processing img = cv2.applyColorMap(ta_img, cv2.COLORMAP_JET) img = cv2.resize(img, (320,240), interpolation = cv2.INTER_CUBIC) img = cv2.flip(img, 1) text = 'Tmin = {:+.1f} Tmax = {:+.1f} FPS = {:.2f}'.format(temp_array.min()/100, temp_array.max()/100, 1/(time.time() - t0)) cv2.putText(img, text, (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 0), 1) cv2.imshow('Output', img) # if 's' is pressed - saving of picture key = cv2.waitKey(1) & 0xFF if key == ord("s"): fname = 'pic_' + dt.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + '.jpg' cv2.imwrite(fname, img) print('Saving image ', fname) t0 = time.time() except KeyboardInterrupt: # to terminate the cycle ser.write(serial.to_bytes([0xA5,0x35,0x01,0xDB])) ser.close() cv2.destroyAllWindows() print(' Stopped') # just in case ser.close() cv2.destroyAllWindows() 


Ergebnisse


Das Skript fragt die Wärmematrix ab und gibt viermal pro Sekunde Frames an die Konsole des angeschlossenen Monitors aus. Dies reicht aus, um nicht zu viel Unbehagen zu empfinden. Zur Visualisierung wird das OpenCV-Paket verwendet. Wenn Sie S drücken, werden „Heatmaps“ von der Kamera als JPGs in den Ordner des Skripts hochgeladen.

Bild

Zur besseren Sichtbarkeit habe ich die App auch dazu gebracht, die minimale und maximale Temperatur innerhalb des Rahmens anzuzeigen. Wenn wir uns also die Wärmekarte ansehen, können wir die Temperatur der kältesten und heißesten Objekte (innerhalb eines Grades, normalerweise auf der höheren Seite) im Bereich von 20 bis 40 Grad abschätzen. Strg + C beendet das Skript.

Bild

Das Skript funktioniert auf dem Raspberry Pi Zero W und Pi 3 B + genauso. Ich habe einen VNC-Server auf meinem Smartphone installiert. Wenn Sie also einen Pi mit einer Power Bank mit einem VNC-fähigen Smartphone verbinden, erhalten Sie eine Taschen-Wärmebildkamera, die Bilder speichert. Könnte nicht zu bequem sein, aber es macht den Job.

Nach dem ersten Start wird möglicherweise die maximale Temperatur falsch angezeigt. In diesem Fall sollte ein Neustart des Skripts die Aufgabe erfüllen.

Das war's für heute. Das Experiment könnte als Erfolg gewertet werden. Mit diesem Gerät können Sie definitiv einen thermischen Scan eines Hauses durchführen. Wenn jemand andere Verwendungszwecke dafür finden kann, schreiben Sie bitte in die Kommentare.

Frohe Arbeitswoche und bis bald!

UPD: Ich wurde in den Kommentaren gebeten, das Haus von außen zu fotografieren. Hier ist es. Die Bilder waren aufgrund des geringeren Temperaturkontrasts nicht sehr informativ. Die beiden oberen Fotos zeigen das gesamte Haus aus zwei Blickwinkeln. Die beiden unteren Fotos sind unterschiedliche Fenster.

Bild

Die einzige Änderung, die ich am Code vorgenommen habe, war der Temperaturbereich: von +20 ... + 40 bis -10 ... + 5.

Source: https://habr.com/ru/post/de441050/


All Articles