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)

Composants et fournitures

Arduino UNO
× 1
Module Bluetooth HC-05
× 1
Caméra OV7670
× 1
Bouclier Arduino TFT
× 1

À propos de ce projet

Aujourd'hui, vous ne pouvez presque plus surprendre personne avec un téléphone portable doté d'un appareil photo, de gadgets sans fil et d'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. 100 500 instructions ont été écrites sur la façon d'échanger des données entre un téléphone mobile et Arduino via Bluetooth... De quoi je parle ? Oui. Je souhaite échanger des données entre un téléphone mobile sous Android et Arduino UNO via Bluetooth en 100 501 fois. Mais je veux transmettre non seulement un ensemble de caractères et de chiffres, mais des images.

Quelqu'un dira que c'est impossible, Arduino est trop lent pour traiter de grandes quantités de données avec une bonne vitesse. Et il aura tout à fait raison. Et si un peu d'aide Arduino - pour transférer tout le travail « dur » sur les épaules d'un autre appareil ? Et il existe un tel appareil !

Il s'agit d'un shield TFT unique pour Arduino. Les informations sur ce logo se trouvent dans ces articles :article 1, article 2 Dans ce tutoriel, je vais vous montrer comment vous pouvez vous connecter via Bluetooth entre Arduino et un téléphone Android, obtenir une image de la caméra OV7670 sur Arduino UNO et la transférer sur un téléphone Android. Ensuite, au contraire, transférez l'image (image de l'appareil photo) du téléphone Android vers Arduino UNO et affichez-la sur l'écran d'un shield TFT unique.

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

Brèves caractéristiques du bouclier TFT :

  • Taille 3,5" en diagonale,
  • Résolution 320 x 240,
  • Nombre de couleurs 65536 (16 bits),
  • Écran tactile résistif (contrôleur XPT2046),
  • 5 boutons,
  • RTC IC DS1307 avec pile au lithium 3 V CR1220,
  • Fente pour connecter une carte micro SD,
  • Connecteur à 4 broches (2,54 mm) pour connecter le module Bluetooth HC-05 (-06), module WiFi ESP8286.
  • Connecteur 20 broches (2,54 mm) pour caméra (OV7670).

Liste des composants nécessaires

Matériel :

  • Arduino UNO ;
  • Bouclier TFT unique ;
  • Adaptateur d'alimentation CA-CC 6-12 volts,>600 mA ;
  • Caméra OV7670 ;
  • Module Bluetooth HC-06 (HC-05) ;
  • Téléphone Android.

Attention :Il est nécessaire (!) d'utiliser un adaptateur secteur 6-12 volts pour faire fonctionner le blindage TFT, car le courant maximum de 500 mA de l'USB n'est pas suffisant pour un fonctionnement normal.

Logiciel :

  • IDE Arduino ;
  • Bibliothèque pour le bouclier TFT unique ;
  • Fichier APK pour téléphone Android.

Préparation

Logiciel

Tous les croquis de démonstration sont écrits dans l'environnement Arduino IDE, donc au début, il est nécessaire d'installer l'IDE Arduino - https://www.arduino.cc/en/main/software.Ensuite, vous devez installer une bibliothèque pour TFT shield - 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 avoir installé l'IDE Arduino, vous devez programmer la carte Arduino UNO. Pour plus de simplicité, je recommande de le flasher séparément, sans shield TFT. Pour cela :

  • Connectez le câble USB à la carte Arduino UNO ;
  • Exécutez l'IDE Arduino sur l'ordinateur ;
  • Sélectionnez le port correspondant auquel l'Arduino UNO est connecté ;
  • Télécharger le ArduinoBluetoothCamera.ino croquis de démonstration (et fichier ov7670_regs.h pour l'initialisation de la caméra);
  • Cliquez sur le bouton Télécharger .

Si la carte Arduino UNO est programmée avec succès, vous pouvez passer à l'étape suivante.

ArduinoBluetoothCamera.ino croquis :

/************************************************ ************************** LE LOGICIEL ET LA DOCUMENTATION SONT FOURNIS "EN L'ÉTAT" SANS GARANTIE DE* AUCUNE SORTE, EXPLICITE OU IMPLICITE, Y COMPRIS SANS LIMITATION, TOUTE* GARANTIE DE QUALITÉ MARCHANDE, DE TITRE, D'ABSENCE DE CONTREFAÇON ET D'ADAPTATION À UN USAGE PARTICULIER. EN AUCUN CAS L'AUTEUR OU SES CONCÉDANTS NE SERONT* RESPONSABLES OU OBLIGÉS EN VERTU D'UN CONTRAT, DE NÉGLIGENCE, DE RESPONSABILITÉ STRICTE,* DE CONTRIBUTION, DE RUPTURE DE GARANTIE OU AUTRE THÉORIE LÉGALE ÉQUITABLE TOUT* DOMMAGE OU DÉPENSE DIRECT OU INDIRECT, Y COMPRIS MAIS SANS S'Y LIMITER* TOUT DOMMAGES SPÉCIAUX, INDIRECTS, PUNITIFS OU CONSÉCUTIFS,* PERTE DE PROFITS OU PERTE DE DONNÉES, COT D'ACHAT DE MARCHANDISES DE REMPLACEMENT,* TECHNOLOGIE, SERVICES OU TOUTE RÉCLAMATION PAR DES TIERS (Y COMPRIS MAIS* NON LIMITÉ À TOUTE DEFENSE DE CEUX-CI) OU AUTRES COUTS SIMILAIRES .****************************************************** ********************/#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 240uint8_t mode =_t_uint8 0;uint8_t start_capt =0;uint16_t err;void setup(){ // initialise le port série Serial.begin(115200); // initialise l'affichage tft.begin(); tft.SetColor(LUMINEUX); tft.ClearDevice();}void loop(){ // mettez votre code principal ici, pour l'exécuter à plusieurs reprises :if (Serial.available()) { uint8_t temp =Serial.read(); switch (temp) { case 0x10 : / Envoyer une seule photo en mode = 1 ; start_capt =1 ; if (last_mode !=mode &&last_mode !=2) { tft.begin(); tft.SetRGB(); // Bascule en mode RVB cam.CamInit(&OV7670_QVGA[0][0]); cam.CamVideoPreview (0, 0, 1, vrai); codec.JPEGinit(); codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY); retard(1000); } Pause; case 0x20 :// Envoi continu Mode photo =2 ; start_capt =2; if (last_mode !=mode &&last_mode !=1) { tft.begin(); tft.SetRGB(); // Bascule en mode RVB cam.CamInit(&OV7670_QVGA[0][0]); cam.CamVideoPreview (0, 0, 1, vrai); codec.JPEGinit(); codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY); } Pause; case 0x30 :// Recevoir une seule photo en mode =3 ; start_capt =3; if (last_mode !=mode &&last_mode !=4) { tft.begin(); tft.SetYUV(); // Bascule en mode YUV } break; case 0x40 :// Réception continue Mode photo =4 ; start_capt =4; if (last_mode !=mode &&last_mode !=3) { tft.begin(); tft.SetYUV(); // Bascule en mode YUV } break; par défaut :pause ; } } if (mode ==1) // Envoyer une seule photo { if (start_capt ==1) { start_capt =0; dernier_mode =mode ; mode =0 ; CamCapture(); } } else if (mode ==2) // Envoi continu de la photo { while (1) { uint8_t temp =Serial.read(); if (start_capt ==2) { start_capt =0; } si (temp ==0x21) // Arrêter ? { start_capt =0; dernier_mode =mode ; mode =0 ; Pause; } if (CamCapture()) continue ; } } else if (mode ==3) // Recevoir une seule photo { if (start_capt ==3) { // Démarrer la capture start_capt =0; dernier_mode =mode ; mode =0 ; Serial.print("!"); srl.JPEGReadFromSerial(&jpeg_decode, // structure de décodage jpeg 0, // x0 (gauche) 0, // y0 (haut) GetMaxX()+1, // x1 (droite) GetMaxY()+1, // y1 (bas ) 32000); // taille maximale de l'image } } else if (mode ==4) // Réception continue de la photo { uint8_t temp =Serial.read(); while (1) { if (start_capt ==4) { //Démarrer la capture start_capt =0; } si (temp ==0x41) // Arrêter ? { start_capt =0; dernier_mode =mode ; mode =0 ; Pause; } Serial.print("!"); srl.JPEGReadFromSerial(&jpeg_decode, // structure de décodage jpeg 0, // x0 (gauche) 0, // y0 (haut) GetMaxX()+1, // x1 (droite) GetMaxY()+1, // y1 (bas ) 32000); // taille maximale de l'image } }}uint8_t CamCapture(void){ uint8_t temp =0xff, temp_last =0; bool is_header =false; uint32_t longueur =0 ; longueur =codec.JPEGStart(); uint32_t en_jpeg_address =ifc.rdReg32(0x414)<<2; entier k =0 ; if ((longueur>=0x5FFFF) | (longueur ==0)) { start_capt =2; retour 1 ; } temp =ifc.GetMem(en_jpeg_address+k); k++ ; longueur --; while ( longueur-- ) { temp_last =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) ) //Si trouver la fin, interrompre pendant, interrompre ; } is_header =false; return 0;}

OV7670_regs.h :

#ifndef OV7670_REGS_H#define OV7670_REGS_Hconst uint8_t OV7670_VGA[][2] PROGMEM ={ { 1, 0x42}, // Taille de l'octet, Adresse (ID) { 640/16, 480/16}, // Taille X, Taille Y {0b01000010, 0b00000100}, // Reset_Enable_N, 7|6|5|4|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}, // Taille de l'octet, Adresse (ID) { 320/16, 240/16}, // Taille X, Taille Y {0b01000010, 0b00000100}, // Reset_Enable_N, 7|6|5|4|3|Vsync Invert|Hsync Invert|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

Sur le téléphone Android, vous devez installer ArduinoTFT.apk . Autorisez l'application à utiliser le Bluetooth et l'appareil photo.

Mise à jour 26/05/2020 !

J'ai ajouté le code source d'ArduinoTFT.apk. COMME SI! Téléchargez ArduinoTFT.zip.h

, renommez en ArduinoTFT.zip et décompressez. Profitez!

Mise à jour 25/07/2020 !

"Bonjour, j'ai eu le même problème avec l'application Android qui ne fonctionne pas. Résolu après avoir autorisé l'application à accéder à l'appareil photo du smartphone. C'est tout. Au revoir" (c)

Module Bluetooth

Il est nécessaire de régler le taux de change dans le module Bluetooth à 115200 (commande "AT+UART=115200, 0, 0"). C'est la vitesse optimale à laquelle Arduino UNO parvient à recevoir et à traiter les données. (Théoriquement, vous pouvez augmenter la vitesse, optimiser la réception et le traitement des données, mais cela nécessite une plus grande quantité de RAM). Des instructions plus détaillées sur la façon de définir le taux de change peuvent être trouvées sur Internet, par exemple, ici :https :/ /www.instructables.com/id/Communication-Bluetooth-Module-With-HC-05-HC-06/ .

(!) Veuillez noter que le module Bluetooth se connecte au port de débogage d'Arduino UNO. Ainsi, lorsque vous travaillez avec Bluetooth, le port de débogage n'est pas disponible. Et avant de programmer l'Arduino UNO (complet avec le module Bluetooth) il faut déconnecter le module Bluetooth. Et après programmation, remettez le (!)

Assemblage

L'assemblage de l'appareil est assez simple :

  • Connectez l'Arduino UNO et le blindage TFT ;
  • Connectez la caméra OV7670 au connecteur à 20 broches du blindage TFT du blindage (j'utilise parfois un connecteur à 18-20 broches coudé avec un pas de 2,54 mm comme adaptateur) ;
  • Connectez le module Bluetooth HC-06 (HC-05) au connecteur à 4 broches avec les mots "Bluetooth" sur le blindage TFT ;
  • Connectez l'adaptateur secteur 6-12 V à l'entrée d'alimentation de la carte Arduino UNO.

Après la mise sous tension, l'écran du bouclier TFT doit devenir rouge. Cela signifie la volonté de recevoir des commandes du téléphone Android.

Démonstration

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

  • Lancer l'ArduinoTFT application sur le téléphone Android ;
  • Tournez le téléphone en position horizontale ;
  • Activez la connexion Bluetooth, sélectionnez le module Bluetooth détecté (HC-06) ;

Deux fenêtres et quatre boutons doivent apparaître à l'écran :

  • La fenêtre en haut à droite est la fenêtre du viseur de l'appareil photo du téléphone ;
  • Grande fenêtre de gauche :images reçues ou envoyées.

Fonctions des boutons :

  • Transférer une seule image du téléphone Android vers Arduino ;
  • Transfert continu d'images du téléphone Android vers Arduino ;
  • Transférer une seule image d'Arduino vers un téléphone Android ;
  • Transfert continu d'images d'Arduino vers un téléphone Android.

La taille de l'image est de 320x240 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) Bouclier TFT unique pour Arduino Uno - Démarrer,

2) Blindage Arduino TFT unique - Came OV7670.

Articles suivants :

3) Blindage TFT pour Arduino Nano - Démarrer,

4) Photos et vidéo RVB sur écran TFT SPI.

5) Contrôle par Smartphone 4WD Robot Car via Bluetooth.

Mise à jour 01.04.2021 :

Rebonjour! Il existe une bibliothèque mise à jour pour une série d'écrans, qui se compose actuellement de deux boucliers et de deux tableaux de répartition. Le croquis est compilé en fonction de la version choisie (de 1 à 4) et du type de microcontrôleur (MegaAVR ou ESP-32). Ajout de photos, exemples. Vous trouverez plus d'informations sur https://github.com/Ekaburg/EkaTFT.

Code

Bibliothèque pour écran TFT
http://github.com/YATFT/YATFT

Pièces et boîtiers personnalisés

Expérimentez avec OV7670 et télécommande TV Expérience avec caméra OV7670 et télécommande TV

Processus de fabrication

  1. Appareil photo
  2. Objectif de la caméra
  3. Lecteur de livres BrickPi
  4. Robot Raspberry Pi contrôlé par Bluetooth
  5. Curseur de caméra motorisé Arduino contrôlé par Bluetooth
  6. Arduino avec Bluetooth pour contrôler une LED !
  7. Appareils Bluetooth à commande vocale avec OK Google
  8. Caméra de surveillance à distance mobile
  9. Un système de détection de chute basé sur Arduino, Windows et Azure