Forum: Mikrocontroller und Digitale Elektronik STM32F407 + Kamera (OV7670) + Ethernet stream


von Peter F. (snoopy81)


Lesenswert?

Hallo,
ich habe momentan das Problem die Kamera (OV7670) per Ethernet (UDP) zu 
stream.

Ich nutze momentan die Demosoftware und kann eine einfache UDP 
Verbindung (Server) aufbauen, nun möchte ich die Kamera daten als JPEG 
Format senden.

Könnt ihr mir bitte dabei helfen? Ich habe die Demo Software auf Dropbox 
hochgeladen 
->https://www.dropbox.com/sh/x74c963dkxyct74/3oCAFAA8dq?v=0mcn

Wie könnte ich die Daten vom Kamera auslesen und per UDP senden?

Ich würde mich sehr freuen wenn ihr mir helfen könnt?

Vielen Dank

von Uwe B. (derexponent)


Lesenswert?

>nun möchte ich die Kamera daten als JPEG
>Format senden

liefert den die Kamera ein JPG-Format ?

versuch doch erstmal die Kamera "einzeln" ans laufen
zu bekommen und im zweiten Schritt dann die Daten
zu senden

von Peter F. (snoopy81)


Lesenswert?

Hallo Uwe,

ich habe bereits ein Demo Software welche die Kamera zum laufen bekommt 
und diese an dem Display ausgibt.

Es gibt eine Funktion "DCMI_JPEGCmd" welche warscheinlich die Daten 
daten als JPG bereit stellt. Nur finde ich die Demo Software so komplex, 
dass ich die einzelnen schritte nicht ganz verstehe.

Die Daten werden vom Kamera über die DMA gesendet an das Display 
gesendet, ich wüsste momentan nicht wie ich den DMA Stream abfangen und 
als UDP Paket versenden soll?? :(

Freundliche Grüße

von Uwe B. (derexponent)


Lesenswert?

>Es gibt eine Funktion "DCMI_JPEGCmd" welche warscheinlich die Daten
>daten als JPG bereit stellt.

das Datenblatt vom OV7670 sagt
das Output-Format ist RGB oder YUV (in versch. Modes)

und das die DCMI-Schnittstelle vom STM32 autom.
in JPG wandelt halte ich für unwahrscheinlich

>ich wüsste momentan nicht wie ich den DMA Stream abfangen und
>als UDP Paket versenden soll

die Kamera hat ein "Einzelbild-Mode"
in dem nur ein einzelnes Frame übertragen wird

du könntest als Ziel beim DMA statt dem Display
eine RAM-Adresse angeben, dann wäre das Bild erstmal im RAM
(allerdings brauchst du genügend RAM für ein Bild :-)

den RAM Block müsstest du dann per UDP versenden

was hast du den als "Gegenstelle" bzw. wo sollen die Bilder
angezeigt werden ?

Gruss Uwe

von Peter F. (snoopy81)


Lesenswert?

Vielen dank für dein Tipp.

Die gegenstelle könnte VLC Player sein, nur ist für mich hierbei die 
Herausforderung die Frames bzw. einzelnen Bilder in die SRAM zubekommen.

Müsste die Einstellung unter dcmi_OV7670.c vorgenommen werden?

---------------------------------------------------
 /* DMA2 Stream1 Configuration */
  DMA_DeInit(DMA2_Stream1);

  DMA_InitStructure.DMA_Channel = DMA_Channel_1;
  DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = FSMC_LCD_ADDRESS; //Hier die 
änderung?
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 0xfffe;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA2_Stream1, &DMA_InitStructure);
-----------------------------------------------------

Speicher hätten wir unter SRAM 192 kByte zur verfügung.

Schöne Grüße

von Uwe B. (derexponent)


Lesenswert?

1
DMA_InitStructure.DMA_MemoryInc

das hier muss noch auf "enable" eingestellt werden
sonst schreibt er alle Daten in eine Adresse

ich hab sowas schon mal gemacht (für eine OV9655)
und kann heut abend mal nach dem Code schauen
um das Einzelbild aufzunehmen...das hab ich nicht mehr im Kopf

für ein Bild brauchst du 320x240x16 = 150 KByte
(also mehr als ein Bild passt in deinen Speicher nicht rein :-)

der VLC Player erwartet allerdings vermutlich einen MPEG-Stream
und wie der aufgebaut ist kann ich dir nicht sagen
(ob es da ein Plugin für RGB gibt ?)

das wird nicht so trivial...

kannst du die Gegenstelle selbst programmieren ? (z.B. .NET)
dann könntest du die Roh-Daten
direkt anzeigen und müsstest sie nicht erst umformatieren

Gruss Uwe

von Peter F. (snoopy81)


Lesenswert?

Die Gegenstelle dürfte kein Problem sein, diese würde ich noch schaffen 
ob mit Java oder C++:-)

Ich würde mich riesig freuen, wenn du die Codestelle bzw. Projekt von 
dir damals nähr bringen könntest. Ich versuche zwischenzeitlich das mit 
SRAM "zwischenspeichern" umzusetzen, ob es klappt ist eine andere 
Frage... :-)

Freundliche Grüße

von Uwe B. (derexponent)


Lesenswert?

so diese Zeile muss auch noch geändert werden
1
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot;

damit macht die Kamera nur ein einzelnes Bild

Gruss Uwe

von Peter F. (snoopy81)


Lesenswert?

Uwe B. schrieb:
> so diese Zeile muss auch noch geändert werden
>
>
1
> DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot;
2
>
>
> damit macht die Kamera nur ein einzelnes Bild
>
> Gruss Uwe

Hallo Uwe,

ich kämpfe momentan noch mit alles drum und dran...:(

Vielen dank aber für deine vorab information! Das ist sehr nett von 
dir:)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.