Главная > Hard > Передача картинки с OV7670 через Arduino Uno на Android телефон

Передача картинки с OV7670 через Arduino Uno на Android телефон

В прошлой статье «Arduino Uno и камера ov7670 — пример использования» был описан способ, как получить картинку с OV7670 на компьютере через USB порт. Это хороший первый шаг, но пришло время попробовать что-то более практичное. Теперь картинка будет передана через bluetooth на Android телефон.

Печедача картинки с ov7670 через bluetooth

 

Для передачи картинки будет использоваться модуль HC-06 из-за его широкого распространения и низкой стоимости.

HC-06

1. Подключение камеры OV7670

Сначала нужно будет подключить камеру к компьютеру, как описано в прошлой статье Arduino Uno и камера ov7670 — пример использования. Это позволит понять, что камера подключена правильно и даёт картинку.

2. Настройка модуля HC-06. 

На этом шаге возникает основная проблема: несовпадение скоростей UART интерфейсов HC-06 и Arduino Uno. Эти платы имеют строго фиксированный набор допустимых значений.

HC-06: 1200 / 2400 / 4800 / 9600 / 19200 / 38400 / 57600 / 115200 / 230400 / 460800 / 921600 / 1382400

Arduino Uno: 2400 / 4800 / 9600 / 14400 / 19200 / 28800 / 38400 / 57600 / 76800 / 115200 / 230400 / 250000 / 500000 / 1000000 / 2000000

Максимальная совпадающая скорость передачи — 230400. Её и нужно выставить.  Для настройки модуля можно использовать пример и следующие параметры. Имя имеет значение, т.к. оно задано в коде Android приложения. Не пытайтесь выставить разные скорости, это приведёт к полной потери связи с HC-06.

Параметр Значение
Скорость 230400,8,1,n
Имя Merl1nVision

После настройки остаётся только подключить модуль HC-06 к Arduino Uno.

3. Доработка кода для Arduino Uno

В примере с  ov7670 и компьютером использовалась скорость UART — 1000000. Этого было достаточно, чтоб передать картинку с камеры. Но если подключение осуществляется на скорости ниже — 230400, картинка будет приходить с сильным искажением. Поэтому нужно внести в код для Arduino изменения:

Изменить частоту UART

UBRR0H = 0;
UBRR0L = 8;//230400
UCSR0A |= 2;
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = 6;

Максимально уменьшить внутреннюю частоту. Это можно сделать, изменив значение в регистре 0x11

wrReg(0x11, 31);

К сожалению изменение внутренней частоты не даёт возможности передать что-то на скорости 230400, поэтому картину придётся передавать в два этапа — сначала четные строки, потом нечётные.

	
...
captureImg(320, 240, true);
captureImg(320, 240, false);
...

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

    bool flag = true;

    StringPgm(PSTR("*RDY*"));

    while (!(PIND & 8));
    while ((PIND & 8));

    y = hg;
    while (y--){
    x = wg;
    while (x--){
        flag = !flag;
	while ((PIND & 4));
            if (flag == firstSecond) {
                UDR0 = (PINC & 15) | (PIND & 240);
            }
            while (!(PIND & 4));
	    while ((PIND & 4));
	    while (!(PIND & 4));
	}
    }
   _delay_ms(100);
}

обновленная версия

4. Android приложение для получения картинки

Приложение для телефона должно только прочитать картинку и вывести её на экран.

приложение

исходники

5. Результаты

Изображение получить удалось. На телефоне с Bluetooth 2.1 (LG P970) кадр передавался больше минуты и был сильно искажен. Для телефона с Bluetooth 4.0 (Nexus 5) результат представлен ниже, передача картинки заняла менее 15 секунд.

Результаты для ov7670Результаты для ov7670

 

Из опыта получается, что передача потокового видео c камеры ov7670 через bluetooth и android невозможна ввиду низких скоростей последних, но можно получить фотографию с выдержкой в 15 секунд через bluetooth 4.0.

Categories: Hard Tags: , , , , ,
  1. Admin
    2 Февраль 2016 в 23:51 | #1

    Из опытов: немного можно ускорить, уменьшив регистр 0x11 до 25.

  2. HermannSW
    24 Февраль 2016 в 03:44 | #2

    Have you considered using the much more powerful Arduino Due?

    Has 84MHz, 32bit CPU, DMA, 96KB main memory, can have factor between 9 and 18 compared to Uno:

    It can even drive VGA monitor at high (monochrome) resolutions with just 3 resistors:
    https://forum.arduino.cc/index.php?topic=150517.90

    I will start using ov7670 shortly and make use of your first article as well as the mamut thread on ov7670 on arduino.cc — target is Arduino Due for me (3.3V based, no level shifting needed) because of use of planned use of ov7670 with Arduebot
    https://forum.arduino.cc/index.php?topic=378555.0.

    Would love to read what you can do with Arduino Due and ov7670 …

    Hermann.

    • Admin
      24 Февраль 2016 в 14:21 | #3

      Interesting idea about Due. I found the following formula to calculate UART speed:
      Baud Rate for Arduino

      Looks like, it will be possible to transmit data at the highest speed of my HC-06. And since Due works at 3.3V, we will not need resistors to connect camera. I must have it!

  3. Aaron
    29 Март 2016 в 05:24 | #4

    Hi bro, could you tell me why program show the fault: «Merl1nVision is not available»?
    Thank you very much :)

    • Admin
      30 Март 2016 в 00:05 | #5

      Merl1nVision should be added to the list of available Bluetooth connections before starting the program.

  4. Aaron
    30 Март 2016 в 08:49 | #6

    :( I still can’t connected it. I don’t understand why, I have exactly the required connection ov7670 with arduino
    http://i.imgur.com/GmoLc98.png

  5. Admin
    30 Март 2016 в 17:06 | #7

    @Aaron
    You need to rename your bluetooth module. The screen shows that it has default name ‘HC-05′.
    http://privateblog.info/arduino/bluetooth-modul-jy-mcu/

  6. Aaron
    31 Март 2016 в 15:51 | #8

    thanks for your help :). I’m already connected Merl1nVision with ov7670, but it can’t show image on app. Could you explain for me this fault, please. Many thanks :)
    https://i.imgur.com/aVAtyhi.png

  7. Admin
    31 Март 2016 в 16:24 | #9

    @Aaron
    Something is with connection. There is no message «Getting image».

  8. Andrey
    6 Апрель 2016 в 07:30 | #10

    Thanks for your tutorial, but I am beginner. I already connect 0v7670 and arduino like image: http://i.imgur.com/Vo5b4sj.jpg
    and your code here http://privateblog.info/files/arduino_uno_ov7670_bluetooth.ino
    but i can’t get image on app Merl1nVision, it just show «Connected».
    could you tell me about this fault, thanks again

    • Admin
      6 Апрель 2016 в 08:52 | #11

      It is better to start from getting image on PC. After that you will be sure that image is sent correctly.

  9. Andrey
    8 Апрель 2016 в 19:11 | #12

    Sorry, I can’t find app to run in «Java Communication API» :( , is it comm.jar?
    Because I have learned about this field recently , I face to many difficulties.

  10. Andrew
    18 Июнь 2016 в 06:13 | #13

    An earlier comment on the you said no need for Resistors does this mean the Arduino 101 ( 32 bit ) , (3.3v) will not need any of the resistors

  11. Marcelo
    10 Июль 2016 в 09:54 | #15

    Wich pins in Arduino One do you use to connect bluetooth? Thanks

  12. Andrew
    30 Август 2016 в 16:36 | #17

    Hi Admin,
    Ive done everything code and schematics from Arduino Uno OV7670
    im connected to Merlinvision as HC 06 but Merlinvision says
    Merlin Vision is not available

  13. Admin
    30 Август 2016 в 16:38 | #18

    @Andrew
    «Merlinvision» != «Merlin Vision»

  14. andrew
    31 Август 2016 в 14:07 | #19

    Hi admin
    I have merlinvision app but app says
    Merlinvision is not available
    connected to HC 06 Pls help
    Oh i connected HC06 5v to 5v gnd to gnd and rx to tx and tx to rx
    Should there be any resistors?
    Pls help connected camera with your previous article
    » OV7670 Arduino Uno Java»

  15. andrew
    31 Август 2016 в 14:08 | #20

    Do you want picture?

    • Admin
      31 Август 2016 в 23:19 | #21

      Try to debug step by step:
      1. get picture on computer
      2. check that bluetooth has correct name
      3. check via bluetooth terminal if something is sent
      4…..

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