Z modułem Wi-Fi i Bluetooth.

Na Arduino Uno Wi-Fi zapewnione na wszystko? wygodna obsługa z mikrokontrolerem: 14 cyfrowych wejść/wyjść (6 z nich można wykorzystać jako wyjścia PWM), 6 wejść analogowych, złącze USB, złącze zasilania, złącze programowania w obwodzie (ICSP) i przycisk resetowania mikrokontrolera.

Najważniejszym elementem płytki jest moduł WiFi ESP8266, który pozwala Arduino komunikować się z innymi modułami za pośrednictwem sieci bezprzewodowe Standardy 802.11 b/g/n.

ESP8266 umożliwia flashowanie płytki Arduino bez użycia kabla USB w trybie OTA (Firmware Over The Air).

Recenzja wideo tablicy

Połączenie i konfiguracja

Na początek Płytka Arduino Uno WiFi na sali operacyjnej System Windows Ściągnij i zainstaluj Zintegrowane środowisko programistyczne Arduino - Arduino IDE.

Coś poszło nie tak?

Konfiguracja modułu WiFi

Oprogramowanie układowe Arduino przez Wi-Fi

Arduino Uno WiFi ma jeszcze jeden fajny bonus w swoim magazynie - możliwość przesyłania szkiców bez użycia kabla USB w trybie OTA (Firmware Over The Air). Przyjrzyjmy się bliżej, jak to zrobić.


Aby to zrobić, wejdź do menu: Narzędzia Port i wybierz właściwy port.

Ponieważ flashujemy Arduino przez WiFi, płyta zostanie zdefiniowana jako zdalne urządzenie z adresem IP

Środowisko jest skonfigurowane, płyta jest podłączona. Możesz przystąpić do pobrania szkicu. Arduino IDE zawiera dużą listę gotowe przykłady, w którym można podejrzeć rozwiązanie każdego problemu. Wybierzmy spośród przykładów miganie diody - szkic „Mrugnięcie”.
Flash tablicę, klikając ikonę pobierania programu.
Po załadowaniu dioda zacznie migać raz na sekundę. Oznacza to, że wszystko się udało.

Teraz możesz iść do przypadków użycia .

Przykłady użycia

serwer internetowy

Ustawmy prosty serwer WWW, który wyświetli stronę z aktualnymi wartościami wejść analogowych.

web-server.ino /* Przykład prostego serwera WWW działającego na Arduino Uno WiFi. Serwer wyświetla wartości wejść analogowych i aktualizuje informacje co dwie sekundy. Uzyskaj dostęp do serwera pod adresem http:// /arduino/webserver/ Zauważ, że ten przykład działa tylko z Arduino Uno WiFi Developer Edition. */#włączać #włączać void setup() ( Wifi.begin () ; Wifi.println ("Serwer sieciowy działa" ); // Wyświetl komunikat o uruchomieniu serwera w konsoli Wi-Fi) void loop() ( while (Wifi.available () ) ( process(Wifi) ; ) delay(50 ) ; ) void process(WifiData client) ( String polecenie = client.readStringUntil ("/" ) ; if (polecenie = = "serwer WWW" ) ( serwer WWW(klient) ; ) ) void WebServer(WifiData client) ( client.println ("HTTP/1.1 200 OK" ) ; client.println ("Content-Type: text/html" ); klient. println ("Połączenie: zamknij" ) ;client.println ("Odśwież: 2" ) ; // Tytuł określający okres odświeżania strony w sekundach klient.println(); klient.println(" " ) ; // Utwórz stronę klient.println( " Serwer sieciowy UNO WIFI " ) ; klient.drukuj( "

Przykład wyprowadzania wartości​​z pinów analogowych

"
) ; klient.drukuj("
    " ); for (int analogChannel = 0 ; analogChannel< 4 ; analogChannel++ ) { int sensorReading = analogRead(analogChannel) ; client.print ("
  • na wejściu analogowym ") ; klient.print(kanał analogowy); klient.print(": " ); klient.print(sensorReading) ; klient.print("
  • " ) ; ) klient.println("
" ); klient.print(DELIMITER) ; // Nie zapomnij zamknąć połączenia! }

Elementy deski

Mikrokontroler ATmega328P

Sercem platformy Arduino Uno WiFi jest 8-bitowy mikrokontroler AVR ATmega328P.

Mikrokontroler ATmega16U2

Mikrokontroler ATmega16U2 łączy mikrokontroler ATmega328P z portem USB komputera. Po podłączeniu do komputera, Arduino Uno WiFi jest definiowane jako wirtualny port COM. Oprogramowanie układowe 16U2 wykorzystuje standardowe sterowniki USB-COM, więc nie trzeba instalować sterowników zewnętrznych.

Kołki zasilania

    VIN: Napięcie z zewnętrznego zasilacza (nie dotyczy 5V z USB lub innego stabilizowanego napięcia). Dzięki temu wyjściu możesz zarówno dostarczać zewnętrzne zasilanie, jak i pobierać prąd, jeśli do urządzenia jest podłączony zewnętrzny adapter.

    5V: Wyjście otrzymuje napięcie 5 V ze stabilizatora płytki. Ten stabilizator zapewnia zasilanie mikrokontrolera ATmega328. Nie zaleca się zasilania urządzenia przez wyjście 5V - w takim przypadku nie stosuje się stabilizatora napięcia, co może doprowadzić do awarii płytki.

    3,3V: 3,3V z regulatora płyty. Maksymalny prąd wyjściowy to 1 A.

    GND: Wnioski naziemne.

    IOREF: Pin dostarcza płytkom rozszerzeń informacji o napięciu pracy mikrokontrolera. W zależności od napięcia, płytka rozszerzająca może przełączyć się na odpowiednie zasilanie lub zastosować konwertery poziomów, które pozwolą na współpracę zarówno z urządzeniami 5V jak i 3,3V.

Porty we/wy

    Wejścia/wyjścia cyfrowe: piny 0 - 13
    Poziom logiczny jedynki to 5 V, zero to 0 V. Maksymalny prąd wyjściowy to 40 mA. Rezystory podciągające są podłączone do pinów, które są domyślnie wyłączone, ale można je włączyć programowo.

    PWM: piny 3, 5, 6, 9, 10 i 11
    Umożliwia wyprowadzenie 8-bitowych wartości analogowych jako sygnału PWM.

    ADC: piny A0 - A5
    6 wejść analogowych, z których każde może reprezentować napięcie analogowe jako liczbę 10-bitową (1024 wartości). Głębia bitowa ADC wynosi 10 bitów.

    TWI/I²C: Piny SDA i SCL
    Do komunikacji z urządzeniami peryferyjnymi za pomocą protokołu synchronicznego za pomocą 2 przewodów. Do pracy - skorzystaj z biblioteki Wire.

    SPI: piny 10(SS) , 11(MOSI) , 12(MISO) , 13(SCK) .
    Poprzez te piny komunikacja odbywa się poprzez interfejs SPI. Do pracy - skorzystaj z biblioteki SPI.

    UART: piny 0(RX) i 1(TX)
    Piny te są połączone z odpowiednimi pinami mikrokontrolera ATmega16U2, który pełni rolę konwertera USB-UART. Służy do komunikacji płytki Arduino z komputerem lub innymi urządzeniami poprzez klasę Serial.

Wskazanie LED

Złącze USB typu B

Złącze USB typu B jest przeznaczone do flashowania platformy Arduino Uno WiFi za pomocą komputera.

Złącze do zasilania zewnętrznego

Złącze do podłączenia zewnętrzny zasilacz 7 V do 12 V.

Regulator napięcia 5V

Gdy płytka jest podłączona do zewnętrznego zasilacza, napięcie przechodzi przez regulator MPM3610. Wyjście stabilizatora jest podłączone do pinu 5V. Maksymalny prąd wyjściowy to 1A.

Regulator napięcia 3.3V

Stabilizator MPM3810GQB-33 z wyjściem 3,3 V. Zapewnia zasilanie modułu WiFi ESP8266 i jest wyprowadzane na pin 3.3V. Maksymalny prąd wyjściowy to 1A.

Złącze ICSP dla ATmega328P

Złącze ICSP jest przeznaczone do programowania w układzie mikrokontrolera ATmega328P. Korzystając z biblioteki SPI, piny te mogą komunikować się z płytami rozszerzeń za pośrednictwem interfejsu SPI. Linie SPI są kierowane do 6-stykowego złącza, a także są duplikowane na cyfrowych pinach 10(SS), 11(MOSI), 12(MISO) i 13(SCK).

Złącze ICSP do ATmega16U2

Złącze ICSP przeznaczone jest do programowania w układzie mikrokontrolera ATmega16U2.

Będziemy więc sterować dwoma silnikami odwracalnymi (obracającymi się w obie strony): głównym i sterującym. Będziemy je zasilać z akumulatora 3,7 V, ale można zasilać w zasadzie do 12 V, jeśli zgodzicie się na zasilanie sterownika lub zorganizujecie go osobnym akumulatorem.

W sekcji mocy używamy najprostszego miniaturowego drivera silnik krokowy l9110s lub możesz użyć montażu na L293\8 lub jakikolwiek równie potężny, jaki możesz znaleźć. Ogólnie narysowałem wszystko na zdjęciu.

Możesz kupić komponenty do projektu na aliexpress:

Kontroler WiFi używał mojego ulubionego NodeMCU 0.9 ESP8266, ale możesz też użyć mniejszy rozmiar WeMos D1 mini.

Akumulator można ładować przez micro USB, po czym bezpośrednio zasila sterownik silnika i kontroler WiFi przez konwerter doładowania do 5 V.

Kod programu:

#włączać
const char* ssid = "nazwa Twojej sieci Wi-Fi";
const char* password = "hasło sieciowe";
int w górę = 2; //liczba wyjść dyskretnych
int w dół = 14;
wewn lewy = 4;
int po prawej = 12;
// Utwórz instancję serwera
// jako argument określ port, na którym chcesz nasłuchiwać
Serwer WiFiServer(80);
pusta konfiguracja()(
Serial.początek(9600);
opóźnienie(10);
//przygotuj wyjścia
pinMode (w górę, WYJŚCIE);
digitalWrite(w górę, 0);
pinMode (w dół, WYJŚCIE);
digitalWrite(w dół, 0);
pinMode(po lewej, WYJŚCIE);
digitalWrite(po lewej, 0);
pinMode(prawo, WYJŚCIE);
digitalWrite(prawo, 0);

// Połącz z siecią Wi-Fi
Serial.println();
Serial.println();
Serial.print("Łączenie z");
seryjne println(ssid);

wifi.begin(SSid, hasło);

Chociaż (WiFi.status() != WL_CONNECTED) (
opóźnienie (500);
Serial.print(".");
}
Serial.println("");
Serial.println("Połączenie WiFi");

//Uruchom serwer
serwer.początek();
Serial.println("Serwer uruchomiony");
//wyświetl adres IP w monitorze portu
Serial.println(WiFi.localIP());
}
pusta pętla() (
// sprawdź, czy klient jest podłączony
Klient WiFiClient = serwer.dostępny();
jeśli (!klient) (
zwrócić;
}

//Czekamy, aż klient wyśle ​​jakieś dane
Serial.println("nowy klient");
while(!klient.dostępny())(
opóźnienie(1);
}

//Przeczytaj pierwszą linię zapytania
String req = client.readStringUntil("\r");
seryjne println(wymagane);
klient.flush();

//przetwarzanie poleceń
if (req.indexOf("/gpio/up") != -1)(
digitalWrite(w górę, 1);
digitalWrite(w dół, 0);
opóźnienie (1000);
digitalWrite(w górę, 0);
digitalWrite(w dół, 0);
}
else if (req.indexOf("/gpio/down") != -1)(
digitalWrite(w górę, 0);
digitalWrite(w dół, 1);
opóźnienie (1000);
digitalWrite(w górę, 0);
digitalWrite(w dół, 0);
}
else if (req.indexOf("/gpio/left") != -1)(
digitalWrite(w górę, 1);
digitalWrite(w dół, 0);
digitalWrite(po lewej, 1);
digitalWrite(prawo, 0);
opóźnienie (1000);
digitalWrite(w górę, 0);
digitalWrite(w dół, 0);
digitalWrite(po lewej, 0);
digitalWrite(prawo, 0);
}
else if (req.indexOf("/gpio/right") != -1)(
digitalWrite(w górę, 1);
digitalWrite(w dół, 0);
digitalWrite(po lewej, 0);
digitalWrite(prawo, 1);
opóźnienie (1000);
digitalWrite(w górę, 0);
digitalWrite(w dół, 0);
digitalWrite(po lewej, 0);
digitalWrite(prawo, 0);
}
w przeciwnym razie(
Serial.println("nieprawidłowe żądanie");
}

Klient.flush();
// przygotuj się na odpowiedź
String s = "HTTP/1.1 200 OK\r\nTyp treści: text/html\r\n\r\n\r\n \r\n";

S+=


W GÓRĘ.
";
s+=
LEWY ";
s += „PRAWY
";
s+=
NA DÓŁ";
s+=
\n";
// Wyślij odpowiedź do klienta
klient.druk(y);
opóźnienie(1);
Serial.println("Klient odłączony");
) Program napisany w Arduino IDE. Jak skonfigurować Arduino IDE do pracy z kontrolerem NodeMCU 0.9 ESP8266? spójrz na link. Po pobraniu programu do kontrolera, monitor portu może odczytać adres IP, który otrzyma płytka po połączeniu się z routerem WiFi. W przeglądarce komputerowej musisz pasek adresu wpisz ten adres i przejdź do strony, którą wygeneruje program sterownika. Będzie to wyglądać tak:

NA DÓŁ

Po kliknięciu łącza GÓRA samochód przesunie się do przodu przez 1 sekundę i zatrzyma się. Gdy naciśniesz DOWN, samochód cofnie się przez 1 sekundę. W LEWO - silnik skrętu skręci kołami w lewo i samochód pojedzie 1 sekundę w lewo. To samo dzieje się w prawo, gdy naciśniesz PRAWO.

Cały ten system będzie działał tylko ze skonfigurowanym punktem dostępowym WiFi (routerem WiFi), ale w przyszłości jestem zainteresowany zabawą kontroler NodeMCU 0.9 ESP8266, który sam zorganizuje punkt dostępu i będzie działał jako serwer WEB, to znaczy, gdy uzyskasz dostęp do jego adresu IP z przeglądarki, zobaczymy stronę internetową z kontrolkami. Interesujące jest również zorganizowanie przesyłania danych z jednego takiego kontrolera do drugiego za pośrednictwem ich autonomicznej sieci WiFi.

Część 1: Przygotowanie ESP8266

Dlaczego ten artykuł? Istnieje już wiele artykułów na Habré na temat używania ESP w różnych konfiguracjach, ale z jakiegoś powodu bez szczegółów na temat tego, jak wszystko jest podłączone, flashowane i zaprogramowane. Jak „wziąłem ESP, dwie baterie AA, DHT22, wrzuciłem do pudełka, potrząsnąłem zegarem i termometr gotowy!”. W rezultacie okazuje się to dziwne: ci, którzy już pracują z ESP, nie widzą nic niezwykłego w tym, co zrobili, a ci, którzy chcą się uczyć, nie rozumieją, od czego zacząć. Dlatego postanowiłem napisać szczegółowy artykuł o tym, jak ESP jest podłączony i flashowany, jak połączyć go z Arduino i światem zewnętrznym oraz na jakie problemy natknąłem się po drodze. Linki do Aliexpress podaję tylko w celu przedstawienia kolejności cen i wygląd zewnętrzny składniki.

Miałem więc dwa mikrokontrolery, siedem różnych czujników, pięć zasilaczy, czujnik temperatury DHT22 i całą masę przewodów wszelkiego rodzaju i kolorów, a także niezliczoną ilość rezystorów, kondensatorów i diod. Nie żeby to wszystko było potrzebne do termometru, ale kiedy już wejdziesz w mikroelektronikę, trudno jest przestać.


Żywność

ESP8266 wymaga napięcia 3,3V i prądu co najmniej 300mA. Niestety Arduino Uno nie jest w stanie zapewnić takiego prądu, podobnie jak przejściówki (programatory) USB-UART takie jak FT232RL nie są w stanie go zapewnić – ich limit to około 50mA. Oznacza to, że będziesz musiał zorganizować osobny posiłek. I byłoby lepiej, gdyby Arduino pracowało również z napięciem 3,3 V, aby uniknąć problemów typu „Podałem pięciowoltowy sygnał do pinu RX modułu ESP, dlaczego śmierdzi spalonym plastikiem?”.

Istnieją trzy rozwiązania.

2. Kup gotowy moduł z regulatorem napięcia obniżającym napięcie 5V do 3,3V. Być może jest to najwygodniejsza opcja.

3. Zmontuj sam moduł z regulatora AMS1117 i jednego kondensatora tantalowego 22uF.

Wybrałem trzecią opcję, ponieważ często potrzebuję 3,3V, jestem chciwy i lubię wbudowywać regulatory bezpośrednio do zasilaczy.

Z AMS1117 wszystko jest proste: jeśli umieścisz go z tekstem do góry, napięcie na nogach wzrośnie od lewej do prawej: 0 (Gnd), 3,3 V (Vout), 5 V (Vin).
Między zerem a wyjściem potrzebny jest kondensator tantalowy 22 mikrofaradów (więc zgodnie z instrukcją, co się stanie, jeśli włożysz elektrolityczny - nie sprawdzałem). Kondensator tantalowy SMD ma plus tam, gdzie jest pasek. Trochę monstrualnego lutowania elementów SMD kompletnie nie przeznaczonych do takiego barbarzyństwa i:

Koniecznie sprawdź napięcie wyjściowe. Jeśli jest znacznie mniej niż 3,3V (np. 1,17V) - pozwól regulatorowi ostygnąć po wlutowaniu i sprawdź styki. Jeśli umieścisz kondensator większy niż 22uF, to multimetr może pokazywać wyższe napięcie.

Dlaczego AMS1117? Jest szeroko stosowany. Można go znaleźć prawie wszędzie, nawet Arduino Uno zwykle kosztuje AMS1117-5.0.
Jeśli znasz coś zbliżonego rozmiarem i ceną, jeszcze łatwiejszego w obsłudze - napisz.

Ważny punkt. Nie wiem dlaczego, ale AMS1117 jest niezwykle kapryśny jeśli chodzi o jakość połączeń. Kontakty muszą być wiarygodne. Lepiej lutowane. W przeciwnym razie podczas testów wytwarza napięcie 3,3 V, ale nie wytwarza niczego pod obciążeniem.

Podłączanie ESP8266

Wybrałem Model 07, ponieważ ma świetną metalową osłonę, która działa jako ochrona przed zakłóceniami, uderzeniami mechanicznymi i jako radiator. Ten ostatni daje różnicę między wypalonym modułem a po prostu podgrzanym. Dodatkowo jest gniazdo na antenę zewnętrzną.

Aby układ się uruchomił, musisz połączyć VCC i CH_P przez rezystor 10kΩ. Jeśli tak nie jest, wystarczy dowolny z zakresu 1-20 kΩ. Dodatkowo konkretnie model 07 nadal wymaga, aby GPIO15 (ten najbliższy GND) znajdował się "na ziemi" (nie widać tego na zdjęciu, bo połączenie jest po drugiej stronie).

Teraz bierzemy przejściówkę USB-UART, przełączamy na 3,3V i podłączamy RX do TX, TX do RX i GND do masy (bez tego mam niestabilną transmisję). Jeśli nie możesz przełączyć na 3,3V, możesz użyć najprostszego dzielnika napięcia rezystorowego: podłącz ESP RX do adaptera TX przez rezystancję 1kΩ, a ESP RX do masy przez 2kΩ. Istnieje wiele bardziej skomplikowanych i bardziej niezawodnych sposobów podłączenia 3,3V i 5V, ale w tym przypadku wystarczy.

I łączymy się z prędkością 9600 na żądanym porcie COM (możesz to zobaczyć w menedżerze urządzeń).

Używam SecureCRT, Putty też jest w porządku, a miłośnicy Linuksa już wiedzą, co robić i gdzie szukać.

(AT+RST resetuje chip)

Jeśli nic się nie dzieje - wyłącz - włącz zasilanie, jeśli nadal nic się nie dzieje - sprawdź zgodność TX / RX, spróbuj je przestawić lub przylutować do układu.

Czasami chip zawiesza się podczas prześmiewczych eksperymentów, a następnie należy go odłączyć od zasilania, w tym przez wyłączenie adaptera (na przykład przez wyciągnięcie go z USB), ponieważ nawet przychodzące okruchy mocy wystarczą, aby chip uparcie głupi i nie działa.

Czasami sztuczki z adapterem zawieszają port USB. Możliwe jest użycie innego portu USB jako tymczasowego rozwiązania, ale ogólnie lepiej jest zrestartować komputer.

Czasami zmienia to numer portu COM. W Linuksie można to rozwiązać za pomocą udev.

Jeśli zamiast tekstu pojawią się śmieci, sprawdź ustawienia prędkości. Niektóre starsze układy działają przy 115200.

Na początku chip się nagrzewa, ale jeśli jest naprawdę gorący i dalej się grzeje, odłącz i sprawdź wszystkie połączenia. Żeby do obudowy nie dochodziło +3,3V, żeby w ogóle nie dochodziło do niej 5V, żeby "masa" adaptera była połączona z "masą" chipa. Modele z metalowym ekranem są bardzo trudne do wypalenia (ale nie ma rzeczy niemożliwych), a modele bez ekranów narzekają, że nawet drobny błąd może być ostatnim w życiu chipem. Ale tego nie sprawdziłem.

Oprogramowanie układowe

Moim wyborem jest NodeMCU. Ma problemy z obsługą pamięci i sprzętu, ale to wielokrotnie procentuje prostotą kodu i łatwością debugowania.

Będziesz także potrzebował flashera NodeMCU i LuaLoadera (ten ostatni jest opcjonalny, są inni klienci do pracy z tym oprogramowaniem).

Wyłącz chip. Podłącz GPIO0 do masy i włącz chip:

Jeśli nic się nie dzieje, a pola AP MAC/STA MAC są puste - sprawdź ponownie, czy GPIO0 jest na ziemi.
Jeśli oprogramowanie układowe uruchomiło się, ale zawiesiło się - spójrz na zakładkę Dziennik, z jakiegoś powodu ten konkretny układ odmówił flashowania na FT232RL, ale został sflashowany na PL2303HX z prędkością 576000 bez żadnych problemów. Musisz otworzyć plastik obudowy i przylutuj przewód od 5V do 3,3V, dostępne są opcje z pięcioma wyjściami: 3,3, 5, TX, RX, Gnd.


Uwaga: zmienił się MAC STA. Podejrzewam, że flasher nie pokazywał tego poprawnie, ale wymagana jest weryfikacja.

Aby zaoszczędzić siłę i nerwy, możesz wziąć wersję gotową lub półproduktową.

Dostępne są jednorazowe adaptery z wygodnym okablowaniem.
Jest