Pull to refresh

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

DIY


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

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

Набор для сборки платформы робота
Плата контроллера робота
Arduino Nano v.7
Драйвер двигателей
Маршрутизатор Nexx WT3020H
Миниатюрный 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://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

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



В дальнейшем планирую научить робота ориентироваться в пространстве и рисовать карту помещения.
Tags:
Hubs:
Total votes 31: ↑30 and ↓1 +29
Views 55K
Comments Comments 32