Как подключить камеру от телефона к ардуино
Статья посвящена подключению и работе с серийным модулем TTL камеры и Arduino.
Камера работает по стандартам NTSC. Подобные модули отлично вписываются в проекты для реализации фотографии и видеострима. Кроме того, обычно они имеют встроенную возможность настройки яркости и насыщенности цветов, настройки авто-контраста и авто-яркости, дают возможность отслеживать движение.
Описание и технические характеристики камеры
Хотелось бы более детально остановиться на том, как именно подобные модули обеспечивают и фото и видеосъемку. Изначально камера была разработана с целью наблюдения. То есть, основная задача была стримить видео с пина Video (в черно-белом цвете) и обрабатывать команды по серийному протоколу связи. С помощью серийного протокола можно запросить у модуля камеры остановить кадр видеосъемки и сохранить полученный кадр в формате JPEG. Например, модуль камеры в стандартном режиме работы будет стримить видео. Когда камера обнаружит движение, будет сделано фото, которое сохранится на карту памяти для дальнейшего анализа.
Разрешение на модуле камеры не большое – максимальный размер фото 630х480 пикселей. При этом камера чувствительна к инфракрасному излучению, благодаря чему обнаруживаются изменения в цветопередаче. Основная причина этих недостатков – модуль камеры предназначен для наблюдения, а не качественной фотографии. Существуют модули и с другими параметрами. Рассматриваемый нами – один из самых лучших по своим техническим характеристикам.
Технические характеристики модуля камеры
- Размер модуля: 32 м x 32 мм : CMOS 1/4 дюйма
- Количество пикселей: 0.3 M
- Размер пикселя: 5.6 мкм * 5.6 мкм
- Формат на выходе: Стандартный JPEG/M-JPEG
- Баланс белого: автоматический
- Экспозиция: автоматическая
- Коэффициент передачи: автоматический
- Динамический диапазон: 60 Дб
- Максимальное аналоговое усиление: 16 Дб
- Скорость кадров: 640*480 30 кадров в секунду
- Режим сканирования: прогрессивное сканирование
- Угол обзора: 60 градусов
- Расстояние наблюдения: 10 метров, максимум 15 метров (настраиваемое)
- Размер изображения: VGA (640*480), QVGA (320*240), QQVGA (160*120)
- Скорость передачи данных: по умолчанию 38400 (В даташите указано, что вы можете менять скорость с помощью соответствующих команд, но на практике это не работает)
- Потребляемый ток: 75 мА
- Рабочее напряжение: постоянный ток +5В
- Связь: 3.3В TTL (три проводника TX, RX, GND)
В качестве примера работы видеокамеры ниже приведены две фотографии: первая – в комнате в солнечный день и вторая – на улице в дождливый.
Подключение камеры
Как правило модуль продается без коннекторов, так что придется запаять проводники к предусмотреным пинам. Хорошая новость: контакты находятся на достаточно большом расстоянии друг от друга (около 2 мм). Можно использовать достаточно толстый проводник и жало для распайки.
Если вы не планируете использовать возможности видеосъемки, можно использовать четыре провода. Мы используем красный для пина +5 В, черный для Земли, белый для пина RX (данные, которые поступают на камеру от Arduino) и зеленый для пина TX (данные, которые поступают с камеры).
Если вы планируете использовать NTSC видео-выход для подключения к телевизору или монитору, припаяйте еще один черный проводник к пину Земля и желтый к пину CVBS.
Если у вас водонепроницаемая модель камеры, в ней уже будут предусмотрены следующие коннекторы:
- Красный подключен к +5 В;
- Черный подключен к Земле;
- Зеленый – RX;
- Белый – TX;
- Желтый – сигнал NTSC видео;
- Коричневый – Земля NTSC видео.
Проверка работоспособности камеры
Один из самых быстрых методов проверки работоспособности камеры – использование NTSC видео выхода для подключения. В этом случае при настройке параметров изображения и фокусировки вы моментально увидите результат. В комплексе с программой CommTool, которую мы рассмотрим ниже, это идеальный метод для ознакомления с основаи работы с модулем камеры и Arduino.
Для подключения к большинству телевизоров и мониторов нужен RCA джек. С этой целью мы припаяли RCA выход к камере. Черный проводник подключен к Земле, а желтый – к сигналу. Купить коннекторы RCA типа можно в любом магазине радиотехнических деталей.
К сожалению, перейти из режима NTSC в режим PAL невозможно.
Подключите кабель NTSC к монитору и подключите красный и черный кабели к источнику питания +5 В. На мониторе тут же появится черно-белое изображение!
Использование CommTool
Для использования windows-приложения Comm Tool, необходимо наладить обмен данными с камерой по серийному протоколу. Мы предлагаем два варианта. Первый – использовать переходник для FTDI или какой-то USB/TTL конвертер. В случае с Arduino вы можете использовать серийный чип (чип FTDI), загрузив следующий скетч на Arduino:
Примечание: Этот метод сработает только на Arduino с отдельным USB-интерфейсом, вроде Uno. С платами Leonardo так не получится!
Если вы используете Leonardo, Micro, Yun, или другие контроллеры на основании ATmega32U4, используйте этот Leo_passthru скетч вместо "пустого" скетча.
//Обеспечивает передачу данных по серийному протоколу при
//использовании плат Arduino Leonardo в Windows.
// Красный подключен к +5 В
// Черный - к земле
// Зеленый - к цифровому пину 0
// Белый - к цифровому пину 1
Теперь подключите камеру к Arduino следующим образом:
На водонепроницаемых камерах белый и зеленый провода часто меняются местами! Так что учтите это при подключении. Красный коннектор должен все равно идти к +5 В, а черный – к Земле.
Обратите внимание, что при подключении камеры к Arduino используется резистор на 10 кОм. Питание логики камеры 3.3 В, так что опустить напряжение с 5 В до 2.5 не такая уж плохая идея. В обычном режиме на выходе с цифрового пина 0 формируется сигнал HIGH, который соответствует 5 В. При нашем подключении, с учетом сопротивления резистора, подключенного к входному сигналу (белый проводник), напряжение не превысит 3.3 В.
Теперь загрузите и установите программное обеспечение VC0706 CommTool.
Запустите программу и выберите COM порт, к которому подключена Arduino.
После этого Open порт и нажмите Get Version
Обратите внимание, что отобразилось VC0703 – Почему DSP запрограммирован под другим номером – точно не известно. В любом, случае, ответ мы получили.
Следующая кнопка – рядом с FBUF CTRL.
Это новая панель, которую мы можем использовать, чтобы напрямую загрузить рисунки с камеры.
- Установите камеру на объекте для его фотографии;
- Нажмите Stop FBuf, чтобы «заморозить» кадр;
- Нажмите Sel File, чтобы выбрать файл для сохранить в JPG формате.
После этого нажмите Read (рядом с Sel File), чтобы считать кадр с камеры.
Вот и все! Теперь вы с легкостью можете загружать фото с камеры. Чтобы сделать новый снимок, нажмите Resume. После этого нажмите Stop CFbuf для нового фото. Кроме того, вы можете выбрать Compression Ratio и выбрать качество снимка. Учтите, что время обработки тоже изменится. Простого пути изменения размера фотографии в этой программе нет, но мы можем это сделать в скетче Arduino.
Вы могли заметить, что есть выпадающий список для изменения скорости передачи данных. По умолчанию скорость выставлена на 38400.
Несмотря на то, что в программе есть эти настройки, даже если они отработают, после перезагрузки камеры придется выставлять их заново. В некоторых случаях, при изменении скорости передачи данных в программе, камеры отключаются. Так что пользоваться этими настройками не рекомендуется.
Стоит обратить внимание на кнопку Image Property, с помощью которой можно настроить камеру. С помощью ползунов можно в режиме реального времени подстраивать изображение, которое выводится на вашем подключенном мониторе.
В программе куча настроек. Рекомендуем ознакомится с их перечнем ниже и не менять их, пока вы на 100% уверены, что это за настройка и зачем она вам нужна.
- Config – смотрите выше.
- Get Version – смотрите выше.
- R/W Data – используется для передачи данных на процессор DSP чипа. Не стоит менять эту настройку без стопроцентного понимания, зачем это необходимо, так как можно получить конфликт с камерой.
- Color Ctrl – служит для выбора цвета, черно-белого режима или авто выбора (вероятно, основанного на условиях освещенности). Автоматический режим отлично отрабатывает, так что можно использовать именно его.
- Mirror Ctrl – скорее всего – переворот изображения (зеркальный эффект).
- Power Ctrl – проверка питания. Можно настроить автоматический режим отключения, когда нет движения.
- Timer Ctrl – в DSP есть встроенный RTC, который можно настроить. Однако батарейки нет, так что после перезагрузки настройки собьются.
- AE Ctrl – управление авто контрастом/яркостью. По умолчанию настройки установлены на автоматический выбор для сьемки в помещении и на открытом пространстве.
- Motion Ctrl – настройки системы обнаружения движения. Можно с ними поиграться и протестировать. Есть скетч для Arduino для обнаружения движения объектов, который можно использовать.
- OSD Config – протокол, который, судя по отзывам, не поддерживается большинством камер :(
- Image property – смотрите выше.
- Gamma – точная настройка гаммы CMOS сенсора. Настройки по умолчанию хорошие. Поэкспериментировать можно.
- SPI Flash – скорее всего – считывание и запись данных в SPI хранилище.
- Other Ctrl – возможно, для цифро-аналогового преобразования.
- Up/Down Load – считывание и запись данных на флэш-память. Вероятно, для загрузки нового DSP кода.
- System Reset – перезагрузка модуля. Актуальна, когда модуль перестает отвечать.
- FBuff Ctrl – смотрите выше.
- Zoom Ctrl – в модуле есть встроенный 'Pan Tilt Zoom', НО он рассчитан только для видеосьемки. С фотографиями отрабатывать не будет. Можете поэкспериментировать с PTZ, может оказаться полезным.
Использование видеокамеры с Arduino
Давайте подключим камеру к нашему микроконтроллеру (в данном случае - Arduino). Подключение похоже на предложенный выше вариант. Для подключения используем два цифровых пина и серийный протокол для обмена данными с модулем. Для сохранения снимков вам понадобится карта памяти. Можно использовать дополнительные microSD модули или шилды.
Подключите видеокамерукамеру к Arduino, как показано на рисунке ниже:
В водонепроницаемых камерах белый и зеленый проводники могут располагаться наоборот! Так что проверьте это перед подключением. Красный кабель идет к +5 В, черный – к Земле.
Переименуйте распакованную папку Adafruit_VC0706. Проверьте наличие файлов Adafruit_VC0706.cpp и Adafruit_VC0706.h. Переместите папку с библиотекой Adafruit_VC0706 в папку /libraries/ folder. Возможно, вам надо будет создать подпапку в библиотеке. Перезагрузите Arduino IDE.
Первый снимок
Что ж, теперь можно делать ваш первый снимок. Откройте Arduino IDE и выберите скетч File-> Examples-> Adafruit_VC0706-> Snapshot. Загрузите его на Arduino. Откройте окно серийного монитора, в котором вы увидите как сделается фото 640x480 и сохранится на карту памяти microSD. Карту можно извлечь и перенести с нее данные на ваш компьютер.
Ниже показаны несколько настроек, которые можно поменять для работы с вашей видеокамерой. Первое – замена пинов, к которым подключена камера. Можно использовать два любых цифровых пина. Замена проводится в следующей строке:
// This is the camera pin connection. Connect the camera TX
// to pin 2, camera RX to pin 3
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
Можно изменить разрешение снимка на 160x120, 320x240 или 640x480. Для этого используются следующие строки:
// Set the picture size - you can choose one of 640x480, 320x240 or 160x120
// Remember that bigger pictures take longer to transmit!
Просто снимите теги комментариев с нужной вам строки и закомментируйте остальные. Помните, что чем больше изображение, тем больше времени понадобится на его обработку и сохранение.
Обнаружение движения
Отличная опция, которая есть в камере – возможность обнаруживать движение. Работает эта фукция по принципу обнаружения изменений в кадрах и подаче соответствующего сигнала на микроконтроллер. Так что в своих проектах можно немного сэкономить и не использовать дополнительный пироэлектрический датчик движения.
Загрузите скетч из File-> Examples-> Adafruit_VC0706-> MotionDetect на Arduino. Как только он загрузится, будет сделан снимок. Подождите несколько минут и помашите рукой перед камерой, будет сделано еще одно фото.
Включать и отключать функцию обнаружения движения можно с помощью вызова setMotionDetect()
// Motion detection system can alert you when the camera 'sees' motion!
cam.setMotionDetect(true); // turn it on
//cam.setMotionDetect(false); // turn it off (default)
Вам надо подать запрос на камеру при обнаружении движения, вызвав motionDetected() – в результате вам вернется true, если движение было и false, если не было.
Ручная настройка фокуса
В камере не предусмотрен автофокус, есть только ручной режим. С одной сторы это хорошо, с другой – плохо. Камера поставляется с хорошей глубиной фокуса, которая подходит для большинства задач. Если вы планируете настраивать фокус, очень рекомендуем предварительно подключить модуль камеры к монитору, как мы это делали выше. Так вы сможете в режиме реального времени отследить изменение настроек. После настройки, объектив затягивается винтом.
Если у вас влагозащищенная камера, для настройки придется снять корпусную часть и только потом провести настройку.
Дополнительные вопросы-пояснения
Как можно изменить скорость передачи данных на модуле видеокамеры?
Возможно, вы обратили внимание, что есть командная строка для изменения скорости передачи данных. По умолчанию, значение установлено на 38400.
Несмотря на то, что в приложении можно изменять скорость, эти настройки отрабатывают не очень хорошо. Даже если получиться изменить настройки, после перезагрузки модуля видеокамеры для Ardbino, они собьются. Кроме того, порой это приводит даже к поломке камеры.
С какой скоростью можно делать снимки?
Рассмотренная в данной статье камера достаточно медленная. Для передачи изображения понадобится около 30 секунд. Обратите внимание, что это характеристика, которая отвечает за обработку и сохранение снимка в том числе. Для анализа в режиме реального времени подобной задержки нет.
Почему такие бледные цвета? Снимки похожи на монохромные.
Рассмотренный модуль был разработан для режима наблюдения, чувствительность видеокамеры смещена к инфракрасному диапазону. Это значит, что объект, который отражает или излучает инфракрасные волны будет казаться ярче.
Для более естественной цветопередачи можно использовать дополнительные инфракрасные фильтры.
Есть ли альтернативные библиотеки для камеры и Arduino?
Например, есть еще одна библиотека, которую можно тоже скачать на Github
Так что экспериментируйте, тестируйте и развивайте свои проекты на Arduino.
Сегодня вы вряд ли кого-нибудь удивите мобильным телефоном с камерой, беспроводными гаджетами и другими техническими достижениями. Благодаря платформе Arduino миллионы людей открыли для себя удивительный мир электроники и программирования. Было написано огромное количество инструкций по обмену данными между мобильным телефоном и Arduino через Bluetooth. И да, мы хотим в очередной раз обмениваться данными между мобильным телефоном на Android и Arduino Uno через Bluetooth, но мы хотим передавать не просто набор символов и цифр, а картинки.
Кто-то скажет, что это невозможно, Arduino слишком медленно обрабатывает большие объемы данных с хорошей скоростью. И он будет абсолютно прав. А что, если немного помочь Arduino - перенести всю «тяжелую» работу на плечи другого устройства? А такое устройство существует!
Это уникальный TFT-шилд (экран) для Arduino. В этом уроке мы продемонстрируем, как можно подключиться через Bluetooth к Arduino и телефону Android, получить изображение с камеры OV7670 на Arduino Uno и перенести его на телефон Android. Затем, наоборот, перенести изображение (изображение с камеры) с телефона Android на Arduino Uno и отобразитm его на TFT-экране. Для этого было написано специальное приложение для телефона Android. Но прежде чем начать, рекомендуем ознакомиться с нашим гидом по TFT-дисплеям.
Шаг 1. TFT-шилд для Ардуино Уно
Для начала мы остановимся на нашем TFT-шилде, который расширяет возможности Arduino Uno.
Этот урок по-сути является первым, с которого мы хотели бы начать рассказ об уникальном TFT-экране, разработанном для платформы Arduino Uno, который позволяет значительно расширить возможности Arduino Uno. Несмотря на то, что этот TFT-экран все еще находится в стадии разработки, на данный момент уже есть работающее устройство.
Характеристики
- Размер диагонали: 3,5",
- Разрешение: 320х240,
- Количество цветов: 65536 (16 бит),
- Резистивный сенсорный экран (контроллер XPT2046),
- 5 кнопок,
- RTC IC DS1307 с литиевой батареей 3В CR1220,
- Слот для подключения карты Micro SD,
- 4-контактный (2,54 мм) разъем для подключения модуля Bluetooth HC-05 (-06),
- 20-контактный (2,54 мм) разъем для камеры (OV7670).
Программное обеспечение
На данный момент для работы с графикой реализованы следующие библиотечные функции: рисование точек, линий, окружностей, прямоугольников. Самая популярная библиотека от Adafruit Industries была адаптирована для работы со шрифтами. Дополнительно реализована работа с сенсорным экраном и кнопками. Демо эскиз для демонстрации работы с графикой и шрифтами ниже:
Демо пример, демонстрирующий работу со шрифтами и сенсорным экраном:
Демо-эскиз логической игры «Столбцы» для демонстрации работы с графикой, текстом и кнопками:
Демонстрация
Ниже добавлено видео, демонстрирующее работу эскизов.
Шаг 2. Комплектующие
Из оборудования нам понадобятся следующие комплектующие:
-
;
- Уникальный TFT-шилд (ссылка выше);
- AC-DC адаптер питания 6-12 вольт, >600 мА;
- Камера OV7670;
- Модуль Bluetooth HC-06 (HC-05);
- Телефон на Андроиде.
Программное обеспечение (можно скачать ниже):
-
;
- Библиотека для TFT-экрана;
- APK-файл для телефона Android.
Шаг 3. Подготовка
Программное обеспечение
Все демо скетчи написаны в среде Arduino IDE, поэтому вначале необходимо установить саму Arduino ID, которую можно скачать у на в Инструментарии либо на сайте официального производителя Ардуино.
Затем вам нужно установить библиотеку для TFT отсюда, скачать библиотеку и распаковать ее в папку «библиотеки» в директории Arduino IDE. После установки Arduino IDE необходимо запрограммировать плату Arduino Uno. Для простоты рекомендуем прошивать отдельно, без экрана TFT, а для этого:
Если плата Arduino UNO успешно запрограммирована, вы можете перейти к следующему шагу. Все необходимые библиотеки и файлы вы найдете ниже в zip-архиве.
Android
На телефоне Android необходимо установить Arduino_TFT.apk. Разрешить приложению использовать Bluetooth и камеру.
Модуль Bluetooth
Необходимо установить скорость обмена в модуле Bluetooth равным 115200 (команда «AT + UART = 115200,0,0»). Это оптимальная скорость, с которой Arduino UNO удается получать и обрабатывать данные. Теоретически вы можете увеличить скорость, оптимизировать прием и обработку данных, но для этого требуется больший объем оперативной памяти. Более подробно о том, как установить скорость обмена мы поговорим в ближайших уроках.
Обратите внимание, что модуль Bluetooth подключается к порту отладки Arduino UNO. Таким образом, при работе с Bluetooth порт отладки недоступен. А перед программированием Arduino UNO (в комплекте с модулем Bluetooth) необходимо отключить модуль Bluetooth. И после программирования установить его обратно (!).
Шаг 4. Сборка
Сборка устройства довольно проста:
После включения питания TFT-экран должен стать красным. Это означает готовность получать команды с телефона Android.
Шаг 5. Демонстрация
Выполните следующие операции на телефоне Android:
- Запустите приложение ArduinoTFT на телефоне Android;
- Поверните телефон в горизонтальное положение;
- Включите соединение Bluetooth, выберите обнаруженный модуль Bluetooth (HC-06);
На экране должны появиться два окна и четыре кнопки:
- В верхнем правом окне находится окно видоискателя камеры телефона;
- Большое левое окно - полученные или отправленные изображения.
- Передача одного изображения с телефона Android на Arduino;
- Непрерывная передача изображений с телефона Android на Arduino;
- Передача одного изображения из Arduino на телефон Android;
- Непрерывная передача изображений с Arduino на телефон Android.
Размер изображения составляет 320x240 пикселей (2-5 кБ). Выше есть демо-видео.
И здесь, как черт из табакерки, на арену выпрыгивают китайские производители контроллеров. Сначала появляется ESP8266, который был нами протестирован, но честно говоря, поговорка о том, что чего из него ни делай, а получается погодная станция, родилась не на пустом месте. Попытки установить ESP8266 на мобильного робота и одновременно обеспечить адекватную работу обвески из датчиков у нас не получилось. Но, тем не менее, эти контроллеры пользуются определенным успехом, по крайней мере, их покупают.
Начав разработку, дети Поднебесной уже остановиться не могут, и следом выпускают новую версию контроллера ESP32, который не только получил адекватный запас GPIO, но и дополнительно получил второе ядро, и дополнительно (к поддержке WiFi протокола, который уже был на ESP8266) поддержку протокола Bluetooth.
Частота 160МГц, два 32-ных ядра, WiFI, BT, не оставили нас равнодушными, тем более идея сборки мобильного робота с камерой, которая передает изображение по WiFi витает уже давно.
Анализ документации по камере показал, что подключить ее к ESP32 вполне по силам. А позднее был найден пример подобного подключения на github:
Ниже приводится схема подключения по программе указанной выше. Стоит заметить, что используется камера без буфера FiFO.
Помимо камеры в примере к ESP32 подключен TFT дисплей.
Я не нашел поблизости дисплея и подключил только камеру. Более того использовался контроллер Lolin32 Lite, который не имеет разведенного вывода GPIO 21 и моя схема немного изменилась.
С 5й ноги камеры контакт соединен с 23 GPIO платы на основе ESP32. В программе убрано всё, что касается работы с дисплеем и изменен указанный выше GPIO.
Программный код будет по второй схеме прикреплен к данной статье.
Сначала из куска шлейфа IDE был создан шлейф для камеры, но потом для простоты (скорости) все было сделано на макетной плате.
На стандартную макетную плату Lolin32 Lite становится так, что остаются с боков по одному контактному месту для соединений, а вот плата ESP-WROOM32 шире, и с одной стороны все контактные посадочные места оказываются под платой.
Вот такой пучёк проводов получился.
Установив прошивку и открыв Serial port на скорости 115200, можно убедиться, что плата завелась, а заодно узнать полученный ею адрес от вашей WiFi сети. И не забудьте в программе прописать ваше имя WiFi сети и пароль сети.
Чтобы получить информацию из Serial port следует: открыть Serial port, затем нажать на ESP32 кнопку Reset (Boot). После этого ESP32 перезагрузится и напечатает в порт информацию по подключению.
Теперь во внутренней сети потребуется компьютер или смартфон.
На нем в адресной строке браузера следует указать ip-адрес нашего устройства (здесь это 192.168.1.136). Все! Смотрим на картинки с камеры.
Честно говоря, качество полученной картинки не выдерживает никакой критики. Под большим вопросом и скорость передачи, отрисовка рисунка 320х240 шла довольно медленно и с задержкой в пару секунд. В итоге мы имеем загруженный под завязку ESP32 и 1-3 мутных кадра в секунду.
Выводы: камера OV7670 работает, но образец без буфера FiFo показывает на выходе изображение низкого качества, причины тому могут быть две – 1) большое время экспонирования полного кадра, что приводит к смазыванию картинки, 2)объектив без автофокуса с ручной фокусировкой, что затрудняет использование данной камеры в динамике (на мобильном роботе).
Использование камеры с внутренним буфером FiFo может немного улучшить ситуацию, но кардинально ничего не изменится.
Дальнейшие испытания пойдут в область использования готовых изделий, таких как смартфон в качестве камеры робота (или подобное устройство с возможностью отдельной от контроллера робота трансляции видео в сеть).
Видеокамеры (камеры) в настоящее время находят широкое применение в электронной промышленности и имеют множество применений, таких как система мониторинга посетителей, система наблюдения, система учета посещаемости и т.д. Камеры, которые мы используем сегодня, умны и имеют множество функций, которых не было в предыдущих моделях камер. Современные цифровые камеры не только захватывают изображения, но также захватывают и высокоуровневые описания изображений и анализируют то, что они видят. Они широко используются в робототехнике, искусственном интеллекте, машинном обучении и т. д. Захваченные кадры обрабатываются с помощью искусственного интеллекта и машинного обучения, а затем используются во многих приложениях, таких как обнаружение номерных знаков, обнаружение объектов, обнаружение движения, распознавание лиц и т. д.
В этой статье мы рассмотрим подключение наиболее часто используемого сейчас модуля камеры OV7670 к плате Arduino Uno. Аналогичным образом ее можно подключить и к плате Arduino Mega. Модуль камеры достаточно тяжел в подключении поскольку он имеет большое количество контактов. Также при использовании камеры достаточно важен выбор проводов, которыми вы ее подключаете, поскольку качество проводов может значительно влиять на качество картинки и уровень зашумленности видеоизображения.
Камера OV7670 работает от напряжения 3.3V, поэтому следует избегать прямого ее подключения к обычным контактам ввода/вывода Arduino, которые работают с напряжением 5V. OV7670 является камерой с буфером FIFO (first in, first out – первым пришел, первым вышел). Но в этом проекте мы будем захватывать изображения без использования данного буфера. Мы постарались максимально упростить данный проект чтобы его можно было повторить даже начинающим радиолюбителям.
Необходимые компоненты
Аппаратное обеспечение
- Плата Arduino Uno (купить на AliExpress).
- Модуль камеры (Camera Module) OV7670 (купить на AliExpress).
- Резистор 10 кОм – 2 шт. (купить на AliExpress).
- Резистор 4,7 кОм – 2 шт. (купить на AliExpress).
- Соединительные провода.
Программное обеспечение
Arduino IDE
Serial Port Reader (для анализа выходного изображения)
Некоторые особенности модуля камеры OV7670
OV7670 представляет собой модуль камеры с буфером типа FIFO. В настоящее время он производится несколькими фирмами и доступен с различной распиновкой. OV7670 обеспечивает полномасштабное (full frame) 8 битовое изображение в окне. OV7670 умеет работать с различными форматами видео изображения. В VGA разрешении камера обеспечивает до 30 кадров в секунду.
Модуль камеры OV7670 включает:
- массив датчиков изображений (разрешения примерно 656 x 488 пикселов);
- тактовый генератор;
- процессор обработки сигналов;
- аналого-цифровые преобразователи;
- генератор тестовых шаблонов;
- цифровой сигнальный процессор;
- устройство для масштабирования изображений;
- цифровой видео порт;
- светодиод и выход управления стробоскопической вспышкой.
Датчик изображения камеры OV7670 управляется с помощью шины SCCB (Serial Camera Control Bus - последовательная шина управления камерой) по протоколу I2C (контакты SIOC, SIOD) с максимальной частотой синхронизации 400 кГц.
Внешний вид модуля камеры OV7670 показан на следующих рисунках.
OV7670 модуль VGA камеры
Модуль камеры OV7670 (со снятой линзой)
Модуль камеры OV7670 (нижняя сторона платы)
Камера использует следующие квитирующие (подтверждающие) сигналы:
- VSYNC : Vertical Sync Output (выход вертикальной синхронизации (для строк) – низкий уровень во время кадра;
- HREF : Horizontal Reference (горизонтальная синхронизация (для колонок) – высокий уровень во время активных пикселов ряда (строки);
- PCLK : Pixel Clock Output (пиксельная синхронизация (тактовый сигнал передачи байта из параллельного порта D0–D7) – независимый генератор синхронизирующих импульсов. Данные правильны на нарастающем фронте.
В дополнение к этому камера оперирует еще следующими сигналами:
Камера OV7670 синхронизируется с помощью генератора на 24 МГц. Это обеспечивает выход пиксельной синхронизации (PCLK) 24 МГц. Буфер типа FIFO имеет память на 3 Мбит. Генератор тестовых шаблонов формирует шаблон цветовых полос – с 8 полосами, с постепенным уменьшением к серому цвету (fade-to-gray).
Схема проекта
Схема подключения модуля камеры OV7670 к плате Arduino Uno представлена на следующем рисунке.
Внешний вид получившейся у нас конструкции проекта показан на следующем рисунке.
Объяснение программы для Arduino
Полный текст программы приведен в конце в статьи, здесь же мы рассмотрим его наиболее важные фрагменты.
Для работы с камерой OV7670 нам понадобится встроенная в Arduino IDE библиотека. Никаких внешних библиотек, которые необходимо скачивать, мы в этом проекте использовать не будем, только встроенные библиотеки.
После подключения в программе необходимых библиотек нам необходимо сконфигурировать регистры для работы с камерой OV7670.
Функция Setup() в нашем проекте будет включать все необходимые установки, необходимые для захвата изображений. Первой функцией, которую мы применим, будет arduinoUnoInut() – она используется для инициализации платы Arduino Uno. Она отключает все глобальные прерывания и устанавливает настройки для интерфейсов связи, такие как синхронизацию для ШИМ (широтно-импульсная модуляция), выбор контактов прерывания, настройки предделителя, добавление бита четности и стоповых битов.
В этом проекте мы сделаем робота с функцией слежения за лицом. Работая над проектом, я старался чтобы описанное было как можно более простым в повторении, не требовало глубоких знаний и опыта в создании систем компьютерного зрения и программирования.
Распознавание лиц реализовано на смартфоне под управлением ОС Android в среде Processing. Для передачи данных с Android устройства на Arduino было решено использовать Bluetooth. Если Вам захочется развить проект, Вы всегда можете попробовать свои силы в программировании. APK файлы для установки, исходные коды программы под Android, скетч для Arduino и файлы 3D-моделей для печати можно скачать по этой ссылке.
Основные компоненты:
- Arduino
- 2 x сервоприводы
- Модуль Bluetooth HC-05 (или HC-06 или подобный)
- Смартфон с ОС Android
Под модулем HC-05 подразумевается не сам модуль, имеющий следующий вид:
А модуль, распаянный на примерно такой плате:
на которой есть штырьки для подключения, стабилизатор питания, кнопка для перевода в режим настройки и т.д.
Механизм поворота и наклона можно взять готовый или сделать самостоятельно из различных материалов. Это может быть картон, профиль, дерево, обрезки пластика (коробки из-под cd/dvd дисков, пластиковые корпуса и т.д.) и много чего ещё. Как говориться полная свобода для творчества. В данном случае был выбран вариант печати на 3D-принтере.
Для печати использовалось программное обеспечение Cura, использованные настройки приведены ниже. Вы можете использовать их или изменить их в зависимости от вашего принтера.
После распечатки деталей, собираем. Для соединения деталей можно использовать винты и клеевой пистолет. В собранном виде всё выглядит примерно так:
Подключение электроники
Основные детали - это Arduino, HC-05 модуль блютуза и два сервопривода. Для сборки можно использовать макетную плату. Соединение сигнальных линий показано на следующем изображении
С организацией питания есть множество вариантов. К примеру, если будете запитывать от внешнего блока питания на 5В, то схема может быть такая:
После блока питания можно поставить выключатель.
На модуле HC-05 обычно установлен линейный стабилизатор, на вход которого можно подавать 3.6-6В. Модуль блютуза можно подключить не на прямую к источнику питания, а к пину 5В Arduino Nano. Стабилизатор на Arduino Nano вполне выдержит такую дополнительную небольшую нагрузку.
На схеме выше источник питания подключен к Arduino Nano через пин VIN. Если Ваш источник питания выдаёт не более 5В, можно подключить не к пину VIN, а к пину 5В. Пин VIN идёт на вход линейного стабилизатора (обычно это LM1117), а с его выхода уже и запитывается Arduino. От пина 5В питание идёт на прямую на микроконтроллер и, если подадите слишком большое напряжение, микроконтроллер может выйти из строя.
Некоторые запитывая Arduino Nano через пин VIN, берут питание для однного-двух маломощных (на подобии SG-90) сервоприводов с пина 5В Arduino. Лучше так не делать, т.к. линейный стабилизатор на Arduino может сгореть. При подключении более мощных сервоприводов (MG995 и т.д.) тем более так не стоит подключать. На других платах Arduino может быть установлен более мощный стабилизатор, тогда подключение как минимум пары SG90 будет не проблема.
Кроме питания от внешнего блока питания можно использовать аккумуляторы. Это могут быть несколько NiMh аккумуляторов или один и более Li-ion.
К примеру, если будет использовано 4 NiMh АА аккумулятора, можно подключить как на схеме выше вместо блока питания, должно работать. Если всё-таки будет сбоить, дополнительно можно поставить повышающе-понижающий dc-dc преобразователь. Если запитывать более чем от 4 NiMh АА аккумуляторов, следует использовать понижающий dc-dc преобразователь.
Вместо NiMh аккумуляторов можно взять Li-ion. В аккумуляторах от мобильных телефонов обычно есть плата защиты. В типоразмере 18500, 18650. или примерно таких
плата защиты может быть, а может и отсутствовать. В данном случае плата защиты есть (обведена красным). Если платы защиты нет, она очень желательна - при глубоком разряде у Li-ion аккумуляторы сильно деградируют. Если использовать один Li-ion аккумулятор или несколько соединённых параллельно, очень удобный вариант - это использовать модуль зарядки со встроенной защитой на подобии такого модуля
т.к. для питания Arduino и сервоприводов нужно приблизительно 5В, а с аккумулятора будет примерно в диапазоне 3-4В, нужно будет подключить повышающий преобразователь. Получится примерно так:
Использовать для питания пальчиковые батарейки или как при съёмке видео крону и т.д., можно, но это не очень хороший вариант. У них очень маленькая ёмкость и их имеет смысл устанавливать в малопотребляющую электронику на подобии настенных часов, мультиметры и т.д. При питании таких вещей как моторы, сервоприводы (особенно мощные) они очень быстро "садятся", т.е. лучше использовать или блок питания или аккумуляторы, которые можно заряжать.
Организацию питания немного рассмотрели, перейдём к коду.
Программная часть
Как уже упоминалось ранее, распознавание и слежения происходит благодаря приложению под ОС Android. Это приложение создано с помощью Processing Android. В папке "Android" есть APK файлы "Face_tracking_with_arduino_android_app.apk" и "face_tracking2.apk", загрузите один из них на смартфон и затем установите. В face_tracking2 немного изменён способ подключения к HC-05, в некоторых ситуациях он может работать лучше.
На смартфоне зайдите в настройки Bluetooth, там произведите сопряжение (Pairing) с модулем. Пароль по умолчанию обычно 0000 или 1234. При сопряжении укажите название модуля "HC-05", если до этого уже произведено сопряжение и указано другое название, переименуйте в "HC-05". Приложение будет подключаться только к модулю с таким названием. Для работы нужно что бы модуль был настроен на битрейт "9600,1,0". В режиме настроек (обычно для этого режима настроен битрейт 38400) модуля HC-05 Вам могут понадобиться некоторые команды.
Проверка битрейта: at+uart?
Для установки: at+uart=9600,1,0
Изменения названия: at+name=HC-05
Изменение пароля: at+pswd=1234
Проверка режима работы (master, slave, slave-loop): at+role?
Установка режима работы в slave: at+role=0
Если будете использовать "Face_tracking_with_arduino_android_app", перед запуском HC-05 уже должен работать, т.к. подключение производится только при запуске приложения. Иногда это приводило к трудностям (выгружать приложение, отключать HC-05 и bluetooth в телефоне и т.д.) и подключение было немного переделано. В "face_tracking2" подключение перенесено в функцию draw и немного изменено - постоянно проверяет, если не подключено и есть "HC-05", пробует к нему подключиться (т.е. HC-05 модуль можно подключать и после запуска программы). Какой вариант будет работать лучше на Вашем телефоне, тот и используйте. Если захотите ещё как-то переделать, исходные коды проекта находятся в папке " Android".
Теперь запустите приложение. В зависимости от смартфона, его нужно развернуть в ландшафтном или портретном режиме. После запуска, если всё нормально, Вы увидите на экране изображение с камеры и вверху надпись «Connected to: HC-05» в верхней части экрана.
Для удобства проверки можно использовать фотографию (открыть на компьютере и т.д.). Наведите камеру смартфона на лицо и вокруг него должно появиться зеленое поле. В левом верхнем углу синим текстом будут отображаться координаты.
После обнаружения лица и определения координат, приложение вычислит, нужно ли и в каком направлении нужно переместиться, чтобы лицо на изображении оказалось по центру. Эти данные затем по Bluetooth отправляются на Arduino.
Программа для Arduino в этом проекте не сложная. Получая данные от смартфона, мы подаём соответствующие управляющие импульсы на сервоприводы.
На Arduino есть UART, но он задействован при загрузке скетча и для вывода отладочной информации. Его можно использовать для подключения Bluetooth модуля, но это не удобно. В данном случае было решено использовать библиотеку SoftwareSerial для программного UART. В скетче настройка пинов для UART происходит в следующей строчке:
SoftwareSerial cam_BT (12, 11); //RX, TX
TX UART`а это вывод D12, он подключен к выводу RX модуля HC-05
RX UART`а это вывод D11, он подключен к выводу TX модуля HC-05
Далее для Bluetooth настраивается битрейт 9600 бод:
Если Ваш модуль настроен на другой битрейт, или перенастройте модуль Bluetooth или задайте такой же битрейт в скетче Arduino.
Далее проверяется, есть ли не считанные данные от Bluetooth и если есть, они считываются и сохраняются в переменную BluetoothData:
if (cam_BT.available())
<
BluetoothData=cam_BT.read();
Serial.print("Incoming from BT:");
Serial.println(BluetoothData);
>
В зависимости от получаемых со смартфона данных, переменные pos1 и pos2 увеличиваются или уменьшаются на 2 и эти переменные передаются в функцию write для задания положения сервоприводов:
Вместо изменения на 2, Вы можете использовать число больше или меньше, чтобы замедлить или ускорить движение сервоприводов. При задании слишком большого значения, камера будет постоянно проскакивать нужную позицию.
Дальнейшее развитие проекта
Этот проект создавался максимально простым, что бы его было легче повторить и понять исходный код. Разобравшись, что и как работает, можно будет улучшать какие-либо его части или переделывать для выполнения других задач.
Поделюсь некоторыми идеями, что можно реализовать. В текущем виде происходит только слежение за лицом и при нажатии на экран сохраняется фото с камеры. Можно сделать автоматическое сохранение фотографий при обнаружении лица. Для реализации интерактивного робота, вместо изображения с камеры, на экране можно нарисовать лицо. Так же можно сделать робота подвижным:
Если на смартфоне нет фронтальной камеры, с обратной стороны смартфона можно разместить одну или несколько светодиодных матриц, на которых выводить анимированные смайлики, глаза и т.д.
Можно сделать "живую картину". Принцип работы может быть следующим: выводится изображение, а когда приложение распознаёт лицо, начать воспроизводить видео. Это могут быть картины природы или людей (некоторые из серии слабонервным не смотреть) или ещё что-то. Видео можно сделать самостоятельно или поискать что-то готовое, к примеру на YouTube.
Можно сделать дополнительную фигурку и за счёт распознавания лица (т.е. кто-то стоит и смотрит в её сторону) реализовать интерактивное поведение - мигать глазами, воспроизводить звуки, при использовании сервоприводов фигурка сможет ещё и двигаться. К примеру, вот пара фотографий из одного проекта в сети таких фигурок на Хэллоуин:
С идеями на этом закончим, можете использовать их или придумать ещё что-то своё.
И в заключении рассмотрю, как настроить Processing (под Windows) для создания приложения под Android. Файлы для скачивания Processing находятся на официальном сайте тут. Скачиваете архив, распаковываете и запускаете файл processing.
На основе среды Processing сделана Arduino Ide, так что интерфейс Вам покажется знакомым. Посмотрите в правый верхний угол приложения, там скорей всего у Вас будет отображаться "Java". Это текущий режим работы, но нам нужен не он, а "Android". Нажимаем и появится меню. Если до этого не было установлено других режимов, меню будет таким:
Нажимаете на "Добавить режим", появится такое окно:
Выбираете пункт "Android Mode" и нажимаете кнопку "Установить" ("Install"). После окончания установки переключитесь на закладку "Библиотеки" (в левом верхнем углу "Libraries"):
В данном проекте нам понадобиться библиотека "Ketai". В верху в поле поиска введите "Ketai", затем выберете её в списке и нажмите " Установить". Теперь это окно и Processing можно закрыть, чтобы перезапустить.
После запуска в верхнем правом углу переключаетесь в режим "Android":
По коду ещё только одно замечание. Если у вас на телефоне более одной камеры, возможно первое что может понадобиться изменить - это с какой камеры получать изображение. Выбор камеры производится в строчке:
Читайте также: