ESP32

Leitor de QR Code com ESP32 (ESP32-CAM)

Aproveitando-me da necessidade de um membro do grupo ESP8266 e ESP32, resolvi escrever um artigo sobre leitor de QR Code com ESP32 (ESP32-CAM), por considerar (em minha opinião pessoal) algo útil. Talvez possa citar “divertido” também.

Onde comprar

O pioneiro do ESP32-CAM no Brasil foi nosso querido parceiro MASUGUX. Sugiro não só a compra, mas a compra rápida. Na primeira leva, escrevi um artigo no domingo pela manhã e antes do fim da tarde já havia esgotado. Na segunda leva, dos 80 que chegaram, 40 já estavam reservados e dos 40 que sobraram só tem mais 18 (no momento em que iniciei a escrita desse artigo).

Vale a pena comprar?

Se você quiser, pode fazer com uma câmera externa, desde que seja dos modelos suportados. Adquirir um ESP32 e uma câmera à parte sai mais caro que comprar o ESP32-CAM. Além disso, será necessário fazer wiring e torcer para que não tenha mal contato. Depois, ficará um trambolho em cima da mesa, nada elegante.

O ESP32-CAM é compacto e vem com a câmera OV2640, que suporta compressão jpg. Já escrevi alguns artigos sobre ela, por exemplo, a de detecção e reconhecimento facial. Um espetáculo!

Como fazer um leitor de QR Code com ESP32 (ESP32-CAM)

Nada de IDE do Arduino. Será necessário ter o ESP-IDF no computador, devidamente configurado. Para preparar o ambiente de desenvolvimento, devemos seguir 3 passos.

Configurar a toolchain

Se você usa Windows, siga as instruções desse link (em inglês). Para Linux, descrevo o processo em seguida.

Instale as dependências

Previamente, será necessário garantir as dependências para só então iniciar o processo de configuração. Nas distribuições Linux baseadas em Debian (por ex., Ubuntu), faça:

Baixe a ajuste a toolchain para o path do sistema

Após, crie um diretório esp em seu home e baixa o arquivo da toolchain para dentro dele. Finalize extraindo-o:

Será necessário ter a toolchain no path do sistema para ser utilizada. Há diversas formas de fazê-lo, normalmente adicionando o diretório ao path através do arquivo /etc/profile ou ~/.profile. Caso exista o arquivo ~/.bash_profile, priorize-o. Para colocar no path somente quando for utilizar, uma opção é criar um alias no arquivo ~/.bashrc. Eu adicionei a seguinte linha:

Desse modo, quando abrir um novo terminal e desejar ter o toolchain no path do sistema, basta chamar o alias esp32dev e o path será incluído automaticamente. Isso pode ser necessário se tiver mais de um SDK no sistema.

Após chamar o alias esp32dev em um novo terminal, confirme se está no path:

Deve retornar algo similar a isso:

QR Code com ESP32

Garanta as permissões para usuário comum no grupo dialout

Provavelmente seu usuário comum já está fazendo uso da porta serial sem problemas, mas vale garantir isso também. Adicione seu usuário ao grupo dialout para que possa acessar a porta serial sem maiores complicações:

Confirme a existência do usuário adicionado ao grupo:

Deve retornar algo como:

QR Code com ESP32

Será necessário refazer o login para que as modificações sejam aplicadas. Se não houver complicação para você, reinicie o sistema.

Teste a conexão com a porta serial

Para testar a porta serial (com todo o respeito), você pode utilizar o cu:

Aparecerá a mensagem Connected. Para sair, use ~. e em seguida use Ctrl+C.

Baixe o ESP-IDF

Todo o ambiente  está preparado para o desenvolvimento nesse ponto. Agora necessitaremos da API para compilar nossos firmwares. Faça o clone recursivo do repositório do ESP32, estando dentro do diretório recém criado, ~/esp:

Esse repositório não é dos menores, deve demorar um pouquinho pra baixar, mas é só acompanhar a linha Receiving Objects.

O diretório criado se chamará esp-idf.

Configurar o PATH para o ESP-IDF

Do mesmo modo que para a toolchain, podemos utilizar os mesmos arquivos. No caso de colocar no ~/.bashrc, podemos colocar junto ao mesmo alias esp32dev:

Abra um novo terminal, chame o alias e teste o path do sistema:

QR Code com ESP32

Instalar os requerimentos

Algumas dependências de Python estão incluídas no tradicional arquivo requirements.txt, podendo ser instalados como usuário comum, da seguinte maneira:

Clone o repositório de exemplo

Temos um repositório com o exemplo de uso do QR Code. Devemos cloná-lo dentro do diretório ~/esp, de onde sempre faremos nosso desenvolvimento, quando utilizando o ESP-IDF invés da API do Arduino. Nesse caso especificamente, é fundamental todo esse processo, exceto o código seja portado.

O diretório criado se chamará ESP32_CAMERA_QR. O firmware foi testado com câmeras OV7725 e OV2640. Essa segunda câmera é a que vem junto ao ESP32-CAM vendido pelo nosso parceiro.

Tenha em mente que a resolução deve ser de VGA para baixo, senão a memória não dá conta e aí teria que usar uma PSRAM externa.

A estrutura de diretórios do projeto está especificada na página principal de seu repositório, podendo ser acessada através desse link.

Habilitar a biblioteca QR

Para habilitar, entre no diretório do projeto e digite make menuconfig, então abra a opção ESP32 Camera Demo Configuration e marque a opção QR Recognize Support.  Depois, modifique esses dois defines no arquivo app_main.c (comente as anteriores, na linha 57 e 58):

Aproveite para definir o SSID e senha de sua rede WiFi, senão ele não inicia a detecção. Pode colocar logo abaixo das definições da câmera.

Hora de tentar a leitura do QR Code com ESP32.

Grave o firmware no ESP32-CAM

O ESP32-CAM não tem porta USB, será necessário um FTDI para gravá-lo. Veja nesse artigo, na seção “ESP32-CAM não tem porta USB?“. Para gravar o firmware, primeiramente coloque um jumper do IO0 ao GND. Depois, aperte o botão reset. Isso garantirá o modo de gravação.

Agora, de dentro da raiz do projeto (diretório ~/esp/ESP32_CAMERA_QR), digite make flash. Se tudo der certo e nada der errado, hora de fazer o teste.

Pesquise no google por qr code generator online ou use um programa de sua preferência para isso. Ainda, se preferir ir direto ao teste, use o meu QR Code, com a URL desse site, onde me honra com vossa leitura:

QR Code com ESP32Antes de colocar a câmera em frente ao QR Code, abra um terminal. Você pode utilizar, bem, o cu, como citado anteriormente. Ou então agora:

No boot deve aparecer algo como:

QR Code com ESP32

Ótimo sinal. Quando terminar o carregamento, deve aparecer uma URL para pegar shots a partir do browser.

QR Code com ESP32

Cada vez que a URL for carregada, uma imagem é baixada. Bem, aqui começaram os problemas. Ainda não grudei a cabeça da câmera sobre a placa, então fica chacoalhando. Além disso, a lente está suja, preciso limpar com álcool isopropílico. Mesmo dando uns tapas, não consegui fazer a identificação do QR Code, tirei 70 amostras. Quando detecta mas está pequeno, a mensagem é “QR: Camera Size err”. Quando está ideal, aparece:

QR Code com ESP32

Ainda, tentei mudar a resolução para VGA, mas aí a memória já não comportava.

Algumas das tentativas:

QR Code com ESP32

Não foi falta de vontade, como percebe-se. Vou tentar limpar a lente, criar códigos mais simples, procurar impressos em papel (porque pode ser interferência de luminosidade, sei lá).

No git do projeto (citado mais acima) tem screenshot, presumo que seja real. A detecção acontece mas falha no reconhecimento. Seria bom alguém mais aí testar e comentar em um dos nossos grupos do facebook. Vou continuar testando e assim que descobrir a melhor condição, coloco um vídeo no nosso canal DobitAoByteBrasil no Youtube.

Até a próxima e, ajudem com feedbacks!