25 листопада 2016 р.

10. Дистанційне керування

Нарешті дійшли руки до модуля ESP13, якого нам помилково прислали разом із шасі і який до цього часу припадав пилюкою в надійному місці. Цей модуль ідеально підійшов для реалізації дистанційного керування нашим роботом.


ESP13 Arduino WiFi Shield


Апаратна частина


В основу модуля закладено мікроконтролер ESP8266, який сам по собі є дуже потужною штукою. Його можна програмувати окремо, і по потужності він співмірний з Arduino, а багато в чому і крутіший. Ми будемо поки використовувати його в пів сили - лише як засіб комунікації для нашого Arduino із зовнішнім світом через WiFi.

Конструктивно модуль виконаний у вигляді шилда, і може під'єднуватися прямо на Arduino UNO (а також Mega). Крім живлення (5V+GND), шилд використовує лише два виходи Arduino - 0 (RX) та 1 (TX). Всі інші контакти вільні і виведені на верхню площину плати. Щоб не сплутати контакти Arduino із власними виводами ESP8266, на платі навіть намальовано лінію розмежування. Все що над нею - належить Arduino. Все що під - ESP8266.

Вузьким місцем є використання контактів 0 та 1 для забезпечення взаємодії між Arduino та ESP8266. Проблема в тому, що коли ви заливаєте прошивку в Arduino, для цього також використовуються лінії, під'єднанні до контактів 0 та 1, навіть якщо Arduino підключене до комп'ютера через порт USB. Тому під час заливання прошивки, ESP13 приймає інформацію від комп'ютера на свій рахунок, та інтенсивно починає пробувати відповідати. В результаті - ваша програма не потрапить на Arduino.

Розробники вирішили проблему просто, хоч і не зовсім елегантно. У правому верхньому куті плати змонтовано два прості перемикачі (по одному на кожну лінію). Якщо ви хочете, щоб Arduino спілкувався з ESP - переведіть вимикачі в позицію ON. Якщо хочете, щоб Arduino працював із комп'ютером через USB - переведіть вимикачі в OFF. Не знаю чому, але в нас чомусь ті вимикачі зовсім не допомогли. Незалежно від їхнього стану, Arduino з підключеним ESP13 не піддається програмуванню. Тому перед заливанням програми на Arduino, шилд доводиться кожен раз знімати.

ESP13 ідеально підходить для початківців. Виробник заливає на ESP8266 прошивку, яка забезпечує дві чудові речі:
  • Налаштування шилда елементарно просте - простіше навіть ніж налаштування домашньої точки доступу, яка роздає Інтернет. ESP13 несе на собі міні-веб сервер, куди можна зайти звичайним переглядачем тенет і налаштувати всі параметри роботи.
  • Arduino не турбується всіма складнощами спілкування із зовнішнім світом через WiFi (всякими там IP адресами, передачею пакетів, корекцією помилок і т.д.). Навіть не вимагається використання спеціальних бібліотек. Arduino може обмінюватися даними використовуючи простий протокол роботи із послідовним портом і стандартну бібліотеку Serial.

Детальніше про характеристики і особливості роботи можна почитати в офіційній документації (англ.). Знання китайської не є обов'язковим, але дуже вітається :-)

Опишу як ми використовуємо ESP13 для дистанційного керування роботом.

Налаштування шилда


Схема комунікацій на основі ESP13 виглядає так:
Схема комунікацій на основі ESP13

Після першого вмикання, шилд автоматично піднімає WiFi мережу з назвою "DoitWiFi_Config". Пароль "12345678". Якщо підключитися до цієї мережі, наприклад з мобільного телефона чи планшета, можна зайти на сторінку налаштувань модуля за адресою: http://192.168.4.1.

Наш робот налаштований ось так:
Сторінка налаштувань ESP13


Оскільки робот буде жити в будинку, який вже покритий домашньою мережею WiFi, ми налаштували ESP13 щоб вона підключалася автоматично в домашню мережу (AP Name), отримувала з маршрутизатора динамічну IP адресу (DHCP Enable) і очікувала (Socket Type: Server) команди по протоколу TCP (Transport Type) на порті 9000 (Local Port). Інтеграція в домашню мережу дозволяє підключатися до робота напряму і з комп'ютера, і з мобільних пристроїв без переконфігуровування мережі та іншого шаманства. Використавши IP Forwarding чи SSH тунелі можна навіть налаштувати керування роботом з будь-якої точки світу. Але то вже інша тема, мережна. Не будемо на ній зупинятися (ну хіба хто дійсно в ступор зайде - можу допомогти розібратися).

Яку саме IP адресу виділив маршрутизатор для робота можна підглянути на сторінці самого маршрутизатора. Якщо з динамічними адресами зв'язуватися не хочеться - можна жорстко задати статичну адресу і параметри мережі (STA IP address, Netmask, Gateway address).

Налаштування взаємодії з Arduino (Serial Setting) залишилися стандартними. Припильнуйте, щоб такі ж налаштування використовувалися в програмному коді на стороні Arduino.

Програма дистанційного керування


Для керування роботом у такій схемі нема потреби в спеціалізованих програмах. Елегантність рішення на основі ESP13 в тому, що керувати роботом можна практично з будь-якого пристрою, де можна запустити клієнта Telnet. Так ми і працювали спочатку. Просто запускали на комп'ютері PuTTY, підключалися до адреси 192.168.1.41 на порт 9000 по протоколу Telnet - і вуаля! Всі символи, які набиралися в PuTTY негайно передавалися в Arduino. А все, що Arduino виводив у свій послідовний порт - негайно з'являлося на екрані комп'ютера. (Зверніть увагу - IP адреса 192.168.1.41 була видана випадковим чином. У вас вона скоріш за все буде інша.)

Звісно ж, ми зразу навчили нашого робота реагувати на WASD команди, і говорити все, що він думає з приводу тих команд. Але про це - пізніше.

Керування роботом в текстовій консолі - це звісно ж дуже круто. Але не всі поділяють наше захоплення зеленими буквами на чорних екранах. В багатьох душа більше лежить до кнопочок, іконочок та інших кольорових надлишковостей.

Знайти якийсь хороший продукт з відкритим кодом для керування роботом нам не вдалося. Писати самому щось для Android трохи лінь, та й доведеться пару днів потратити на вивчення програмування під Android.

Серед закритих продуктів вибір на перший погляд гігантський, але майже всі з них мають фундаментальне обмеження. Вони дають контроль над Arduino не шляхом посилання команд через мережу, а шляхом захоплення повного контролю над вашим мікроконтролером, вимагаючи заливати на нього якусь специфічну прошивку (такий же ж спосіб роботи використовує Scratch), або як мінімум використовувати якусь особливу зазвичай важку бібліотеку. Нашому Arduino і без цього є чим занятися, ніж тягати на собі ще якісь бібліотеки і прошивки.

В комплекті із шасі до танка виробник дав лінки на власні програми віддаленого керування. Судячи з описів вони мали би робити те, що треба. Але прикра звичка постійно випадати в китайську мову не дала можливості розкрити весь потенціал. Після п'ятої-шостої спроби розібратися в ієрогліфах, ці програмки були знесені і забуті.

Ідеальним виявився єдиний продукт: RoboRemoFree - Arduino control. Зразу ж за ним іде RemoteXY: Arduino control, який все ж трохи складніший для інтеграції.

Ми експериментували з RoboRemo.

Вже за кілька хвилин вдалося намалювати просту панель керування.
Панель керування RoboRemo
Кнопка menu на екрані є завжди. Дає доступ до всіх функцій RoboRemo.

Кнопки FWD, LEFT, RIGHT додали ми самі. Все що треба для них вказати (крім тексту на самій кнопці) - це "set press action" які ми відповідно встановили у "W", "A" та "D". Хто грав FPS ігри - той знає, що саме такі символи і треба використовувати для руху вперед, чи поворотів вліво-вправо.

Оскільки наш робот поки не вміє рухатися назад, передавати команду заднього ходу сенсу нема.

Переконайтеся, що в пункті "repeat" для кожної кнопки стоїть delay = 500 ms, period = 500 ms. Щоб не затопити робота стрімким потоком команд.

Тепер треба під'єднатися до модуля ESP13. Пройдіть кроками menu->connect->Internet (TCP)->other. У вікні, яке відкриється введіть "192.168.1.41:9000".

Якщо ви все зробили добре - RoboRemo підключиться до вашого робота, і при натисканні на кнопки почне посилати по мережі команди які ви прописали для кнопок ("W", "A", "D"). Кожна команда буде супроводжуватися службовим символом, але поки можна його ігнорувати.

Що ще можна зробити з RoboRemo:
  • Купити PRO версію, яка дозволяє використовувати більше, ніж 5 елементів керування одночасно
  • Використати індикатор типу led і засвічувати його якщо зв'язок з роботом встановлено, і робот відгукується на команди 
  • Використати компоненту "accelerometr" і керувати роботом нахилами мобілки чи планшета
  • Використати компоненту "text log" яка виводитиме на екран повідомлення від робота - це прекрасний спосіб отримувати відлагоджувальну інформацію, без потреби тримати робота на прив'язі.
  • Замінити некрасиві написи на кнопках на миловидні іконки (потрібна PRO версія)

Одним словом - якщо переконаєтеся, що RoboRemo це саме те, що вам треба - купуйте PRO версію і насолоджуйтеся. Ми для себе ще не вирішили, чи зупинитися на RoboRemo, чи будемо таки писати щось своє для Android. Не виключено, що рано чи пізно нам захочеться написати пульт керування, який зразу ж і відео з робота показуватиме, і звуки передавати. А а може взагалі - буде десктопною програмою з підтримкою джойстика чи ігрового керма...

Якщо хто знає кращі програми для дистанційного керування - пишіть в коментарях. В першу чергу цікаво  знайти вільні програми, або хоча би програми з відкритим кодом.

Опрацювання команд на стороні Arduino


Опрацювання команд на стороні робота зводиться до простого зчитування символів із послідовного порта і виконання дій відповідно до отриманого. Простий прототип може виглядати так:

#include "Arduino.h"

void setup() {
    // налагоджуємо послідовний порт для отримування команд
    Serial.begin(9600);
    while (!Serial) {
        ; // ця затримка потрібна тільки при підключенні по USB
    }
}

void loop() {
    // чи щось прийшло ззовні?
    if (Serial.available() > 0) {
       

        //читаємо символ з послідовного порта
        int remoteCommand = Serial.read();

        // залежно від команди робимо що треба
        switch(remoteCommand) {
            case 'W':
                // це повідомлення оператор побачить на консолі
                // як варіант - можна послати команду RoboRemo увімкнути
                // якийсь індикатор на панелі керування
                Serial.write("MOVING FORWARD\n");
 
                // запуск двигунів на повний вперед
                // 255 тут означає максимальну силу (PWM)
                // 600 це тривалість виконання команди в мілісекундах
                // важливо, щоб тут була величина більша, 
                // ніж швидкість повтору команди на пульті керування
                // інакше робот може смикатися, коли дія попередньої
                // команди закінчилася, а наступна ще не прийшла
                robotMotors->driveForward(255, 600);
                break;
            case 'A':
                Serial.write("TURNING LEFT\n");
                robotMotors->turnLeft(255, 600);
                break;
            case 'D':
                Serial.write("TURNING RIGHT\n");
                robotMotors->turnRight(255, 600);
                break;
        }
    }
}

Код такого плану легко інтегрувати з іншим. У новішій версії прошивки робота включено блок, який дозволяє керувати роботом віддалено. Не забудьте скачати і опис панелі керування для програмки RoboRemo (збережіть файл в теку  "roboremo" на вашому мобільному чи планшеті і відкрийте, вибравши menu->interface->import).

Вдалих маневрів вам і вашому роботу!

Немає коментарів:

Дописати коментар