В этой статье мы рассмотрим робота на основе платы Arduino, который будет распознавать и отслеживать лица людей. Робот будет состоять из схемы на основе платы Arduino, двух сервомоторов и мобильного телефона (смартфона) с камерой на операционной системе Android. Камера смартфона будет перемещаться вдоль вашего лица с помощью сервомоторов. Преимущество такого подхода состоит в том, что вам не нужно будет покупать отдельно камеру для этого проекта, а всю работу по распознаванию лиц может выполнить непосредственно смартфон. Также наше устройство не нужно будет подключать к компьютеру для работы. Для связи Arduino с мобильным телефоном мы будем использовать Bluetooth модуль.
Приложение для Android написано в бесплатной программной среде Processing. Далее в статье вы можете скачать готовое приложение и установить его на свой телефон, либо установить среду Processing, скачать исходный код приложения и дописать его под свои потребности. Также вы можете посмотреть все проекты на нашем сайте, использующие Processing.
Также в этой статье мы рассмотрим создание мини роботизированной руки, которая будет отслеживать местоположение вашего лица и перемещаться вдоль него. Также в дальнейшем вы можете использовать эту роботизированную руку чтобы записывать видеоблоги или делать идеальные селфи с помощью задней камеры смартфона поскольку рассматриваемое нами устройство будет позиционировать камеру строго по центру вашего лица. Более подробно все описываемые процессы можно посмотреть в видео в конце статьи.
Мы постарались сделать проект максимально простым, чтобы его мог повторить любой начинающий в электронике и микропроцессорной технике. Но также на нашем сайте вы можете посмотреть более "продвинутый" проект отслеживания лиц с помощью Arduino и OpenCV.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Сервомотор SG90 (2 шт.) (купить на AliExpress).
- Bluetooth модуль HC-05/HC-06 (купить на AliExpress).
- Смартфон на Android с задней камерой.
- Компьютер для программирования.
- 3D принтер (опционально).
- Батарейка на 9В.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Печать компонентов на 3D принтере (опционально)
Для того чтобы удерживать и перемещать смартфон в пространстве нам необходимая некоторая механическая структура (наподобие держателя для мобильного телефона) с сервомоторами. При желании ее можно сделать из картона (или другого легкого в обработке материала), но мы использовали для этой цели 3D принтер.
Если у вас есть доступ к 3D принтеру, то вы можете скачать готовые STL файлы к нему для нашего проекта. Мы использовали 3D принтер под названием FABX v1, который доступен по приемлемой цене – за это приходится расплачиваться небольшим разрешением и отсутствием разъема для SD карты. Для данного принтера мы использовали программное обеспечение Cura чтобы печатать STL файлы. Настройки для данного программного обеспечения показаны на следующем рисунке:
После сборки с помощью шурупов и клея конструкция должна выглядеть примерно следующим образом:
Работа схемы
Схема устройства представлена на следующем рисунке.
Схема состоит из двух сервомоторов, один из которых используется для поворота мобильного телефона вправо/влево, а другой – для его наклонов вперед/назад. Управляющие команды для сервомоторов подает плата Arduino Nano, которая, в свою очередь, получает их от Bluetooth (HC-05) модуля. Схема запитывается от батарейки на 9 В.
Схему можно собрать либо на макетной, либо на перфорированной плате – по вашему желанию.
Установка приложения для Android
Как уже указывалось ранее, интеллектуальной основой этого проекта является приложение на Android, разработанное в программной среде Processing для Android. Вы можете установить на свой смартфон уже готовое приложение для этого проекта, выполнив следующие шаги:
- Скачать APK файл приложения по этой ссылке.
- Подать питание на собранную схему устройства.
- В настройках телефона найти Bluetooth модуль под именем “HC-05”.
- Если вы использовали не “HC-05”, то все равно назовите его HC-05 иначе приложение не будет работать.
- Подключите модуль к вашему мобильному телефону по Bluetooth используя какой-нибудь простой пароль, например, “1234” или “0000”.
- Запустите приложение в портретном режиме. Вы должны увидеть изображение с камеры телефона и надпись “Connected to: HC-05” вверху экрана.
- Попробуйте навести камеру на чье либо лицо – на экране смартфона должно отобразиться это лицо и также должен появиться квадрат зеленого цвета, символизирующий захват лица.
Вы можете внести в этот проект множество улучшений. Для этого можете скачать исходный код этого приложения и изменять его по своему желанию. Поначалу может показаться что это очень сложно, но на самом деле программная среда Processing достаточно проста для освоения и при минимальных усилиях позволяет создавать впечатляющие проекты.
Вы можете посмотреть другие проекты на нашем сайте, в которых использовалась программная среда Processing:
- проект виртуальной реальности на Arduino;
- игра в Ping Pong с помощью Arduino;
- радар на Arduino с использованием ультразвукового датчика.
Программирование Arduino
Рассмотренное приложение на Android будет обнаруживать ваше лицо и его положение на экране, далее оно должно решить в какую сторону необходимо довернуть камеру чтобы лицо оказалось строго в центре экрана. Это необходимое направление движения камеры передается на плату Arduino через Bluetooth модуль.
Программа для платы Arduino в нашем проекте очень проста, мы должны просто управлять поворотами осей двух сервомоторов на основании данных, получаемых от Bluetooth модуля. Полный текст программы приведен в конце статьи, здесь же рассмотрим только его основные части.
В следующих строках кода устанавливается последовательная связь на контактах D12 (RX) и D11 (TX) платы Arduino. Контакт 12 должен быть соединен с контактом TX Bluetooth модуля, а контакт 11 - с контактом RX Bluetooth модуля.
SoftwareSerial cam_BT(12, 11); // RX, TX
Затем мы инициализируем Bluetooth module для работы на скорости 9600 бод/с. Убедитесь в том, что ваш модуль работает именно на этой скорости, иначе измените скорость его работы.
cam_BT.begin(9600); //start the Bluetooth communication at 9600 baudrate
cam_BT.println("Ready to take commands");
Следующие строки кода считывают данные поступающие от Bluetooth модуля. Эти данные затем сохраняются в переменной “BluetoothData”.
if (cam_BT.available()) //считываем что поступает по Bluetooth
{
BluetoothData=cam_BT.read();
Serial.print("Incoming from BT:");
Serial.println(BluetoothData);
}
В зависимости от данных, получаемых по Bluetooth, происходит задание угла поворота серводвигателей. К примеру, для поворота камеры влево используется декремент значения угла поворота на 2. Вместо 2 вы можете использовать декремент и на большие значения, например 4 или 6 – в этом случае наше роботизированная рука, управляющая перемещением смартфона в пространстве, будет перемещаться быстрее, однако это может сделать работу проекта более нестабильной.
if (BluetoothData==49) //поворот влево
{pos1+=2; servo1.write(pos1);}
if (BluetoothData==50) //поворот вправо
{pos1-=2; servo1.write(pos1);}
if (BluetoothData==51) //поворот вверх
{pos2-=2; servo2.write(pos2);}
if (BluetoothData==52) //поворот вниз
{pos2+=2; servo2.write(pos2);}
Исходный код программы
После того как схема будет собрана и программа загружена в плату Arduino, запустите приложение на своем смартфоне и подайте питание на плату Arduino. Приложение автоматически соединится с вашим Bluetooth модулем (он должен быть назван HC-05) и будет ждать обнаружения чьего либо лица. Сядьте напротив камеры смартфона – вы должны заметить как начнут двигаться сервомоторы чтобы поместить ваше лицо в центр экрана. Теперь подвигайтесь в различные стороны в диапазоне действия вашей камеры и вы заметите как смартфон будет следить за вашими перемещениями. Для тестирования работы устройства можно использовать любую картину с изображением человеческого лица.
Более подробно работу проекта вы можете посмотреть на видео в конце статьи. Вы можете усовершенствовать этот проект так, как вам будет необходимо. Далее представлен полный текст программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
/*необходимые соединения * Arduino D11 -> RX of BT Module * Arduino D12 -> Tx of BT * Servo1 -> pin 3 of arduino Nano to pan * Servo2 -> pin 5 of arduino Nano to tilt */ #include <Servo.h> //подключение библиотеки для работы с сервомоторами #include <SoftwareSerial.h>// подключаем библиотеку последовательной связи SoftwareSerial cam_BT(12, 11); // RX, TX int ledpin=13; // светодиод подключен к контакту D13 int BluetoothData; // данные, получаемые от смартфона //инициализируем сервомоторы Servo servo1; Servo servo2; long gmotor,gnum1,gnum2; int pos; int flag=0; int pos1 = 40; int pos2 = 90; void setup() { servo1.attach(3); servo2.attach(5);; //**начальная позиция сервомоторов**// servo1.write(pos1); servo2.write(pos2); //**initialised**// cam_BT.begin(9600); //инициализация Bluetooth соединения на скорости 9600 бод/с cam_BT.println("Ready to take commands"); Serial.begin(57600); Serial.println("Face tracking programming"); } //***функции для действий каждого сервомотора**// void call(int motor, int num1, int num2) // The values like Motor number , from angle and to angle are received { Serial.println("Passing values..."); flag =0; switch (motor) { case 1: // для первого сервомотора { Serial.println("Executing motor one"); if(num1<num2) // вращение по часовой стрелке { for ( pos =num1; pos<=num2; pos+=1) { servo1.write(pos); delay( 20); } } if(num1>num2) // вращение против часовой стрелки { for ( pos =num1; pos>=num2; pos-=1) { servo1.write(pos); delay( 20); } } break; } ////////JUST DUPLICATE FOR OTHER SERVOS//// case 2: // для второго сервомотора { Serial.println("Executing motor two"); if(num1<num2) { for ( pos =num1; pos<=num2; pos+=1) { servo2.write(pos); delay( 20); } } if(num1>num2) { for ( pos =num1; pos>=num2; pos-=1) { servo2.write(pos); delay( 20); } } break; } } } void loop() { if(Serial.available()>0) //считываем что поступает по последовательному порту { gmotor= Serial.parseInt(); Serial.print(" selected Number-> "); Serial.print(gmotor); Serial.print(" , "); gnum1= Serial.parseInt(); Serial.print(gnum1); Serial.print(" degree , "); gnum2= Serial.parseInt(); Serial.print(gnum2); Serial.println(" degree "); flag=1; } if (cam_BT.available()) //считываем что поступает по Bluetooth { BluetoothData=cam_BT.read(); Serial.print("Incoming from BT:"); Serial.println(BluetoothData); } if (flag ==1) call(gmotor,gnum1,gnum2); //вызов соответствующего сервомотора для действия 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);} flag=0; BluetoothData=0; } |
Забавная вещица. Можно установить на турель с пушкой для теннисных мячей и сделать так, чтобы она подавала, когда появится определенная физиономия в кадре.
Ну человеческая фантазия не знает границ, это факт ))
Однако Аурдина у Вас не причем. Однако сервопривод.
Посмотрите https://yadi.sk/d/LAlnZT0jIvc5Kg?w=1
Посмотрел, но ваш проект все таки достаточно сильно отличается от того, который описан в этой статье. Или вы хотите чтобы я опубликовал ваш проект на моем сайте?