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

в 8:33, , рубрики: arduino, CyberBot, diy или сделай сам, robot, Wi-Fi robot, программирование микроконтроллеров, Программирование робототехники

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

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

Набор для сборки платформы робота
Материнская плата робоконтроллера
Arduino Nano v.7
Драйвер двигателей
Маршрутизатор TP-Link TL-WR703N
Миниатюрный USB 2.0 Hub
Покупал комплектующие здесь.

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

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

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

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

Роутер wr703N прикрепил к нижней части платформы робота на двухсторонний скотч
Собираем Wi-Fi робота - 5

Веб камера прикреплена на мебельный уголок, к штанам отверстиям платформы, предусмотренных для сервомоторов.
Собираем Wi-Fi робота - 6

Прошил роутер прошивкой 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

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

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

Автор: CyberBot

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js