L’intégration d’une caméra comme la PTC06 avec un microcontrôleur Arduino pour capturer des images et les enregistrer sur une carte SD semble être un processus simple sur le papier. Cependant, dans la réalité, cela peut s’avérer être un défi de taille.
Ce tutoriel vise à démystifier cette procédure complexe en partageant notre expérience et les solutions adoptées, illustrant ainsi le parcours souvent tumultueux vers le succès.
Présentation de la Caméra PTC06
La Caméra PTC06, une caméra Jpeg Cmos, offre la capacité de prendre des photos (snapshots). Elle fonctionne via le protocole UART et peut être connectée à différents microcontrôleurs équipés d’un port UART.
Connexion avec Arduino et le Module Carte SD
L’intégration de la caméra PTC06 avec un Arduino Mega et un module carte SD nécessite une configuration précise.
Les détails de connexion, y compris les valeurs des résistances dans le diviseur de tension, sont cruciaux pour assurer un fonctionnement efficace de l’ensemble.
Programme et Étapes
La compréhension du fonctionnement de la caméra, en particulier des trames à envoyer, ainsi que l’extraction des données Jpeg représentant les images, étaient des défis majeurs.
Les nombreux programmes Arduino créés témoignent des étapes franchies pour atteindre le succès final.
Programme "GOD_HELP_ME_PLEASE"
Dans un élan de désespoir, le programme “GOD_HELP_ME_PLEASE” a été conçu et s’est avéré être la solution à nos problèmes.
Ce programme, élaboré par Christian Joseph le 03/09/2020, a été un tournant dans notre exploration de l’utilisation de la caméra PTC06 avec Arduino.
/*Programme: GOD_HELP_ME_PLEASE
Auteur: Christian Joseph
Date: 03/09/2020
www.eagle-robotics.com
*/
#include "SPI.h"
#include "SD.h"
byte ZERO = 0x00;
byte incomingbyte;
long int j=0,k=0,count=0,i=0x0000;
uint8_t MH,ML;
boolean EndFlag=0;
File myFile;
void SendResetCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x26);
Serial1.write(ZERO);
}
/*************************************/
/* Set ImageSize :
/* <1> 0x22 : 160*120
/* <2> 0x11 : 320*240
/* <3> 0x00 : 640*480
/* <4> 0x1D : 800*600
/* <5> 0x1C : 1024*768
/* <6> 0x1B : 1280*960
/* <7> 0x21 : 1600*1200
/************************************/
void SetImageSizeCmd(byte Size)
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x54);
Serial1.write(0x01);
Serial1.write(Size);
}
/*************************************/
/* Set BaudRate :
/* <1>¡¡0xAE : 9600
/* <2>¡¡0x2A : 38400
/* <3>¡¡0x1C : 57600
/* <4>¡¡0x0D : 115200
/* <5>¡¡0xAE : 128000
/* <6>¡¡0x56 : 256000
/*************************************/
void SetBaudRateCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x31);
Serial1.write(0x06);
Serial1.write(0x04);
Serial1.write(0x02);
Serial1.write(ZERO);
Serial1.write(0x08);
Serial1.write(0X2A);
Serial1.write(0xF2);
}
void SendTakePhotoCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x36);
Serial1.write(0x01);
Serial1.write(ZERO);
}
void SendReadDataCmd()
{
MH=i/0x100;
ML=i%0x100;
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x32);
Serial1.write(0x0c);
Serial1.write(ZERO);
Serial1.write(0x0a);
Serial1.write(ZERO);
Serial1.write(ZERO);
Serial1.write(MH);
Serial1.write(ML);
Serial1.write(ZERO);
Serial1.write(ZERO);
Serial1.write(ZERO);
Serial1.write(0x20);
Serial1.write(ZERO);
Serial1.write(0x0a);
i+=0x20;
}
void StopTakePhotoCmd()
{
Serial1.write(0x56);
Serial1.write(ZERO);
Serial1.write(0x36);
Serial1.write(0x01);
Serial1.write(0x03);
}
void setup()
{
Serial.begin(38400);
while (!Serial)
{
;
}
Serial.print("Initialisation carte SD...");
pinMode(53, OUTPUT);
if (!SD.begin(53))
{
Serial.println("initialisation KO!");
return;
}
Serial.println("initialisation reussie.");
Serial.println("Veuillez patienter ....");
Serial1.begin(115200);
delay(500);
SendResetCmd();
delay(2000);
SetBaudRateCmd();
delay(500);
Serial1.begin(38400);
delay(100);
}
void loop()
{
byte a[32];
int ii;
SendResetCmd();
delay(2000); //attente 2 à 3 secondes pour prendre la photo
SendTakePhotoCmd();
delay(1000);
while(Serial1.available()>0)
{
incomingbyte=Serial1.read();
}
myFile = SD.open("pic777.jpg", FILE_WRITE); //Nom de la photo à enregistrer
while(!EndFlag)
{
j=0;
k=0;
count=0;
//Serial1.flush();
SendReadDataCmd();
delay(20);
while(Serial1.available()>0)
{
incomingbyte=Serial1.read();
// Serial.print(incomingbyte);
k++;
delay(1);
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9)) //Donnée indiquant le photo terminée
{
EndFlag=1;
}
j++;
count++;
}
}
for(j=0;j