ÍNDICE DE CONTEÚDO
Introdução
– O que é a solução Smart HMI da NXP?
A Smart HMI é uma solução de HMI que suporta múltiplas interfaces como display com touch, cameras RGB e IR, microfones, speakers, switches e LEDs. Quando o assunto é Edge Computing, a solução oferece reconhecimento de fala e voz suportando Far-field, reconhecimento facial com liveness detection, ou seja, a prova de ataques 2D: ataque o qual o atacante usa uma foto de pessoa autorizada para enganar o sistema e reconhecimento de gestos. Além disso, acrescentando uma camera 3D, é possível também adicionar proteção contra ataque 3D: ataque o qual o atacante usa uma superfície tridimensional como uma máscara. Por exemplo, este EVKB já suporta essa camera e esse recurso: NXP EdgeReady MCU-Based Solution for 3D Face Recognition | NXP Semiconductors.
Por solução, podemos entender um conjunto de componentes de software, ferramentas, hardware e documentação que viabilizam o desenvolvimento de maneira agil, oferecendo todo o suporte necessário para que o desenvolvedor possa focar na lógica da resolução do problema do seu cliente e abstraia o desenvolvimento e treinamento de modelos de inteligência artificial.
Falando sobre estes componentes, no lado do hardware, a solução conta com o MCU crossover i.MX RT117H, um MCU multicore com Cortex-M7 (1 GHz) e Cortex-M4 (400 MHz) e com 2 MB de SRAM. Este MCU foi especialmente desenvolvindo visando aplicações multimídia, pois possui internamente múltiplos periféricos para interfaces de mídia como:
- PDM, MQS, SAI e SPDIF para interfaceamento com microfones e auto-falantes.
- CSI e MIPI CSI-2 para interfaceamento com camera.
- eLCDIF, LCDIFv2 e MIPI DSI para interfaceamento com displays.
- PXP e GPU2D para aceleração de operações gráficas.
Esse suporte multimídia dispensa a necessidade de circuitos externos como codecs para interfacear dispositivos e consequentemente reduz o custo total da BOM do produto final.
A placa de desenvolvimento conta com múltiplos dispositivos e conectores, entre eles, em destaque estão:
- Memória: 64 MB de flash externa e 32MB de SDRAM externa.
- Câmeras: RGB para exibir preview no display e IR para reconhecimento facial 2D.
- Display: 5.5 inch TFT LCD display (Rocktech RK055AHD091) com resolução de 720×1280.
- Audio: 2 microfones MEMS, 1 mini auto-falante com diodo amplificador de audio.
- Sensor PIR.
- Módulo Wi-Fi IW416 NXP: WIFI 4+ BLE 5.2
Imagem: Diagrama de blocos das placa de desenvolvimento Smart HMI.
Imagem: Vista superior frontal e posterior da placa.
Do lado do software a solução conta com os seguintes componentes para cada segmento:
- Câmera:
- Oasis Lite runtime library: Uma biblioteca estática de Machine Learning, enxuta e otimizada que oferece detecção e reconhecimento facial 2D e 3D.
- Uvita library: Outra biblioteca estática para reconhecimento de gestos.
- GUI:
- GUI Guider: Uma aplicação desktop que permite o design manual de telas e de widgets e geração do código equivalente usando a biblioteca Open Source LVGL. Também permite a implementação de lógica em código associado a um evento, como por exemplo: executar uma rotina quando o botão da tela é pressionado. É considerada uma ferramenta low code para aceleração de design gráfico.
- Áudio:
- Voice Seeker AFE (Audio Front End): O AFE é o processamento de áudio da NXP que suporta por exemplo: múltiplos microfones, beamforming, AEC (Acoustic Echo Cancellation ou cancelamento de eco) e supressão de ruído.
- VIT (Voice Intelligent Technology) Engine : O VIT é uma engine de reconhecimento de wake word e de comandos que roda localmente no MCU sem necessidade de conectividade. Além da engine, a NXP oferece uma página no site para configurar e criar um modelo com suas próprias wake words e comandos, sem necessidade de nenhuma expertise em AI. O VIT tem suporte a cerca de 9 idiomas e o português está no roadmap da solução. A solução é totalmente gratuita e livre de custos recorrentes e de licença.
Entretanto, para usar o VIT deve-se adquirir o part number RT1060V.
- Suporte ao Cyberon DSMT: Com o mesmo objetivo do VIT, o DSMT é uma solução third party que a NXP suporta no part number RT1060C. Conta com suporte de mais de 40 idiomas, com diferenciação de sotaque (por exemplo, português do Brasil e de Portugal), com diferentes nível de otimização para o modelo e permite que o desenvolver ajuste o comando para calibrar o reconhecimento dos comandos e chegar a uma performance desejável. O DSMT é uma aplicação gráfica desktop suportada no Windows.
- Framework, APIs e OOBE (Out of the Box Eperience): junto com as demos open source, o desenvolvedor também tem acesso as APIs que permitem capturar os eventos da IA e estabelecer sua própria lógica.
O Framework foi projetado como uma camada de software para abstrair o gerenciamento dos dispositivos de tal maneira que o desenvolvedor apenas inicializa o dispositivo e implementa alguns hooks relacionados a eventos. O Framework também tem como objetivo prover um mecanismo de mensagem entre os dispositivos, por exemplo: entre o streaming da câmera e o display. Porém, como toda camada de abstração e componente facilitador, requer uma certa curva de aprendizagem para compreender o mecanismo de mensagem e os hooks para finalmente customizar a solução. Como a solução oferece muitas funcionalidades, também requer um certo tempo para se sentir familiar com todas os recursos.
- Toolkit: a solução pode ser customizada utilizando o MCUXpresso IDE da NXP, uma IDE baseada no Eclipse suportando edição de código, depuração e muito mais.
Do lado da documentação a solução oferece os manuais de usuários, os arquivos de desing, esquemáticos e outros, os quais clientes podem usar como referência para seus projetos e suporte no site.
Hands On
Nesse tutorial será ensinado como preparar o seu ambiente para compilar e fazer o upload do projeto para a placa Smart HMI. Também será mostrado como atualizar a placa com a demo mais recente.
Required Materials
Hardware Requirements
- Smart HMI EVKB: NXP EdgeReady Smart HMI Solution Based on i.MX RT117H with ML Vision, Voice and Graphical UI | NXP Semiconductors
- USB C cable
Software Requirements
- MCUXpresso IDE v 11.7.0
- SDK: MIMXRT1170 EVK SDK v2.13.x
- Windows OS (Foi usado o Windows 10 para este tutorial)
- OBS: Tanto o MCUXpresso quanto o SDK são suportados no Linux também. Porém, neste tutorial será usado a função MSD (Mass Storage Device), que atualmente só é suportada no Windows. Entretanto, ao longo do tutorial será mostrado como escolher versões diferentes de SO.
Instalação das ferramentas
Observação:
Para realizar alguns downloads do site da NXP é necessário ter uma conta. Quando o site requisitar login, registre-se para criar sua conta e continue o laboratório.
MCUXpresso IDE
MCUXpresso é a IDE da NXP para a edição de código, compilação, depuração e outras features comuns em IDEs baseadas no Eclipse.
Para realizar a instalação:
- Acesse MCUXpresso IDE for NXP MCUs | Linux, Windows and MacOS | NXP Semiconductors | NXP Semiconductors e clique em downloads.
- Selecione a versao 11.7.0
- Concorde com os termos e selecione o instalador para o seu Sistema Operacional.
- Execute o download para instalar a IDE.
Gerando o SDK MIMXRT1170 EVK v2.13.1
Cada MCU tem seu próprio SDK que inclui driver, exemplos, midleware, docs e outros componentes. Para compilar a demo para o iMX. RT1170 nessa placa, iremos instalar o SDK MIMXRT1170 EVK v2.13.1.
- Acesse Welcome | MCUXpresso SDK Builder (nxp.com). Essa página é uma nova página para gerar SDKs de acordo com suas preferências. Clique em Select Development Board.
- Digite na busca RT 1170 e certifique-se de selecionar RT1170 EVK:
- Do lado direito, selecione a versao 2.13.1 e clique em Build MCUXpresso SDK para gerar o seu SDK:
- Nessa próxima página você pode customizar o seu SDK, incluindo o suporte a diferentes RTOSes e middlewares. Também é nessa fase que deve selecionar o Sistema Operacional da sua máquina e a toolchain ou IDE a ser utilizada. Para esse tutorial, clique em Select All para baixar um SDK completo.
- Role para baixo e clique em Download SDK
- Clique novamente em Download SDK, selecione o download archive para baixar o SDK em formato .zip conforme as próximas imagens e aceite os termos. Seu download deve iniciar então.
Instalando o SDK na IDE
- Para instalar o SDK na IDE é muito simples! Abra o MCUXpresso IDE e feche a janela de Boas Vindas. Selecione o arquivo .zip e arraste para a janenela de SDKs instalados. Uma janela de confirmação te pedirá para confirmar, clique em OK:
Atualizando a placa com a versão mais recente da OOBE (Out of the Box Experience)
Nessa etapa aprenderemos como atualizar a placa com uma nova demo da OOBE. Todas as demos da OOBE estão neste repositório público do GitHub: GitHub – NXP/mcu-smhmi
No branch master tem-se o bootloader, a demo da coffe machine e do elevador. E no branch v1.2.0_SmartHMI, a demo do Smart Home Panel. Certamente sua nova placa virá com as demos da coffe machine e do elevador. Portanto, neste tutorial será mostrado como fazer o build da demo do Smart Home Panel e gravá-la via MSD.
O bootloader é responsável por chamar a aplicação principal, realizar verificação de imagem, oferecer a função de MSD (Mass Storage Device), que permite a atualização da aplicação principal via drag and drop usando o cabo USB e a função de atualização de firmware via OTA. OBS: somente é possível gravar a demo do Smart Panel sem usar o J-Link debug probe, porque a placa vem com o bootloader gravado, viabilizando a função de MSD.
A demo da coffe machine: é uma demo de uma máquina de café inteligente que grava as preferências da bebida de acordo com o usuário e carrega automaticamente as preferências na próxima vez que o usuário é identificado na câmera. Nela é possível explorar as funcionalidades de reconhecimento facial, GUI e comandos de voz.
A demo do Elevador: é uma demo de um painel de elevador que permite o usuário selecionar o andar via comando de voz.
A demo do Smart Panel é uma demo de um painel central residencial que tem outras 3 sub-demos: Thermostat, Security e Audio Player.
O Thermostat é um painel de controle do ambiente que suporta comandos de voz para regular a temperatura, controlar o ventilador, definir modo de aquecimento ou de resfriamento e outros. Também utiliza o recurso de reconhecimento facial para definir as condições do ambiente quando um usuário previamente registrado for reconhecido.
O Security é um painel para controle de acesso de portas de uma residência e utiliza o reconhecimento facial para validar a autenticação do morador previamente registrado.
O Audio Player é uma demo para tocar músicas e permite explorar as funcionalidades de áudio como o autofalante e o reconhecimento de gestos. Observe que cada botão tem um gesto desenhado que pode ser usado para controlar o audio player. Á direita, também é possível visualizar o preview do gesto reconhecido pela mão do usuário.
Para todas as demos, toque o botão para verificar a lista de comandos de voz disponíveis para a demo. Mais detalhes sobre a demo pode ser encontrada no User Guide.
Neste tutorial, vamos explorar o Smart Home Panel, pois é a aplicação com todos os recursos presentes como reconhecimento facial, gestos, GUI e áudio, e a que possivelmente não veio gravada na sua placa.
- Faça o download do branch na versão v1.2.0_SmartHMI.
- Extraia o .zip.
- Abra a IDE e importe o projeto home_panel seguindo as instruções das imagens abaixo e clique em Finish no final.
- Seu Project Explorer então deve parecer como o da imagem abaixo:
- Dentro do projeto Smart Home Panel há 3 sub projetos: o projeto do código associado a GUI, o projeto que será executado pelo core CM4 e o projeto que será executado pelo core CM7. Todos esses projetos são linkados e o projeto principal é o CM7. Durante a compilação do CM7, o projeto do CM4 também é compilado. O projeto da GUI que inclui a biblioteca LVGL foi isolado pois consome muito tempo de compilação, logo ele deve ser compilado separadamente apenas quando a GUI for modificada e não deve ser recompilado todas as vezes que o projeto do CM7 for compilado. Nota: A IDE reconhecerá quando o projeto da GUI for modificado e fará o link da nova biblioteca com a projeto do CM7.
- Como essa é a primeira vez da compilação, selecione o projeto da GUI (lvgl_vglite_lib_home_panel) e clique em Build para gerar a biblioteca estática resultante desse projeto.
- Após a compilação da biblioteca, selecione o projeto master, ou seja, do CM7 e repita o processo de build, que pode levar alguns minutos.
- Após a compilaçao, acesse o projeto do CM7, acesse o diretório Debug o qual se encontra os artefatos da compilação e gere um binário a partir do arquivo .axf conforme ilustra a imagem a seguir:
- Um novo binário deve ser visto no mesmo diretório:
- Antes de prosseguirmos para a gravação do binário recém gerado, vamos abordar alguns temas relacionados ao layout da memória.
Para a experiência da OOBE, a flash foi dividida em 4 principais regiões: 1 dedicada ao bootloader e outros 3 bancos de memória, chamados Banco A, Banco B e Banco C para hospedar as 3 aplicações: máquina de café, elevador e Smart Panel, respectivamente. Dentro de cada banco, há ainda uma região dedicada a aplicação e outra dedicada aos recursos que são estruturados em um sistema de arquivo. Os recursos incluem por exemplo imagens, ícones e áudios, que apenas precisam serem atualizados quando o desenvolvedor quer modificar as imagens ou os sons por exemplo.
Os endereços bases para cada uma dessas regiões são mostrados na imagem a seguir.
Para selecionar um banco para ser executado, deve-se usar os botões da placa ao ligar a placa (plugando o cabo USB) ou usando o botão de reset.
- Quando a placa é inicializada com SW0 pressionado, a placa entra no modo de MSD, permitindo a operação de atualização da aplicação e também dos recursos via drag and drop.
- Quando a placa é inicializada com SW1 pressionado, a placa executa a aplicação que está no Banco A.
- Quando a placa é inicializada com SW2 pressionado, a placa executa a aplicação que está no Banco B.
- Quando a placa é inicializada com SW3 pressionado, a placa executa a aplicação que está no Banco C.
O bootloader utiliza o banco A e B para oferecer um mecanismo de redundância durante a atualização de firmware.
Digamos que há uma imagem no banco A que está funcional e o banco A, é o banco ativo. Por banco ativo, entende-se o banco para o qual o bootloader estava apontando durante a inicalização.
Quando uma nova imagem (binário do código) for gravada usando MSD, esta será gravada no novo banco inativo, ou seja, no banco B nesse cenário. E a imagem do banco ativo, bem como os seus recursos são mantidos. Caso tenha algum problema na imagem do novo banco, o usuário ainda possui uma imagem confiável no banco anterior. O processo é ilustrado na imagem a seguir, sendo o Banco A o ativo e o banco B, o inativo.
O mesmo se aplica a gravação dos recursos. Quando um novo binário contendo os recursos é gravado, ele é gravado no banco inativo e o bootloader copia a aplicação do banco ativo para o banco inativo e em seguida torna este o banco ativo.
- Após essa overview relacionada a memória e ao mecanismo de ping pong do bootloader quando usado o MSD, podemos seguir em frente para gravar tanto o binário da aplicação, quanto o binário dos recursos. Ligue a placa pressionado o SW1 para tornar o banco A ativo, você deve estar visualizando a aplicação da máquina de café.
- Em seguida, desligue e ligue a placa mantendo o SW0 pressionado para entrar no modo MSD. O display deve ficar assim:
- Uma nova unidade de disco USB Drive (D:) será montada no seu computador, arraste o binário gerado nos passos anteriores para a unidade. Aguarde até o bootloader gravar a aplicação no novo banco. Ao final a placa será reinicilializada automaticamente a partir do novo banco ativo, neste caso, o banco B. Você certamente notará que a imagem do display está estranha com imagens se sobrepondo e sem ícones. Isso acontece porque o novo banco não contém os recursos da aplicação do Smart Home Panel.
- Deslique e ligue a placa novamente no modo MSD (pressionando o SW0). Arraste e solte o arquivo de recursos do Smart Home Panel localizado no projeto no diretório resource. Observação: para que o bootloader diferencie a aplicação dos recursos e saiba aonde colocar na memória, é necessário renomear os recursos para res.bin.
- Aguarde novamente e a placa deve reinicilizar a partir do banco A com a nova demo do Smart Panel:
- Parabéns, você agora pode testar a nova demo. Aqui valem algumas considerações:
- O mecanismo de MSD é um recurso para desenvolvimennto e não permite a depuração e requer que o bootloader esteja gravado. Para depurar o código ou gravar o bootloader utilize o JTAG.
- Para gravar tanto código quanto recursos em posições específicas e desejadas da memória, o JTAG deve ser usado. Você pode usar a ferramenta da Segger como J-Flash ou a GUI Flash Tool de dentro do MCUXpresso IDE.
- No projeto do GitHub, na aba de releases já estão disponibilizados os binários de todas as demos e do bootloader para conveniência caso necessário. Arquivos binários com o nome bundle incluem aplicação e recursos e podem ser usados via MSD desde que sejam renomeados como bundle.bin. Neste caso o bootloader irá reconhecer que o arquivo contém os dois artefatos e posicionar na memória adequadamente.
- O projeto também oferece scripts para geração de recursos, por exemplo, quando o usuário quiser costomizar ou criar seu próprio projeto do zero com seus arquivos de mídia. Também oferece scripts para geração de bundle e muito mais. Todos os detalhes podem ser encontrados na documentação.
Conclusão
Nesse artigo voce aprendeu:
- O que é a solução de Smart HMI e suas principais características.
- Como instalar as ferramentas para usar a solucao da Smart HMI.
- Como acessar o código da Demo e gravar a demo do Smart Home Panel somente com o cabo USB via MSD.
- O mecanismo de atualização de firmware que o bootloader usa MSD e o layout de memória.
- Como testar e avaliar a OOBE.