Taula de continguts:

Càmera ZYBO OV7670 amb control panoràmic / inclinable: 39 passos (amb imatges)
Càmera ZYBO OV7670 amb control panoràmic / inclinable: 39 passos (amb imatges)

Vídeo: Càmera ZYBO OV7670 amb control panoràmic / inclinable: 39 passos (amb imatges)

Vídeo: Càmera ZYBO OV7670 amb control panoràmic / inclinable: 39 passos (amb imatges)
Vídeo: Powerful Alternative to ESP32 CAM | Realtek AMB82-Mini IoT AI Camera Board - Getting Started 2024, Juliol
Anonim
Image
Image
Càmera ZYBO OV7670 amb control de panoràmica / inclinació
Càmera ZYBO OV7670 amb control de panoràmica / inclinació

Comenceu al primer pas per obtenir informació detallada sobre la creació d’un controlador PWM servo de 2 eixos.

Comenceu pel diagrama de blocs massiu (pas 19) per al projecte complet.

Configuració de càmera + panoràmica / inclinació que hem utilitzat:

El PmodCON3 de Digilent es va utilitzar per connectar els servos.

Pas 1: crear un mòdul PWM: fitxer font

Pas 2: Construir un mòdul PWM: configuració de Vivado

Construint un mòdul PWM: configuració de Vivado
Construint un mòdul PWM: configuració de Vivado

En primer lloc, descarregueu el lloc web Vivado Design Suite From Xilinx. Instal·leu tota la suite de disseny, inclòs el kit de desenvolupament de programari (SDK) de Vivado. Aquest projecte utilitza la versió 2017.2.

Mentrestant, Digilent Adept 2 també s’hauria d’instal·lar com a controlador de placa Zybo.

Pas 3: Construir un mòdul PWM: crear un fitxer de projecte

Construir un mòdul PWM: crear un fitxer de projecte
Construir un mòdul PWM: crear un fitxer de projecte

Abans de crear un fitxer de projecte, assegureu-vos que ja heu instal·lat correctament el fitxer Zybo com a tutorial aquí:

Versió Vivado 2015.1 i posterior Instal·lació de fitxers de placa

Obert Vivado 2017.2. A l’inici ràpid, feu clic a Crea projecte -> Següent -> Nom del projecte (anomeneu aquí el nom del vostre projecte) -> Tipus de projecte. A Tipus de projecte, seleccioneu Projecte RTL i marqueu "No especifiqueu fonts en aquest moment". A continuació, per a la part per defecte, seleccioneu "Taulers" i "Zybo" com a nom visible. A continuació, feu clic a Finalitza per iniciar el projecte.

Pas 4: Construir un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (I)

Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (I)
Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (I)

A Flow Navigator, feu clic a "" Crea un disseny de blocs "i, a continuació, premeu D'acord. feu clic al signe "+" per afegir les adreces IP necessàries. Afegeix:

  • Un sistema de processament ZYNQ7 amb dos temporitzadors AXI
  • Dos temporitzadors AXI

Pas 5: Construir un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (II)

Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (II)
Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (II)

Després d'afegir IP, executeu l'automatització de blocs i l'automatització de la connexió. Un cop finalitzada l'automatització, al bloc “axi_timer_0”, feu clic amb el botó dret a pwm0 -> Fes extern. Anomeneu el pin extern pwm0 com pwm_Xaxis. A més, repeteix el procés anterior al bloc "axi_timer_1" i posa el nom del pin extern pwm0 com a pwm_Zaxis.

Pas 6: Construir un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (III)

Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (III)
Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (III)

Tingueu en compte que cada vegada que acabem el disseny de blocs a Vivado, hem de crear un embolcall HDL. Ja que serà el mòdul de nivell superior per a cada projecte.

Pas 7: Construir un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (IV)

Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (IV)
Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (IV)

Ara, hem de configurar el nostre fitxer de restriccions per assignar pins connectats al nostre diagrama de blocs. Tanqueu la finestra Disseny de blocs, a la pestanya Fonts, "Afegeix fonts" -> Afegiu o creeu restriccions-> afegiu el Zybo-Master.xdc com a fitxers de restricció.

Pas 8: Construir un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (V)

Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (V)
Creació d'un mòdul PWM: disseny de blocs i configuració de fitxers de restricció (V)

Obriu el fitxer de restriccions Zybo-Master.xdc de la carpeta Constraints, descomenteu els ports que volem especificar com a senyals de sortida i canvieu el nom de "get_ports {XXXX}", que XXXX designa el pin extern anomenat al diagrama de blocs. La configuració del fitxer de restricció es mostra a la figura.

Pas 9: Construir un mòdul PWM: instal·lació de maquinari

Construir un mòdul PWM: instal·lació de maquinari
Construir un mòdul PWM: instal·lació de maquinari

Connecteu els servomotors al Pmod CON3. TowerPro SG90 és el model de servomotor que hem utilitzat en aquest projecte. Per als cables del servomotor, el cable taronja representa el senyal PWM, connectat al pin SIG del Pmod CON3. El cable vermell Vcc és un cable d'alimentació connectat al pin VS del Pmod CON3. Finalment, el fil marró Gnd és un fil de terra connectat al pin GND. A continuació, inseriu el Pmod CON3 a la fila superior del port JD a la placa Zybo.

Pas 10: Construir un mòdul PWM: genera bitstream i llança l'SDK

1. A la pestanya Project Navigator, executeu Generate BitStream.

2. Exporteu maquinari: Fitxer> Exporta> Exporta maquinari-> marqueu a "inclou bitstream" -> D'acord 3. Inicieu l'SDK: Fitxer -> Inicieu l'SDK.

Pas 11: Creació d'un mòdul PWM: creeu una nova aplicació a l'SDK de Xilinx

Creació d'un mòdul PWM: creeu una nova aplicació a l'SDK de Xilinx
Creació d'un mòdul PWM: creeu una nova aplicació a l'SDK de Xilinx

Creeu una aplicació nova:

Fitxer> Nou> Projecte d'aplicació -> Introduïu el nom del vostre projecte -> Finalitza

A Project Explorer, hi hauria d’haver tres carpetes.

En aquest cas, "design_1_wrapper_hw_platform_0" és la carpeta exportada anteriorment per Vivado. Axis_2_PWM_SDK_bsp és la carpeta de paquets de suport de la placa. I Axis_2_PWM_SDK és la nostra carpeta principal del projecte a l’SDK. Podeu veure el fitxer "helloworld.c" a la carpeta "src" d'Axis_2_PWM_SDK, on "helloworld.c" és el fitxer principal.

Pas 12: construcció d'un mòdul PWM: visió general de l'Explorador de projectes (I)

Creació d'un mòdul PWM: visió general de l'Explorador de projectes (I)
Creació d'un mòdul PWM: visió general de l'Explorador de projectes (I)

Consulteu alguns fitxers a Project Explorer. Primer, a la carpeta "design_1_wrapper_hw_platform_0", obriu el "system.hdf". Aquest fitxer mostra el mapa d'adreces del processador ps7_cortex9 i els blocs IP presents al nostre disseny.

Pas 13: construcció d'un mòdul PWM: visió general de l'Explorador de projectes (II)

Creació d'un mòdul PWM: visió general de l'Explorador de projectes (II)
Creació d'un mòdul PWM: visió general de l'Explorador de projectes (II)

A continuació, comproveu els fitxers "inclou" i "libsrc" a la carpeta "Axis_2_PWM_SDK_bsp". Els fitxers de biblioteca aquí ens permeten interactuar amb perifèrics de maquinari sense "reproduir" registres.

Pas 14: construcció d'un mòdul PWM: visió general de l'Explorador de projectes (III)

Creació d'un mòdul PWM: visió general de l'Explorador de projectes (III)
Creació d'un mòdul PWM: visió general de l'Explorador de projectes (III)

A través de la documentació BSP, xtmrctr.h es troba com una biblioteca de control del temporitzador Xilinx relacionada amb el temporitzador AXI. Normalment, aquí podríem trobar la funció PWM desitjada. Tanmateix, si llegiu la documentació "tmrctr_v4_3", es mostra que el controlador actualment no admet l'operació PWM del dispositiu. A causa de la deficiència de la funció PWM, hem de completar la nostra funció PWM amb l'ajut de xtmrctr.h i AXI Timer v2.0 LogiCORE IP Product Guide.

Pas 15: construcció d'un mòdul PWM: funció PWM de recopilació (I)

Creació d'un mòdul PWM: funció PWM de recopilació (I)
Creació d'un mòdul PWM: funció PWM de recopilació (I)

De nou al fitxer principal "helloworld.c", incloeu els fitxers de capçalera següents:

Pas 16: construcció d'un mòdul PWM: funció PWM de recopilació (II)

Construir un mòdul PWM: funció PWM de terminació (II)
Construir un mòdul PWM: funció PWM de terminació (II)

Definiu les adreces base de dos AXI TImer mitjançant "xparameters.h".

Pas 17: Construir un mòdul PWM: funció PWM de finalització (III)

Construir un mòdul PWM: funció PWM de finalització (III)
Construir un mòdul PWM: funció PWM de finalització (III)

Construïu la funció PWM desitjada.

Duty_val: converteix el valor del grau en cicle de treball. PWM_Freq_Duty: estableix la freqüència i el cicle de treball desitjats per generar PWM. També s’ha d’assignar el període de rellotge.

PWM_START: assigneu l'adreça del registre PWM i comenceu a generar PWM.

PWM_STOP: assigneu l'adreça del registre PWM i deixeu de generar PWM.

La resta de codi de demostració es mostra a "helloworld.c" a "Axis_2_PWM_SDK"

Pas 18: construir un mòdul PWM: feu-lo funcionar

1. Programa el FPGA mitjançant SDK

  • Connecteu la placa Zybo a través del port USB al PC.
  • Eines Xilinx -> Programa FPGA

2. Executeu el programa

Feu clic a la icona "Executa" i desplegueu el menú -> Executa com -> Inicia al maquinari

3. Terminal SDK

  • Obriu el terminal de l'SDK -> Connectar al port sèrie -> D'acord
  • Executeu el programa. Si el codi de demostració s'executa correctament, hauríeu de veure "Inicialització feta". al terminal SDK.

Pas 19: Streaming de processament de vídeo a Digilent ZYBO amb OV7670

S'adjunta l'arxiu d'arxiu complet.

Pas 20: completeu el diagrama de blocs

Diagrama de blocs complet
Diagrama de blocs complet

Es mostra el diagrama complet de totes les connexions i blocs IP del projecte

Pas 21: connecteu l'OV7670 al ZYBO

Connecteu l’OV7670 al ZYBO
Connecteu l’OV7670 al ZYBO

Creeu una connexió per connectar el mòdul ov7670 als ZYBO Pmods

Pmod de dades és Pmod D.

El control Pmod és Pmod C

A més, connecteu el PmodCON3 i els servos tal com s’especifica a la primera meitat d’aquest tutorial

Pas 22: Creeu disseny de blocs

Crea un disseny de blocs
Crea un disseny de blocs

A Flow Navigator, feu clic a "Crea disseny de blocs" i premeu D'acord.

Pas 23: afegiu fitxers VHDL per al control i la captura de la càmera OV7670

Afegiu al projecte els fitxers VHDL adjunts a aquest pas

Pas 24: Afegiu un fitxer de restriccions

Afegiu el fitxer de restriccions adjunt al vostre projecte.

Pas 25: afegiu IP Repo per a IP HLS

Afegir IP Repo per a IP HLS
Afegir IP Repo per a IP HLS

Agafeu el fitxer Zip adjunt i descomprimiu-lo a una nova carpeta anomenada de manera similar en un nou directori (carpeta) anomenat "HLS_repo".

Afegiu un dipòsit d'IP al vostre projecte anant al catàleg d'IP i fent clic amb el botó dret seleccionant "Afegeix un dipòsit …"

Aneu al directori "HLS_repo" i seleccioneu-lo.

Opcional: creeu el bloc de processament de vídeo HLS.

Pas 26: afegiu mòduls i IP

Afegiu mòduls i IP
Afegiu mòduls i IP
Afegiu mòduls i IP
Afegiu mòduls i IP

Afegiu els mòduls ov7670_axi_stream_capture, debounce i ov7670_controller al diagrama de blocs fent clic dret al fons i seleccionant "Afegeix mòdul …"

De la mateixa manera, afegiu les adreces IP:

  • HLS_Video_Track
  • Escriptura de memòria intermèdia de vídeo
  • Lectura de memòria intermèdia de vídeo
  • Controlador de sincronització de vídeo
  • AXI4-Stream a sortida de vídeo
  • 3 de "llesca"
  • Constant
  • 2 del temporitzador AXI

Pas 27: paràmetres de configuració d'IP

Configuració de la configuració IP
Configuració de la configuració IP
Configuració de la configuració IP
Configuració de la configuració IP
Configuració de la configuració IP
Configuració de la configuració IP

Com es mostra a les imatges

Pas 28: afegiu i configureu el bloc IP de PS

Afegir i configurar el bloc IP de PS
Afegir i configurar el bloc IP de PS
Afegir i configurar el bloc IP de PS
Afegir i configurar el bloc IP de PS

Afegiu el sistema de processament ZYNQ7 al diagrama de blocs

editeu la configuració:

  • Configuració PS-PL

    • HP

      • Activa S HP 0
      • Activa S HP 1
  • Configuració del rellotge

    • Rellotges de tela PL

      • FCLK_0 a 100 MHz
      • FCLK_1 a 25 MHz (OutputClock)
      • FLCK_2 a 35 MHz (<= 50 MHz) (CameraClock)

Pas 29: Part 1. Construir un mòdul PWM per a servomotors

Traieu axi_timer_0 pwm0 al nou port de sortida pwm_Xaxis

Traieu axi_timer_1 pwm0 al nou port de sortida pwm_Zaxis

Pas 30: connexions laterals d'entrada de vídeo (aclk ressaltat)

Connexions laterals d'entrada de vídeo (aclk ressaltat)
Connexions laterals d'entrada de vídeo (aclk ressaltat)

Connecteu correctament els blocs IP del costat d’entrada de vídeo

(* aquestes connexions haurien de crear-se seleccionant les opcions adequades durant l'automatització de la connexió) "aclk" de la captura axi_stream_ va a:

  • ap_clk a l'escriptura de memòria intermèdia del marc de vídeo
  • ap_clk al bloc de processament de flux de vídeo HLS
  • * Feu clic a IP AXI smartconnect des de la memòria intermèdia del marc de vídeo Escriviu al S_AXI_HP0
  • * aclk corresponent als canals de l'IP d'interconnexió AXI per als canals S_AXI del bloc de processament de vídeo HLS i la memòria intermèdia del marc de vídeo escriu S_AXI_HP0_ACLK al bloc PS

El senyal de transmissió de vídeo simplement es connecta en sèrie des del bloc de captura a la interfície de memòria Zynq.

  • El vídeo passa del bloc de captura al bloc de processament HLS.
  • El vídeo processat del bloc HLS es dirigeix al bloc d’escriptura de memòria intermèdia de fotogrames.
  • * El bloc d'escriptura de memòria intermèdia de marcs es connecta a la interfície HP0 del bloc Zynq PS.
  • El senyal m_axis_tuser de la sortida del bloc de captura es connecta manualment al senyal d'entrada video_in_TUSER del bloc de processament HLS i al senyal ap_start del mateix bloc.

El senyal TUSER (tuser) l’utilitza el protocol de flux de vídeo AXI per indicar l’inici d’un fotograma del vídeo. AP_Start indica al bloc HLS que comenci a processar. Per tant, fem servir el tuser per activar el bloc HLS per processar cada fotograma tal com es fa. entra. Quan es connecta un senyal únic d'un autobús i es divideix d'aquesta manera, cal connectar-lo també al punt de finalització normal de la resta del bus. Vivado assumeix que, si esteu connectant el senyal manualment, voleu desconnectar a què es connectaria normalment.

Configuració dels blocs IP:

Escriptura de memòria intermèdia de marcs de vídeo:

Formats de vídeo: RGB8

1 mostra per rellotge Màxima de columnes: 1280 (> = 640) Màxima fila: 960 (> = 480) Amplada màxima de dades: 8

Pas 31: connexions a OV7670

Connexions a OV7670
Connexions a OV7670

Al bloc ov7670_axi_stream_capture

  • Feu que totes les entrades siguin externes (feu clic amb el botó dret a un pin i seleccioneu al menú o feu clic esquerre-> ctrl + T)
  • Deixeu els noms tal com són

Al bloc ov7670_controller

  • Feu que totes les sortides del bloc siguin externes
  • Canvieu el nom del port config_finished a led0
  • connect clk al CameraClock (<= 50 MHz) (FCLK_2)

Al bloc de rebounce

  • connecteu l’entrada button1 a un port d’entrada extern anomenat btn0
  • connecteu l’out1 a la línia de reenviament del bloc IP ov7670_controller
  • connecteu l’entrada button2 a un port d’entrada extern anomenat btn3
  • connecteu out2n a l'entrada ext_reset_in a la IP de reinici del sistema del processador per al domini del rellotge de captura de vídeo. (* Pot ser que calgui fer-ho després de generar aquesta IP *)
  • connect clk al CameraClock (<= 50 MHz) (FCLK_2)

Pas 32: connexions a la sortida de vídeo

Connexions a la sortida de vídeo
Connexions a la sortida de vídeo
Connexions a la sortida de vídeo
Connexions a la sortida de vídeo
Connexions a la sortida de vídeo
Connexions a la sortida de vídeo
Connexions a la sortida de vídeo
Connexions a la sortida de vídeo

Connexions per a blocs Video Timing Controller (VTC), AXI4-Stream to Video Out i talls

  • Utilitzeu un rellotge de 25 MHz (FCLK_1) per a vid_io_out_clk i VTC clk
  • Utilitzeu un rellotge de 100 MHz (FCLK_0) per acclk a AXI4-Stream to Video Out
  • vtiming_out a vtiming_in
  • Límit de memòria intermèdia de vídeo m_axis_video va a AXI4-Stream to Video Out video_in
  • vtg_ce va a gen_clken
  • Vincula clken VTC, aclken, vid_io_out_ce a Constant dout [0: 0]
  • Traieu vid_hsync i vid_vsync als ports de sortida externs vga_hs i vga_vs, respectivament. (no apareix a la foto)

Llesques:

  • Els talls s'han de configurar tal com es mostra a les imatges adjuntes

    • canvieu el nom dels blocs a slice_red, slice_green i slice_blue
    • configureu els intervals de la secció tal com es mostra a les imatges segons el nom del bloc
    • connecteu cada sortida de tall a una sortida de port extern com es mostra a la imatge.
  • vid_data [23: 0] es connecta a les entrades de cada segment (Din [23: 0])

Pas 33: executeu el bloc i l'automatització de la connexió

Executeu Block and Connection Automation
Executeu Block and Connection Automation
Executeu l’automatització de blocs i connexions
Executeu l’automatització de blocs i connexions
Executeu l’automatització de blocs i connexions
Executeu l’automatització de blocs i connexions

Executeu Block Automation per connectar les coses del bloc ZYNQ7 PS. Com mostra la imatge.

Executeu l'automatització de la connexió per crear tota la IP d'interconnexió. Preste molta atenció a totes les opcions de cada imatge.

Al bloc de rebounce, connecteu out2n al domini del rellotge de captura de vídeo Processador Restabliment del sistema entrada ext_reset_in.

Pas 34: generar embolcall HDL

Generar embolcall HDL
Generar embolcall HDL

Genereu l’embolcall HDL per al disseny del vostre bloc.

Establiu-lo com a mòdul superior.

Pas 35: generar Bitstream, exportar maquinari a SDK, iniciar SDK des de Vivado

Assegureu-vos d’incloure el flux de bits a l’exportació.

La generació de flux de bits pot trigar molt de temps.

A continuació, inicieu l'SDK

Pas 36: SDK (sense FreeRTOS)

SDK (sense FreeRTOS)
SDK (sense FreeRTOS)

Aquesta versió ho fa tot sense utilitzar FreeRTOS, condensant el codi molt bé.

Creeu un BSP autònom basat en el disseny de maquinari. Les opcions per defecte haurien d’estar bé. Assegureu-vos que s’hagin generat fonts BSP.

Creeu una aplicació tal com es mostra a la imatge. (aplicació buida)

Suprimiu la pàgina principal autogenerada i importeu els fitxers adjunts.

Pas 37: Implementació de FreeRTOS

Implementació de FreeRTOS
Implementació de FreeRTOS

Aquesta versió utilitza FreeRTOS. Crea un FreeRTOS901 BSP basat en el disseny del maquinari. Les opcions per defecte haurien d’estar bé. Assegureu-vos que s’hagin generat fonts BSP.

Creeu una aplicació tal com es mostra a la imatge. (aplicació buida)

Suprimiu la pàgina principal autogenerada i importeu els fitxers adjunts.

Pas 38: instruccions d'ús

Aquest projecte és una mica difícil d’executar. Seguiu els passos en ordre.

Assegureu-vos que el ZYBO no es carrega res quan s’encén. Això significa que el LED Fet no s'hauria d'encendre. Una manera de fer-ho és establir el pont d’origen d’arrencada a JTAG.

Obriu el projecte (FreeRTOS o no) que voleu programar des de l'SDK

  1. Enceneu el ZYBO. El LED Fet no s’ha d’encendre.
  2. Programa el FPGA amb el fitxer de bits. El LED Fet hauria d’encendre’s. El led0 no s’ha d’encendre.
  3. Executeu el codi (recordeu-vos de superar el punt d’interrupció inicial si ho feu).

En aquest punt hauríeu d’obtenir una sortida a la pantalla VGA.

Per reiniciar (si es produeix un error o qualsevol altra cosa): toqueu ràpidament el botó PS-SRST o apagueu el ZYBO i torneu-lo a encendre. Continueu des del pas 2.

Si atureu el processador amb el depurador, la càmera es mantindrà en lloc de moure’s. El flux de vídeo continuarà igualment.

Pas 39: referències i enllaços

Guies i documentació de referència Xilinx:

  • PG044: transmissió AXI a sortida de vídeo
  • PG278: lectura / escriptura de memòria intermèdia de vídeo

Altres enllaços:

  • Blog de Lauri: entrada VDMA
  • Blog de Lauri: sortida OV7670 a VGA mitjançant BRAM
  • Wiki Hamsterworks, de Mike Fields, la font original del codi OV7670
  • Full de dades que mostra les especificacions bàsiques de temps

Recomanat: