¿Conectar la cámara termográfica al microcontrolador? No hay problema! ¡Especialmente si es un STM32 con interfaz USB Host y una cámara termográfica Seek Thermal de Dadget!
Soldador a través de los ojos de una cámara termográfica SeekThermalIntroduccion
Creo que todos se han encontrado con dispositivos como una cámara termográfica, bueno, al menos han leído sobre ellos. Y entre estos dispositivos, hay una subclase completa de dispositivos que no son dispositivos independientes, sino que sirven como una especie de decodificador para una computadora o teléfono inteligente.
Hoy hablaremos sobre la conexión de la cámara
termográfica Seek Thermal al microcontrolador STM32. Y la compañía Dadget me proporcionó este dispositivo. En las extensiones de Geektimes, esta cámara termográfica se consideró más de una vez: cubrió principalmente su trabajo con Android, así como un artículo sobre cómo conectar este dispositivo a una PC. En mi revisión, quiero hablar sobre mi propia experiencia al conectar una cámara termográfica Seek Thermal al microcontrolador STM32 a través de un host USB.
Requisitos de hardware
¡No tan específico! Todo lo que debe tener su STM32 es una interfaz USB capaz de funcionar en modo Host y alguna interfaz para controlar la pantalla LCD. La opción más obvia es tomar el STM32F4 - Discovery. Tenía a mano la placa STM32F746G-Discovery. En consecuencia, la descripción será para este tablero, pero! Porque el código se genera en el entorno CubeMX, es posible usar otro EVM. Considero que el pago aplicado por mí es excesivo para este proyecto.
Parte de software
Esta cámara termográfica no implementa ninguna clase cuando se comunica a través de USB. Toda la interacción se lleva a cabo directamente, solicitudes masivas a través de puntos finales. Al enviar comandos (solicitudes) al punto final de control, puede encender la cámara termográfica, calibrarla y hacer que transmita un cuadro o varios cuadros. En este
foro se describe un trabajo especialmente detallado con Seek Thermal.
Por lo tanto, para que la cámara termográfica funcione con el microcontrolador STM32, necesitamos:
1) Tome cualquier ejemplo de host USB para su placa favorita (tomé el ejemplo CDM de host USB STM32 de la colección de muestras CubeMX de STM32F7);
2) Desechar el procedimiento de inicialización de la clase de dispositivo;
3) Escribir envoltorios convenientes para trabajar con las funciones de lectura / escritura para controlar puntos finales y puntos finales de datos;
4) Escriba su función para convertir datos sin procesar en algo que se muestra;
5) Use LUT (tabla de búsqueda de color) para colorear una imagen monocroma en color. Este ajuste apareció en la familia de microcontroladores STM32, que se pueden controlar de forma independiente con pantallas LCD.
Para comenzar, hagamos algo similar a una pieza de libusb, que nos ayudará a vincular la Biblioteca HAL con el siguiente código:
Código de procedimiento 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; } }
Luego vamos
aquí y
miramos el procedimiento
vendor_transfer . Además, no está de más prestar atención a la lista de solicitudes.
código de procedimiento de transferencia de proveedor 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) {
A continuación, escribimos el procedimiento para recibir la imagen. No hay nada especial que comentar, espiado en el ejemplo de los CDC.
Procedimiento de recepción de datos 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))
Además, necesitamos dibujar de alguna manera los datos recibidos en la pantalla. Observo que en el vigésimo byte de datos, que es una matriz de píxeles de 16 bits, se almacena información sobre el tipo de marco. Hay varios tipos de marcos. Estamos interesados en un marco de calibración y un marco de trabajo. Se obtiene un marco de calibración cuando la cámara termográfica cierra la cortina y toma una fotografía de la "oscuridad". Cuando se dispara un cuadro normal, el obturador está abierto. Por lo tanto, cuando trabaja, siempre escucha que el dispositivo hace clic en el obturador.
Procedimiento de dibujo de pantalla 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;
Finalmente, el ciclo principal, desde el cual se puede ver: dónde se cortó, dónde se insertó algo.
Ciclo 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);
Conclusión
El funcionamiento de la
cámara termográfica con un microcontrolador se ve mucho más rápido que con un teléfono inteligente. Recomiendo este dispositivo para evaluar la imagen térmica de los dispositivos electrónicos. ¡La cámara termográfica tiene una distancia focal ajustable, que le permite incluso considerar componentes electrónicos individuales en el tablero! En conclusión, un video desde el que puede evaluar la velocidad de la cámara termográfica (en algún lugar alrededor de 8-9 fps)
Información para compradores potenciales.