7
votes

Arduino + ov7670 - Sans Fifo - Snapshot de lecture

Je sais qu'il y a beaucoup d'Internet ( http://forum.arduino.cc/index.php ? Topic = 159557.0 par exemple) À propos de OV7670 et j'ai beaucoup lu à ce sujet, mais il semble que quelque chose manque quelque chose.

Tout d'abord, j'ai pris un oeil sur la manière dont pouvons-nous lire pixel par pixel de la caméra Pour construire l'image rectangulaire 600 x 480, et cela était assez facile à comprendre en considérant HREF, Vsynch et Pclock décrit sur la documentation ici: http : //www.voti.nl/docs/ov7670.pdf . Je comprends xclock comme une entrée dont j'ai besoin pour donner à ov7670 comme un type de contrôleur de cycle et réinitialiser serait quelque chose à réinitialiser.

Donc, à ce stade, je pensais que la fonctionnalité de cette caméra serait couverte par Câblage des broches suivantes:

  • d0..d7 - pour les données (pixel) connectées aux broches numériques Arduino 0 à 7 comme entrée sur le tableau Arduino
  • xclk - pour une horloge de caméra connectée à l'épingle numérique Arduino 8 comme sortie de l'Arduino Board
  • pclk - pour pixel horloge connectée à Arduino Digital PIN 9 comme entrée sur le tableau Arduino
  • href - Pour définir lorsqu'une ligne démarre / extrémités connectées à Arduino Digital PIN 10 comme entrée sur Arduino Board
  • VESCH - Pour définir lorsqu'un cadre démarre / les extrémités connectées à Arduino Digital PIN 11 comme entrée sur le tableau Arduino
  • GRD - Groud connecté à Arduino GRD
  • 3v3 - 3,3 entrée connectée à Arduino 3,3V
  • réinitialiser - connecté à ARDUININO RESET
  • PWDN - connecté à Arduino GRD

    La mise en œuvre de cette approche de mon point de vue serait quelque chose comme: Code: xxx

    mon ReadpixelfromDatapins () En gros, lisez simplement le premier octet (comme je ne fais que tester si je peux même lire quelque chose de la caméra ), et il est écrit comme suit:

    code: xxx

    afin de vérifier si quelque chose est lu à partir de la caméra, je viens d'imprimer à La série 9600, l'octet lue des broches de données en tant que nombre. Mais actuellement, je ne reçois que des valeurs zéro. Le code que j'utilise pour récupérer une image est stocké ici: https://gist.github.com/franciscosospaeth/8503747.

    Quelqu'un a-t-il fait des œuvres OV7670 avec Arduino, trouvez-vous déjà ce que je fais mal? Je suppose que j'utilise la xclock à tort? Que dois-je faire pour le faire fonctionner?

    J'ai cherché beaucoup et je n'ai trouvé aucun SSCCE ( http: // SSCCE. Org / ) Pour cette caméra à l'aide de Arduino, si quelqu'un l'aime s'il vous plaît laissez-moi savoir.


    Cette question est présente sur l'Arduino Forum ( http://forum.arduino.cc/index.php?topic=211741.0 ) aussi.


0 commentaires

3 Réponses :


5
votes

Votre idée n'est pas mauvaise mais ... Le XClock doit être une horloge (dans votre programme est juste une transition de 0 à 1 et est gelée) Vous devez également utiliser I2C avec SIOC et diayez pour la configuration de la caméra (ou vous pouvez utiliser les paramètres par défaut, mais je ne suis pas sûr que le format de sortie est correct pour vous, le format 30F / S, VGA, YUV ....)

Votre exécution de code est plus lente à l'aide de la sortie série dans la même boucle avec les données de lecture Je vous recommanderai de basculer le code PIN XCLOCK et de déplacer l'impression de pixels dans un IF (). Vous ne pourrez également lire des données uniquement dans un moment très précis, si vous souhaitez lire un octet seulement, après une transition de 0 à 1 de HREF, vous devez attendre une nouvelle transition de 0 à 1 de PCLK (vous Sera en mesure de ne voir qu'une seule transition 0-1 de HREF après 784x2 Transitions de PCLK (640 pixels actifs + 144 morts pour chaque ligne) X 2 (pour YUV ou RVB sont 2 octets reçus pour chaque pixel))


0 commentaires

2
votes

Bonjour je suis M.arduino des forums Arduino. Votre problème est que vous lisez des pixels trop lents s'il vous plaît n'utilisez pas de lecture numérique pour faire une telle chose. En outre, si vous insistez sur l'utilisation d'une fonction distincte, simplement pour lire un octet, assurez-vous que la fonction est en cours d'inlinité. Vous pouvez le faire en déclarant votre fonction comme statique en ligne. Aussi comme mentionné ci-dessus, comment générez-vous l'horloge. Vous pouvez générer le XCLK à l'aide de PWM sur l'Arduino.

J'ai créé un exemple de travail ici: P>

https://github.com/computerernerd/arduino-camererner-tft/blob/master/captureImage.c p>

EDIT: Une tierce partie a copié une partie mais pas toutes forte> du code du lien ci-dessus dans la réponse ici. Cependant, le lien doit rester au fur et à mesure que le code affiché ci-dessous nécessite des fichiers supplémentaires de cette source pour fonctionner réellement. Edit 2: Suppression du code non pertinent. Vous devrez modifier ce que vous faites avec les données. P>

void capImg(void){
    cli();
    uint8_t w,ww;
    uint8_t h;
    w=160;
    h=240;
    tft_setXY(0,0);
    CS_LOW;
    RS_HIGH;
    RD_HIGH;
    DDRA=0xFF;
    //DDRC=0;
    #ifdef MT9D111
        while (PINE&32){}//wait for low
        while (!(PINE&32)){}//wait for high
    #else
        while (!(PINE&32)){}//wait for high
        while (PINE&32){}//wait for low
    #endif
    while (h--){
        ww=w;
        while (ww--){
            WR_LOW;
            while (PINE&16){}//wait for low
            PORTA=PINC;
            WR_HIGH;
            while (!(PINE&16)){}//wait for high
            WR_LOW;
            while (PINE&16){}//wait for low
            PORTA=PINC;
            WR_HIGH;
            while (!(PINE&16)){}//wait for high
            WR_LOW;
            while (PINE&16){}//wait for low
            PORTA=PINC;
            WR_HIGH;
            while (!(PINE&16)){}//wait for high
            WR_LOW;
            while (PINE&16){}//wait for low
            PORTA=PINC;
            WR_HIGH;
            while (!(PINE&16)){}//wait for high
        }

    }
    CS_HIGH;
    sei();
}


3 commentaires

@Xaverkapeller - S'il vous plaît soyez plus prudent dans la modification. Vous avez remplacé un lien vers un référentiel de travail avec le contenu d'un seul des fichiers.


@Chrisstratton Je n'ai pas retiré le lien, je viens de le déplacer vers le bas. Et il a lié à un seul fichier pour que j'ai copié son contenu ici.


J'avoue que j'étais un peu paresseux en publiant juste un lien de mon référentiel. Tout le code dont vous avez besoin est à Caplimg (). Vous devrez le modifier pour votre demande. L'essentiel est que je désactive des interruptions à l'aide de CLI () et de ne pas utiliser digitalRead pour obtenir les données et que j'utilise la cartographie du port.



0
votes

Vous pouvez utiliser mes instructions: Comment récupérer l'image de ov7670 Il contient toutes les étapes dont vous avez besoin. Il y a aussi de l'instruction à la configuration CadreGrabber: Comment exécuter Framegrabber


2 commentaires

J'ai travaillé sur ce problème et j'ai vu des liens vers votre blog à plusieurs endroits. Vous devriez vraiment le traduire en anglais. La seule chose que je peux comprendre est le code, mais même que j'ai beaucoup de questions sur ...


Il y a une version traduite sur les instructables.