Manual
do
Maker
.
com
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.
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!
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.
Se você usa Windows, siga as instruções desse link (em inglês). Para Linux, descrevo o processo em seguida.
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
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:
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:
Será necessário refazer o login para que as modificações sejam aplicadas. Se não houver complicação para você, reinicie o sistema.
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.
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.
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:
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
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.
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.
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:
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:
Ótimo sinal. Quando terminar o carregamento, deve aparecer uma URL para pegar shots a partir do browser.
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:
Ainda, tentei mudar a resolução para VGA, mas aí a memória já não comportava.
Algumas das tentativas:
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.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.