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



    Давно мечтал сделать 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

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



    В дальнейшем планирую научить робота ориентироваться в пространстве и рисовать карту помещения.
    Поделиться публикацией
    Комментарии 32
      +2
      Осталось только приделать к роботу пылесос, и можно выпускать коммерческую партию :-)
        0
        На сколько хватает одного заряда батареек? По моим расчётам, у вас должно получиться 1.5-3 часа.
          +1
          Точно не могу сказать, так как долго робота не гонял, но примерно часа на два хватает
            +1
            А вы не могли бы замерить ток, который потребляет робот в различных режимах работы (езда, видео, стоянка на месте и т.д.)?
              0
              Сегодня не смогу замеры произвести, завтра постараюсь замерить
            +1
            Удалено, ошибся
              +1
              Расскажите, пожалуйста, подробнее о роутере. В первую очередь интересует качество картинки с камеры и можно ли использовать UART роутера для подключения к контроллеру.
                +1
                Качество картинки зависит от веб камеры, у меня установлена старенькая камера Logitech с максимальным разрешением видео 960х720
                Наилучший результат цена/качество дает камера Logitech C270
                Вот Вам скриншот с моей камеры, скриншот сделан в режиме настроек, так что на ползунки и кнопки на изображении, не обращайте внимание.
                UART тоже можно использовать. Единственный недостаток в том что нужно в секции скетча, вставить паузу на 30-40сек., так как в момент загрузки роутера в UART шлется log
                  0
                  Картинка невероятно отличная! У меня TL320 лагает с гораздо меньшим разрешением с 5FPS!
                  И я все равно не понял, как подключена ардуина к роутеру. У него же один USB-разъем вроде.
                    0
                    У меня TL320 лагает с гораздо меньшим разрешением с 5FPS
                    Она умеет выдавать уже сжатый поток? Если нет, то понятно. Если да, то надо ковырять дрова того, что у вас стримит.

                    как подключена ардуина к роутеру
                    Я бы по UART подключил. Но у автора написано:
                    Миниатюрный USB 2.0 Hub
                      +1
                      Изображение не лагает, потому как камера имеет встроенный MJPG кодер
                      Если будете покупать камеру, то покупайте камеру Logitech, они практически все имеют встроенный MJPG кодер
                      У меня хаб спрятан в роутере
                      image

                      image
                        0
                        Вот пример работы с камерой C270
                        Видео и робот не мои
                          0
                          Я два года назад этим занимался, может, много чего поменялось. И роутер у меня был немного другой. Камера точно была Logitech. Надо попробовать воскресить проект.
                          С хабом отлично придумано! Теперь хаки с внешними антеннами кажутся баловством.
                            0
                            Возможно что MJPG-Streamer был не правильно настроен.
                            Вместо режима MJPG был включен режим YUV
                            0
                            А каков FPS и на каких разрешениях?
                              0
                              FPS не замерял, но он больше зависит от скорости кодирования камеры и пропускной способности WiFi сети
                              Роутер в данном случаи работает как посредник, он добавляет HTML заголовок к каждой картинке MJPG, пришедшей с камеры и отправляет ее в сеть
                            0
                            У меня вот так работает — первый тест.
                            Да порой пропадает видео, но сразу обновив страничку оно продолжает работать.
                            Но прошивка роутера у меня другая и после тестов скрипты я там дописывал.
                            У меня как раз все команды с роутера на adruino идут именно по UART, а в USB подключена только камера.
                            Катался по WiFi дома, потом через инет с работы. Даже конкурс для коллег делал, кто быстрее проедет трассу в FPV режиме.

                            Как раз хотел спросить как проблему с логами в UART решали, а то при таком скетче робот на старте будет чудить, но автор делал по другому и еще про паузу написал.
                            А я просто повысил скорость UART и сделал более сложные команды, а еще робот возвращает телеметрию — расстояние на все четыре стороны.
                              0
                              А у вас какой роутер?
                                0
                                TP-LINK TL-MR3020
                                Он аналог 703, только в нем есть уже площадка под пины для UART, просто припаять пины и можно пользоваться.
                                  0
                                  У меня такой же. Попробую обновиться. Спасибо большое!
                                0
                                В CyberWrt логи отключаются установкой модуля «Free UART»
                          0
                          Я так понял, что при таком решении надо к ездящему девайсу коннектится с компа как к точке доступа через Wi-Fi.

                          А можно как-то им управлять через интернет удалённо? Т.е. чтобы он подключался к домашнему Wi-Fi роутеру, а я бы с работы мог им поиграться? Это будет гораздо интереснее. И еще интереснее будет, если прикрутить к системе возможность выхода в интернет через GSM: 2/3G, LTE, 4G…
                            0
                            Можно настроить WiFi робота как режиме AP так и Client.
                            Через интернет подключался, все прекрасно работает и управляется
                            Только порты(80 и 8080) пробросить на шлюзе не забудьте
                            Через GSM не проверял, но не вижу никаких препятствий для такого подключения
                              0
                              Это понятно, что надо порты пробросить.
                              Но тут еще вопрос — вы подключались как — на статичный IP? Т.е. если я у провайдера за NAT'ом, то надо будет статичный IPшник себе делать или как-то выкручиваться внешними сервисами как-то?
                          0
                          Вопрос автору поста — а вам из carduino все нормально дошло? Потому как мне недолложили комплектующих для шасси, положили сломанный бат. отсек, прорези в энкодерах низкого качества… Невесело как-то…
                            0
                            Я покупал у них в офисе, все было в комплекте и исправном состоянии.
                            А Вы к ним обращались с этой проблемой?
                            Не думаю что они Вам умышленно плохую деталь подсунули.
                              0
                              Да, написал письмо. Там видно будет.
                              На худой конец прихолхозю до рабочего состояния — в первый раз что ли )))
                                0
                                Восстанавливаю репутацию магазина!
                                Утрясли вопрос — все недостающие/бракованные детали мне обещали возместить и уже отправили в точку самовывоза.
                            0
                            Скажите а можно как-то удаленно команды отсылать роботу, типа http запросы.
                              0
                              Можно конечно

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое