Собираем Wi-Fi робота
Давно мечтал сделать Wi-Fi робота, которым можно было бы управлять удаленно. И вот наконец настал тот день когда я смог управлять роботом через интернет, видеть и слышать все что происходит вокруг него.Заинтересовавшихся приглашаю под катДля создания робота использовались следующие комплектующие:
Набор для сборки платформы роботаМатеринская плата робоконтроллераArduino Nano v. 7Драйвер двигателейМаршрутизатор TP-Link TL-WR703NМиниатюрный USB 2.0 HubПокупал комплектующие здесь.
Вот так выглядит собранный мной робот, без верхней крышки.
Теперь все по порядку:
Сборка платформы робота
Расположение компонентов на материнской платеЯ установил только Arduino Nano, драйвер двигателей и звуковой излучатель HC.
Роутер wr703N прикрепил к нижней части платформы робота на двухсторонний скотч
Веб камера прикреплена на мебельный уголок, к штанам отверстиям платформы, предусмотренных для сервомоторов.
Прошил роутер прошивкой CyberWrt.СyberWrt — это прошивка собранная на базе OpenWrt и предназначенная в первую очередь для роботов, умного дома и других устройств построенных на базе популярных моделей роутеров Tp-Link mr3020 b Wr703N. У СyberWrt максимально возможный объем свободного места для инсталляции пакетов — 1.25Мб. По умолчанию установлен веб сервер и все операции можно проводить через встроенный веб интерфейс. Сразу после перепрошивки, роутер доступен в сети по кабелю и по WiFi, как точка доступа. Через веб-интерфейс можно работать в режиме «командной строки» — через веб терминал и в файловом менеджере, в котором можно редактировать, загружать, удалять, создавать, копировать файлы и многое другое.
После прошивки роутера, он доступен как WiFi точка доступа с именем «CyberBot», подключаемся к нему заходим на главную страницу роутераВот так выглядит веб интерфейс сразу после прошивкиУстанавливаем модули Драйвер FTDI, Драйвер video и CyberBot-2
Прошиваем контроллер ардуино.Код программы робота получился достаточно простым, но его достаточно для того что бы удаленно управлять роботом через локальную сеть или интернетКод адаптирован под контроллеры Arduino с ATmega168/328 на борту и использует библиотеку CyberLibЭта библиотека помогает из контроллера выжать максимум его возможностей и уменьшить объем конечного кодаВ коде используется WDT, для того что бы робот не смог зависнуть.Так же код поддерживает управление камерой по осям X и Y, но у меня не было свободных сервомоторов и я не смог воспользоваться этой функцией
Код для Arduino
#include
Servo myservo1; Servo myservo2;
long previousMillis; http://cyber-place.ru/attachment.php? attachmentid=600&d=1389429469 uint8_t LedStep = 0; // Счетчик int i; boolean light_stat; uint8_t inByte; uint8_t speed=255; //максимальная скорость по умолчанию
#define init {D4_Out; D5_Out; D6_Out; D7_Out; D8_Out; D11_Out; D12_Out;}
void setup () { myservo1.attach (9); // Подключение сервоприводов к порту myservo2.attach (10); // Подключение сервоприводов к порту init; // Инициализация портов D11_Low; // Динамик OFF randomSeed (A6_Read); //Получить случайное значение horn (); //звуковое оповещение готовности робота UART_Init (57600);// Инициализация порта для связи с роутером wdt_enable (WDTO_500MS); }
void loop () { unsigned long currentMillis = millis (); if (LedStep == 0 && currentMillis — previousMillis > 500){ // Задержка 0,5 сек. previousMillis = currentMillis; LedStep = 1; }
if (LedStep == 1 && currentMillis — previousMillis > 500){ // Задержка 0,5 сек. previousMillis = currentMillis; LedStep = 2; }
if (LedStep == 2 && currentMillis — previousMillis > 500){ // Задержка 0,5 сек. LedStep = 0; } if (UART_ReadByte (inByte)) //Если что то пришло { switch (inByte) // Смотрим какая команда пришла { case 'x': // Остановка робота robot_stop (); break; case 'W': // Движение вперед robot_go (); break; case 'D': // Поворотjт влево robot_rotation_left (); break;
case 'A': // Поворот вправо robot_rotation_right (); break; case 'S': // Движение назад robot_back (); break; case 'U': // Камера поднимается вверх myservo1.write (i -= 20); break; case 'J': // Камера опускается вниз myservo1.write (i += 20); break; case 'H': // Камера поворачивается вправо myservo2.write (i += 20); break; case 'K': // Камера поворачивается влево myservo2.write (i -= 20); break; case 'B': // Бластер D12_High; break; case 'C': // Клаксон horn (); break; case 'V': // Включить/Выключить фары if (light_stat) { D8_Low; light_stat=false; } else { D8_High; light_stat=true; } break; } if (inByte>47 && inByte<58) speed=(inByte-47)*25+5; //принимаем команду и преобразуем в скорость } wdt_reset(); }
void horn () { for (uint8_t i=0; i<12; i++) beep(70, random(100, 2000)); //звуковое оповещение }
void robot_go () { D4_Low; analogWrite (5, speed); analogWrite (6, speed); D7_Low; }
void robot_back () { D4_High; analogWrite (5, 255-speed); analogWrite (6, 255-speed); D7_High; }
void robot_stop () { D4_Low; analogWrite (5, 0); analogWrite (6, 0); D7_Low; }
void robot_rotation_left () { D4_Low; analogWrite (5, speed); analogWrite (6, 255-speed); D7_High; }
void robot_rotation_right () { D4_High; analogWrite (5, 255-speed); analogWrite (6, speed); D7_Low; } Все собрано и прошито, теперь включаем робота и управляем им удаленно.На PC кроме экранных кнопок можно управлять еще с клавиатуры, клавишами W, A, D, S, X
Выкладываю видео:[embedded content]
В дальнейшем планирую научить робота ориентироваться в пространстве и рисовать карту помещения.