Caméra Bluetooth Arduino (ABC) : connecter votre téléphone via Bluetooth pour capturer des images
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Module Bluetooth HC-05 | 1 |
| Caméra OV7670 | 1 |
| Shield TFT Arduino | 1 |
À 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
- Taille 3,5" diagonale
- Résolution 320×240
- 65 536 couleurs (16 bits)
- Écran tactile résistif (contrôleur XPT2046)
- 5 boutons
- RTC DS1307 avec pile lithium 3 V CR1220
- Emplacement pour carte micro SD
- Connecteur 4 broches (2,54 mm) pour module Bluetooth HC-05 (-06) ou ESP8266 WiFi
- Connecteur 20 broches (2,54 mm) pour caméra OV7670
Liste des composants nécessaires

Matériel :
- Arduino UNO
- Shield TFT unique
- Adaptateur secteur AC-DC 6-12 V, >600 mA (obligatoire !) car le courant max de 500 mA de l'USB ne suffit pas pour le fonctionnement normal du shield TFT.
- Caméra OV7670
- Module Bluetooth HC-06 (ou HC-05)
- Téléphone Android
Logiciel :
- Arduino IDE
- Bibliothèque pour shield TFT unique
- Fichier APK pour téléphone Android
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 :
- Connectez le câble USB à l'Arduino UNO
- Lancez l'Arduino IDE sur l'ordinateur
- Sélectionnez le port correspondant à l'Arduino UNO
- Téléchargez le sketch de démonstration ArduinoBluetoothCamera.ino (et le fichier ov7670_regs.h pour l'initialisation de la caméra)
- Cliquez sur Téléverser
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









L'assemblage est assez simple :
- Connecter l'Arduino UNO et le shield TFT
- Connecter la caméra OV7670 au connecteur 20 broches du shield TFT (parfois j'utilise un connecteur coudé 18-20 broches pas 2,54 mm comme adaptateur)
- Connecter le module Bluetooth HC-06 (HC-05) au connecteur 4 broches marqué « Bluetooth » sur le shield TFT
- Connecter l'adaptateur secteur 6-12 V sur l'entrée d'alimentation de l'Arduino UNO
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






Effectuez les opérations suivantes sur le téléphone Android :
- Lancez l'application ArduinoTFT
- Mettez le téléphone en position horizontale
- Activez le Bluetooth, sélectionnez le module détecté (HC-06)
Deux fenêtres et quatre boutons apparaissent :
- Fenêtre en haut à droite : viseur de la caméra du téléphone
- Grande fenêtre de gauche : images reçues ou envoyées
Fonctions des boutons :
- Transférer une image unique du téléphone vers Arduino
- Transfert continu d'images du téléphone vers Arduino
- Transférer une image unique d'Arduino vers le téléphone
- Transfert continu d'images d'Arduino vers le téléphone
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 :
- Shield TFT unique pour Arduino Uno - Démarrage
- Shield TFT Arduino unique - Caméra OV7670
Prochains articles :
- Shield TFT pour Arduino Nano - Démarrage
- Photos et vidéo RGB sur écran SPI TFT
- 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
- Expérience avec OV7670 et télécommande TV
- Expérience avec caméra OV7670 et télécommande TV
Processus de fabrication
- L'Évolution et la Conception des Appareils Photo Modernes
- Comprendre les objectifs d'appareil photo : conception, histoire et innovations futures
- BrickPi Bookreader : Automatiser la lecture Kindle avec Raspberry Pi et LEGO Mindstorms
- Construire un robot Raspberry Pi piloté par Bluetooth avec retour audio
- Slider Motorisé pour Caméra Contrôlé par Bluetooth avec Arduino : Pour des Plans Cinématiques Fluides
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Appareils électroménagers à commande vocale : contrôle Bluetooth avec Google Assistant
- Système de surveillance mobile – Robot caméra Raspberry Pi/Arduino piloté par Android (MQTT, uv4l, Docker)
- Système avancé de détection de chutes avec Arduino, Windows IoT et Azure Cloud