Manual

do

Maker

.

com

Leitor de QR Code com ESP32 (ESP32-CAM)

Leitor de QR Code com ESP32 (ESP32-CAM)

Aproveitando-me da necessidade de um membro do grupo ESP32/ESP8266 (não mais existente), 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.

Esse artigo certamente é o mais frustrante. "Talvez" o procedimento funcione com você, mas aqui discorro sobre o problema que foi (até então) insolúvel.

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:

sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing

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:

mkdir -p ~/esp && cd esp
wget -c https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
tar zxvf xtensa*gz

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:

alias esp32dev='export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"'

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 esp32devem um novo terminal, confirme se está no path:

echo $PATH|cut -f1 -d:

Deve retornar algo similar a isso:

esp32-esp-idf.webp

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:

sudo usermod -a -G dialout $USER

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

egrep dialout /etc/group

Deve retornar algo como:

esp32-dialout.webp

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:

sudo apt-get install cu
cu -l /dev/ttyUSB0 -s 115200

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:

cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git

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:

alias esp32dev='export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH" && export IDF_PATH=~/esp/esp-idf'

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

esp-idf-env.webp

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:

python -m pip install --user -r $IDF_PATH/requirements.txt

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.

cd ~/esp
git clone https://github.com/donny681/ESP32_CAMERA_QR.git

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):

#define CAMERA_PIXEL_FORMAT CAMERA_PF_GRAYSCALE
#define CAMERA_FRAME_SIZE CAMERA_FS_QVGA

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.

#define CONFIG_WIFI_SSID "seu ssid"
#define CONFIG_WIFI_PASSWORD "suaSenha"

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:

frame.png

Antes 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:

make monitor

No boot deve aparecer algo como:

ov2640-detected.webp

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

url_pgm.webp

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_detected.webp

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

Algumas das tentativas:

tentativas-qr.webp

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.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.