Автомобіль із відеокамерою. Управління через WiFi. Arduino Tank керування через Wi-Fi

Це невелика розповідь про те, як побудувати робота у вигляді іграшкового авто з відео камерою, яким можна керувати за допомогою комп'ютера або смартфона на ОС Android через WiFi. Пристрій немає ніякої автономності у сенсі своєї поведінки (типу розпізнавання чогось), управління - лише від людини, тому «робот» - це зовсім не підходяще слово у назві.
Почалося все з того, що ідея управління іграшковими пристроями від першої особи (т.зв. FPV) мені здалася надзвичайно цікавою з погляду власне процесу. Адже ми можемо таким чином реалізувати свою присутність, не у віртуальному світі, а реальному.
Найпростіше і найшвидше застосувати цю ідею на іграшкових або модельних автомобілях. Поточні технології повинні давати таку можливість промисловості та запропонувати масу подібних речей. Однак ця пропозиція виявилася досить дорогою порівняно з тим, що можна зробити самому.
Так як це мій перший проект, я ні програмувати, ні навіть паяти нормально не вмів, і я вирішив спочатку пошукати в інтернеті однодумців та їх варіанти вирішення цього завдання.
Почавши вивчення варіантів, як можна здійснити цю ідею, я знайшов дуже докладний опис такого проекту . А його автор з радістю допоміг мені розібратися в проблемах, що виникли під час створення робота.
Так я вперше та дізнався що таке …duino. Так як це був уже готовий варіант мікроконтролера, де не потрібно було паяти обв'язку до нього, я вибрав саме його. Також дуже сподобалося присутність бутлоадера, що дозволяє прошивати мікроконтролер без програматорів.

Для реалізації цього проекту знадобиться:

  • Мікроконтролер Arduino (будь-який: nano, uno, mega)
  • Акумулятор 9,6 вольт
  • Китайська машинка на радіокеруванні
  • Роутер dir320 (або будь-який інший прошивку, що підтримує OPEN-WRT)
  • Вебкамера Logitech c310 або будь-яка інша з потоком UVC






Програм п'ять: на PC, на Android, на роутері (сервер управління та відеопотік), та у мікропроцесорі.
Схема роботи: з'єднуємо настільний комп'ютер (ноутбук, далі – PC) з роутером WiFi. На роутері при його включенні автоматично завантажуються 2 програми:
1) сервер. Ця програма відкриває сокет (з'єднання) на певному порту і чекає, коли з цього порту з нею з'єднається клієнт (будь-яка програма, яка звернеться в цей порт і також, особливим чином скаже серверу, що вона готова працювати через відкритий сокет). Далі, після встановлення з'єднання, все що прийде від клієнта, буде перенаправлено певним шляхом, для нас це COM-порт, на цьому порту підключений мікропроцесор. І навпаки, все, що прийде з боку COM-порту, буде надіслано клієнту.
2) програма обробки відео, захоплює його з usb камери та шле на певний порт. Для його перегляду потрібно лише мати з'єднання з роутером на цьому порту.
Після того, як між комп'ютером та роутером встановлено WiFi-з'єднання, запускаємо на PC програму для управління роботом (той самий клієнт), ця програма з'єднується з програмою-сервером на роутері. Ця ж інша програма транслює відео з WiFi роутера.
Далі користувач може керувати автомобільчиком і натискає, наприклад, кнопку «вперед». Програма на PC відсилає команду «вперед» прямо на роутер, на його IP, але на певний порт. На роутері, ця команда вступає у програму-сервер, т.к. вислано її на його порт, і в рамках відкритого для цього сокету. Програма-сервер, нічого не роблячи з цією командою, просто відправляє її до COM-порту. Таким чином, команда "вперед" опиняється в мікропроцесорі, який у відповідь на неї, дає сигнал "вперед" на один із своїх висновків. До висновків процесора приєднана схема управління двигунами, т.к. сам мікропроцесор керувати ними не може через свою малопотужність.
Керувати виконавчим пристроєм через роутер без мікропроцесора не вийде, т.к. мікропроцесор може формувати сигнали «1» (напруга >2,5v) чи «0» (менше позначеного) будь-якому з десятка-другого своїх висновків. У роутера ж висновків немає, є лише порти вводу/виводу, типу USB або COM (serial), у яких по 2-3 дроти.
Тепер частина практична. Заздалегідь скажу, що незважаючи на складності, що здаються, все насправді просто, якщо йдеться про просте копіювання цього проекту - адже все вже зроблено і працює. Потрібно просто виконати точно цю інструкцію.
Спочатку мікроконтролер був freeduino maxserial у якого був com port, який був одним з небагатьох (як я тоді вважав) для підключення до uart роутера, для цього потрібно було паяти перехідник з uarta на com щоб з'єднати його з роутером. Його брати я не дуже хотів, тому що оригіналом є все-таки Arduino та й Freeduino в Україні немає.



Як я з'ясував потім, все це було просто зайве нагромадження схеми. Обійтися можна всього 1 проводком який йтиме від TX роутера (на малюнку) до RX (0 пін) мікроконтролера.
Незрозуміло чому, але на фрідуїні виявилося для нормального підключення потрібно tx на tx. Швидше за все, просто неправильно нанесено позначення. (Тут 0 пін tx) За цим краще брати оригінальний .
Машинку я купив хорошу, хоч і китайську



Машинка виявилася дуже потужною, 5 кг на рівній поверхні тягнула дуже впевнено. Також у неї в комплекті йшов акумулятор на 6 вольт. Що стосується електроніки, то в машинці вже є готовий драйвер двигунів, на який можна подати керуючі слаботочні виходи з мікроконтролера (якби з машинкою не пощастило - драйвер моторів можна було взяти також від arduino)
Роутер вимагає прошивки openwrt та список пакетів, вказаних на малюнку.



Роутер можна налаштувати як точку доступу, якою можуть підключитися будь-які пристрої, що мають WiFi. І, навіть якщо не буде програмного забезпечення для керування машиною – використовувати її як бездротову камеру відеоспостереження.
Камера с310 просто підключається до USB-порту на роутер і не вимагає паяння, вимагає невеликих налаштувань в роутері. Проект має 2 ланцюги живлення, 1 ланцюг живиться від 9,6 вольт – роутер та мікроконтролер, 2 ланцюг живиться від 6 вольт – привід та рульове машинки. Можна обійтися всього 1 джерелом живлення 9,6 вольт, але більш ємнісним. Роутер споживає 2А, мікроконтролер споживає майже непомітно, машинка 4А.
Програма мікроконтролера обробляє повідомлення, які надходять з послідовного порту роутера, обробка відбувається побайтово через portb arduino, наприклад, якщо прийшло в роутер 2, то, перевівши в двійкову систему отримуємо 00000010 – що відповідає 2 піну на portb. Таке рішення дозволяє керувати одночасно декількома пінами. Ось що вийшло в результаті:




Додаток для андроїд:



Додаток для пк:




Цей проект ще не закінчено і продовжує вдосконалюватися.
У планах використовувати arduino mega, роутер mr3020, вебкамеру залишити як є (можливо додати сферичну лінзу для більшого огляду), використовувати для плавного і точного управління, використовувати сервопривід для поворотів, додати далекомір. Додати відео для Android.



- повний каталог плат

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

Огляд проекту

Ви можете реалізувати цю систему там, де потрібно включати навантаження постійного струму на певний час. У цьому вам допоможе наш Android додаток, не вимагаючи апаратного інтерфейсу, клавіатури та LCD дисплея.

Комплектуючі

Складання макетної плати ESP8266

ESP8266 - недорогий SoC-чіп із вбудованим мікроконтролером та повним стеком протоколів TCP/IP, що означає, що він може безпосередньо звертатися до вашої Wi-Fi мережі.

Оскільки цей чіп має свій мікроконтролер, ви можете помістити в нього код своєї програми або можете використовувати модуль просто як Wi-Fi приймач, що ми й збираємося зробити в даному проекті. Більш ефективно було б використовувати цей модуль і як приймач, і як контролер, але з метою навчання ми взаємодіятимемо з модулем, використовуючи Arduino.

Чіп ESP8266 поставляється у різних модулях. Ми будемо використовувати модуль ESP-01. Звичайно, ви можете використовувати будь-який інший модуль.

По-перше, ви повинні знати, що модуль працює з напругою 3,3 В, і напруга високого логічного рівня від Arduino має бути такою самою, щоб не пошкодити наш модуль. Для цього потрібно перетворювати рівень напруги між платою Arduino (яка працює на 5 В) і модулем. Хорошою новиною є те, що перетворювача потребуватиме тільки висновок для передачі на Arduino, оскільки приймальний висновок зазвичай розпізнає логічні сигнали з напругою 3,3 від ESP8266.

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

Перетворювач рівня 5В → 3,3В

На малюнку нижче показано розпинування нашого модуля на ESP8266:

ВисновокПризначення
UTXDПередача даних через UART
URXDПрийом даних через UART. Вихід, до якого він підключається, має бути 3,3 Ст.
CH_PDВиняток: низький рівень на вході вимикає чіп, високий рівень на вході включає його; Для нормальної роботи модуля необхідно підтягнути його до лінії живлення.
GPIO0При завантаженні: має бути високий рівень, щоб входити до нормального режиму завантаження; низький рівень вводить у спеціальні режими завантаження.
GPIO2При завантаженні: низький рівень змушує завантажувач увійти в режим завантаження флеш-пам'яті; високий рівень викликає нормальний режим завантаження.
RSTСкидання; активний рівень – низький.
GNDЗемля.
VCCЖивлення/3,3В.

Я використовував LM317, лінійний регулятор напруги, що настроюється, з вихідним струмом до 1,5 А, для забезпечення модуля відповідним джерелом живлення 3,3 В.

Примітка:Не використовуйте висновок 3,3 від Arduino, оскільки стабілізатор напруги 3,3 на платі Arduino не може забезпечити необхідну для модуля величину струму, особливо при піковому споживанні енергії під час передачі.

Я використав BS170 (замість BSS138) для перетворювача логічних рівнів; обидва працюють добре.

Тепер ви можете підключити свій модуль до комп'ютера, використовуючи USB-TTL перетворювач, та випробувати його.

Складання макетної плати реле

Для керування реле я використовував біполярний NPN транзистор BC337 з резистором 1 ком на базі. Для захисту від зворотної напруги котушки я використав діод 1n4007.

Нормально замкнутий (NC) контакт реле я вирішив підключити до землі.

Код Arduino

Тепер ми стикаємося із проблемою. ESP8266 використовує UART як інтерфейс для AT-команд, а Arduino Uno (яка використовує Atmega328) має лише один порт UART. Цей порт вже підключено до мосту USB-TTL, а також висновків 0 і 1.

Як рішення можна використовувати емулятор для UART порту на іншому цифровому виводі Arduino за допомогою бібліотек AltSoftSerial або SoftwareSerial. Це дозволить вам, як і раніше, мати апаратний порт UART для налагодження та друку повідомлень у консолі, а програмний порт - для зв'язку з модулем.

Багато людей (включаючи мене) повідомляють про проблеми з послідовним програмним портом при високих швидкостях передачі - як на тих, що ми будемо використовувати з esp8266, 115200 біт/с. Я можу сказати, що у вас 50% прийнятих від модуля даних буде пошкоджено, якщо ви використовуєте програмний UART, а переданих від Arduino до модуля даних майже 100% буде коректно. Я отримав ці результати після відстеження сигналів на лініях RX та TX.

Як рішення я додав у код кілька директив define, щоб полегшити вам вибір між апаратним та програмним UART портами. Майте на увазі, що ви не можете використовувати один і той же порт для налагодження та спілкування з модулем, тому вам потрібно вибирати між ними.

//Розкомментуйте Serial.***, якщо хочете для зв'язку з ESP використовувати апаратний послідовний порт (висновки 0,1) //Розкомментуйте esp8266.***, якщо хочете для зв'язку з ESP використовувати програмний послідовний порт (висновки 2,3) #define esp8266_Available() Serial.available() //esp8266.available() #define esp8266_Find(ARG) Serial.find(ARG) //esp8266.find(ARG) #define esp8266_Read() Serial.read .read() #define esp8266_Write(ARG1,ARG2) Serial.write(ARG1,ARG2) //esp8266.write(ARG1,ARG2) #define esp8266_Print(ARG) Serial.print(ARG) //esp8266.print

У вихідному коді ви знайдете частину коду, яка встановлює модуля з вашим роутером:

SendCommand("AT+RST\n", 2000, DEBUG); // перезапустити модуль sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); // налаштувати як точку доступу sendCommand("AT+CWJAP="tur", "341983#tur", 3000, DEBUG); //**** ЗМІНИТИ SSID і ПАРОЛЬ У ВІДПОВІДНОСТІ З ВАШОЇ МЕРЕЖЕЮ ******// delay(10000); sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // одержати ip адресу sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // налаштувати для кількох з'єднань sendCommand("AT+CIPSERVER=1,1337\r\n", 1000, DEBUG); // увімкнути сервер на порту 1337

Цикл скетчу чекає на команди, які повинні прийти через Wi-Fi з'єднання. В даний час підтримуються такі команди:

  • 'con' для одержання стану висновків, високий чи низький логічний рівень;
  • 'on=' включити відповідний висновок;
  • 'of=' вимкнути відповідний висновок;
  • 'Tm=n/fS' встановити таймер увімкнення (n) або вимикання (f) відповідного виводу.

Усі команди мають відгук підтвердження.

Примітки:

  • деякі частини скетчу засновані на ;
  • якщо ви використовуєте модулі зі старим SDK, у вас можуть бути такі ж помилки, як і у мене. Єдиним рішенням у цьому випадку є оновлення вашої прошивки до останньої версії. Перегляньте , щоб отримати допомогу в оновленні прошивки модуля на ESP8266. Я оновив програму з версії 1.3 до 1.5.4.

Повний код програми:

#include #define DEBUG 0 // якщо ви для зв'язку з ESP використовуєте апаратний послідовний порт, змініть значення на 0 #define ESPBaudRate 115200 #define HWSBaudRate 115200 #define OUTPUT1 11 #define OUTPUT2 12 #define OUT. якщо для зв'язку з ESP хочете використовувати апаратний послідовний порт (висновки 0,1) // розкоментуйте esp8266.*** , якщо для зв'язку з ESP хочете використовувати програмний послідовний порт (висновки 2,3) #define esp8266_Available() Serial.available( ) //esp8266.available() #define esp8266_Find(ARG) Serial.find(ARG) //esp8266.find(ARG) #define esp8266_Read() Serial.read() //esp8266.read() #define esp8266 ,ARG2) Serial.write(ARG1,ARG2) //esp8266.write(ARG1,ARG2) #define esp8266_Print(ARG) Serial.print(ARG) //esp8266.print(ARG) // Робить RX лінію Arduino виводом 2, а TX лінію Arduino виводом 3. // Це означає, що вам необхідно підключити TX лінію від ESP до 2 висновку Arduino, // а RX лінію від ESP до висновку 3 Arduino. SoftwareSerial esp8266(2, 3); /*************/ byte OUTPUTstate; byte OUTPUTTMRIsSet; byte OUTPUTTMRState; long OUTPUTTimer; /*************/ /***Commands**/ String GETSTATE = "con"; // Рядок запиту від мобільного додатка, щоб дізнатися про стан кожного виходу String SETON = "on="; // Рядок запиту від мобільного додатка, щоб увімкнути вихід String SETOFF = "of="; // Рядок запиту від мобільного додатка, щоб вимкнути вихід String TIMER = "tm ="; // Рядок запиту від мобільного додатка, щоб задати таймер для виходу /*************/ void setup() ( Serial.begin(HWSBaudRate); // Послідовний порт для відправки повідомлень від Arduino на комп'ютер esp8266.begin(ESPBaudRate) // Програмний послідовний порт для Arduino на ESP8266 pinMode(OUTPUT1, OUTPUT); OUTPUT3, OUTPUT); //Write(OUTPUT3, LOW); n", 1000, DEBUG); //**** ЗМІНИТИ SSID і ПАРОЛЬ У ВІДПОВІДНОСТІ З ВАШОЮ МЕРЕЖЮ ******// sendCommand("AT+CWJAP=\"tur\",\"341983#tur\ "\r\n", 3000, DEBUG); delay(10000); CIPMUX=1\r\n", 1000, DEBUG); // включити сервер на порту 1337 sendCommand("AT+CIPSERVER=1,1337\r\n", 1000, DEBUG); "); // Цей символ визначає початок команди тілі нашого повідомлення String InStream; InStream = (char) esp8266_Read(); InStream += (char) esp8266_Read(); true) Serial.println(InStream); if (InStream.equals(GETSTATE)) (// відгук на команду Status=<состояние_выхода_1><состояние_выхода_2><состояние_выхода_3>String response="Status=";<= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (pinNumber == OUTPUT1) OUTPUTstate = 1; else if (pinNumber == OUTPUT2) OUTPUTstate = 1; else if (pinNumber == OUTPUT3) OUTPUTstate = 1; digitalWrite(pinNumber, 1); String response = "Confg="; // Отклик на команду Confg=<номер_вывода>response += OUTPUTstate;<= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (pinNumber == OUTPUT1) OUTPUTstate = 0; else if (pinNumber == OUTPUT2) OUTPUTstate = 0; else if (pinNumber == OUTPUT3) OUTPUTstate = 0; digitalWrite(pinNumber, 0); // изменить состояние вывода String response = "Confg="; // Отклик на команду Confg=<номер_вывода>response += OUTPUTstate;<= 9) { pinNumber *= 10; pinNumber += secondNumber; // получить вторую цифру, т.е., если вывод 13, то 2-ая цифра равна 3, // и добавить ее к первой цифре } if (esp8266_Read() == "n") { if (DEBUG == true) Serial.println("on"); if (pinNumber == OUTPUT1) OUTPUTTMRState = 1; else if (pinNumber == OUTPUT2) OUTPUTTMRState = 1; else if (pinNumber == OUTPUT3) OUTPUTTMRState = 1; } else { if (DEBUG == true) Serial.println("off"); if (pinNumber == OUTPUT1) OUTPUTTMRState = 0; else if (pinNumber == OUTPUT2) OUTPUTTMRState = 0; else if (pinNumber == OUTPUT3) OUTPUTTMRState = 0; } int j = 0; byte Atime; // Таймер может настроен на максимальное значение в 1 сутки // поэтому программа может принять 5 цифр, так как 1 сутки равны 86400 секундам long Time; // Прочитать секунды, значение имеет переменное количество цифр, поэтому читать, пока не получим "s", // что является символом завершения в теле моего сообщения от мобильного телефона while (1) { Time = esp8266_Read(); if (Time == "s") break; Atime[j] = Time - 48 ; j++; } switch (j) // секунды... { case 1: // одна цифра Time = Atime; break; case 2: // две цифры Time = Atime * 10 + Atime; break; case 3: // три цифры Time = Atime * 100 + Atime * 10 + Atime; break; case 4: // четыре цифры Time = Atime * 1000 + Atime * 100 + Atime * 10 + Atime; break; case 5: // пять цифр Time = Atime * 10000 + Atime * 1000 + Atime * 100 + Atime * 10 + Atime[j]; break; } if (DEBUG == true) { Serial.println("Timer:"); Serial.println(Time); } Time = Time * 1000 + millis(); if (DEBUG == true) { Serial.println("Pin:"); Serial.println(pinNumber); } if (pinNumber == OUTPUT1) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } else if (pinNumber == OUTPUT2) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } else if (pinNumber == OUTPUT3) { OUTPUTTMRIsSet = 1; OUTPUTTimer = Time; } String response = "tConfg="; // Отклик на команду tConfg=<номер_вывода>response += OUTPUTstate;< millis())) { digitalWrite(OUTPUT1, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT2, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } if (OUTPUTTMRIsSet != 0 && (OUTPUTTimer < millis())) { digitalWrite(OUTPUT3, OUTPUTTMRState); OUTPUTstate = OUTPUTTMRState; OUTPUTTMRIsSet = 0; } /***************************************/ } /* Name: sendData Description: Функция, используемая для отправки данных на ESP8266. Params: command - данные/команда для отправки; timeout - время ожидания отклика; debug - печатать в консоль?(true = да, false = нет) Returns: Отклик от esp8266 (если есть отклик) */ String sendData(String command, const int timeout, boolean debug) { String response = ""; int dataSize = command.length(); char data; command.toCharArray(data, dataSize); esp8266_Write(data, dataSize); // передача символов на esp8266 if (debug) { Serial.println("\r\n====== HTTP Response From Arduino ======"); Serial.write(data, dataSize); Serial.println("\r\n========================================"); } long int time = millis(); while ((time + timeout) >millis()) ( while (esp8266_Available()) ( // У esp є дані, тому вивести їх у консоль char c = esp8266_Read(); // прочитати наступний символ. response += c; ) ) if (debug) ( Serial .print(response); ) return response; ) /* Name: sendHTTPResponse Description: Функція, яка посилає HTTP 200, HTML UTF-8 відгук */ void sendHTTPResponse(int connectionId, String content) ( // створити HTTP відгук String httpResponse; String httpHeader; // HTTP HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n"; \r\n"; httpHeader += "Connection: close\r\n\r\n"; httpResponse = httpHeader + content + " "; // Тут у коді баг: останній символ в "content" не посилається, тому я додав додатковий пробіл sendCIPData(connectionId, httpResponse); ) /* Name: sendCIPDATA Description: посилає команду CIPSEND= ,<данные>*/ void sendCIPData(int connectionId, String data) ( String cipSend = "AT+CIPSEND="; cipSend += connectionId; cipSend += ","; cipSend += data.length(); cipSend += "\r\ n"; sendCommand(cipSend, 1000, DEBUG); sendData(data, 1000, DEBUG); ) /* Name: sendCommand Description: Функція, яка використовується для надсилання даних на ESP8266.

Params: command – дані/команда для відправки; timeout - час очікування відгуку; debug - друкувати в консоль? (true = так, false = ні) Returns: Відгук від esp8266 (якщо є відгук) */ String sendCommand ) // передача символів на esp8266 long int time = millis(); while ((time + timeout) > millis()) ( while (esp8266_Available()) = esp8266_Read(); // прочитати наступний символ.

Android додаток

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

  • Перш за все, ви повинні знати IP-адресу свого модуля. Якщо ви використовували програмний послідовний порт, IP адреса буде надрукована в консолі. Якщо ви використовували апаратний послідовний порт, то слід використовувати кабель для відстеження даних на лініях RX і TX, щоб побачити IP адресу. Вам також потрібно знати номер порту, який був вказаний у скетчі Arduino. Після цього натисніть "connect", щоб отримати стан усіх трьох виходів. Вам потрібно переконатися, що ваш Wi-Fi роутер увімкнено, і ви підключені до локальної мережі.
  • Тепер натисніть будь-який перемикач, який ви хочете увімкнути/вимкнути. Щоразу, коли захочете, ви можете натиснути "refresh", щоб оновити стан усіх виходів.
  • На вкладці "Timers" можна встановити будь-який з цих трьох виходів для включення/вимкнення через певний проміжок часу (від 0 до 24 годин).
  • Після будь-якої дії ви отримаєте повідомлення з підтвердженням, чи виконалася команда успішно, чи виникла якась помилка.

Демонстраційне відео

От і все! Сподіваюся, стаття виявилася корисною. Залишайте коментарі!

RC машинка може бути WiFi машинкою...?

RC машинка це добре, але дешеві RC машинки мають обмежений діапазон і управляються лише певним пультом, що поставляється в комплекті.

Я купив RC джип 4х4 з гнучкою підвіскою та позашляховими шинами приблизно за 30 доларів. Погравшись з машинкою я вирішив, що її можна покращити за допомогою Wi-Fi та Android. Витративши трохи часу, я повністю вилучив плату з машинки. Я заміряв напруги на цій платі та розробив систему керування двигуном за допомогою Arduino. Оригінальна система управління не використовує ШІМ для контролю швидкості. Машинка розрахована на переїзд через перешкоди на дуже низькій передачі, і, як наслідок, дуже повільно. У моїй схемі використовується ШІМ.

Я використовую Arduino вже кілька місяців. Я також придбав asynclabs WiFi Sheild для Duemilanoe Arduino, щоб експериментувати з WiFI. Він поставляється з бібліотекою, яка встановлюється в Arduino IDE. Я зміг зробити програму, яка дозволяє керувати двигунами та напрямком руху за допомогою WiFi.

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

Інструменти та елементи

Це загальний список інструментів та елементів, які використовувалися у цьому проекті. У документації Eagle вказані точні технічні характеристики компонентів, що використовуються.

Мультиметр
Паяльник
Припій
Викрутки
Розчин для травлення плат
Фольгований склотекстоліт
Плоскогубці
Arduino
AsyncLabs WiFi Sheild
Роз'єми RJ45
Драйвер двигуна з H-мостом
Конденсатори

Драйвер двигунів

Використовуючи Eagle, я розробив цю схему та зробив друковану плату для неї. Вона функціонує як драйвер двигунів та регулятор їх потужності для Arduino.
Це дозволяє використовувати стандартний 7.2В акумулятор для живлення основних та рульових двигунів та Arduino.

У цій схемі використовується подвійний інтегральний драйвер з Н-мостом SN754410 для керування двигунами. Виводи керування драйвера приєднані до кабелю RJ45, який підключається до AsyncLabs WiFi Sheild.

Arduino Shield

Використовуючи бібліотеку SparkFun в Eagle я розробив Arduino Shield, через який проходитимуть контакти з WiFi Shield і підключатимуться до драйвера двигуна через роз'єм RJ45 та 2 гвинтові клеми.

Цоколівка контактів RJ45 дуже важлива. Помилка підключення може призвести до непередбачуваних результатів і доведеться переробляти плату.

Травлення друкованих плат

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

Для кріплення плати корпусу використовувалися липучки. Мені пощастило, т.к. у моїй машинці було багато місця для електроніки під трубчастим каркасом.
Я забув сфотографувати з'єднання плати драйвера двигуна з рештою плат, проте він добре став і не зайняв багато місця в корпусі.

Програма

Мій код може бути не досить ефективний, але він працює.

Машинка

Мені вдалося зібрати CarServer на основі прикладу SocketServer, який я отримав разом із Wifi Sheild AsynLabs.
Вам необхідно буде ввести інформацію про свою бездротову мережу в код Arduino. Коли машина увімкнулась, дайте їй 15-45 секунд, щоб встановити з'єднання з маршрутизатором. Червоний світлодіод на WiFi Shield означає, що підключення встановлено.

Я зробив цю програму за допомогою C # та MS Visual Studio 2008. Я зробив гарне вікно, і автомобілем можна керувати стрілочками.

Чому б не керувати машиною з телефону?

Така думка з'явилася у мене приблизно через тиждень після покупки DroidX. Я почав експериментувати і зрештою використав Android SDK. Я знайшов аналогічні програми, де для керування використовується акселерометр. Дивлячись на ці програми написав своє.

Вставити IP та порт, вказані в коді Arduino. Тримайте телефон горизонтально. Потім нахиліть його від себе, щоб їхати вперед і на себе, щоб їхати назад. Використовуйте телефон як кермо.
Це моя перша велика додаток для Android. У ньому досі є деякі помилки, але переважно воно працює нормально.

Керуйте у дворі машинкою 4x4 з WiFi!

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

Мені потрібна камера для встановлення за лобовим склом, щоб дивитися куди їхати. Вона має бути з низьким енергоспоживанням, а також передавати відео сама по собі. (Я думаю, що Arduino впорається з цим).

Список радіоелементів

Позначення Тип Номінал Кількість ПриміткаМагазинМій блокнот
Драйвер двигунів
IC1 МікросхемаSN7544101 До блокноту
Лінійний регулятор5 В1 До блокноту
Біполярний транзистор

2N3904

1 До блокноту
C1, C2 Електролітичний конденсатор 2 До блокноту
Роз'єм2 висновки7 До блокноту
Роз'єм8 висновків1 До блокноту
Arduino Shield
U1 Плата Arduino 1 До блокноту
Т1 Біполярний транзистор

2N3904

1 До блокноту
R1 Резистор 1 До блокноту
U$3 Підстроювальний резистор 1 До блокноту
Роз'єм2 висновки2

Мікросхема ESP8266 – один із найпопулярніших інструментів для організації бездротового зв'язку у проектах розумного будинку. За допомогою бездротового контролера можна організовувати зв'язок за інтерфейсом WiFi, забезпечуючи проектам Arduino вихід в інтернет та можливість дистанційного керування та збору даних. На основі ESP8266 створені такі популярні плати як WeMos та NodeMcu, а також величезна кількість саморобних проектів. У цій статті, ми дізнаємося, що являє собою ESP82266, які бувають її різновиди, як працювати з ESP8266 в середовищі Arduino IDE.

ESP8266 – мікроконтролер з інтерфейсом WiFi, який може виконувати програми з флеш-пам'яті. Пристрій було випущено в 2014 році китайською фірмою Espressif і практично відразу стало популярним.

Контролер недорогий, має невелику кількість зовнішніх елементів і має такі технічні параметри:

  • Підтримує Wi-Fi протоколи 802.11 b/g/n з WEP, WPA, WPA2;
  • Має 14 портів введення і виведення, SPI, I2C, UART, 10-біт АЦП;
  • Підтримує зовнішню пам'ять до 16 МБ;
  • Необхідне живлення від 2,2 до 3,6 В, споживаний струм до 300 мА залежно від вибраного режиму.

Важливою особливістю є відсутність користувальницької енергонезалежної пам'яті на кристалі. Програма виконується від зовнішнього SPI ПЗУ за допомогою динамічного завантаження необхідних елементів програми. Доступ до внутрішньої периферії можна отримати не з документації, а з набору бібліотек API. Виробником вказується приблизна кількість ОЗП – 50 кБ.

Особливості плати ESP8266:

  • Зручне підключення до комп'ютера через USB кабель, живлення від нього ж;
  • Наявність вбудованого перетворювача напруги 3,3В;
  • Наявність 4 Мб флеш-пам'яті;
  • Вбудовані кнопки для перезавантаження та перепрошивки;
  • Всі порти виведені на плату на два гребінки з кроком 2,5 мм.

Сфери застосування модуля ESP8266

  • Автоматизація;
  • Різні системи для розумного будинку: Бездротове керування, бездротові розетки, керування температурою, доповнення до сигналізаційних систем;
  • Мобільна електроніка;
  • ID мітки;
  • Дитячі іграшки;
  • Mesh-мережі.

Розпинання esp8266

Існує безліч різновидів модуля ESP8266. На малюнку представлені деякі з них. Найбільш популярним варіантом є ESP 01.

Виконання програми потрібно встановити станом портів GPIO0, GPIO2 і GPIO15, коли закінчується подача живлення. Можна виділити 2 важливі режими – коли код виконується з UART (GPIO0 = 0, GPIO2 = 1 та GPIO15 = 0) для перепрошивки флеш-карти і коли виконується із зовнішньої ПЗУ (GPIO0 = 1, GPIO2 = 1 та GPIO15 = 0) у штатному режимі.

Розпинування для ESP01 зображено на зображенні.

Опис контактів:

  • 1 – земля, 8 – харчування. По документації напруга подається до 3,6 У – це важливо врахувати під час роботи з Ардуїно, яку зазвичай подають 5 У.
  • 6 - RST, необхідна для перезавантаження мікроконтролера при подачі на нього низького логічного рівня.
  • 4 – CP_PD, також використовується для переведення пристрою в режим енергозбереження.
  • 7 та 0 – RXD0 та TXD0, це апаратний UART, необхідний для перепрошивки модуля.
  • 2 – TXD0, до цього контакту підключається світлодіод, який загоряється за низького логічного рівня на GPIO1 і передачі даних по UART.
  • 5 – GPIO0, порт введення та виведення, також дозволяє перевести пристрій у режим програмування (при підключенні порту до низького логічного рівня та подачі напруги) .
  • 3 – GPIO2, порт введення та виведення.

Розпинування ESP-12

Основні відмінності Ардуїно від ESP8266

  • ESP8266 має більший обсяг флеш-пам'яті, при цьому ESP8266 відсутня енергонезалежна пам'ять;
  • Процесор ESP8266 швидше, ніж у Ардуїно;
  • Наявність Wi-Fi у ESP8266;
  • ESP8266 споживає більше струму, ніж для Ардуїно;

Програмування ESP8266 в Arduino IDE

Програмний комплект розробника esp8266 включає:

  • Компілятор із пакету GNU Compiler Collection.
  • Бібліотеки, стеки протоколів WiFi, TCP/IP.
  • Засіб завантаження інформації у програму контролера.
  • Операційна IDE.

Спочатку модулі ESP8266 поставляються із прошивкою від фірми-виробника. З її допомогою можна керувати модулем із зовнішнього мікроконтролера, реалізовувати роботу з Wi-Fi як з модемом. Також існує багато інших готових прошивок. Деякі з них дозволяють настроювати роботу модуля за допомогою WEB-інтерфейсу.

Можна програмувати із середовища Arduino IDE. За її допомогою можна легко писати скетчі та завантажувати їх у ESP8266, прошивати ESP8266, при цьому не потрібно сама плата Ардуїно. Arduino IDE підтримує усі види модулів ESP8266.

На даний момент для ESP8266 можна реалізувати такі функції:

  • Основні функції мови Wiring. Керувати портами GPIO можна так само, як і пінами на платі Ардуїно: pinMode, digitalRead, digitalWrite, analogWrite. Команда analogRead(А0) дозволяє вважати значення АЦП. За допомогою команди analogWrite (pin, value) можна підключити ШІМ на потрібному виході GPIO. При value=0 ШІМ відключається, максимальне значення досягає константи, що дорівнює 1023. За допомогою функцій attachInterrupt, detachInterrupt можна виконувати переривання на будь-якому порту GPIO, крім 16.
  • Таймінг та delay. Використовуючи команди millis та micros можна повернути мс та мкс, які пройшли з моменту старту. Delay дозволяє призупинити виконання програми на потрібний час. Також функція delay(…) дозволяє підтримувати нормальну роботу Wi-Fi, якщо у скетчі є великі елементи, які виконуються більше 50 мс. Yield() – аналог функції delay(0).
  • Serial та Serial1 (UART0 та UART1). Робота Serial на ESP8266 аналогічна роботі на Ардуїно. Запис та читання даних блокують виконання коду, якщо FIFO на 128 байт та програмний буфер на 256 байт заповнені. Об'єкт Serial користується апаратним UART0, для нього можна встановити піни GPIO15 (TX) і GPIO13 (RX) замість GPIO1 (TX) і GPIO3 (RX). Для цього після функції Serial.begin(); потрібно викликати Serial.swap();. Аналогічно Serial1 використовує UART1, який працює на передачу. Необхідний пін для цього GPIO2.
  • Макрос PROGMEM. Його робота аналогічна роботі в Ардуїно. Дозволяє переміщати дані read only і рядкові незмінні в flash-пам'ять. При цьому ESP8266 не зберігаються однакові константи, що призводить до додаткової витрати флеш-пам'яті.
  • I2C. Перед початком роботи із шиною I2C вибираються шини з допомогою функції Wire.pins(int sda, int scl).
  • SPI, OneWire – повністю підтримуються.

Використання esp8266 для зв'язку Ардуїно WiFi

Перед підключенням до Ардуїно важливо пам'ятати, що у ESP8266 напруга живлення не може бути вищою за 3,6, у той час як на паті Ардуїно напруга дорівнює 5 В. З'єднувати 2 мікроконтролери потрібно за допомогою резистивних дільників. Перед підключенням модуля потрібно ознайомитися з розпинанням обраного ESP8266. Схема підключення для ESP8266-01 представлена ​​малюнку.

3,3 В з Ардуїно – на Vcc&CH_PD на модулі ESP8266, Земля з Ардуїно – до землі з ESP8266, 0 – TX, 1 – RX.

Для підтримки стабільної роботи ESP8266 необхідне джерело постійної напруги на 3,3 В та максимальний струм 250 мА. Якщо живлення походить від USB-TTL-конвертера, можуть виникати проблеми та збої в роботі.

Робота з бібліотекою Wi-Fi для ESP8266 схожа на бібліотеку для звичайного шилда. Є кілька особливостей:

  • mode(m) – вибір одного з трьох режимів: клієнт, точка доступу або обидва режими одноразово.
  • softAP(ssid) – необхідний створення відкритої точки доступу.
  • softAP(ssid, password) – створює точку доступу з паролем, який має складатися щонайменше 8 знаків.
  • WiFi.macAddress(mac) та WiFi.softAPmacAddress(mac) – визначає МАС адресу.
  • WiFi.localIP() та WiFi.softAPIP() – визначення IP адреси.
  • printDiag(Serial); – дозволять дізнатись дані про діагностику.
  • WiFiUDP – підтримка передачі та прийому multicast пакета в режимі клієнта.

Робота виконується за таким алгоритмом:

  • Підключення USB-TTL до USB та ESP.
  • Запустити Arduino IDE.
  • Вибрати в меню інструменти потрібний порт, плату, частоту та розмір flash-пам'яті.
  • Файл - Прімери - ESP8266WiFi - WiFiWebServer.
  • Записати в скетчі SSID та пароль мережі Wi-Fi.
  • Почати компіляцію та завантаження коду.
  • Дочекайтеся закінчення процесу прошивки, від'єднайте GPIO0 від землі.
  • Поставити швидкість 115 200.
  • З'явиться підключення, буде записано IP-адресу.
  • Відкрити браузер, ввести в адресному рядку номер IP/gpio/1
  • Переглянути монітор порту, якщо до виходу GPIO2 підключено світлодіод, він повинен спалахнути.

NodeMCU на базі esp8266

NodeMCU – це платформа, що базується на базі модуля esp8266. Використовується для керування схемою на відстані за допомогою інтернету через Wi-Fi. Плата малогабаритна, компактна, коштує дешево, на лицьовій стороні є роз'єм для USB. Поруч кнопки для налагодження та перезавантаження мікроконтролера. Також встановлений чіп ESP8266. Напруга живлення – від 5 до 12, бажано подавати більше 10 В.

Великою перевагою плати є її мале енергоспоживання. Нерідко їх використовують у схемах з автономним харчуванням. На платі розташовано лише 11 портів загального призначення, з них деякі мають спеціальні функції:

  • D1 та D2 – для інтерфейсу I2C/TWI;
  • D5-D8 - для інтерфейсу SPI;
  • D9, D10 – для UART;
  • D1-D10 – можуть працювати як ШІМ.

Платформа має сучасне API для апаратного введення та виведення. Це дозволяє скоротити кількість дій під час роботи з обладнанням та при його налаштуванні. За допомогою прошивки NodeMCU можна використовувати весь робочий потенціал для швидкої розробки пристрою.

WeMos на базі esp8266

WeMos – ще один вид платформи, що базується на базі мікроконтролера esp8266. Відповідно є Wi-Fi модуль, підтримується Arduino IDE, є роз'єм для зовнішньої антени. Плата має 11 цифрових входів/виходів, які (крім D0) підтримують interrupt/pwm/I2C/one-wire. Максимальна напруга живлення досягає 3,3 В. Також на платформі є USB роз'єм. Аналоговий вхід 1 з максимальною напругою 3,2В.

Для роботи з модулем потрібно встановити драйвер CH340 та налаштувати Ардуїно IDE під ESP8266. Для цього потрібно в меню налаштування у рядку «додаткове посилання для менеджера плат» додати адресу http://arduino.esp8266.com/stable/package_esp8266com_index.json.

Після цього потрібно знайти пакет ESP8266 і встановити його. Потім потрібно вибрати в меню інструменти мікроконтролер Wemos D1 R2 та записати потрібний скетч.

Висновки по ESP8266

За допомогою плат на основі мікросхеми ESP8266 ви можете додати у свої проекти можливості великого інтернету, зробивши їх набагато інтелектуальнішими. Дистанційне керування, збирання та аналіз даних на сервері, обробка голосу та робота із зображенням – все це стає доступним, коли ми підключаємо наш проект по WiFi до інтернету. У наступних статтях ми докладно розглянемо, як можна програмувати пристрої на базі esp8266, а також приділимо увагу таким популярним платам як WeMos та NodeMcu.