Wärmebildkamera an Mikrocontroller anschließen? Kein Problem! Besonders wenn es sich um einen STM32 mit USB-Host-Schnittstelle und einem Seek Thermal Thermal Imager von Dadget handelt!
Lötkolben durch die Augen einer SeekThermal-WärmebildkameraEinführung
Ich denke, dass jeder auf solche Geräte wie eine Wärmebildkamera gestoßen ist. Lesen Sie zumindest darüber. Und unter diesen Geräten gibt es eine ganze Unterklasse von Gadgets, die kein eigenständiges Gerät sind, sondern als eine Art Set-Top-Box für einen Computer oder ein Smartphone dienen.
Heute werden wir über den Anschluss der
Seek Thermal Wärmebildkamera an den STM32-Mikrocontroller sprechen. Und die Firma Dadget hat mir dieses Gerät zur Verfügung gestellt. Bei Geektimes-Erweiterungen wurde diese Wärmebildkamera mehr als einmal in Betracht gezogen: Sie behandelte hauptsächlich die Arbeit mit Android sowie einen Artikel über das Anschließen dieses Geräts an einen PC. In meinem Test möchte ich über meine eigenen Erfahrungen beim Anschließen einer Seek Thermal-Wärmebildkamera an den STM32-Mikrocontroller über einen USB-Host sprechen.
Hardwareanforderungen
Nicht so spezifisch! Alles, was Ihr STM32 haben sollte, ist eine USB-Schnittstelle, die im Host-Modus arbeiten kann, und eine Schnittstelle zur Steuerung des LCD-Bildschirms. Die naheliegendste Wahl ist die STM32F4 - Discovery. Ich hatte das STM32F746G-Discovery Board zur Hand. Dementsprechend wird die Beschreibung für dieses Board sein, aber! Weil Der Code wird in der CubeMX-Umgebung generiert. Es ist möglich, ein anderes EVM zu verwenden. Ich halte die von mir für dieses Projekt beantragte Zahlung für übermäßig.
Software-Teil
Diese Wärmebildkamera implementiert keine Klasse bei der Kommunikation über USB. Alle Interaktionen werden direkt ausgeführt, Massenanforderungen über Endpunkte. Durch Senden von Befehlen (Anforderungen) an den Steuerendpunkt können Sie die Wärmebildkamera einschalten, kalibrieren und einen Frame oder mehrere Frames übertragen lassen. In diesem
Forum wird eine besonders detaillierte Arbeit mit Seek Thermal beschrieben.
Damit die Wärmebildkamera mit dem STM32-Mikrocontroller funktioniert, benötigen wir:
1) Nehmen Sie ein USB-Host-Beispiel für Ihr Lieblingsboard (ich habe das STM32-USB-Host-CDC-Beispiel aus der STM32F7-CubeMX-Beispielsammlung genommen).
2) Verwerfen Sie die Initialisierungsprozedur der Geräteklasse.
3) Schreiben Sie praktische Wrapper für die Arbeit mit den Funktionen Lesen / Schreiben, um Endpunkte und Datenendpunkte zu steuern.
4) Schreiben Sie Ihre Funktion, um Rohdaten in etwas Konvertiertes umzuwandeln.
5) Verwenden Sie LUT (Color Look Up Table), um ein monochromes Bild in Farbe einzufärben. Dieser Fehler trat in der STM32-Familie von Mikrocontrollern auf, die unabhängig mit LCD-Bildschirmen gesteuert werden können.
Lassen Sie uns zunächst etwas Ähnliches wie ein Stück aus libusb tun, um die HAL-Bibliothek mit dem folgenden Code zu verknüpfen:
Prozedurcode von libusbint libusb_control_transfer(libusb_device_handle* dev_handle, uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char* data, uint16_t wLength, unsigned int timeout) { hUSBHost.Control.setup.b.bmRequestType = request_type; hUSBHost.Control.setup.b.bRequest = bRequest; hUSBHost.Control.setup.b.wValue.w = wValue; hUSBHost.Control.setup.b.wIndex.w = wIndex; hUSBHost.Control.setup.b.wLength.w = wLength; int status; do { status = USBH_CtlReq(&hUSBHost, data, wLength); } while (status == USBH_BUSY); if (status != USBH_OK) { hUSBHost.RequestState = CMD_SEND; return 0; } else { return wLength; } }
Dann gehen wir
hierher und
schauen uns
die vendor_transfer- Prozedur an. Es tut auch nicht weh, auf die Liste der Anfragen zu achten.
Prozedurcode von vendor_transfer int vendor_transfer(bool direction, uint8_t req, uint16_t value, uint16_t index, uint8_t * data, uint8_t size, int timeout) { int res; uint8_t bmRequestType = (direction ? LIBUSB_ENDPOINT_IN : LIBUSB_ENDPOINT_OUT) | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_INTERFACE; uint8_t bRequest = req; uint16_t wValue = value; uint16_t wIndex = index; uint8_t * aData = data; uint16_t wLength = size; if (!direction) {
Als nächstes schreiben wir die Prozedur zum Empfangen des Bildes. Im CDC-Beispiel gibt es nichts Besonderes zu kommentieren.
USB-Datenempfangsverfahren int CAM_ProcessReception(USBH_HandleTypeDef *phost) { USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; uint16_t length = 0; uint8_t data_rx_state = CDC_RECEIVE_DATA; size = FRAME_WIDTH * FRAME_HEIGHT; int bufsize = size * sizeof(uint16_t); int bsize = 0; while (data_rx_state != CDC_IDLE) { switch(data_rx_state) { case CDC_RECEIVE_DATA: USBH_BulkReceiveData (phost, &rawdata[bsize], 512, InPipe); data_rx_state = CDC_RECEIVE_DATA_WAIT; break; case CDC_RECEIVE_DATA_WAIT: URB_Status = USBH_LL_GetURBState(phost, InPipe); if(URB_Status == USBH_URB_DONE ) { length = USBH_LL_GetLastXferSize(phost, InPipe); bsize+= length; if(((bufsize - length) > 0) && (bsize < bufsize))
Außerdem müssen wir die empfangenen Daten irgendwie auf den Bildschirm zeichnen. Ich stelle fest, dass im 20. Datenbyte, bei dem es sich um ein 16-Bit-Array von Pixeln handelt, Informationen über den Rahmentyp gespeichert werden. Es gibt verschiedene Arten von Frames. Wir interessieren uns für einen Kalibrierrahmen und einen Arbeitsrahmen. Ein Kalibrierungsrahmen wird erhalten, wenn die Wärmebildkamera den Vorhang schließt und ein Bild der „Dunkelheit“ macht. Wenn Sie ein normales Bild aufnehmen, ist der Verschluss geöffnet. So hören Sie beim Arbeiten immer, wie das Gerät auf den Auslöser klickt.
Bildschirmzeichnungsverfahren void BSP_LCD_DrawArray(uint32_t Xpos, uint32_t Ypos, uint32_t width, uint32_t height, uint8_t bit_pixel, uint8_t *pbmp) { uint32_t index = 0; uint32_t index2 = 0;
Schließlich der Hauptzyklus, aus dem ersichtlich ist - wo was geschnitten wurde, wo etwas eingefügt wurde.
Hauptzyklus #define DELAY1 10 #define USB_PIPE_NUMBER 0x81 #define FRAME_WIDTH 208 #define FRAME_HEIGHT 156 uint8_t OutPipe, InPipe; uint8_t usb_device_state; uint8_t rawdata[FRAME_HEIGHT*FRAME_WIDTH*2]; uint8_t data[64]; USBH_StatusTypeDef status; uint8_t transf_size; int size; int main(void) { CPU_CACHE_Enable(); HAL_Init(); SystemClock_Config(); CDC_InitApplication(); USBH_Init(&hUSBHost, USBH_UserProcess, 0);
Fazit
Die Bedienung der
Wärmebildkamera mit einem Mikrocontroller sieht viel schneller aus als mit einem Smartphone. Ich empfehle dieses Dadget, um das Wärmebild elektronischer Geräte zu beurteilen. Die Wärmebildkamera hat eine einstellbare Brennweite, mit der Sie sogar einzelne elektronische Komponenten auf der Platine berücksichtigen können! Abschließend ein Video, anhand dessen Sie die Geschwindigkeit der Wärmebildkamera bewerten können (etwa 8-9 fps).
Informationen für potenzielle Käufer