Главная > Hard > Arduino Due и камера ov7670 — пример использования

Arduino Due и камера ov7670 — пример использования

Arduino Due и ov7670 - пример использоватья В предыдущей статье я уже описывал способ подключения камеры ov7670 к Arduino Uno. Теперь получилось подключить камеру  ov7670 к Arduinoe Due.

Arduino Due имеет больше преимуществ, чем Arduino Uno:

1. Большая рабочая частота.  84МГц для Due, 16MГц для Uno/Nano. Это позволяет без проблем получить большую скорость обработки сигнала, большую свободу в выборе скорости для сопряжения с bluetooth модулем HC-06.

2. Рабочее напряжение: 3v для Due, 5V для Uno/Nano. Это позволяет избавиться от резисторов для делителя напряжения, чтоб подавать на камеру безопасные 3V.

3. Больший объём памяти. 512 KB для Due, 32 KB для Uno/Nano. Это позволяет выделить буфер для картинки и уменьшить искажения при движение камеры.

4. Встроенные подтягивающие резисторы TWI интерфейса Arduino Due позволяют полностью исключить дополнительные резисторы при подключении камеры.

Начать стоит с правильного подключение камеры:

Arduino Due и камера ov7670 - пример использования

Дальше необходимо подать тактовую частоту на камеру. В данном примере подаётся 10.5МГц на PIN 7.

int32_t mask_PWM_pin = digitalPinToBitMask(7);
REG_PMC_PCER1 = 1<<4; // activate clock for PWM controller
REG_PIOC_PDR |= mask_PWM_pin; // activate peripheral functions for pin (disables all PIO functionality)
REG_PIOC_ABSR |= mask_PWM_pin; // choose peripheral option B
REG_PWM_CLK = 0; // choose clock rate, 0 -> full MCLK as reference 84MHz
REG_PWM_CMR6 = 0<<9; // select clock and polarity for PWM channel (pin7) -> (CPOL = 0)
REG_PWM_CPRD6 = 8; // initialize PWM period -> T = value/84MHz (value: up to 16bit), value=8 -> 10.5MHz
REG_PWM_CDTY6 = 4; // initialize duty cycle, REG_PWM_CPRD6 / value = duty cycle, for 8/4 = 50%
REG_PWM_ENA = 1<<6; // enable PWM on PWM channel (pin 7 = PWML6)

Теперь необходимо настроить камеру. Значения для регистров будут совпадать с теми, что использовались для версии с Uno/Nano. Разница будет только в доступе к Serial Camera Control Bus (SCCB). Теперь будет использоваться библиотека Wire.

void write(uint8_t regID, byte regDat){
  Wire.beginTransmission(address);
  Wire.write(regID & 0x00FF);    
  Wire.write(regDat & 0x00FF);    
    
  if(Wire.endTransmission(true)){
    Serial.print("error write reg ");
    Serial.println(regID);
  }
  delay(20);
}

Настройка UART тоже будет стандартной. (Скорость больше 460800 выставить не получилось)

Serial.begin(460800);

С целью ускорения отсылки картинки будет использоваться функция с прямым доступом к регистрам микроконтроллера.

static inline int uart_putchar(const uint8_t c) {
    while(!(UART->UART_SR & UART_SR_TXRDY));
    UART->UART_THR = c;
    return 0;
}

Для отправки картинки можно использовать буфер, куда картинка сохранится  и откуда она будет отправляться.

static void captureImg(uint16_t wg, uint16_t hg){
  uint16_t y, x;

  Serial.println("*RDY*");

  while (!(REG_PIOB_PDSR & (1 << 21)));//wait for high
  while ((REG_PIOB_PDSR & (1 << 21)));//wait for low

  y = hg;
  while (y--){
    x = wg;
    while (x--){
      while ((REG_PIOD_PDSR & (1 << 10)));//wait for low       
      myImage[y][x] = (REG_PIOC_PDSR & 0xFF000) >> 12; 
      while (!(REG_PIOD_PDSR & (1 << 10)));//wait for high
      while ((REG_PIOD_PDSR & (1 << 10)));//wait for low
      while (!(REG_PIOD_PDSR & (1 << 10)));//wait for high      
    }
  }
  
  for (y = 0; y < hg; y++) {
    for (x = 0; x < wg; x++) {
      uart_putchar(myImage[y][x]);      
    }
  }
}

arduino_due_ov7670_schema

Описание формата получаемой картинки и клиента FrameGrabber для получения картинки можно найти в других статьях по теме.

Arduino Uno и камера ov7670 — пример использования
Как запустить FrameGrabber для OV7670

Код примера можно скачать тут:

Код для отправки картинки

Результаты:

Результат

 Arduino Due не оказалась панацеей для камеры OV7670. Попытка использовать буфер уменьшила искажение от движения камеры, но не убрала их. Почему-то возникла проблема с установкой скорости UART больше, чем 460800, что значительно замедляет получение картинки — около 4.5 секунды. Возникли проблемы и с проверкой регистров камеры. Я уже описывал, как прочитать регистры камеры, но значения некоторых не совпали с теми, которые подавались. Есть подозрение, что проблема в связке протоколов TWI-SCCB.

Categories: Hard Tags: , ,
  1. Palliser
    10 Июль 2016 в 03:41 | #1

    Hello Merl1n,
    Amazing application!
    Question:
    Have you a code that saves the bitmap image in a SD card instead of send it via Serial?
    I will highly appreciate your help with that (if possible).

    Regards,
    Palliser

  2. 31 Август 2016 в 00:41 | #3

    This is an excellent description. Very good.

    How can you read the blue channel ?
    have you any clue which registers these are ?

    thank you

  3. Paramvir Singh
    22 Сентябрь 2016 в 16:29 | #4

    Hi

    i am trying to make it work but after some data sent it stopped sending any data, that too i can see only in serial monitor.

    Thanks

  4. Paramvir
    26 Сентябрь 2016 в 07:40 | #5

    Hi

    i got camera working though data came quite late. problem now facing how to detect the image start at the receiving end. i tried using uart->putchar(x) but on receiving end it interpret something else and is not comparing command.

    Thanks

  5. Astron_
    15 Ноябрь 2016 в 21:12 | #6

    Добрый вечер!
    Я так понимаю директория (c: / new / out) для сохранения картинок создается автоматически. У меня на диске С: нет такой папки … в чем может быть проблема?
    Заранее спасибо за ответ!

  6. Astron_
    15 Ноябрь 2016 в 22:48 | #7

    А если создать папку вручную то все равно туда ничего не записывается.

  7. Astron_
    16 Ноябрь 2016 в 00:54 | #8

    Подскажите, пожалуста, если видите что я в чом-то ошибаюсь.
    Буду очень благодарен за помощь. Уже три месяца пытаюсь разобраться с этой камерой никак не получается. Я зделал всьо как в вашем примере всьо идет без ошибок, только вот скорость (baud 460800) немогу виставить потому-что Arduino IDE 1.6.8 позволяет только до 250000. Но я поменял скорость в коде на нужную. В последовательном порту сначала выдает «error write reg 18″ а затем «*RDY*» и начинает передавать что-то. Подскажите хотя би идею в чом может бить проблема.

  8. Chawa
    30 Ноябрь 2016 в 02:11 | #9

    Hi Merl1n, I have tried the code, but I can’t find where the photo is stored. Could you tell me?
    Thanks!

  1. Пока что нет уведомлений.