W moim poprzednim wpisie opisałem budowę prostego i taniego dwukołowca, którego można sterować smartfonem przez WiFi (ESP8266) wykorzystując aplikację Blynk. Wadą tego rozwiązania była konieczność wykorzystania sieci domowej (dostępu do internetu) oraz serwera Blynk w celu kontroli pojazdu, co uniemożliwiało wyjście z pojazdem w teren.
W tym wpisie pokażę jak wykorzystać tryb Access Point w ESP8266 aby uniezależnić się od dostępu do internetu i sieci domowej. W celu wyeliminowania części kabli jaka była potrzebna do podłączenia ESP-12e ze sterownikiem silników i zasileniem, użyję taniego modułu WeMos D1 mini wraz z DC Power Shield, który nie będzie wymagał użycia dodatkowego konwertera USB-UART do zaprogramowania ESP. Całość zabuduję klockami LEGO Duplo w celu zakrycia elektroniki i zasilania. Do kontroli pojazdu użyję aplikacji RoboRemoFree.
Spis części
Do zbudowania prostego pojazdu potrzeba:
- 2 x Koło + silnik 65x26mm 5V z przekładnią 48:1 – np. https://botland.com.pl/kola-dagu/3696-kolo-silnik-65x26mm-5v-z-przekladnia-481.html – ok. 40 zł – Alternatywnie można kupić całe podwozie (np. https://botland.com.pl/podwozia-robotow/7283-podwozie-robota-2wd-dwukolowe-z-silnikami-prostokatne.html) za tę samą cenę, które będzie dodatkowo posiadać kółko obrotowe (patrz niżej).
- Obrotowe kółko do podwozia pojazdu – np. https://botland.com.pl/podwozia-robotow/7292-obrotowe-kolko-do-podwozia-robota.html – ok. 3 zł
- Dwukanałowy sterownik silników – np. https://botland.com.pl/sterowniki-silnikow-dc/851-pololu-drv8835-dwukanalowy-sterownik-silnikow-11v12a.html – ok. 18 zł
- Moduł WeMos D1 mini – https://pl.aliexpress.com/store/product/D1-mini-Mini-NodeMcu-4M-bytes-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266/1331105_32529101036.html – ok. 17 zł
- Moduł DC Power Shield dla WEMOS D1 mini – https://pl.aliexpress.com/store/product/DC-Power-Shield-V1-0-0-for-WEMOS-D1-mini/1331105_32790327733.html – ok. 8 zł.
- Płytka uniwersalna – np. https://botland.com.pl/plytki-uniwersalne/175-plytka-uniwersalna-pdu21-tht.html – ok. 3 zł.
- Koszyk na 6 baterii typu AA (R6) – np. https://botland.com.pl/koszyki-na-baterie/2430-koszyk-na-6-baterii-typu-aa-r6.html – ok. 2.2 zł
- Oraz kilka przewodów połączeniowych, listwa żeńska goldpin, baterie lub akumulatorki, trochę kleju na gorąco, klocki LEGO.
Nie licząc baterii lub akumulatorków (które miałem w szufladzie), klocków LEGO (które zabrałem synowi), kleju, listwy goldpin oraz przewodów, całość powinna wynieść ok. 90 zł.
Moduły WeMos kupiłem ze sklepu firmowego (www.wemos.cc) na AliExpresie. Czekałem na nie tylko 23 dni, co jest wynikiem bardzo dobrym jak na zakupy u naszych chińskich przyjaciół.
Mimo, że silniki zasilane są napięciem maks. 6V, to użyta ilość baterii (6 sztuk – 9V) wynika z tego że, DC Power Shield potrzebuje zasilania min. 7V. Będzie to wymagało programowego ograniczenia mocy silników, o czym w dalszej części.
Przygotowanie
WeMosa programować będziemy w środowisku Arduino IDE. Instalację i konfigurację tego środowiska opisałem w poprzednim wpisie, w podrozdziale ‘Przygotowanie’, zatem tu je pominę. Aby wgrać program na WeMosa należy podłączyć go poprzez kabel USB do komputera i w programie Arduino IDE wybrać w menu Tools–>Board–>WeMos D1 R2 & mini, oraz w menu Tools–>Port wybrać odpowiedni port (COM’XX’). Dodatkowo w menu Tools ustawiamy Flash size: „4M (1M SPIFFS)” lub Flash size: „4M (3M SPIFFS)”. Resztę ustawień możemy pozostawić bez zmian.
Podłączenie WeMosa do mostka H
Po wgraniu programu (o którym w dalszej części opisu) do WeMosa należy połączyć go ze sterownikiem silników według schematu przedstawionego na rys. 1.
Rys. 1 Schemat podłączenia WeMos do sterownika silników
Czyli D4 i D3 będą sterować kanałem B, natomiast D2 i D1 będą sterować kanałem A. Podanie stanu wysokiego na wejście MODE sterownika powoduje że będzie on działał w trybie PHASE/ENABLE.
Aby pozbyć się większości kabli moduł WeMoss oraz sterownik umieściłem na płytce uniwersalnej z dolutowanymi listwami goldpin i połączeniami wykonanymi z nóżek po rezystorach (patrz rys. 2).
Rys. 2 Płytka uniwersalna z dolutowanymi listwami goldpin i zworkami
Aplikacja RoboRemoFree – ustawienia
Po zainstalowaniu aplikacji RoboRemoFree należy stworzyć projekt zawierający jeden przycisk, jedną diodę, jeden suwak pionowy i jeden suwak poziomy jak pokazano na rys. 3.
Rys. 3 Ustawienia aplikacji RoboRemoFree
W celu edycji projektu i wstawienia elementów należy, kliknąć ‘Menu–>edit ui’ następnie kliknąć na puste miejsce na ekranie i wybrać odpowiedni element.
Ustawienia elementów:
- button:
- set text: włącznik;
- set press action: s
- led:
- set id: led
- slider (pionowy):
- set id: x
- set min, max: min -100, max 100
- slider (poziomy):
- set id: y
- set min, max: min -40, max 40
Po wprowadzeniu powyższych ustawień wciskamy przycisk Menu i wybieramy ‘don’t edit ui’. Uruchomienie i sposób połączenia się z pojazdem opiszę w dalszej części.
Program
Kod programu z komentarzami znajduje się poniżej. W programie założono że sterowanie odbywać się będzie z aplikacji RoboRemoFree.
Poniższy kod jest zmodyfikowaną wersją programu zaproponowaną przez ElektroPrzewodnika, Kurs Budowy Robotów FORBOT oraz stronę http://www.makerworkshop.com.au/emitcollect/electronics/esp8266-as-access-point-and-station-with-udp-comms/.
Chciałbym w tym miejscu nadmienić, że zarówno Tomasz Grabowski (a.k.a. ElektroPrzewodnik) jak i twórcy portalu FORBOT (w szczególności Damian Szymański a.k.a Treker) robią kawał dobrej roboty w propagowaniu elektroniki i robotyki. Jeżeli ktoś jeszcze ich nie zna to bardzo polecam kanał ElektroPrzewodnik i portal FORBOT.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
#include <ESP8266WiFi.h> #include <WiFiUdp.h> #define portUDP 4210 // definicja portu UDP WiFiUDP UDP; IPAddress APlocal_IP(192, 168, 4, 1); // definicja adresu IP pojazdu IPAddress APgateway(192, 168, 4, 1); IPAddress APsubnet(255, 255, 255, 0); #define Lewy_PWM D4 #define Lewy_KIERUNEK D3 #define Prawy_PWM D2 #define Prawy_KIERUNEK D1 #define Maksymalny_PWM 170 // Ograniczenie "mocy" silników char bufor[255]; char incomingPacket[255]; int suwak_PT = 0, suwak_LP = 0; // zmienne dla suwaka PrzódTył oraz LewoPrawo int V_silnik_Lewy = 0, V_silnik_Prawy = 0; // prędkości dla obu silników boolean stan = false; void setup() { // Konfiguracja pinow od mostka H pinMode(Lewy_KIERUNEK, OUTPUT); pinMode(Prawy_KIERUNEK, OUTPUT); pinMode(Lewy_PWM, OUTPUT); pinMode(Prawy_PWM, OUTPUT); analogWriteFreq(20000); analogWriteRange(255); WiFi.mode(WIFI_AP); Serial.begin(115200); Serial.print("Soft-AP configuration ... "); Serial.println(WiFi.softAPConfig(APlocal_IP, APgateway, APsubnet) ? "OK" : "Failed!"); // konfiguracja sieci Serial.print("Setting soft-AP ... "); Serial.println(WiFi.softAP("Samochod_Lego", "lego1111") ? "OK" : "Failed!"); // konfiguracja AP Serial.print("Soft-AP IP address = "); Serial.println(WiFi.softAPIP()); Serial.println("begin UDP port"); UDP.begin(portUDP); Serial.print("local UDP port: "); Serial.println(portUDP); } void loop() { int packetSize = UDP.parsePacket(); if (packetSize) { int len = UDP.read(bufor, 255); if (len > 0) bufor[len] = 0; switch (bufor[0]) { case 'x': suwak_PT = atoi(&bufor[2]); break; case 'y': suwak_LP = atoi(&bufor[2]); break; case 's': stan = !stan; UDP.beginPacket(UDP.remoteIP(), portUDP); if (stan) UDP.write("led 1\n"); else UDP.write("led 0\n"); UDP.endPacket(); break; } } if (stan) { V_silnik_Lewy = suwak_PT - suwak_LP; // prędkość silnika lewego V_silnik_Prawy = suwak_PT + suwak_LP; // prędkość silnika prawego lewySilnik(V_silnik_Lewy); prawySilnik(V_silnik_Prawy); } else { stopSilniki(); } } void lewySilnik(int V) { if (V > 0){ digitalWrite(Lewy_KIERUNEK, 0); //Kierunek do przodu } else{ digitalWrite(Lewy_KIERUNEK, 1); //Kierunek do tyłu } V=abs(V); V = map(V, 0 , 140, 0, Maksymalny_PWM); // Mapowanie prędkości analogWrite(Lewy_PWM, V); //Ustawienie prędkości } void prawySilnik(int V) { if (V > 0){ digitalWrite(Prawy_KIERUNEK, 0); //Kierunek do przodu } else{ digitalWrite(Prawy_KIERUNEK, 1); //Kierunek do tyłu } V=abs(V); V = map(V, 0 , 140, 0, Maksymalny_PWM); // Mapowanie prędkości analogWrite(Prawy_PWM, V); //Ustawienie prędkości } void stopSilniki(){ analogWrite(Lewy_PWM,0); analogWrite(Prawy_PWM,0); } |
W programie ustawiono maksymalną wartość PWM dla silników równą 170, co ogranicza programowo ich moc. Przy takiej wartości PWM maksymalne napięcie zasilania nie powinno przekroczyć 6 V. Przy użyciu innego zasilania, przed podłączeniem silników, warto zmierzyć jaka jest maksymalna wartość napięcia wychodząca z mostka H i dostosować ją do używanych silników dobierając odpowiednio maksymalną wartość PWM.
Składanie pojazdu
Do złożenia pojazdu potrzeba niestety użyć trochę kleju na gorąco, aby przymocować silniki i koło obrotowe (patrz rys. 4), oraz płytkę z elektroniką aby nie latała.
Rys. 4 Mocowanie silników i kół
Zasilanie i elektronikę można zabudować używając dostępnych klocków. W moim przypadku wygląda to tak jak na poniższych rysunkach.
Rys. 5 Składanie pojazdu
Oczywiście, niepodlegającym dyskusji jest fakt, że pojazd ten żadnych konkursów piękności nie wygra. Lecz nie o to chodziło. Pewnie używając mniejszych klocków (a nie Duplo) udałoby się zbudować coś bardziej przypominającego samochód. Ale to może za kilka lat jak syn wyrośnie z klocków Duplo :-)
Uruchomienie pojazdu
Po wgraniu programu do WeMosa, powinien on przejść w tryb AP (niebieska dioda w module powinna się świecić) i tym samym pojazd jest gotowy do akcji.
W telefonie należy połączyć się z siecią ‘Samochod_Lego’ i w aplikacji RoboRemoFree w Menu wybrać opcję connect–>Internet (Udp) a następnie wpisać adres 192.168.4.1:4210 i kliknąć w niego w celu połączenia.
Następnie, włączenie pojazdu nastąpi po kliknięciu przycisku ‘włącznik’, co zasygnalizowane będzie przez zaświecenie wirtualnej diody w aplikacji.
Złożony i zaprogramowany pojazd w akcji można zobaczyć na filmie:
Bardzo fajny projekt… A czy jest jakiś odpowiednik aplikacji na iOS-y?
Dziękuję. Niestety nie znam odpowiednika na iOS :-/ Jest Blynk, który opisywałem w poprzednim wpisie, ale on wymaga serwera do łączności.
Ciekawe połączenie klocki z elektroniką no i duży plus za dokładny i czytelny opis sam jestem na etapie budowy robota na czterokołowej platformie samojezdnej sterowanej bezprzewodowo na nRF24 Lo1 mam tylko trochę kłopotów z kodem – dopiero się uczę programowania
No to widzę że i statywy do wiertarek i roboty robisz :-) Nie bawiłem się jeszcze nRF24Lo1 ale jak zrobisz to wrzuć opis. Chętnie poznam coś nowego.
cześć trochę to pewnie potrwa ale zainteresowałem się ostatnio projektem Arduino i postanowiłem się trochę poduczyć, a to jest mój pierwszy robot, jak tylko skończę to na pewno opublikuję . Mam jeszcze jedno pytanie czy sam zmodyfikowałeś kod ?
Czy ewentualnie mogę liczyć na jakąś małą pomoc jeśli będę chciał zmienić swój kod ?
Modyfikowałem podpatrując jak inni to robią. Sam zaczynam zabawę i w wolnych chwilach poznaje możliwość tych różnych zabawek, których kiedyś jak chodziłem do szkoły nie było :-) Jeżeli tylko będę potrafił to oczywiście postaram się pomóc. Powodzenia.
Projekt fajny, ale jak przekonałeś syna do oddania klocków bo mój nie chce się podzielić.
:-) Dał mi tylko kilka, dlatego pojazd kolorystycznie przypomina tęczę :-)
Jak tak przeglądam post nasunęła mi się jeszcze jedna uwaga zauważyłem że do zasilania pojazdu użyłeś baterii R6 ja w swoim zastosowałem bardzo wydajne akumulatory Litowo jonowe 18650 cztery szt. połączone szeregowo- równolegle tzn. połączyłem równolegle 2 sekcje po 2 szeregowo co przy pojemności pojedynczego akumulatora około 2200 mAh dało mi około 8 V i pojemność 4400 mAh no i mogę je wielokrotnie ładować co w sumie bardziej się chyba opłaca, akumulatory kupiłem firmowe Samsung na aliexpress .
Ja na razie zakupiłem eneloopy ni-mh, ale też myślałem o li-ion. Pamiętasz może sklep na aliexpresie, w którym kupiłeś te akumulatory? Skoro masz sprawdzonego dostawcę to może i ja bym skorzystał.
tak zaraz Ci wyślę
tutaj https://www.aliexpress.com/store/2779003
Dzięki.
Wcześnie wstajesz albo póżno chodzisz spać chyba że masz przestawiony czas w komputerze
Czas niestety ustawiony jest prawidłowo. Dojazd do pracy wymaga wczesnej pobudki :-/
A jeszcze się przy okazji dopytam Ciebie o ładowarkę do tych li-ion’ów. Masz jakąś szczególną, która się sprawdza i mógłbyś polecić? Na sieci można znaleźć i takie za 40 zł i takie za 140 lub więcej. Nie wiem na ile jest sens inwestować w te droższe.
Widziałem że Wemos robi również shieldy ze sterownikami silników. Uzywałes może ich? Chciałem taki zamówić, ale czytalem że są z nimi problemy.
Nie miałem okazji się nimi bawić.
Właśnie takiego projektu szukałem. Dzięki dzięki. A czy byłby duży kłopot żeby sterować jednym silnikiem lewo prawo i pwm ale na l293 bo takie mam?
Ciesze sie ze sie podoba. Co do sterownika silnikow to mozna uzyc dowolnego, byleby pasowal do uzytych silnikow. Ale nie bardzo kumam o co chodzi z tym jednym silnikiem lewo prawo?
Ciągle mam problem z działaniem kół, wifi działa bez problemu, ale pojazd nie chce działać. Masz jakieś porady co sprawdzić? Dzięki za pomoc