+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
работаем с 2010 года

Обнаружение и слежение за лицом с использованием смартфона и Arduino

ГлавнаяИнформацияСтатьи

Обнаружение и слежение за лицом с использованием смартфона и Arduino



В этом проекте мы сделаем робота с функцией слежения за лицом. Работая над проектом, я старался чтобы описанное было как можно более простым в повторении, не требовало глубоких знаний и опыта в создании систем компьютерного зрения и программирования.

Распознавание лиц реализовано на смартфоне под управлением ОС Android в среде Processing. Для передачи данных с Android устройства на Arduino было решено использовать Bluetooth. Если Вам захочется развить проект, Вы всегда можете попробовать свои силы в программировании. APK файлы для установки, исходные коды программы под Android, скетч для Arduino и файлы 3D-моделей для печати можно скачать по этой ссылке.





Основные компоненты:

  • Arduino
  • 2 x сервоприводы
  • Модуль Bluetooth HC-05 (или HC-06 или подобный)
  • Смартфон с ОС Android

Под модулем HC-05 подразумевается не сам модуль, имеющий следующий вид:



А модуль, распаянный на примерно такой плате:



на которой есть штырьки для подключения, стабилизатор питания, кнопка для перевода в режим настройки и т.д.

Механизм поворота и наклона можно взять готовый или сделать самостоятельно из различных материалов. Это может быть картон, профиль, дерево, обрезки пластика (коробки из-под cd/dvd дисков, пластиковые корпуса и т.д.) и много чего ещё. Как говориться полная свобода для творчества. В данном случае был выбран вариант печати на 3D-принтере.

STL-файлы данного проекта также доступны для скачивания. Не обязательно печатать именно их, Вы можете взять за основу модели от другого держателя смартфона, механизма поворота/наклона, которые можно поискать на специализированных сайтах (thingiverse.com и т.д.) или создать свои модели. Немного про то, как можно развить проект будет в конце. Я разработал такую конструкцию для моего мобильного телефона MOTO G.

Для печати использовалось программное обеспечение 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 бод:

cam_BT.begin(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 для задания положения сервоприводов:

if (BluetoothData==49) //Turn Left
{pos1+=2; servo1.write(pos1);}
if (BluetoothData==50) //Turn Right
{pos1-=2; servo1.write(pos1);}
if (BluetoothData==51) //Turn Up
{pos2-=2; servo2.write(pos2);}
if (BluetoothData==52) //Turn Down
{pos2+=2; servo2.write(pos2);}

Вместо изменения на 2, Вы можете использовать число больше или меньше, чтобы замедлить или ускорить движение сервоприводов. При задании слишком большого значения, камера будет постоянно проскакивать нужную позицию.





Дальнейшее развитие проекта

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

Поделюсь некоторыми идеями, что можно реализовать. В текущем виде происходит только слежение за лицом и при нажатии на экран сохраняется фото с камеры. Можно сделать автоматическое сохранение фотографий при обнаружении лица. Для реализации интерактивного робота, вместо изображения с камеры, на экране можно нарисовать лицо. Так же можно сделать робота подвижным:





Если на смартфоне нет фронтальной камеры, с обратной стороны смартфона можно разместить одну или несколько светодиодных матриц, на которых выводить анимированные смайлики, глаза и т.д.

Можно сделать "живую картину". Принцип работы может быть следующим: выводится изображение, а когда приложение распознаёт лицо, начать воспроизводить видео. Это могут быть картины природы или людей (некоторые из серии слабонервным не смотреть) или ещё что-то. Видео можно сделать самостоятельно или поискать что-то готовое, к примеру на YouTube.

Можно сделать дополнительную фигурку и за счёт распознавания лица (т.е.  кто-то стоит и смотрит в её сторону) реализовать интерактивное поведение - мигать глазами, воспроизводить звуки, при использовании сервоприводов фигурка сможет ещё и двигаться. К примеру, вот пара фотографий из одного проекта в сети таких фигурок на Хэллоуин:





С идеями на этом закончим, можете использовать их или придумать ещё что-то своё.

И в заключении рассмотрю, как настроить Processing (под Windows) для создания приложения под Android. Файлы для скачивания Processing находятся на официальном сайте тут. Скачиваете архив, распаковываете и запускаете файл processing.



На основе среды Processing сделана Arduino Ide, так что интерфейс Вам покажется знакомым. Посмотрите в правый верхний угол приложения, там скорей всего у Вас будет отображаться "Java". Это текущий режим работы, но нам нужен не он, а "Android". Нажимаем и появится меню. Если до этого не было установлено других режимов, меню будет таким:



Нажимаете на "Добавить режим", появится такое окно:



Выбираете пункт "Android Mode" и нажимаете кнопку "Установить" ("Install"). После окончания установки переключитесь на закладку "Библиотеки" (в левом верхнем углу "Libraries"):



В данном проекте нам понадобиться библиотека "Ketai". В верху в поле поиска введите "Ketai", затем выберете её в списке и нажмите " Установить". Теперь это окно и Processing можно закрыть, чтобы перезапустить.

После запуска в верхнем правом углу переключаетесь в режим "Android":



Теперь Вы сможете править код и запускать его на смартфоне. Для запуска, как и в Arduino Ide нажимается кнопка с изображением треугольника. Перед запуском подключите свой смартфон к компьютеру. На нём должна быть разрешена отладка по USB, но как настраивать ищите сами, т.к. эта настройка сильно зависит от телефона. После подключения смартфона, выберите его в меню ("Android" -> "Devices"):



По коду ещё только одно замечание. Если у вас на телефоне более одной камеры, возможно первое что может понадобиться изменить - это с какой камеры получать изображение. Выбор камеры производится в строчке:

cam.setCameraID(0);

Вместо "0" впишите нужный индекс камеры.

На этом всё.


Автор: Aswinth Raj
Перевод и адаптация: RobotoTehnika.ru