본문 바로가기

[ST_MICRO]/STM32F4

[STM32F4-RP] OV2640 카메라 테스트2 - RAW 이미지 데이터 전송 테스트

 

W5300을 웹서버를 이용한 영상 전송 테스트  W5300을 웹서버를 이용한 영상 전송 테스트에서 JPEG 모드에서 스트리밍 영상 전송이 힘들다는 것을 확인 했다OV2640 을 RAW모드로 설정해서 UDP로 실시간 영상 전송하는 것을 확인 해 보자

 

카메라 제어 관련 코드는 STMicro에서 제공하는 ov2640.c 파일(https://github.com/STMicroelectronics/stm32-ov2640) 을 이용하였다.



카메라 관련 함수는 _user_code_cam.h 에 작성되어 있다.

카메라에서 라인데이터가 들어올 때 HAL_DCMI_LineEventCallback() 함수와 한프레임이 완료 되었을때 HAL_DCMI_VsyncEventCallback() 함수를 재 정의 해서 main 함수에 알려 주도록 했다.

void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
{
	gCameraLineFlag++;
}

void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
{
	gCameraFrameFlag++;
}

 

라인 인터럽트 신호가 인식되면 카메라 버퍼에 저장되어 있는 영상 데이터를 TCP 로 전송하고 프레임 인터럽트 신호가 인식되면  PC 호스트 프로그램에 프레임 완료 신호를   전송해서 화면을 갱신하도록 했다.

 

  while (1)
  {
	if(gCameraFrameFlag>0)
	{
		gCameraFrameFlag = 0;
		//CamImagTransferFrame(_CMD_CAM_FRAME, gLineCnt);

		printf(">%d, %d\r\n", gFrameCnt, gLineCnt);
		gFrameCnt++;
		gLineCnt = 0;
	}


	if(gCameraLineFlag>0)
	{
		gCameraLineFlag = 0;

		//CamImagTransferLine(_CMD_CAM_LINE, gLineCnt);
		gLineCnt++;
	}
  }

 

640x480 해상도에서 480 라인이 들어 올 때마다 1프레임이 정상적으로 증가 되는것을 확인 할 수 있다.

 

 

우선 간단하게 기존에 작성해 두었던 이더넷을 이용한 이미지파일 전송 테스트에서 사용했던 PC프로그램을 조금 수정해서 UDP로 전송되는 이미지를 출력 해 보았다.

 

 

640x480 해상도에서 614400Byte(640x480x2)의 메모리가 필요 하다. STM32F4는 내부 메모리가 128kbyte 라 프레임 단위로 영상을 보내는것은 어려워 보인다.

 

UDP로 이미지 전송은 완료 되었지만 실시간으로 영상으로 보내는 순간 디스플레이 쪽에서 멈춰 버린다.

고속 BMP이미지 출력에는 이 방법이 맞지 않나?

쓰레드를 생성해야 하나?

 

프로그램완전히 새롭게 작성하고 OpenCV를 사용해서 영상 출력및 이미지 처리도 할수 있도록 했다.

이제 1프레임 출력 되는것은 잘 동작 한다.

 

 

 

https://youtu.be/GihDPhPfnMk

 

 

 

#문제 발생

해상도를 변경해서 테스트 하려고 하는데 영상이 흘러가는듯 보이는 현상이 나타난다.

 

https://youtu.be/aImLPLKWfNo

 

 

해상도가 커지면서 전송 속도가 문제가 되는 것인가?

라인 인터럽트 발생시 W5300에서 데이터 전송하는 부분에서 걸리는 시간을 측정한 결과를 스코프로 확인 결과 라인 인터럽트 시간보다 전송하는데 시간이 더 많이 걸리는 것이 확인된다.

 

 

640x480 10프레임일때 라인 인터럽트 시간은 65us 정도 이 시간내에 UDP전송을 끝내야 하는데 이부분 때문인것 같다.

 

 

W5300에서 UDP 전송률을 확인 해 보자.

W5300에서 UDP loopback 전송 율은 14Mbps로 TCP전송 속도보다 많이 느린 것을 확인 할수 있다.

 

[1] iInChip Send: 14.2327 Mbps(12470418 bytes, 6.6848 sec)

iInChip Recv: 14.1547 Mbps(12470418 bytes, 6.7216 sec)

------------------------------------------------------------

 

 

W5300에서 UDP 전송 속도가 왜 이렇게 느릴까?

STM32F7 보드 내장 이더넷 컨트롤러를 이용한 UDP loopback전송 속도 테스트 결과 (33Mbps)와 비교해 봐도 많이 느리다. (STM32 내장 이더넷 컨트롤러의 경우 TCP, UDP 전송 속도는 동일 하다.)

 

아무튼 W5300에서 UDP로 데이터 전송 하는 시간만 216us 이상 측정이 된다.

 

UDP로는 전송 할수 없다는 결론이 나온다.

 

TCP 방식으로 변경 하니 라인 신호 들어온 이후 다음 인터럽트가 발생 하기 전에 W5300으로 데이터 전송 하는것을 확인 할 수 있다.

 

 

STM32F4 OV2640 카메라 테스트 동영상

6Mbyte/s (640x480x2x10) RAW image 전송

https://youtu.be/OBXqDe1XmW8

 

반응형