Câmera Arduino Bluetooth (ABC)
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Sobre este projeto
Hoje você dificilmente pode surpreender alguém com um telefone celular com câmera, aparelhos sem fio e outros avanços técnicos. Graças à plataforma Arduino, milhões de pessoas descobriram o maravilhoso mundo da eletrônica e da programação. 100, 500 instruções foram escritas sobre como trocar dados entre um telefone celular e o Arduino via bluetooth ... Do que estou falando? sim. Quero trocar dados entre um telefone celular no Android e o Arduino UNO por bluetooth em 100, 501 vezes. Mas quero transmitir não apenas um conjunto de caracteres e números, mas também imagens.
Alguém dirá que isso é impossível, o Arduino é muito lento para processar grandes quantidades de dados com boa velocidade. E ele estará absolutamente certo. E se um pouco de ajuda Arduino - para transferir todo o trabalho "duro" para os ombros de outro dispositivo? E esse dispositivo existe!
Este é um escudo TFT exclusivo para Arduino. As informações sobre esse logotipo estão nestes artigos:artigo 1, artigo 2 Neste tutorial, demonstrarei como você pode se conectar via bluetooth entre o Arduino e o telefone Android, obter uma foto da câmera OV7670 no Arduino UNO e transferi-la para o telefone Android. Então, ao contrário, transfira a imagem (imagem da câmera) do telefone Android para o Arduino UNO e exiba-a na tela de um escudo TFT exclusivo.
Um aplicativo especial foi escrito para o telefone Android.
Breves características do escudo TFT:
- Tamanho 3,5 "na diagonal,
- Resolução 320x240,
- Número de cores 65536 (16 bits),
- Tela de toque resistiva (controlador XPT2046),
- 5 botões,
- RTC IC DS1307 com bateria de lítio de 3 V CR1220,
- Slot para conectar um cartão micro SD,
- Conector de 4 pinos (2,54 mm) para conectar o módulo Bluetooth HC-05 (-06), módulo WiFi ESP8286.
- Conector de 20 pinos (2,54 mm) para câmera (OV7670).
Lista de componentes necessários
Hardware :
- Arduino UNO;
- Escudo TFT exclusivo;
- Adaptador de alimentação AC-DC 6-12 volts,> 600mA;
- Câmera OV7670;
- Módulo Bluetooth HC-06 (HC-05);
- telefone Android.
Atenção:É necessário (!) Usar um adaptador de alimentação de 6-12 volts para operar a blindagem TFT, pois a corrente máxima de 500 mA do USB não é suficiente para a operação normal.
Software :
- Arduino IDE;
- Biblioteca para escudo TFT exclusivo;
- Arquivo APK para telefone Android.
Preparando
Software
Todos os esboços de demonstração são escritos no ambiente Arduino IDE, portanto, no início é necessário instalar o Arduino IDE - https://www.arduino.cc/en/main/software. Em seguida, você precisa instalar uma biblioteca para o escudo TFT - github.com/YATFT/YATFT (baixe a biblioteca e descompacte-a na pasta "libraries" no diretório IDE do Arduino).
Após instalar o Arduino IDE, você deve programar a placa Arduino UNO. Para simplificar, eu recomendo piscar separadamente, sem escudo TFT. Por esta:
- Conecte o cabo USB à placa Arduino UNO;
- Execute o IDE Arduino no computador;
- Selecione a porta correspondente à qual o Arduino UNO está conectado;
- Baixe o ArduinoBluetoothCamera.ino esboço de demonstração (e arquivo ov7670_regs.h para câmera init);
- Clique no botão Upload .
Se a placa Arduino UNO for programada com sucesso, você pode prosseguir para a próxima etapa.
ArduinoBluetoothCamera.ino esboço:
/ ******************************************* ***************************** O SOFTWARE E A DOCUMENTAÇÃO SÃO FORNECIDOS "TAL COMO ESTÃO" SEM GARANTIA DE * QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO SEM LIMITAÇÃO, QUALQUER * GARANTIA DE COMERCIALIZAÇÃO, TÍTULO, NÃO VIOLAÇÃO E ADEQUAÇÃO A UM * FIM ESPECÍFICO. EM NENHUMA HIPÓTESE O AUTOR OU SEUS LICENCIADORES SERÁ * RESPONSÁVEL OU OBRIGADO SOB CONTRATO, NEGLIGÊNCIA, RESPONSABILIDADE RIGOROSA, * CONTRIBUIÇÃO, QUEBRA DE GARANTIA OU OUTRA TEORIA LEGAL EQUITATIVA QUALQUER * DANOS OU DESPESAS DIRETOS OU INDIRETOS, INCLUINDO *, SEM LIMITAÇÃO, INCLUINDO * SEM LIMITAÇÃO. DANOS ESPECIAIS, INDIRETOS, PUNITIVOS OU CONSEQÜENCIAIS, * PERDA DE LUCROS OU DADOS, CUSTO DE AQUISIÇÃO DE MERCADORIAS DE SUBSTITUIÇÃO, * TECNOLOGIA, SERVIÇOS OU QUAISQUER RECLAMAÇÕES DE TERCEIROS (INCLUINDO, MAS * NÃO SE LIMITANDO A QUALQUER DEFESA SIMILAR, OU OUTROS CUSTO SEMELHANTE A ESSES. . ************************************************* *********************** / # include #include #include #include #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_teste8_tode modo =0; uint8_tode =0; uint8_tode mode =0; uint8 0; uint8_t start_capt =0; uint16_t err; void setup () {// inicializa a porta serial Serial.begin (115200); // inicializa o display tft.begin (); tft.SetColor (BRIGHTRED); tft.ClearDevice ();} void loop () {// coloque seu código principal aqui, para executar repetidamente:if (Serial.available ()) {uint8_t temp =Serial.read (); switch (temp) {case 0x10:// Send single Photo mode =1; start_capt =1; if (last_mode! =mode &&last_mode! =2) {tft.begin (); tft.SetRGB (); // Muda para o modo RGB cam.CamInit (&OV7670_QVGA [0] [0]); cam.CamVideoPreview (0, 0, 1, verdadeiro); codec.JPEGInit (); codec.JPEGSetRegs (IMG_SizeX, IMG_SizeY); atraso (1000); } pausa; case 0x20:// Envio contínuo modo Foto =2; start_capt =2; if (last_mode! =mode &&last_mode! =1) {tft.begin (); tft.SetRGB (); // Muda para o modo RGB cam.CamInit (&OV7670_QVGA [0] [0]); cam.CamVideoPreview (0, 0, 1, verdadeiro); codec.JPEGInit (); codec.JPEGSetRegs (IMG_SizeX, IMG_SizeY); } pausa; case 0x30:// Recebe modo de uma única foto =3; start_capt =3; if (last_mode! =mode &&last_mode! =4) {tft.begin (); tft.SetYUV (); // Muda para o modo YUV} break; case 0x40:// Recebimento contínuo modo Foto =4; start_capt =4; if (last_mode! =mode &&last_mode! =3) {tft.begin (); tft.SetYUV (); // Muda para o modo YUV} break; padrão:break; }} if (mode ==1) // Enviar uma única foto {if (start_capt ==1) {start_capt =0; last_mode =mode; modo =0; CamCapture (); }} else if (mode ==2) // Envio contínuo de foto {while (1) {uint8_t temp =Serial.read (); if (start_capt ==2) {start_capt =0; } if (temp ==0x21) // Parar? {start_capt =0; last_mode =mode; modo =0; pausa; } if (CamCapture ()) continue; }} else if (mode ==3) // Receber uma única foto {if (start_capt ==3) {// Iniciar a captura start_capt =0; last_mode =mode; modo =0; Serial.print ("!"); srl.JPEGReadFromSerial (&jpeg_decode, // estrutura de decodificação jpeg 0, // x0 (esquerda) 0, // y0 (superior) GetMaxX () + 1, // x1 (direita) GetMaxY () + 1, // y1 (inferior ) 32000); // tamanho máximo da imagem}} else if (mode ==4) // Recebimento contínuo da foto {uint8_t temp =Serial.read (); while (1) {if (start_capt ==4) {// Iniciar captura start_capt =0; } if (temp ==0x41) // Parar? {start_capt =0; last_mode =mode; modo =0; pausa; } Serial.print ("!"); srl.JPEGReadFromSerial (&jpeg_decode, // estrutura de decodificação jpeg 0, // x0 (esquerda) 0, // y0 (superior) GetMaxX () + 1, // x1 (direita) GetMaxY () + 1, // y1 (inferior ) 32000); // tamanho máximo da imagem}}} uint8_t CamCapture (void) {uint8_t temp =0xff, temp_last =0; bool is_header =false; comprimento uint32_t =0; comprimento =codec.JPEGStart (); uint32_t en_jpeg_address =ifc.rdReg32 (0x414) <<2; int k =0; if ((comprimento> =0x5FFFF) | (comprimento ==0)) {start_capt =2; return 1; } temp =ifc.GetMem (en_jpeg_address + k); k ++; comprimento --; enquanto (comprimento--) {temp_último =temp; temp =ifc.GetMem (en_jpeg_address + k); k ++; if (is_header ==true) {Serial.write (temp); } else if ((temp ==0xD8) &(temp_last ==0xFF)) {is_header =true; Serial.write (temp_last); Serial.write (temp); } if ((temp ==0xD9) &&(temp_last ==0xFF)) // Se encontrar o fim, interrompa enquanto, interrompe; } is_header =false; return 0;}
OV7670_regs.h:
#ifndef OV7670_REGS_H # define OV7670_REGS_Hconst uint8_t OV7670_VGA [] [2] PROGMEM ={{1, 0x42}, // Tamanho do byte, Endereço (ID) {640/16, 480/16}, // Tamanho X, Tamanho Y {0b01000010, 0b00000100}, // Reset_Enable_N, 7 | 6 | 5 | 5 | 3 | Vsync Invert | Hsync Invert | 0 {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}, // Tamanho do byte, Endereço (ID) {320/16, 240/16}, // Tamanho X, Tamanho Y {0b01000010, 0b00000100}, // Reset_Enable_N, 7 | 6 | 5 | 4 | 3 | Inverter Vsync | Inverter Hsync | 0 {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 telefone Android, você precisa instalar o ArduinoTFT.apk . Permita que o aplicativo use o Bluetooth e a câmera.
Atualização em 26/05/2020!
Eu adicionei código fonte de ArduinoTFT.apk. COMO É! Baixe ArduinoTFT.zip.h
, renomeie para ArduinoTFT.zip e descompacte. Aproveitar!
Atualização em 25/07/2020!
"Olá, tive o mesmo problema com o App Android que não funciona. Resolvido após autorizar o acesso do App pela câmera do smartphone. É isso. Tchau" (c)
Módulo Bluetooth
É necessário definir a taxa de câmbio no módulo Bluetooth para 115200 (comando "AT + UART =115200, 0, 0"). Esta é a velocidade ideal na qual o Arduino UNO consegue receber e processar dados. (Teoricamente, você pode aumentar a velocidade, otimizar a recepção e processamento de dados, mas isso requer uma quantidade maior de RAM). Instruções mais detalhadas sobre como definir a taxa de câmbio podem ser encontradas na Internet, por exemplo, aqui:https:/ /www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/.
(!) Observe que o módulo Bluetooth se conecta à porta de depuração do Arduino UNO. Portanto, ao trabalhar com bluetooth, a porta de depuração não está disponível. E antes de programar o Arduino UNO (completo com o módulo Bluetooth) deve desconectar o módulo Bluetooth. E depois de programar, configure novamente (!)
Montagem
A montagem do dispositivo é bastante simples:
- Conecte o Arduino UNO e o escudo TFT;
- Conecte a câmera OV7670 ao conector de 20 pinos na blindagem TFT da blindagem (às vezes eu uso um conector angular de 18-20 pinos com um passo de 2,54 mm como adaptador);
- Conecte o módulo Bluetooth HC-06 (HC-05) ao conector de 4 pinos com as palavras "Bluetooth" no escudo TFT;
- Conecte o adaptador de alimentação 6-12 V à entrada de alimentação na placa Arduino UNO.
Depois de ligar a energia, a tela do escudo TFT deve ficar vermelha. Isso significa a disposição de receber comandos do telefone Android.
Demonstração
Execute as seguintes operações no telefone Android:
- Inicie o ArduinoTFT aplicativo no telefone Android;
- Vire o telefone na posição horizontal;
- Habilite a conexão Bluetooth, selecione o módulo Bluetooth detectado (HC-06);
Duas janelas e quatro botões devem aparecer na tela:
- A janela superior direita é a janela do visor da câmera do telefone;
- Grande janela esquerda - imagens recebidas ou enviadas.
Funções dos botões:
- Transfira uma única imagem do telefone Android para o Arduino;
- Transferência contínua de imagens do telefone Android para o Arduino;
- Transfira uma única imagem do Arduino para o telefone Android;
- Transferência contínua de imagens do Arduino para o telefone Android.
O tamanho da imagem é 320x240 pixels (2-5 kB). Este capítulo tem um vídeo de demonstração.
Se você gosta do meu artigo, gostaria de receber uma avaliação. Talvez isso me dê motivação para novos artigos. :-)
Obrigado por assistir!
Artigos anteriores:
1) Escudo TFT exclusivo para Arduino Uno - Iniciar,
2) Escudo TFT Arduino exclusivo - OV7670 Cam.
Próximos artigos:
3) Escudo TFT para Arduino Nano - Iniciar,
4) Fotos e vídeo RGB em exibição TFT SPI.
5) Controle por Smartphone 4WD Robot Car sobre Bluetooth.
Atualização 01.04.2021:
Olá de novo! Há uma biblioteca atualizada para uma série de telas, que atualmente consiste em dois escudos e duas placas de quebra. O esboço é compilado dependendo da versão selecionada (de 1 a 4) e do tipo de microcontrolador (MegaAVR ou ESP-32). Adicionadas fotos, exemplos. Mais informações podem ser encontradas em https://github.com/Ekaburg/EkaTFT.
Código
Biblioteca para escudo TFT
http://github.com/YATFT/YATFTPeças personalizadas e gabinetes
Experimente o OV7670 e o controle remoto da TV Experimente com a câmera OV7670 e o controle remoto da TVProcesso de manufatura
- Câmera
- Lente da câmera
- BrickPi Bookreader
- Robô Raspberry Pi controlado por Bluetooth
- Deslizador de câmera motorizada Arduino controlado por Bluetooth
- Arduino com Bluetooth para controlar um LED!
- Dispositivos Bluetooth controlados por voz com OK Google
- Câmera de vigilância remota móvel
- Um sistema de detecção de queda baseado em Arduino, Windows e Azure
- Arduino Uno + Dispositivo elétrico (Bulb) + Telefone Android