[STM32F4-RP] OV2640 카메라를 테스트 해보자. W5300에서 웹서버 테스트코드를 활용해서 웹에서 영상을 볼 수 있도록 해볼 예정이다.
STM32 DCMI 회로도
[STM32F4-RP] 보드의 카메라 인터페이스(DCMI) 핀맵은 아래 그림과 같다.
STM32CubeIDE 설정
STM32에서 카메라는 DCMI 장치에서 설정 할 수 있다. STM32CubeIDE 를 이용하여 DCMI설정을 해 준다.
인터럽트를 사용할 수 있도록 설정하고 DMA 설정도 해 준다.
카메라 모듈에는 Master 클럭을 입력해 주어야 하는데 STM32의 PA8을 MCO로 설정하여 16Mhz의 시스템 클럭이 출력 되도록 해 주었다.
카메라관련 설정은 I2C 인터페이스로 가능하고 I2C2를 활성화 하도록 했다.
설정을 완료후 저장하면 기본 코드가 생성된다
OV2640 JPEG 영상 테스트
STM32에 카메라 설정이 완료 되었으므로 영상이 정상적으로 들어 오는지 확인 할 필요가 있는데.... 어떻게 하면 좋을까?
우선 JPEG 모드로 설정해서 이미지를 받아 보자
static void MX_DCMI_Init(void) {
/* USER CODE END DCMI_Init 1 */
hdcmi.Instance = DCMI;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.JPEGMode = DCMI_JPEG_ENABLE;
if (HAL_DCMI_Init(&hdcmi) != HAL_OK) {
Error_Handler();
}
}
시리얼 포트로 JPEG 영상을 출력하면 정상적으로 출력되는 것을 확인 할 수 있다.
Found header of JPEG file ->0
ff d8 ff e0 00 10 4a 46 49 46
00 01 01 01 00 00 00 00 00 00
ff db 00 43 00 0c 08 09 0b 09
08 0c 0b 0a 0b 0e 0d 0c 0e 12
1e 14 12 11 11 12 25 1a 1c 16
1e 2c 26 2e 2d 2b 26 2a 29 30
36 45 3b 30 33 41 34 29 2a 3c
52 3d 41 47 4a 4d 4e 4d 2f 3a
55 5b 54 4b 5a 45 4c 4d 4a ff
db 00 43 01 0d 0e 0e 12 10 12
23 14 14 23 4a 32 2a 32 4a 4a
4a 4a 4a 4a 4a 4a 4a 4a 4a 4a
4a 4a 4a 4a 4a 4a 4a 4a 4a 4a
4a 4a 4a 4a 4a 4a 4a 4a 4a 4a
4a 4a 4a 4a 4a 4a 4a 4a 4a 4a
4a 4a 4a 4a 4a 4a 4a 4a ff c4
00 1f 00 00 01 05 01 01 01 01
01 01 00 00 00 00 00 00 00 00
01 02 03 04 05 06 07 08 09 0a
0b ff c4 00 b5 10 00 02 01 03
03 02 04 03 05 05 04 04 00 00
네트워크로 보낸 패킷을 캡쳐 해보면 정상적으로 보내는 것을 확인 할 수 있다.
W5300 웹서버를 이용한 OV2640 이미지 전송
이제 웹서버에서 이미지 요청이 있을때 카메라에서 받은 JPEG 버퍼의 데이터를 보내면 된다.
기존 웹서버 예제에 카메라의 이미지를 전송 하도록 해 보자
OV2640 웹서버를 통한 이미지 전송 테스트 동영상
W5300의 네트워크 성능을 이용하면 스트림 영상을 보낼 수 있을거라 생각 했는데...
아쉽게도 JPEG 모드로 설정하면 초당 1프레임 을 얻기가 힘들다고 한다.
스트리밍 영상을 보내려면 RAW 모드로 영상을 받아 오고 JPEG로 변환해서 보내야 할것 같은데... STM32F4에서 실시간으로 가능할지 테스트가 더 필요할 것 같다.