Conecte o termovisor ao microcontrolador? Não tem problema! Especialmente se for um STM32 com interface USB Host e um termovisor térmico Seek da Dadget!
Ferro de solda através dos olhos de um termovisor SeekThermal1. Introdução
Acho que todo mundo já se deparou com aparelhos como um termovisor, bem, pelo menos leu sobre eles. Entre esses dispositivos, há toda uma subclasse de gadgets que não são independentes, mas servem como uma espécie de decodificador para um computador ou smartphone.
Hoje falaremos sobre como conectar o termovisor
Seek Thermal ao microcontrolador STM32. E a empresa Dadget me forneceu este dispositivo. Nas extensões do Geektimes, esse termovisor foi considerado mais de uma vez: cobriu principalmente seu trabalho com o Android, além de um artigo sobre como conectar esse dispositivo a um PC. Na minha análise, quero falar sobre minha própria experiência ao conectar um termovisor Seek Thermal ao microcontrolador STM32 por meio de um host USB.
Requisitos de hardware
Não é tão específico! Tudo o que o seu STM32 deve ter é uma interface USB capaz de funcionar no modo Host e alguma interface para controlar a tela LCD. A escolha mais óbvia é usar o STM32F4 - Discovery. Eu tinha a placa STM32F746G-Discovery em mãos. Por conseguinte, a descrição será para este fórum, mas! Porque Como o código é gerado no ambiente CubeMX, é possível usar outro EVM. Considero o pagamento aplicado por mim excessivo para este projeto.
Parte do software
Este termovisor não implementa nenhuma classe ao se comunicar via USB. Toda a interação é realizada diretamente, solicitações em massa através de terminais. Ao enviar comandos (solicitações) para o terminal de controle, você pode ativar o termovisor, calibrá-lo e transmiti-lo a um quadro ou a vários quadros. Um trabalho especialmente detalhado com o Seek Thermal é descrito neste
fórum .
Assim, para o termovisor trabalhar com o microcontrolador STM32, precisamos:
1) Tome qualquer exemplo de host USB para sua placa favorita (peguei o exemplo CDC do host USB STM32 da coleção de amostras STM32F7 CubeMX);
2) Jogue fora o procedimento de inicialização da classe de dispositivo;
3) Escreva invólucros convenientes para trabalhar com as funções de leitura / gravação para controlar terminais e dados;
4) Escreva sua função para converter dados brutos em algo exibido;
5) Use LUT (Tabela de consulta de cores) para colorir uma imagem monocromática em cores. Esse problema apareceu na família de microcontroladores STM32, que pode ser controlada independentemente com telas de LCD.
Para começar, vamos fazer algo semelhante a uma peça do libusb, que nos ajudará a vincular a Biblioteca HAL ao seguinte código:
Código de procedimento do 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; } }
Então vamos
aqui e
olhamos o procedimento
vendor_transfer . Além disso, não é demais prestar atenção à lista de solicitações
struct Request .
código do procedimento 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) {
Em seguida, escrevemos o procedimento para receber a foto. Não há nada de especial para comentar, espionado no Exemplo do CDC.
Procedimento de recepção de dados 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))
Além disso, precisamos desenhar de alguma forma os dados recebidos na tela. Observo que no 20º byte de dados, que é uma matriz de 16 bits de pixels, são armazenadas informações sobre o tipo de quadro. Existem vários tipos de quadros. Estamos interessados em um quadro de calibração e um quadro de trabalho. Uma moldura de calibração é obtida quando o termovisor fecha a cortina e tira uma foto da “escuridão”. Ao fotografar um quadro normal, o obturador está aberto. Assim, ao trabalhar, você sempre ouve o dispositivo clicar no obturador.
Procedimento de desenho da tela 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, o ciclo principal, a partir do qual ele pode ser visto - onde o que foi cortado, onde algo foi inserido.
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);
Conclusão
A operação do
termovisor com um microcontrolador parece muito mais rápida do que com um smartphone. Eu recomendo este projeto para avaliar a imagem térmica dos dispositivos eletrônicos. O termovisor possui uma distância focal ajustável, o que permite considerar componentes eletrônicos individuais na placa! Em conclusão, um vídeo a partir do qual você pode avaliar a velocidade do termovisor (algo em torno de 8 a 9 fps)
Informações para potenciais compradores