INHOUDSOPGAWE:

ZYBO OV7670 -kamera met pan-/kantelbediening: 39 stappe (met foto's)
ZYBO OV7670 -kamera met pan-/kantelbediening: 39 stappe (met foto's)

Video: ZYBO OV7670 -kamera met pan-/kantelbediening: 39 stappe (met foto's)

Video: ZYBO OV7670 -kamera met pan-/kantelbediening: 39 stappe (met foto's)
Video: Camera Tracking 2024, Julie
Anonim
Image
Image
ZYBO OV7670 -kamera met pan-/kantelbeheer
ZYBO OV7670 -kamera met pan-/kantelbeheer

Begin by stap een vir meer inligting oor die skep van 'n 2-as servo PWM-beheerder.

Begin by die massiewe blokdiagram (Stap 19) vir die volledige projek.

Opstelling van kamera + pan/kantel wat ons gebruik het:

Die PmodCON3 van Digilent is gebruik om die servo's aan te sluit.

Stap 1: Bou 'n PWM-module- Bronlêer

Stap 2: Bou 'n PWM-module- Vivado-opstelling

Bou 'n PWM-module- Vivado-opstelling
Bou 'n PWM-module- Vivado-opstelling

Laai eers die Vivado Design Suite From Xilinx -webwerf af. Installeer al die ontwerppakkette, insluitend Vivado Software Development Kit (SDK). Hierdie projek gebruik die weergawe 2017.2.

Intussen moet Digilent Adept 2 ook as 'n Zybo -bestuurder geïnstalleer word.

Stap 3: Bou 'n PWM-module- Skep 'n projeklêer

Bou van 'n PWM-module- Skep 'n projeklêer
Bou van 'n PWM-module- Skep 'n projeklêer

Voordat u 'n projeklêer skep, moet u seker maak dat u die Zybo -lêer reeds behoorlik geïnstalleer het as die tutoriaal hier:

Vivado Weergawe 2015.1 en latere bordlêerinstallasie

Open Vivado 2017.2. Klik op 'n vinnige begin op Skep projek -> Volgende -> Projeknaam (noem u projeknaam hier) -> Projek tipe. Kies op Projektipe RTL -projek en merk op "Moenie bronne spesifiseer nie". Kies dan vir die standaarddeel 'Boards' en 'Zybo' as vertoonnaam. Klik vervolgens op Voltooi om die projek te begin.

Stap 4: Bou 'n PWM-module- Blokontwerp en beperking van lêeropstelling (I)

Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (I)
Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (I)

Klik op Flow Navigator op "" Create Block Design "en druk dan op OK. klik op die "+" teken om die nodige IP's by te voeg. Voeg by:

  • Een ZYNQ7 -verwerkingstelsel Twee AXI -timer
  • Twee AXI -timer

Stap 5: Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (II)

Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (II)
Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (II)

Nadat u IP's bygevoeg het, voer Block Automation en outomatiese verbinding uit. Sodra die outomatisering voltooi is, klik met die rechtermuisknop op die blok "axi_timer_0" op pwm0 -> Maak ekstern. Noem die eksterne pwm0 -pen as pwm_Xaxis. Herhaal ook die bogenoemde proses op die blok "axi_timer_1" en noem die eksterne pwm0 -pen as pwm_Zaxis.

Stap 6: Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (III)

Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (III)
Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (III)

Let op dat ons elke keer as ons die Block Design in Vivado voltooi het, 'n HDL Wrapper moet maak. Aangesien dit die module op die hoogste vlak vir elke projek sal wees.

Stap 7: Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (IV)

Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (IV)
Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (IV)

Nou moet ons ons beperkingslêer opstel om penne wat aan ons blokdiagram gekoppel is, toe te ken. Sluit die venster Blokontwerp, op die oortjie Bronne, "Voeg bronne by"-> Voeg of skep beperkings-> voeg die Zybo-Master.xdc by as ons beperkingslêers.

Stap 8: Bou 'n PWM-module- Blokontwerp en beperking van lêeropstelling (V)

Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (V)
Bou van 'n PWM-module- Blokontwerp en beperking van lêeropstelling (V)

Maak die beperkingslêer Zybo-Master.xdc oop in die gids Constraints, los die poorte wat ons wil spesifiseer as uitvoerseine, en hernoem die naam "get_ports {XXXX}", wat XXXX die eksterne pen aandui in die blokdiagram. Die instelling van die beperkingslêer word in die figuur getoon.

Stap 9: Bou 'n PWM-module- hardeware-installasie

Bou van 'n PWM-module- hardeware-installasie
Bou van 'n PWM-module- hardeware-installasie

Koppel die servomotors aan die Pmod CON3. TowerPro SG90 is die servomotormodel wat ons in hierdie projek gebruik het. Vir die servomotordrade verteenwoordig die oranje draad die PWM -sein, gekoppel aan die SIG -pen in Pmod CON3. Die rooi draad Vcc is 'n kragdraad wat gekoppel is aan 'n VS -pen in Pmod CON3. Uiteindelik is die bruin draad Gnd 'n gronddraad wat aan die GND -pen gekoppel is. Plaas vervolgens die Pmod CON3 in die boonste ry van die JD -poort in die Zybo Board.

Stap 10: Bou 'n PWM-module- Genereer Bitstream en begin SDK

1. Begin Generate BitStream in die oortjie Project Navigator.

2. Voer hardeware uit: Lêer> Uitvoer> Uitvoer hardeware-> merk op 'sluit bitstroom in'-> OK 3. Begin SDK: Lêer-> Begin SDK.

Stap 11: Bou 'n PWM-module- Skep 'n nuwe toepassing in Xilinx SDK

Bou van 'n PWM-module- Skep 'n nuwe toepassing in Xilinx SDK
Bou van 'n PWM-module- Skep 'n nuwe toepassing in Xilinx SDK

Skep 'n nuwe toepassing:

Lêer> Nuut> Toepassingsprojek -> Voer die naam van u projek in -> Voltooi

Onder Project Explorer behoort daar drie vouers te wees.

In hierdie geval is “design_1_wrapper_hw_platform_0” die vouer wat Vivado voorheen uitgevoer het. Axis_2_PWM_SDK_bsp is die gids vir ondersteuningspakkette. En Axis_2_PWM_SDK is ons belangrikste projekmap in SDK. U kan 'helloworld.c' -lêer sien onder die 'src' -lêergids van Axis_2_PWM_SDK, waar' helloworld.c 'die hooflêer is.

Stap 12: Bou van 'n PWM-module- Oorsig van die Project Explorer (I)

Bou van 'n PWM-module- Oorsig van die Project Explorer (I)
Bou van 'n PWM-module- Oorsig van die Project Explorer (I)

Kom ons kyk na 'n paar lêers onder Project Explorer. Maak eers die "system.hdf" oop in die gids "design_1_wrapper_hw_platform_0". Hierdie lêer toon die adreskaart vir verwerker ps7_cortex9 en die IP -blokke wat in ons ontwerp voorkom.

Stap 13: Bou van 'n PWM-module- Oorsig van die Project Explorer (II)

Bou van 'n PWM-module- Oorsig van die Project Explorer (II)
Bou van 'n PWM-module- Oorsig van die Project Explorer (II)

Gaan dan die lêer "insluit" en "libsrc" na onder die "Axis_2_PWM_SDK_bsp" lêer. Biblioteeklêers hier stel ons in staat om met hardeware -randapparatuur te kommunikeer sonder om registers te speel.

Stap 14: Bou van 'n PWM-module- Oorsig van die Project Explorer (III)

Bou van 'n PWM-module- Oorsig van die Project Explorer (III)
Bou van 'n PWM-module- Oorsig van die Project Explorer (III)

Deur die BSP -dokumentasie word xtmrctr.h gevind as 'n Xilinx Timer Control Library wat verband hou met AXI Timer. Gewoonlik kan ons die gewenste PWM -funksie hier vind. As u egter die dokumentasie "tmrctr_v4_3" lees, toon dit dat die bestuurder tans nie die PWM -werking van die toestel ondersteun nie. Weens die tekort aan PWM -funksie, moet ons ons PWM -funksie afrond met behulp van xtmrctr.h en AXI Timer v2.0 LogiCORE IP -produkgids.

Stap 15: Bou van 'n PWM-module- Sluit PWM-funksie af (I)

Bou van 'n PWM-module- Sluit PWM-funksie af (I)
Bou van 'n PWM-module- Sluit PWM-funksie af (I)

Terug na die hooflêer "helloworld.c", bevat die volgende koplêers:

Stap 16: Bou van 'n PWM-module- Sluit PWM-funksie af (II)

Bou van 'n PWM-module- Sluit PWM-funksie af (II)
Bou van 'n PWM-module- Sluit PWM-funksie af (II)

Definieer die basisadresse van twee AXI TImer deur "xparameters.h".

Stap 17: Bou van 'n PWM-module- Sluit PWM-funksie af (III)

Bou van 'n PWM-module- Sluit PWM-funksie af (III)
Bou van 'n PWM-module- Sluit PWM-funksie af (III)

Bou die gewenste PWM -funksie.

Duty_val: skakel die graadwaarde om in duty cycle. PWM_Freq_Duty: stel die gewenste frekwensie en dienssiklus in om PWM te genereer. Die tydsduur moet ook toegeken word.

PWM_START: ken die PWM -registeradres toe en begin om PWM te genereer.

PWM_STOP: ken die PWM -registeradres toe en stop met die opwekking van PWM.

Die res van die demo -kode word getoon in "helloworld.c" onder "Axis_2_PWM_SDK"

Stap 18: Bou 'n PWM-module- laat dit loop

1. Programmeer die FPGA deur middel van SDK

  • Koppel die Zybo Board via die USB -poort aan die rekenaar.
  • Xilinx Tools -> Program FPGA

2. Begin die program

Klik op die "Run" -ikoon en maak die menu oop -> Run As -> Launch on Hardware

3. SDK Terminal

  • Maak die SDK -terminale oop -> Koppel aan die seriële poort -> OK
  • Begin die program. As die demokode suksesvol loop, moet u 'Inisialisering gedoen!' op die SDK Terminal.

Stap 19: Stroom van videoverwerking op Digilent ZYBO met OV7670

Volledige argieflêer aangeheg.

Stap 20: Voltooi blokdiagram

Volledige blokdiagram
Volledige blokdiagram

Dit toon die volledige diagram van alle verbindings en IP -blokke in die projek

Stap 21: Koppel die OV7670 aan die ZYBO

Koppel die OV7670 aan die ZYBO
Koppel die OV7670 aan die ZYBO

Maak 'n verbinding om die ov7670 -module na die ZYBO Pmods te dra

Data Pmod is Pmod D

Beheer Pmod is Pmod C

Koppel ook die PmodCON3 en servo's soos gespesifiseer in die eerste helfte van hierdie tutoriaal

Stap 22: Skep blokontwerp

Skep blokontwerp
Skep blokontwerp

Klik in Flow Navigator op "Create Block Design" en druk dan OK.

Stap 23: Voeg VHDL -lêers by vir OV7670 -kamerabeheer en -opname

Voeg die VHDL -lêers wat by hierdie stap aangeheg is, by die projek

Stap 24: Voeg beperkingslêer by

Voeg die aangehegte beperkingslêer by u projek.

Stap 25: Voeg IP Repo by vir HLS IP

Voeg IP Repo by vir HLS IP
Voeg IP Repo by vir HLS IP

Pak die aangehegte zip -lêer uit en pak dit uit in 'n nuwe gids met dieselfde naam in 'n nuwe gids (gids) genaamd "HLS_repo".

Voeg 'n IP-bewaarplek by u projek deur na die IP-katalogus te gaan, en klik met die rechtermuisknop "Add Repository …"

Gaan na u "HLS_repo" -gids en kies dit.

Opsioneel: Skep self die HLS -videoverwerkingsblok!

Stap 26: Voeg modules en IP by

Voeg modules en IP by
Voeg modules en IP by
Voeg modules en IP by
Voeg modules en IP by

Voeg die ov7670_axi_stream_capture-, debounce- en ov7670_controller -modules by die blokdiagram deur met die rechtermuisknop op die agtergrond te klik en "Voeg module by …" te kies

Voeg ook die IP's by:

  • HLS_Video_Track
  • Videorame Buffer Skryf
  • Video raam buffer gelees
  • Video tydsberekening kontroleerder
  • AXI4-stroom na video-uitgang
  • 3 van "Sny"
  • Konstante
  • 2 van AXI Timer

Stap 27: IP -konfigurasie -instellings

IP -konfigurasie -instellings
IP -konfigurasie -instellings
IP -konfigurasie -instellings
IP -konfigurasie -instellings
IP -konfigurasie -instellings
IP -konfigurasie -instellings

Soos op die foto's getoon

Stap 28: Voeg PS IP -blok by en konfigureer dit

Voeg PS IP -blok by en konfigureer dit
Voeg PS IP -blok by en konfigureer dit
Voeg PS IP -blok by en konfigureer dit
Voeg PS IP -blok by en konfigureer dit

Voeg die ZYNQ7 -verwerkingstelsel by die blokdiagram

wysig die opset:

  • PS-PL-opset

    • HP

      • Aktiveer S HP 0
      • Aktiveer S HP 1
  • Opstelling van die klok

    • PL Stofhorlosies

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

Stap 29: Deel 1. Bou 'n PWM -module vir Servomotors

Bring axi_timer_0 pwm0 na die nuwe uitvoerpoort pwm_Xaxis

Bring axi_timer_1 pwm0 na die nuwe uitvoerpoort pwm_Zaxis

Stap 30: Sy -aansluitings vir video -invoer (aclk gemerk)

Video -invoer -syverbindings (aclk gemerk)
Video -invoer -syverbindings (aclk gemerk)

Koppel die IP -blokke van die video -invoerkant korrek

(* hierdie verbindings moet geskep word deur die regte opsies te kies tydens die outomatisering van die verbinding) "aclk" uit die axi_stream_capture gaan na:

  • ap_clk op video raam buffer skryf
  • ap_clk op HLS -videostroomverwerkingsblok
  • *reken op AXI smartconnect IP vanaf die videorame -buffer Skryf na die S_AXI_HP0
  • *aclk wat ooreenstem met die kanale van die AXI Interconnect IP vir die S_AXI kanale van die HLS video verwerkingsblok en die video raam buffer skryf S_AXI_HP0_ACLK op die PS blok

Die videostroomsein word eenvoudig in serie verbind vanaf die opneemblok na die Zynq -geheue -koppelvlak.

  • Video gaan van opnameblok na HLS -verwerkingsblok.
  • Die verwerkte video van die HLS -blok gaan na die raambuffer -skryfblok.
  • *Die raambuffer -skryfblok maak verbinding met die HP0 -koppelvlak op die Zynq PS -blok.
  • Die m_axis_tuser -sein vanaf die uitset van die opneemblok word handmatig aan beide die video_in_TUSER -invoersein op die HLS -verwerkingsblok en die ap_start -sein op dieselfde blok gekoppel.

Die TUSER (tuser) sein word deur die AXI videostroom protokol gebruik om die begin van 'n raam van die video aan te dui. AP_Start sê die HLS blok moet begin verwerk. Ons gebruik dus tuser om die HLS blok te aktiveer om elke raam te verwerk kom in. As u 'n enkele sein van 'n bus aansluit en dit op hierdie manier verdeel, is dit ook nodig om die normale eindpunt van die res van die bus aan te sluit. Vivado veronderstel dat as u die sein handmatig verbind dat u wil ontkoppel waaraan dit normaalweg sou aansluit.

Konfigurasie -instellings van IP -blokke:

Video raam buffer skryf:

Videoformate: RGB8

1 monster per klok Max kolomme: 1280 (> = 640) Max rye: 960 (> = 480) Max data breedte: 8

Stap 31: Verbindings met OV7670

Verbindings met OV7670
Verbindings met OV7670

Op die ov7670_axi_stream_capture -blok

  • Maak alle insette ekstern (klik met die rechtermuisknop op 'n speld en kies in die spyskaart, of klik met die linkermuisknop-> ctrl+T)
  • Laat die name soos hulle is

Op die ov7670_controller -blok

  • Maak al die blokuitsette ekstern
  • Hernoem die config_finished -poort na led0
  • koppel clk aan die CameraClock (<= 50MHz) (FCLK_2)

Op die debounce -blok

  • verbind die knoppie 1 -invoer met 'n eksterne invoerpoort genaamd btn0
  • verbind out1 met die re -stuurlyn op die ov7670_controller IP -blok
  • koppel die knoppie 2 -invoer aan 'n eksterne invoerpoort genaamd btn3
  • verbind die out2n met die ext_reset_in -invoer op die verwerkerstelsel -herstel -IP vir die video -opnameklokdomein. (*Dit moet moontlik gedoen word nadat die IP gegenereer is)
  • koppel clk aan die CameraClock (<= 50MHz) (FCLK_2)

Stap 32: Verbindings aan die buitekant van die video

Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video
Verbindings aan die buitekant van die video

Aansluitings vir blokke Video Timing Controller (VTC), AXI4-Stream to Video Out en snye

  • Gebruik 'n 25MHz -klok (FCLK_1) vir vid_io_out_clk en VTC clk
  • Gebruik 'n 100MHz-klok (FCLK_0) vir ACLK op AXI4-Stream to Video Out
  • vtiming_out na vtiming_in
  • Video Frame Buffer Lees m_axis_video gaan na AXI4-Stream na Video Out video_in
  • vtg_ce gaan na gen_clken
  • Bind VTC clken, aclken, vid_io_out_ce aan Constant dout [0: 0]
  • Bring vid_hsync en vid_vsync na onderskeidelik eksterne uitvoerpoort vga_hs en vga_vs. (nie op die foto nie)

Snye:

  • Die snye moet opgestel word soos in die aangehegte foto's

    • hernoem die blokke na slice_red, slice_green en slice_blue
    • opstel sny reekse soos getoon in die beelde volgens die naam van die blok
    • koppel elke sny -uitset aan 'n eksterne poort -uitvoer soos in die prentjie getoon.
  • vid_data [23: 0] sluit aan by die insette vir elke sny (Din [23: 0])

Stap 33: Begin blok- en verbindingsautomatisering

Begin blok- en verbindingsoutomatisering
Begin blok- en verbindingsoutomatisering
Begin blok- en verbindingsoutomatisering
Begin blok- en verbindingsoutomatisering
Begin blok- en verbindingsoutomatisering
Begin blok- en verbindingsoutomatisering

Begin Block Automation om die dinge van die ZYNQ7 PS -blok aan te sluit. Soos op die foto getoon.

Begin verbindingsoutomatisering om alle onderlinge verbindings -IP te skep. Gee aandag aan alle opsies in elke prent.

Koppel out2n op die debounce -blok aan die video -opnameklokdomein Verwerkerstelsel herstel ext_reset_in -invoer.

Stap 34: Genereer HDL Wrapper

Genereer HDL Wrapper
Genereer HDL Wrapper

Genereer die HDL Wrapper vir u blokontwerp.

Stel dit as die boonste module.

Stap 35: Genereer Bitstream, voer hardeware uit na SDK, begin SDK vanaf Vivado

Maak seker dat u bitstream by uitvoer insluit.

Die opwekking van bitstroom kan baie lank neem.

Begin dan SDK

Stap 36: SDK (geen FreeRTOS)

SDK (geen FreeRTOS)
SDK (geen FreeRTOS)

Hierdie weergawe doen alles sonder om FreeRTOS te gebruik, en kondenseer die kode mooi.

Skep 'n selfstandige BSP gebaseer op die hardeware -ontwerp. Die standaard opsies moet goed wees. Maak seker dat BSP -bronne gegenereer is.

Skep 'n app soos in die prentjie getoon. (leë aansoek)

Verwyder die outomaties gegenereerde hoof en voer die aangehegte lêers in.

Stap 37: FreeRTOS -implementering

FreeRTOS -implementering
FreeRTOS -implementering

Hierdie weergawe gebruik wel FreeRTOS. Create a FreeRTOS901 BSP based on the hardware design. Die standaard opsies moet goed wees. Maak seker dat BSP -bronne gegenereer is.

Skep 'n app soos in die prentjie getoon. (leë aansoek)

Vee die outomatiese hoofstroom uit en voer die aangehegte lêers in.

Stap 38: Gebruiksinstruksies

Hierdie projek is 'n bietjie moeilik om aan die gang te kom. Volg die stappe in volgorde.

Maak seker dat u ZYBO niks self laai as dit aangeskakel word nie. Dit beteken dat die Done -LED nie moet brand nie. Een manier om dit te doen is om die opstartbron -springer op JTAG te stel.

Maak die projek oop (FreeRTOS of nie) wat u vanaf SDK wil programmeer

  1. Skakel jou ZYBO aan. Die Klaar LED moet nie brand nie.
  2. Programmeer die FPGA met die bit -lêer. Die klaar LED moet brand. Led0 moet nie brand nie.
  3. Begin die kode (onthou om verby die beginpunt te gaan as u dit doen).

Op hierdie punt behoort u 'n uitset op u VGA -skerm te kry.

Om weer te begin (as daar foute is of nie): tik vinnig op die PS-SRST-knoppie of skakel die ZYBO uit en weer aan. Gaan voort vanaf stap 2.

Deur die verwerker te stop met die ontfouter, sal die kamera posisie in plaas van beweeg. Die videostroom sal in elk geval voortgaan.

Stap 39: Verwysings en skakels

Xilinx verwysingsgidse en dokumentasie:

  • PG044 - AXI -stroom na video -uitgang
  • PG278 - Videorame -buffer lees/skryf

Ander skakels:

  • Lauri se blog - VDMA -insette
  • Lauri se blog - OV7670 na VGA -uitset met BRAM
  • Hamsterworks wiki, deur Mike Fields, die oorspronklike bron van die OV7670 -kode
  • Gegewensblad met basiese tydsberekening spesifikasies

Aanbeveel: