Bonjour,
Je cherche à comprendre comment fonctionne l'Arducam (modèle que je possède OV2640 2MP+) pour pouvoir récupérer l'image prise par l'Arducam, l'envoyé via une liaison série et la récupéré ensuite.
La finalité serait d'avoir une application mobile qui affiche l'image prise. L'utilisateur aura à ce moment l'opportunité d'enregistrer la photo. J'utilise un arduino Uno r3.
(Ce n'est pas un sujet de bac ou d'examen. Au cas où, je préfère le préciser. Je pourrai préciser le contexte si besoin.)
Est-ce que c'est réalisable ? Je pense que oui.
-Si on oublie la partie bluetooth et qu'on souhaite juste l'afficher sur un pc : je ne vois pas en quoi c'est non-réalisable. Arducam a une application qui fait cela.
-Avec la partie bluetooth : toujours aucun problème (à mes yeux, mais je suis très très loin d'être un pro en informatique), la donnée est envoyé avec une liaison série, à mon sens c'est faisable avec le bluetooth. (Mais ça, c'est pour plus tard.)
Je vais présenter les morceaux de code qui m'intéresse. Pour demander la capture de l'image :
if (start_capture == 1)
{
myCAM.flush_fifo();
myCAM.clear_fifo_flag();
//Start capture
myCAM.start_capture();
start_capture = 0;
}
if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))
{
Serial.println(F("ACK CMD CAM Capture Done.END"));
delay(50);
read_fifo_burst(myCAM);
//Clear the capture done flag
myCAM.clear_fifo_flag();
}
Explication (de ce que j'ai compris en fouillant les datasheets, mais également les librairies) :
-start_capture : est une variable que le programme va mettre à 1 quand il détecte un appuie sur le bouton "capture" de l'application,
- .flush_fifo() et .clear_fifo_flag() font la même chose : on envoie le bit qu'il faut pour clear le FIFO write done flag.
- .start_capture() : on demande le début de la capture
-myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK) quand la capture est finie, le CAP_DONE_MASK est un bit à 1.
ça, c'est que je suis presque sûr de comprendre correctement.
La fonction qui doit permettre de récupérer les données de l'image est "read_fifo_burst()" et elle me pose de gros problème d'analyse et de compréhension.
uint8_t read_fifo_burst(ArduCAM myCAM)
{
uint8_t temp = 0, temp_last = 0;
uint32_t length = 0;
length = myCAM.read_fifo_length();
Serial.println(length, DEC);
if (length >= MAX_FIFO_SIZE) //512 kb
{
Serial.println(F("ACK CMD Over size.END"));
return 0;
}
if (length == 0 ) //0 kb
{
Serial.println(F("ACK CMD Size is 0.END"));
return 0;
}
myCAM.CS_LOW();
myCAM.set_fifo_burst();//Set fifo burst mode
temp = SPI.transfer(0x00);
length --;
while ( length-- )
{
temp_last = temp;
temp = SPI.transfer(0x00);
if (is_header == true)
{
Serial.write(temp);
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
Serial.println(F("ACK CMD IMG END"));
Serial.write(temp_last);
Serial.write(temp);
}
if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
break;
delayMicroseconds(15);
}
myCAM.CS_HIGH();
is_header = false;
return 1;
}
Je pense que cette fonction écrit dans le port série (c'est peut-être très mal dit, j'en suis désolé si c'est le cas) les octets relatives à l'image, petit à petit. Et je pense que la partie qui fait ça est plus spécifiquement :
temp_last = temp;
temp = SPI.transfer(0x00);
if (is_header == true)
{
Serial.write(temp);
}
else if ((temp == 0xD8) & (temp_last == 0xFF))
{
is_header = true;
Serial.println(F("ACK CMD IMG END"));
Serial.write(temp_last);
Serial.write(temp);
}
Ce que je ne comprend c'est que faire après ça.
En théorie, j'imagine que j'ai les données de l'image. Qui est au format choisi, qui est à la dimension choisi.
Ce qu'il me reste à faire, c'est donc de pouvoir "reconstruire" l'image pour l'afficher. Pour tester et vérifier que je comprends bien comment ça se produit.
Après, je pense utiliser le port série pour transmettre les données de l'image via bluetooth et refaire le travail de reconstruction sur une application.
Mes questions sont les suivantes :
-Premièrement, est-ce que mon analyse vous parait correcte ou défaillante ?
-Est-ce que l'idée de petit projet vous parait possible ? Si non, pouvez-vous m'expliquer en quoi ce n'est pas faisable ?
-J'ai dû mal à formuler exactement et explicitement ce qui me pose problème. J'espère que c'est clair et compréhensible. Est-ce que vous avez une idée de ce que je pourrai faire pour récupérer l'image ?
J'ai essayé de lire les données dans le moniteur série pour voir ce qu'il envoie réellement. A mon sens, je dois avoir des messages pour dire que la capture est lancée, puis finie, puis une suite d'octet. Sauf que je ne vois que les phrases envoyées avec "serial.println()" et pas les octets envoyés avec "serial.write()". Je ne vois que des symboles.
Le github : ArduCAM (Lee) · GitHub