OV5640 센서를 STM32H743와 연결하여 FHD 해상도 및 초당 60프레임의 영상을 Wi-Fi를 통해 전송하는 과정은 여러 단계를 포함합니다. 여기서는 주요 단계와 필요 기술에 대해 설명하겠습니다.

 

일인 IT 스타트업 딥네트워크  CEO  /  장석원

HP :   010 3350 6509   /   sayhi7@daum.net

1. OV5640 센서 설정

OV5640 센서를 FHD (1920x1080) 해상도와 60fps의 프레임 속도로 설정하기 위해 I2C 통신을 사용합니다. 일반적으로 아래와 같은 과정을 따릅니다:

  • I2C 통신 초기화: STM32H743의 I2C 인터페이스를 초기화하고, OV5640에 연결합니다.
  • 레지스터 설정: OV5640의 데이터 시트에서 FHD 해상도와 프레임 속도에 해당하는 레지스터 주소를 확인한 후, 이를 설정하는 값을 작성하여 I2C를 통해 전송합니다. 예를 들어, 0x3800부터 시작하는 레지스터를 설정하여 해상도 및 프레임 속도를 조정할 수 있습니다.
c
코드 복사
#include "i2c.h"

void OV5640_Setup() {
    // I2C 통신을 통해 OV5640 레지스터 설정
    uint8_t reg_data[] = {0xXX, 0xYY}; // 설정할 레지스터와 값
    HAL_I2C_Master_Transmit(&hi2c1, OV5640_ADDRESS, reg_data, sizeof(reg_data), HAL_MAX_DELAY);
}

2. 영상 캡처

OV5640에서 캡처한 영상 데이터는 STM32H743의 DCMI (Digital Camera Memory Interface)를 통해 수신됩니다. DCMI는 카메라에서 입력된 데이터를 처리하고 메모리에 저장하는 데 사용됩니다.

  • DCMI 초기화: DCMI 모듈을 설정하여 OV5640으로부터 영상을 수신합니다.
  • 영상 포맷 설정: DCMI에서 수신할 데이터 포맷을 설정합니다 (예: YUV422, JPEG 등).
c
코드 복사
// DCMI 초기화 코드
void DCMI_Init() {
    // DCMI 초기화 및 설정
}

3. 영상 처리 및 전송

STM32H743에서 수신한 영상 데이터를 Wi-Fi를 통해 전송하는 과정은 다음과 같습니다:

  • Wi-Fi 초기화: ESP32 같은 Wi-Fi 모듈을 STM32와 연결하여 Wi-Fi 네트워크에 연결합니다.
  • TCP/UDP 프로토콜 설정: Wi-Fi 모듈을 통해 데이터를 전송하기 위해 TCP 또는 UDP 프로토콜을 사용합니다.
  • 영상 데이터 전송: DCMI로부터 수신한 영상 데이터를 Wi-Fi 모듈을 통해 전송합니다. 이 때, 실시간 전송을 위해 버퍼링 및 압축 알고리즘을 사용할 수 있습니다.
c
코드 복사
// Wi-Fi 모듈을 통한 데이터 전송 예시
void Send_Video_Over_WiFi(uint8_t *data, size_t length) {
    // Wi-Fi를 통해 데이터 전송
}
 
 

4. I2C 통신 설정

OV5640 센서를 I2C 통신을 통해 설정하는 코드입니다. STM32의 HAL API를 사용하여 I2C 통신을 초기화하고, 레지스터 값을 설정하는 방법을 보여줍니다.

I2C 초기화

c
코드 복사
#include "stm32h7xx_hal.h"

// I2C 핸들 정의
I2C_HandleTypeDef hi2c1;

// I2C 초기화 함수
void I2C_Init(void) {
    hi2c1.Instance = I2C1;
    hi2c1.Init.Timing = 0x00303D5B; // Timing 설정 (예: 100kHz)
    hi2c1.Init.OwnAddress1 = 0; // 자신의 주소 (필요한 경우 설정)
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.OwnAddress2 = 0;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    
    if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
        // 오류 처리
    }
}

// 레지스터에 값 쓰기
void OV5640_WriteRegister(uint16_t reg, uint8_t value) {
    uint8_t data[3];
    data[0] = (reg >> 8) & 0xFF; // 레지스터 주소 상위 바이트
    data[1] = reg & 0xFF;        // 레지스터 주소 하위 바이트
    data[2] = value;             // 값
    
    HAL_I2C_Master_Transmit(&hi2c1, OV5640_ADDRESS, data, 3, HAL_MAX_DELAY);
}

// OV5640 초기화 함수
void OV5640_Init(void) {
    // OV5640 초기화 설정
    OV5640_WriteRegister(0x3103, 0x11); // 파워 업 명령
    // FHD 및 60fps 설정에 필요한 추가 레지스터 설정
    OV5640_WriteRegister(0x3800, 0x00); // X 시작
    OV5640_WriteRegister(0x3801, 0x00); // Y 시작
    OV5640_WriteRegister(0x3802, 0x07); // X 끝
    OV5640_WriteRegister(0x3803, 0x9F); // Y 끝
    // 추가 설정을 여기에 추가
}

5. DCMI 초기화 및 데이터 수신

DCMI를 초기화하고 데이터 수신을 처리하는 방법입니다.  단 DCMI를 설정하여 OV5640에서 캡처한 영상을 수신시 초당 60 fps 로 FHD 영상 수신이  DCMI를 초기화하고 데이터 수신시 이런 처리능력이 가능한지 확인이 필요 합니다 ...

DCMI 초기화

c
코드 복사
#include "stm32h7xx_hal.h"

// DCMI 핸들 정의
DCMI_HandleTypeDef hdcmi;

// DCMI 초기화 함수
void DCMI_Init(void) {
    hdcmi.Instance = DCMI;
    hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
    hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
    hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
    hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
    hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
    hdcmi.Init.ExtendedDataMode = DCMI_EXTENDED_DATA_DISABLE;
    hdcmi.Init.JpegMode = DCMI_JPEG_DISABLE;
    
    if (HAL_DCMI_Init(&hdcmi) != HAL_OK) {
        // 오류 처리
    }
}

// 데이터 수신 콜백
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) {
    // DCMI로부터 수신한 데이터 처리
    // 예: DMA를 통해 버퍼에 저장
}

6. Wi-Fi 모듈 초기화 및 데이터 전송

ESP32와 같은 Wi-Fi 모듈을 초기화하고 데이터를 전송하는 코드입니다. 이 예시에서는 ESP32를 UART로 연결한다고 가정하겠습니다.

Wi-Fi 초기화 및 데이터 전송

c
코드 복사
#include "stm32h7xx_hal.h"

// UART 핸들 정의
UART_HandleTypeDef huart2;

// UART 초기화 함수
void UART_Init(void) {
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200; // ESP32 기본 보드레이트
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    
    if (HAL_UART_Init(&huart2) != HAL_OK) {
        // 오류 처리
    }
}

// 데이터 전송 함수
void Send_Video_Over_WiFi(uint8_t *data, size_t length) {
    HAL_UART_Transmit(&huart2, data, length, HAL_MAX_DELAY);
}

7. 메인 루프 및 통합

모든 초기화 및 데이터 처리를 포함한 메인 루프를 작성합니다.

c
코드 복사
#include "stm32h7xx_hal.h"

int main(void) {
    HAL_Init(); // HAL 초기화
    SystemClock_Config(); // 시스템 클럭 설정
    I2C_Init(); // I2C 초기화
    DCMI_Init(); // DCMI 초기화
    UART_Init(); // UART 초기화
    OV5640_Init(); // OV5640 초기화

    // DMA 버퍼 선언
    uint8_t video_buffer[1920 * 1080 * 2]; // YUV422 포맷 가정

    while (1) {
        // DCMI로부터 영상을 수신
        // 수신된 데이터를 video_buffer에 저장 (HAL_DCMI_FrameEventCallback 내에서 처리)

        // 수신된 데이터 전송
        Send_Video_Over_WiFi(video_buffer, sizeof(video_buffer)); // 데이터 전송
    }
}

9. 추가 사항 및 고려 사항

    • DMA 설정: DCMI 로부터 수신하는 데이터는 DMA 를 통해 처리할 수 있습니다. DMA 를 사용하면 CPU 의 부하를 줄이고 빠른 데이터 전송을 가능하게 합니다. DMA 설정을 추가하여 DCMI 와의 통신을 최적화할 수 있습니다.
    • Wi-Fi 통신 처리: ESP32와의 UART 통신을 통해 데이터 전송을 구현합니다. 필요한 경우 연결 상태와 오류 처리도 추가해야 합니다.
    • 성능 최적화: 데이터의 양이 크므로, 데이터를 전송하기 전에 필요한 경우 압축하거나 배치 전송하는 방법을 고려해야 합니다.
    •  

10. 주의사항

    • 전송 대역폭: FHD 해상도와 60fps 에서 발생하는 데이터는 매우 크므로 Wi-Fi 의 전송 대역폭이 충분한지 확인해야 합니다. 일반적으로 FHD 비디오의 경우 약 3 - 6Mbps 의 대역폭이 필요합니다.
    • 전원 관리: STM32H743 및 Wi-Fi 모듈의 전원 소모를 고려하여 설계를 진행해야 합니다.

위와 같은 세부 구현을 통해 OV5640 센서와 STM32H743을 연동하여 Wi-Fi로 영상을 전송하는 시스템을 구축할 수 있습니다. 각 기능은 실제 하드웨어 및 애플리케이션 요구 사항에 맞게 조정해야 합니다.

 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts