Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images

Composants et fournitures

ComposantQuantité
Arduino UNO1
Module Bluetooth HC-051
Caméra OV76701
Shield TFT Arduino1

À propos du projet

Aujourd'hui, personne n'est surpris par un téléphone mobile avec caméra, des gadgets sans fil et autres avancées techniques. Grâce à la plateforme Arduino, des millions de personnes ont découvert le monde merveilleux de l'électronique et de la programmation. Des centaines d'instructions ont été écrites sur l'échange de données entre un téléphone mobile et Arduino via Bluetooth... De quoi parle-je ? Oui. Je veux échanger des données entre un téléphone Android et un Arduino UNO via Bluetooth pour la 501ème fois. Mais je veux transmettre non pas de simples caractères et nombres, mais des images.

Quelqu'un dira que c'est impossible, l'Arduino est trop lent pour traiter de grandes quantités de données à bonne vitesse. Et il aura tout à fait raison. Et si on aidait un peu l'Arduino en transférant tout le travail « dur » sur les épaules d'un autre périphérique ? Et il existe un tel périphérique !

C'est un shield TFT unique pour Arduino. Des informations sur ce logo sont dans ces articles : article 1, article 2. Dans ce tutoriel, je vais démontrer comment connecter via Bluetooth l'Arduino et un téléphone Android, obtenir une image de la caméra OV7670 sur l'Arduino UNO et la transférer vers le téléphone Android. Puis, dans l'autre sens, transférer l'image (depuis la caméra du téléphone) vers l'Arduino UNO et l'afficher sur l'écran du shield TFT unique.

Une application spéciale a été écrite pour le téléphone Android.

Caractéristiques du shield TFT

Liste des composants nécessaires

Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images

Matériel :

Logiciel :

Préparation

Logiciel

Tous les sketches de démonstration sont écrits dans l'environnement Arduino IDE, donc installez d'abord l'Arduino IDE : https://www.arduino.cc/en/main/software. Ensuite, installez la bibliothèque pour le shield TFT : github.com/YATFT/YATFT (téléchargez la bibliothèque et décompressez-la dans le dossier « libraries » du répertoire Arduino IDE).

Après l'installation de l'IDE Arduino, programmez la carte Arduino UNO. Pour simplifier, je recommande de le flasher séparément, sans le shield TFT :

Si la programmation réussit, passez à l'étape suivante.

Sketch ArduinoBluetoothCamera.ino :


/**********************************************************************
 * SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
 * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY
 * WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A
 * PARTICULAR PURPOSE. IN NO EVENT SHALL AUTHOR OR ITS LICENSORS BE
 * LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY,
 * CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY
 * DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO
 * ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES,
 * LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS,
 * TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT
 * NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 **********************************************************************/
#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 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: // Envoi photo unique
        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: // Envoi continu
        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: // Réception photo unique
        mode = 3; start_capt = 3;
        if (last_mode != mode && last_mode != 4) {
          tft.begin(); tft.SetYUV();
        }
        break;
      case 0x40: // Réception continue
        mode = 4; start_capt = 4;
        if (last_mode != mode && last_mode != 3) {
          tft.begin(); tft.SetYUV();
        }
        break;
      default: break;
    }
  }
  if (mode == 1) { // Envoi photo unique
    if (start_capt == 1) { start_capt = 0; last_mode = mode; mode = 0; CamCapture(); }
  } else if (mode == 2) { // Envoi continu
    while (1) {
      uint8_t temp = Serial.read();
      if (start_capt == 2) start_capt = 0;
      if (temp == 0x21) { start_capt = 0; last_mode = mode; mode = 0; break; }
      if (CamCapture()) continue;
    }
  } else if (mode == 3) { // Réception photo unique
    if (start_capt == 3) {
      start_capt = 0; last_mode = mode; mode = 0;
      Serial.print("!");
      srl.JPEGReadFromSerial(&jpeg_decode, 0, 0, GetMaxX()+1, GetMaxY()+1, 32000);
    }
  } else if (mode == 4) { // Réception continue
    uint8_t temp = Serial.read();
    while (1) {
      if (start_capt == 4) start_capt = 0;
      if (temp == 0x41) { start_capt = 0; last_mode = mode; mode = 0; break; }
      Serial.print("!");
      srl.JPEGReadFromSerial(&jpeg_decode, 0, 0, GetMaxX()+1, GetMaxY()+1, 32000);
    }
  }
}
uint8_t CamCapture(void) {
  uint8_t temp = 0xff, temp_last = 0;
  bool is_header = false;
  uint32_t length = 0;
  length = codec.JPEGStart();
  uint32_t en_jpeg_address = ifc.rdReg32(0x414)<<2;
  int k = 0;
  if ((length >= 0x5FFFF) | (length == 0)) { start_capt = 2; return 1; }
  temp = ifc.GetMem(en_jpeg_address+k); k++; length--;
  while (length--) {
    temp_last = temp;
    temp = ifc.GetMem(en_jpeg_address+k); k++;
    if (is_header) { 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)) break;
  }
  is_header = false;
  return 0;
}

OV7670_regs.h :


#ifndef OV7670_REGS_H
#define OV7670_REGS_H
const uint8_t OV7670_VGA[][2] PROGMEM = { ... }; // Registres pour mode VGA 640x480
const uint8_t OV7670_QVGA[][2] PROGMEM = { ... }; // Registres pour mode QVGA 320x240
#endif

Android

Sur le téléphone Android, installez ArduinoTFT.apk. Autorisez l'application à utiliser le Bluetooth et la caméra.

Mise à jour 26/05/2020 ! J'ai ajouté le code source de ArduinoTFT.apk. Téléchargez ArduinoTFT.zip.h, renommez en ArduinoTFT.zip et décompressez. Profitez-en !

Mise à jour 25/07/2020 ! « Salut, j'avais le même problème avec l'application Android qui ne marche pas. Résolu après avoir autorisé l'accès à la caméra du smartphone. C'est tout. Au revoir »

Module Bluetooth

Il faut régler le débit du module Bluetooth à 115200 (commande « AT+UART=115200, 0, 0 »). C'est la vitesse optimale à laquelle l'Arduino UNO arrive à recevoir et traiter les données. (Théoriquement, on peut augmenter la vitesse, optimiser la réception et le traitement, mais cela demande plus de RAM). Des instructions détaillées pour régler le débit sont disponibles sur Internet, par exemple : https://www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/.

(!) Notez que le module Bluetooth se connecte au port de débogage de l'Arduino UNO. Ainsi, lors du travail avec Bluetooth, le port de débogage n'est pas disponible. Avant de programmer l'Arduino UNO (avec le module Bluetooth), il faut débrancher le module Bluetooth. Et après la programmation, le rebrancher (!)

Assemblage

Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images

L'assemblage est assez simple :

Après mise sous tension, l'écran du shield TFT doit devenir rouge. Cela signifie qu'il est prêt à recevoir les commandes du téléphone Android.

Démonstration

Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images

Effectuez les opérations suivantes sur le téléphone Android :

Deux fenêtres et quatre boutons apparaissent :

Fonctions des boutons :

La taille de l'image est 320×240 pixels (2-5 Ko). Ce chapitre contient une vidéo de démonstration.

Si vous aimez mon article, j'apprécierais une évaluation. Cela me motivera peut-être pour de nouveaux articles. :-)

Merci d'avoir regardé !

Articles précédents :

  1. Shield TFT unique pour Arduino Uno - Démarrage
  2. Shield TFT Arduino unique - Caméra OV7670

Prochains articles :

  1. Shield TFT pour Arduino Nano - Démarrage
  2. Photos et vidéo RGB sur écran SPI TFT
  3. Contrôle par smartphone d'un robot 4 roues motrices via Bluetooth

Mise à jour 01/04/2021 : Bonjour à nouveau ! Il y a une bibliothèque mise à jour pour une série d'écrans, actuellement composée de deux shields et deux breakout boards. Le sketch se compile selon la version choisie (1 à 4) et le type de microcontrôleur (MegaAVR ou ESP-32). Photos et exemples ajoutés. Plus d'infos sur https://github.com/Ekaburg/EkaTFT.

Code

Bibliothèque pour shield TFT

https://github.com/YATFT/YATFT

Pièces personnalisées et boîtiers

Processus de fabrication

  1. L'Évolution et la Conception des Appareils Photo Modernes
  2. Comprendre les objectifs d'appareil photo : conception, histoire et innovations futures
  3. BrickPi Bookreader : Automatiser la lecture Kindle avec Raspberry Pi et LEGO Mindstorms
  4. Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
  5. Slider Motorisé pour Caméra Contrôlé par Bluetooth avec Arduino : Pour des Plans Cinématiques Fluides
  6. Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
  7. Appareils électroménagers à commande vocale : contrôle Bluetooth avec Google Assistant
  8. Système de surveillance mobile – Robot caméra Raspberry Pi/Arduino piloté par Android (MQTT, uv4l, Docker)
  9. Système avancé de détection de chutes avec Arduino, Windows IoT et Azure Cloud