камера ov7670 на ардуино уно

Тема в разделе "Arduino & Shields", создана пользователем Danil_2002, 17 июл 2019.

  1. Danil_2002

    Danil_2002 Гик

    Доброго времени суток.

    Нужна помощь с получения данных с камеры ov7670(Уже очень давно не могу справиться с этим модулем, он самый проблемный для меня, поэтому очень надеюсь на вашу помощь). Данные нужно получить в любом виде, чтобы я мог открыть монитор порта в ARDUINO IDE и увидеть хоть что-то от камеры(числа какие-нибудь например, байты), а дальше я уже разберусь.

    Приведите какой-нибудь самый малый рабочий пример, чтобы я хотя бы мог узнать работает ли камера, а то может дела в неисправности.

    P.S. Примеры, которые я находил в инете мне полностью не подходят, там авторы просят установить какие-то программы на java для сбора изображения и тому подобное... мне просто получать значение байтов с камеры с остальным я разберусь сам. Знаю что существует библиотека OV7670.h но описания библиотеки не нашел(я имею в виду что какая функция делает). Подключал камеру по видео, поэтому проблем с этим быть недолжно.
     
  2. Igor68

    Igor68 Гуру

    https://voltiq.ru/camera-ov7670-connecting-to-arduino/
    Тут в примере как раз ардуина передаёт в PC по COM порту. Или вы хртели светодиодом от камеры поморгать? По COM порту и будете получать байты.
    Тут в примере как раз две функции:
    Код (C++):
    static void captureImg(uint16_t wg, uint16_t hg){
        uint16_t y, x;
        StringPgm(PSTR("*RDY*"));
        while (!(PIND & 8));//wait for high
        while ((PIND & 8));//wait for low
        y = hg;
        while (y--){
            x = wg;
            //while (!(PIND & 256));//wait for high
            while (x--){
                while ((PIND & 4));//wait for low
                UDR0 = (PINC & 15) | (PIND & 240);
                while (!(UCSR0A & (1 << UDRE0)));//wait for byte to transmit
                while (!(PIND & 4));//wait for high
                while ((PIND & 4));//wait for low
                while (!(PIND & 4));//wait for high
            }
          //  while ((PIND & 256));//wait for low
        }
           _delay_ms(100);
    }
    и
    Код (C++):
    void StringPgm(const char * str){
        do{
            while (!(UCSR0A & (1 << UDRE0)));//wait for byte to transmit
            UDR0 = pgm_read_byte_near(str);
            while (!(UCSR0A & (1 << UDRE0)));//wait for byte to transmit
        } while (pgm_read_byte_near(++str));
    }
    Обратите внимание на первую функцию. Чрез неё, переделав немного, и получайте эти байты. В ней как раз опрос камеры в 320х240
     
    Danil_2002 нравится это.
  3. Igor68

    Igor68 Гуру

    Программу для ардуино придётся копировать из статьи. Для скачивания её нет.
     
    Danil_2002 нравится это.
  4. Igor68

    Igor68 Гуру

    Вложения:

    Danil_2002 нравится это.
  5. Danil_2002

    Danil_2002 Гик

    Я и раньше использовал тот код, который вы мне привели, но в мониторе порта пусто, это так и должно быть? То есть без переделки captureImg() я ничего не получу? Просто я посмотрел эту функцию и что поменять не нашел

    Код (C++):
    static void captureImg(uint16_t wg, uint16_t hg){
        uint16_t y, x;
        StringPgm(PSTR("*RDY*"));
        while (!(PIND & 8));//wait for high
        while ((PIND & 8));//wait for low
        y = hg;
        while (y--){
            x = wg;
            //while (!(PIND & 256));//wait for high
            while (x--){
                while ((PIND & 4));//wait for low
                UDR0 = (PINC & 15) | (PIND & 240); // То есть читаем байт с шины данных d0-d7
                while (!(UCSR0A & (1 << UDRE0)));//wait for byte to transmit // ждем пока освободиться буфер usart
                while (!(PIND & 4));//wait for high
                while ((PIND & 4));//wait for low
                while (!(PIND & 4));//wait for high
            }
          //  while ((PIND & 256));//wait for low
        }
           _delay_ms(100);
    }
     
  6. Igor68

    Igor68 Гуру

    Конечно нада модифицировать ту часть, которая занимается обменом с ПК. Как Вы поняли никто не собирается байты превращать в удобночитаемый формат. Хуже того в ардуине негде хранить 320х240 байт (это если чёрно-белое с 256 градациями) для цвета надо 320х240х3 это если не "округлять" до кратности к 8. А если приводить к кратности 320х240х4 = 307200 байт ОЗУ требуется. А у Вас и ПЗУ кода программ меньше. Потому тут картинка сразу и передаётся вся.
     
  7. Danil_2002

    Danil_2002 Гик

    Нет, вы по моему не поняли. Если я использую ваш код(из статьи), без изменений, то в мониторе порта пусто, а как я понимаю этот скейч побайтно передают изображение и по идее при открытии монитора порта в Arduino IDE я должен что-то увидеть, так?
     
  8. Igor68

    Igor68 Гуру

    ПК должен делать запрос. Про работу этого кода как есть я не говорил что он сразу выдаст пакет байтов. Вам надо его изменить. Насколько я понял данные идут типа RAW и ПК должен знать начало... ну и подаёт запрос. Вам для передачи байтов надо изменить.
    Там же в комменатиях кода есть ожидания.
    А на яве сделана ответная часть. Думаю явисты подскажут... Вам для испытаний надо тупо передавать байты. Оставьте только цикл в captureImg сделайте в нём передачу без ожидания ответа и избавьтесь от начала (функция с "*RDY*"). У меня нет ни камеры такой ни ардуины свободной. Давно бы испытали по всякому.
     
  9. Danil_2002

    Danil_2002 Гик

    Код (C++):
    static void captureImg(uint16_t wg, uint16_t hg){
    uint16_t y, x;

    //StringPgm(PSTR("*RDY*"));
    //while (!(PIND & 8));//wait for high
    //while ((PIND & 8));//wait for low

    y = hg;
    while (y--)
    {
        x = wg;
        //while (!(PIND & 256));//wait for high
        while (x--)
        {
            //while ((PIND & 4));//wait for low
            UDR0 = (PINC & 15) | (PIND & 240);
            while (!(UCSR0A & (1 << UDRE0)));//wait for byte to transmit
            //while (!(PIND & 4));//wait for high
            //while ((PIND & 4));//wait for low
           // while (!(PIND & 4));//wait for high
    }
    // while ((PIND & 256));//wait for low
    }
    _delay_ms(100);
    }
    То есть так? Я убрал начало, и оставил цикл, просто читаем данные с шины данных D0-D7 и отправляем через USART. Просто это не работает.Мне нужно чтобы камера передавала данные без запроса ПК.
     
  10. Igor68

    Igor68 Гуру

    Простите! А у Вас хоть что-нибудь в SERIAL идёт?
    Попобуйте что-нибудь попосылать в сериал и принимать в терминале на ПК. Просто символ без чтения камеры. Т.е сначала установите гарантированную связь... сделайте передачу байта простого в цикле программы(к примеру 0x31 в терминале будут приходить единицы). А потом только наладите байты от камеры.
     
  11. b707

    b707 Гуру

    Danil_2002 - а можно поинтересоваться, зачем вам получать с камеры необработанные байты?
    А то может вы зря воюете с кодом...
     
  12. Igor68

    Igor68 Гуру

  13. Igor68

    Igor68 Гуру

  14. Danil_2002

    Danil_2002 Гик

    1) Это для того чтобы написать свою программу для сбора изображения из отдельный байт,ов хотя бы попробывать это сделать.
    2) Мне нужно будет передавать изображение с камеры по nrf
     
  15. Danil_2002

    Danil_2002 Гик

    В сериал ничего не идет. Попробую сделать как вы сказали. Спасибо за ссылки
     
  16. b707

    b707 Гуру

    Размер 1 кадра - 300кбайт. Максимальный размер данных в пакете NRF - 32 байта
    Итого получаем, что для передачи одного единсвенного кадра потребуется отправить и принять 10 тысяч пакетов NRF
     
  17. parovoZZ

    parovoZZ Гуру

    У nRF теоретический потолок - 800 кбит/сек. Отсюда можно посчитать FPS.
     
  18. Danil_2002

    Danil_2002 Гик

    Разве? Просто я использую nrf модуль с антенной, у которого дальность 1км, при минимальном расстоянии 250 м, скорость у него вроде 2Мбит/c
     
    Последнее редактирование: 19 июл 2019
  19. Danil_2002

    Danil_2002 Гик

    А есть какая нибудь альтернатива? Я работаю над научным проектом "Создание дирижабля для аэрофотосъемки", цель которого создать гондолу дирижабля с камерой и радиоуправлением.
    По идее дирижабль создается для фотографии, и 2fps в минуту достаточно, но им нужно управлять, а для этого должна быть картинка в реальном времени. Да и 10000 тысяч пакетов на один кадр очень много, плюс патери
     
  20. Danil_2002

    Danil_2002 Гик

    Wifi не хочу использовать