Forum Arduino
Forum Arduino
Forum Arduino
Sujet: [RÉSOLU] Problème avec le module de caméra OV7670 (lu 16470 fois)
matanbright
17 mars 2018 à 19h02 Dernière édition : 02 avril 2018 à 11h09 par matanbright
Bonjour,
http://www.instructables.com/id/OV7670-Without-FIFO-Very-Simple-Framecapture-With-/
https://forum.arduino.cc/index.php?topic=159557.0
https://create.arduino.cc/projecthub/tech-duino/visual-capturing-with-ov7670 -on-arduino-069ebb
Ces tutoriels sont pour l'Arduino UNO et j'ai changé les valeurs DDRx, PORTx et PINx afin qu'il
corresponde aux broches de l'Arduino MEGA, mais cela ne fonctionne pas!
Je pense que le module de caméra est faux, car il ne ressemble pas aux images d'Internet:
#1
20 mars 2018, 20h50 Dernière édition : 20 mars 2018, 20h52 par falexandru
Je ne l'ai pas dé-scellé pour le moment (prévu pour une étape ultérieure du projet). Mais je l'ai apporté
d'une source commerciale réputée et fiable dans mon pays. Donc, d'après l'apparence, celui de l'image
de droite est le même que celui que j'ai,
Qu'entendez-vous par «ne fonctionne pas»? Le code ne compile pas? La caméra n'envoie rien au
tableau?
Je n'ai aucune idée de la caméra en tant que telle, mais souvent, j'ai mal câblé ou les cavaliers ne sont
pas en contact.
matanbright
#2
La caméra est connectée aux broches Arduino SCL et SDA, et les communications avec les registres de
caméra se font via le protocole I2C.
Autant que je sache, la caméra communique via le protocole SCCB, qui peut être implémenté via le
protocole I2C.
2) L'Arduino envoie un octet représentant l'ID du registre dont on souhaite modifier sa valeur.
Code: [Sélectionner]
Wire.beginTransmission(0x42);
Wire.write(registerId);
Wire.write(registerValue);
Wire.endTransmission();
2) L'Arduino envoie un octet représentant l'ID du registre dont on veut lire sa valeur.
Code: [Sélectionner]
Wire.beginTransmission(0x42);
Wire.write(registerId);
Wire.endTransmission();
Wire.requestFrom(0x43, 1);
return Wire.read();
Selon la fiche technique OV7670, les adresses esclaves de la caméra sont: 0x42 pour l'écriture et 0x43
pour la lecture. Mais lorsque j'essaye de lire une valeur dans un registre, la caméra ne répond pas à la
demande.
J'envoie à la caméra l'identifiant du registre Je veux lire sa valeur, mais la caméra ne me renvoie pas la
valeur.
J'ai essayé d'exécuter un code qui essaie toutes les adresses possibles pour les périphériques I2C et
imprime si une adresse démarre une connexion avec succès, mais aucune adresse n'a démarré une
connexion, cela signifie qu'il y a un problème avec la connexion I2C de l'appareil photo avec l'Arduino .
#3
28 mars 2018 17:13 Dernière édition : 31 mars 2018 à 11:19 par matanbright
Maintenant, je peux modifier les registres de la caméra et je peux prendre des photos et des vidéos de
la caméra avec mon Arduino MEGA sans aucun problème!
Au début cela n'a pas fonctionné pour moi parce que j'ai essayé un code qui était pour l'Arduino UNO,
j'ai donc oublié de changer certains des noms et valeurs des registres afin qu'ils soient compatibles avec
l'Arduino MEGA (je veux dire Registres DDRx, PORTx et PINx) et en plus, l'Arduino MEGA a des broches
différentes associées à chaque minuterie PWM donc j'ai oublié de changer la broche pour qu'elle soit
compatible avec la minuterie utilisée dans le code (je veux dire aux registres OCRxA les broches
associées).
Ensuite, j'ai eu des problèmes de communication avec les registres de la caméra. Je n'ai pas pu
communiquer avec les registres car j'ai utilisé l'adresse d'écriture (0x42) et l'adresse de lecture (0x43) de
la caméra dans les fonctions "Wire.beginTransmitting" et "Wire.requestFrom". Ces adresses contiennent
le bit de lecture / écriture pour l'I2C:
Mais les fonctions I2C ont besoin de l'adresse sans le bit de lecture / écriture car elles gèrent
automatiquement les adresses de lecture / écriture.
Donc, si nous décalons les bits des adresses de lecture / écriture vers la droite une fois (1000010 >> 1),
nous obtiendrons l'adresse sans le bit de lecture / écriture: 0x21 (1000010 >> 1 = 0100001).
Donc, lorsque j'écris l'adresse 0x21 dans les fonctions I2C, cela fonctionne!
Code: [Sélectionner]
Wire.beginTransmission(0x21);
Wire.requestFrom(0x21, 1);
Veuillez noter que la caméra a besoin d'un signal PWM à la broche de l'horloge maître (MCLK ou XCLK)
même pour la communication via l'I2C avec l'Arduino. Sans le signal d'horloge maître, la caméra ne
fonctionnera pas du tout! Pour cette raison, lorsque j'ai essayé le code qui essaie toutes les adresses
possibles pour les périphériques I2C, même lorsqu'il a essayé l'adresse 0x21, la communication n'a pas
fonctionné!
zoomx
#4
matanbright
#5
29 mars 2018, 22h29 Dernière édition : 31 mars 2018, 21h35 par matanbright
L'esquisse sert à capturer des images en niveaux de gris (car c'est plus facile).
Pour recevoir des images, vous devrez installer le logiciel à partir de l'un des tutoriels du premier
message.
Code: [Sélectionner]
// Pins configurations:
// SDA/SIOD ---> pin A4 (for Arduino UNO) | pin 20/SDA (for Arduino MEGA)
// SCL/SIOC ---> pin A5 (for Arduino UNO) | pin 21/SCL (for Arduino MEGA)
// MCLK/XCLK --> pin 11 (for Arduino UNO) | pin 10 (for Arduino MEGA)
// D0 ---------> pin A0
// D1 ---------> pin A1
// D2 ---------> pin A2
// D3 ---------> pin A3
// D4 ---------> pin 4
// D5 ---------> pin 5
// D6 ---------> pin 6
// D7 ---------> pin 7
#include <Wire.h>
// Definitions of functions for manipulating the Arduino boards pins according to each Arduino board
registers, so the code will work for both Arduino UNO and Arduino MEGA:
// The only change is the connections of the SDA/SIOD, SCL/SIOC and MCLK/XCLK pins to each board
(see the pins configurations above).
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // If you are using Arduino
MEGA the IDE will automatically define the "__AVR_ATmega1280__" or "__AVR_ATmega2560__"
constants.
#elif defined(__AVR_ATmega328P__) // If you are using Arduino UNO the IDE will automatically define
the "__AVR_ATmega328P__" constant.
#endif
void initializePWMTimer() {
cli();
OCR2A = 0;
sei();
Wire.beginTransmission(CAMERA_ADDRESS);
Wire.write(registerId);
Wire.endTransmission();
Wire.requestFrom(CAMERA_ADDRESS, 1);
delay(1);
return registerValue;
}
void writeCameraRegister(byte registerId, byte registerValue) {
Wire.beginTransmission(CAMERA_ADDRESS);
Wire.write(registerId);
Wire.write(registerValue);
Wire.endTransmission();
delay(1);
Serial.print("*RDY*"); // send to the frame capture software a "start of frame" message for beginning
capturing
delay(1000);
cli(); // disable all interrupts during frame capture (because it needs to be as fast as possible)
while (frameHeight--) {
tempWidth = frameWidth;
while (tempWidth--) {
UDR0 = byteToWrite; // send data via serial connection with UART register (we need to use the serial
register directly for fast transfer)
// ignore each second byte (for a grayscale image we only need each first byte, which represents
luminescence)
delay(1000);
void setup() {
initializePWMTimer();
Wire.begin();
Serial.begin(1000000); // the frame capture software communicates with the Arduino at a baud rate of
1MHz
}
void loop() {