...

суббота, 7 марта 2015 г.

Собираем Wi-Fi робота



Давно мечтал сделать Wi-Fi робота, которым можно было бы управлять удаленно. И вот наконец настал тот день когда я смог управлять роботом через интернет, видеть и слышать все что происходит вокруг него.

Заинтересовавшихся приглашаю под кат

Для создания робота использовались следующие комплектующие:


Набор для сборки платформы робота

Материнская плата робоконтроллера

Arduino Nano v.7

Драйвер двигателей

Маршрутизатор TP-Link TL-WR703N

Миниатюрный USB 2.0 Hub

Покупал комплектующие здесь.


Вот так выглядит собранный мной робот, без верхней крышки.


Теперь все по порядку:


Сборка платформы робота

image


Расположение компонентов на материнской плате

Я установил только Arduino Nano, драйвер двигателей и звуковой излучатель HC.

image


Роутер 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 <CyberLib.h>
#include <Servo.h>

Servo myservo1;
Servo myservo2;

long previousMillis; http://ift.tt/1EzuWM6
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


Выкладываю видео:


В дальнейшем планирую научить робота ориентироваться в пространстве и рисовать карту помещения.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий