Connecter l'imageur thermique au microcontrôleur? Pas de problème! Surtout s'il s'agit d'un STM32 avec hôte USB et d'un imageur thermique Seek Thermal de Dadget!
Fer à souder à travers les yeux d'un imageur thermique SeekThermalPrésentation
Je pense que tout le monde a rencontré des gadgets comme un imageur thermique, enfin, au moins lisez-les. Et parmi ces appareils, il y a toute une sous-classe de gadgets qui ne sont pas un appareil indépendant, mais qui servent de décodeur pour un ordinateur ou un smartphone.
Aujourd'hui, nous allons parler de la connexion de l'imageur thermique
Seek Thermal au microcontrôleur STM32. Et la société Dadget m'a fourni cet appareil. Sur Geektimes étendues, cet imageur thermique a été envisagé plus d'une fois: il couvrait principalement son travail avec Android, ainsi qu'un article sur la connexion de cet appareil à un PC. Dans ma revue, je veux parler de ma propre expérience de connexion d'un imageur thermique Seek Thermal au microcontrôleur STM32 via un hôte USB.
Configuration matérielle requise
Pas si spécifique! Tout ce que votre STM32 devrait avoir, c'est une interface USB capable de fonctionner en mode hôte et une interface pour contrôler l'écran LCD. Le choix le plus évident est de prendre le STM32F4 - Discovery. J'avais la carte STM32F746G-Discovery sous la main. En conséquence, la description sera pour cette carte, mais! Parce que le code est généré dans l'environnement CubeMX, il est possible d'utiliser un autre EVM. Je considère que le paiement que j'ai appliqué est excessif pour ce projet.
Partie logiciel
Cet imageur thermique n'implémente aucune classe lors de la communication via USB. Toutes les interactions sont effectuées directement, des demandes groupées via des points de terminaison. En envoyant des commandes (demandes) au point de terminaison de contrôle, vous pouvez allumer l'imageur thermique, l'étalonner et lui faire transmettre une trame ou plusieurs trames. Un travail particulièrement détaillé avec Seek Thermal est décrit dans ce
forum .
Ainsi, pour que l'imageur thermique fonctionne avec le microcontrôleur STM32, nous avons besoin de:
1) Prenez n'importe quel exemple d'hôte USB pour votre carte préférée (j'ai pris l'exemple CDC de l'hôte USB STM32 de la collection d'échantillons CubeMX STM32F7);
2) Jetez la procédure d'initialisation de la classe d'unité;
3) écrire des emballages pratiques pour travailler avec les fonctions de lecture / écriture pour contrôler les points d'extrémité et les points d'extrémité de données;
4) Écrivez votre fonction pour convertir des données brutes en quelque chose affiché;
5) Utilisez LUT (Color Look Up Table) pour coloriser une image monochrome en couleur. Ce fitch est apparu dans la famille de microcontrôleurs STM32, qui peuvent être contrôlés indépendamment avec des écrans LCD.
Pour commencer, faisons quelque chose de similaire à un morceau de libusb, qui nous aidera à lier la bibliothèque HAL avec le code suivant:
Code de procédure de 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; } }
Ensuite, nous allons
ici et
regardons la procédure
vendor_transfer . De plus, cela ne fait pas de mal de faire attention à la liste des demandes.
code de procédure vendeur_transfert 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) {
Ensuite, nous écrivons la procédure de réception de l'image. Il n'y a rien de spécial à commenter, espionné dans l'exemple CDC.
Procédure de réception des données USB 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))
De plus, nous devons en quelque sorte dessiner les données reçues sur l'écran. Je note que dans le 20e octet de données, qui est un tableau de pixels de 16 bits, les informations sur le type de trame sont stockées. Il existe plusieurs types de cadres. Nous sommes intéressés par un cadre d'étalonnage et un cadre de travail. Un cadre d'étalonnage est obtenu lorsque l'imageur thermique ferme le rideau et prend une photo de «l'obscurité». Lors de la prise de vue d'une image normale, l'obturateur est ouvert. Ainsi, lorsque vous travaillez, vous entendez toujours l'appareil clique sur l'obturateur.
Procédure de dessin d'écran 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;
Enfin, le cycle principal, à partir duquel on peut le voir - où ce qui a été coupé, où quelque chose a été inséré.
Cycle principal #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);
Conclusion
Le fonctionnement de l'
imageur thermique avec un microcontrôleur semble beaucoup plus rapide qu'avec un smartphone. Je recommande ce dadget pour évaluer l'image thermique des appareils électroniques. L'imageur thermique a une distance focale réglable, ce qui vous permet même de considérer des composants électroniques individuels sur la carte! En conclusion, une vidéo à partir de laquelle vous pouvez évaluer la vitesse de l'imageur thermique (environ 8 à 9 ips)
Informations pour les acheteurs potentiels