Câmera Bluetooth Arduino (ABC): Conecte seu Celular via Bluetooth para Capturar Imagens
Componentes e Materiais
| Arduino UNO | 1 |
| Módulo Bluetooth HC-05 | 1 |
| Câmera OV7670 | 1 |
| Shield TFT Arduino | 1 |
Sobre o Projeto
Hoje em dia dificilmente se surpreende alguém com celular com câmera, gadgets sem fio e outros avanços técnicos. Graças à plataforma Arduino, milhões descobriram o maravilhoso mundo da eletrônica e programação. Centenas de instruções foram escritas sobre como trocar dados entre celular e Arduino via bluetooth... O que quero? Trocar dados entre celular Android e Arduino UNO via bluetooth pela 501ª vez. Mas quero transmitir não apenas caracteres e números, mas imagens.
Alguém dirá que é impossível, Arduino é lento para processar grandes quantidades de dados com boa velocidade. E estará absolutamente certo. E se dermos uma ajudinha ao Arduino – transferir todo o trabalho "pesado" para outro dispositivo? E existe tal dispositivo!
Este é um shield TFT único para Arduino. Informações sobre este logo estão nestes artigos: artigo 1, artigo 2. Neste tutorial, demonstrarei como conectar via bluetooth entre Arduino e celular Android, obter imagem da câmera OV7670 no Arduino UNO e transferir para o celular. E, inversamente, transferir imagem (da câmera) do celular para Arduino UNO e exibi-la na tela do shield TFT único.
Um aplicativo especial foi escrito para o celular Android.
Características do Shield TFT
- Tamanho 3.5" diagonal
- Resolução 320x240
- 65536 cores (16-bit)
- Touch screen resistivo (controlador XPT2046)
- 5 botões
- RTC IC DS1307 com bateria de lítio 3V CR1220
- Slot para cartão micro SD
- Conector 4 pinos (2.54mm) para módulo Bluetooth HC-05 (-06), ESP8286 WiFi
- Conector 20 pinos (2.54mm) para câmera OV7670
Lista de Componentes Necessários

Hardware:
- Arduino UNO
- Shield TFT único
- Fonte AC-DC 6-12V, >600mA
- Câmera OV7670
- Módulo Bluetooth HC-06 (HC-05)
- Celular Android
Atenção: É necessário (!) usar adaptador 6-12V para operar o shield TFT, pois os 500mA máximos do USB não são suficientes.
Software:
- Arduino IDE
- Biblioteca para Shield TFT único
- Arquivo APK para celular Android
Preparação
Software
Todos os sketches de demonstração são escritos no Arduino IDE, portanto instale-o: https://www.arduino.cc/en/main/software. Depois instale biblioteca para shield TFT: github.com/YATFT/YATFT (baixe e descompacte na pasta "libraries" do diretório Arduino IDE).
Após instalar Arduino IDE, programe o Arduino UNO. Por simplicidade, recomendo gravar separadamente, sem shield TFT:
- Conecte cabo USB ao Arduino UNO
- Execute Arduino IDE no computador
- Selecione porta correspondente ao Arduino UNO
- Baixe sketch demo ArduinoBluetoothCamera.ino (e arquivo ov7670_regs.h para init da câmera)
- Clique Upload
Se programado com sucesso, prossiga.
Sketch ArduinoBluetoothCamera.ino
/**********************************************************************
* SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY...
***********************************************************************/
#include <YATFT.h>
#include <util/yacam.h>
#include <util/yacodec.h>
#include <util/yasrl.h>
#include "ov7670_regs.h"
JPEG_DECODE jpeg_decode;
YATFT tft(0);
INTRFC ifc;
CAM cam;
CODEC codec;
SRL srl;
#define IMG_SizeX 320
#define IMG_SizeY 240
uint8_t mode = 0;
uint8_t last_mode = 0;
uint8_t start_capt = 0;
uint16_t err;
void setup() {
Serial.begin(115200);
tft.begin();
tft.SetColor(BRIGHTRED);
tft.ClearDevice();
}
void loop() {
if (Serial.available()) {
uint8_t temp = Serial.read();
switch (temp) {
case 0x10: // Enviar Foto Única
mode = 1; start_capt = 1;
if (last_mode != mode && last_mode != 2) {
tft.begin(); tft.SetRGB();
cam.CamInit(&OV7670_QVGA[0][0]);
cam.CamVideoPreview(0, 0, 1, true);
codec.JPEGInit();
codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
delay(1000);
}
break;
case 0x20: // Envio Contínuo
mode = 2; start_capt = 2;
if (last_mode != mode && last_mode != 1) {
tft.begin(); tft.SetRGB();
cam.CamInit(&OV7670_QVGA[0][0]);
cam.CamVideoPreview(0, 0, 1, true);
codec.JPEGInit();
codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
}
break;
case 0x30: // Receber Foto Única
mode = 3; start_capt = 3;
if (last_mode != mode && last_mode != 4) {
tft.begin(); tft.SetYUV();
}
break;
case 0x40: // Recebimento Contínuo
mode = 4; start_capt = 4;
if (last_mode != mode && last_mode != 3) {
tft.begin(); tft.SetYUV();
}
break;
default: break;
}
}
// ... lógica dos 4 modos (código completo no original)
}
uint8_t CamCapture(void) {
// Captura JPEG da câmera e envia via serial
// ... implementação completa no original
}
OV7670_regs.h
#ifndef OV7670_REGS_H
#define OV7670_REGS_H
const uint8_t OV7670_VGA[][2] PROGMEM = {
{ 1, 0x42}, { 640/16, 480/16}, {0b01000010, 0b00000100},
{0x3a, 0x0C}, {0x40, 0xC0}, {0x12, 0x00}, {0x0c, 0x00},
{0x3e, 0x00}, {0x70, 0x3A}, {0x71, 0x35}, {0x72, 0x11},
{0x73, 0xF0}, {0xa2, 0x02}, {0x11, 0x80}, {0x7a, 0x18},
{0x7b, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F}, {0x7e, 0x49},
{0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87},
{0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB},
{0x87, 0xCF}, {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0},
{0x00, 0x00}, {0x10, 0x00}, {0x0d, 0x00}, {0x24, 0x98},
{0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00}, {0x2b, 0x00},
{0x2d, 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30},
{0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10},
{0x4f, 0x40}, {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17},
{0x53, 0x29}, {0x54, 0x40}, {0x57, 0x80}, {0x58, 0x1e},
{0x41, 0x10}, {0x75, 0x60}, {0x76, 0x50}, {0x77, 0x48},
{0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff}
};
const uint8_t OV7670_QVGA[][2] PROGMEM = {
{ 1, 0x42}, { 320/16, 240/16}, {0b01000010, 0b00000100},
{0x3a, 0x0C}, {0x40, 0xC0}, {0x12, 0x10}, {0x0c, 0x00},
{0x3e, 0x00}, {0x70, 0x3A}, {0x71, 0x35}, {0x72, 0x11},
{0x73, 0xF0}, {0xa2, 0x02}, {0x11, 0x80}, {0x7a, 0x18},
{0x7b, 0x02}, {0x7c, 0x07}, {0x7d, 0x1F}, {0x7e, 0x49},
{0x7f, 0x5A}, {0x80, 0x6A}, {0x81, 0x79}, {0x82, 0x87},
{0x83, 0x94}, {0x84, 0x9F}, {0x85, 0xAF}, {0x86, 0xBB},
{0x87, 0xCF}, {0x88, 0xEE}, {0x89, 0xEE}, {0x13, 0xE0},
{0x00, 0x00}, {0x10, 0x00}, {0x0d, 0x00}, {0x24, 0x98},
{0x25, 0x63}, {0x26, 0xD3}, {0x2a, 0x00}, {0x2b, 0x00},
{0x2d, 0x00}, {0x13, 0xe5}, {0x13, 0xe7}, {0x1e, 0x30},
{0x74, 0x60}, {0x01, 0x80}, {0x02, 0x80}, {0x15, 0x10},
{0x4f, 0x40}, {0x50, 0x34}, {0x51, 0x0C}, {0x52, 0x17},
{0x53, 0x29}, {0x54, 0x40}, {0x57, 0x80}, {0x58, 0x1e},
{0x41, 0x10}, {0x75, 0x60}, {0x76, 0x50}, {0x77, 0x48},
{0x3d, 0x92}, {0x3b, 0x00}, {0x04, 0x00}, {0xff, 0xff}
};
#endif
Android
No celular Android, instale o ArduinoTFT.apk. Permita que o app use Bluetooth e Câmera.
Atualização 26/05/2020! Adicionei código fonte do ArduinoTFT.apk. AS IS! Baixe ArduinoTFT.zip.h, renomeie para ArduinoTFT.zip e descompacte.
Atualização 25/07/2020! "Oi, tive mesmo problema com App Android que não funciona. Resolvi após autorizar o App a acessar a câmera do smartphone. É isso. Tchau"
Módulo Bluetooth
Configure a taxa de transmissão do módulo Bluetooth para 115200 (comando "AT+UART=115200, 0, 0"). É a velocidade ótima para o Arduino UNO receber e processar dados. Instruções detalhadas: https://www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/.
(!) O módulo Bluetooth conecta à porta de debug do Arduino UNO. Assim, ao trabalhar com bluetooth, a porta de debug não está disponível. Antes de programar o Arduino UNO (com módulo Bluetooth) deve desconectar o módulo Bluetooth. E após programar, recolocá-lo (!)
Montagem









Montagem é simples:
- Conecte Arduino UNO e TFT-shield
- Conecte câmera OV7670 ao conector 20 pinos no TFT-shield (às vezes uso adaptador angular 18-20 pinos pitch 2.54mm)
- Conecte módulo Bluetooth HC-06 (HC-05) ao conector 4 pinos com "Bluetooth" no TFT-shield
- Conecte adaptador 6-12V na entrada de energia do Arduino UNO
Após ligar, a tela do shield TFT deve ficar vermelha. Isso indica prontidão para receber comandos do celular Android.
Demonstração






No celular Android:
- Inicie o aplicativo ArduinoTFT
- Coloque o celular na horizontal
- Ative Bluetooth, selecione módulo detectado (HC-06)
Devem aparecer duas janelas e quatro botões:
- Janela superior direita: visor da câmera do celular
- Janela grande esquerda: imagens recebidas ou enviadas
Funções dos botões:
- Transferir imagem única do celular para Arduino
- Transferência contínua de imagens do celular para Arduino
- Transferir imagem única do Arduino para celular
- Transferência contínua de imagens do Arduino para celular
Tamanho da imagem: 320x240 pixels (2-5 kB). Este capítulo tem vídeo demo.
Se gostou, agradeço uma avaliação. Talvez me motive para novos artigos. :-)
Obrigado por assistir!
Artigos anteriores:
- Unique TFT Shield for Arduino Uno - Start
- Unique Arduino TFT Shield - OV7670 Cam
Próximos artigos:
- TFT shield for Arduino Nano - Start
- Photos and RGB video on TFT SPI display
- Control by Smartphone 4WD Robot Car over Bluetooth
Atualização 01.04.2021: Biblioteca atualizada para série de telas (dois shields e duas breakout boards). O sketch compila dependendo da versão selecionada (1 a 4) e tipo de microcontrolador (MegaAVR ou ESP-32). Mais info em https://github.com/Ekaburg/EkaTFT.
Código
Biblioteca para Shield TFT
https://github.com/YATFT/YATFT
Peças Personalizadas e Gabinetes
- Experimento com OV7670 e controle remoto TV
- Experimento com câmera OV7670 e controle remoto TV
Processo de manufatura
- A Evolução e Design das Câmeras Modernas
- Entendendo Lentes de Câmera: Design, História e Inovações Futuras
- BrickPi Bookreader: Automatize Leitura no Kindle com Raspberry Pi e LEGO Mindstorms
- Construa um Robô Raspberry Pi Controlado por Bluetooth com Feedback de Áudio
- Slider Motorizado para Câmera com Bluetooth e Arduino para Tomadas Cinematográficas Suaves
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Eletrodomésticos Ativados por Voz: Controle Bluetooth com Google Assistant
- Sistema Portátil de Câmera de Vigilância Remota
- Sistema Avançado de Detecção de Quedas com Arduino, Windows IoT e Azure Cloud
- Controle Remoto de Lâmpada com Arduino Uno, Relé e App Android (Blynk)