Witam. Chciałbym unowocześnić mój stary projekt zestawu stereo w którym sterowanie oparte jest o mikrokontrolery Atmega32, dokładniej potrzebuję komunikacji bezprzewodowej między Wzmacniaczem a Subwooferem czyli pomiędzy jedną atmegą a drugą. Oba urządzenia już są przygotowane do wymiany danych przez UART. Chodzi tu o komendy włącz wyłącz, głośniej, ciszej, filtr, faza i inne - ogólnie transmisja w obie strony. Mam też 2 moduły ESP-07 do których odnosi się całe zapytanie i do których zrobiłem sobie adaptery TTL. Czy jest możliwość zestawienia transmisji przeźroczystej przez UART (Atmega->ESP->Router->ESP->Atmega, lub z pominięciem routera) tak aby nie używać komend AT bo szczerze mówiąc nieco mi to komplikuje całą sytuację. Jestem laikiem co do ESP zaś atmegi programuję w C.
Czy jest możliwość zestawienia transmisji przeźroczystej przez UART (Atmega->ESP->Router->ESP->Atmega, lub z pominięciem routera) tak aby nie używać komend AT
Wątek ciekawy, wiele osób trafi tu w przyszłości. Może napiszesz więcej na ten temat i dołączysz linki do tych poradników i kodów. Zaoszczędzisz innym szukania.
W skrócie dla mojego modułu ESP-07 (ale i dla wszystkich ESP) wygląda to tak:
1. Pobieramy na komputer Arduino IDE z linku wybierając właściwą architekturę dla naszego komputera.
2. Instalujemy oprogramowanie. Po instalacji uruchamiamy program Arduino, klikamy na Plik -> Preferencje i w polu "Dodatkowe adresy URL do menedżera płytek:" wklejamy tylko adres tego Linku, zatwierdzamy OK.
3. W oknie głównym wybieramy menu Narzędzia -> Płytka: "Arduino/Genuino Uno" -> Menedżer płytek... W oknie menedżera przewijamy listę i szukamy pozycji "esp8266 by ESP8266 Community" jak na obrazku:
Po wybraniu pozycji klikamy Instaluj.
4. Po instalacji przechodzimy do menu "Narzędzia" przewijamy listę do dołu i wybieramy płytkę "Generic ESP8266 Module". Klikamy ponownie na menu "Narzędzia" w których pokazało nam się sporo ustawień do naszego modułu. Ja tylko wybrałem odpowiedni port COM.
5. Teraz wystarczy wkleić gotowy kod w okno główne programu i wgrać go do naszego modułu zwierając GPIO0 do masy podczas podawania napięcia do modułu. Tym sposobem przechodzimy w tryb flashowania. Trzeba równierz pamiętać o prawidłowym podłączeniu linii TX i RX, czyli krzyżowo Ja dla ułatwienia sobie życia zrobiłem adapter do poziomu TTL z konwerterem napięć i przyciskami do resetowania i flashowania modułu. Korzystałem z 2 adapterów USB to Serial (jeden samoróbka na FT232RL i drugi na PL2303) i oba działają ok.
Wystarczy skopiować kod, zmienić SSID na takie jakie nadaje nasz router, hasło, port po którym ma przebiegać komunikacja UDP, adres IP/Broadcast i ustawić sobie baudrate transmisji po UART. Wadą tego typu rozwiązania jest to że czasem może uciąć jeden lub 2 znaki z początku stringa, ale u mnie zdarzało się to bardzo rzadko. Ewentualnie trzeba sobie jakoś poradzić na docelowym urządzeniu.
Ciekawy kod do transmisji. Nie wiem jednak czy to będzie poprawnie działać. Przy prędkości 9600 mamy niecały znak na 1ms, a autor wprowadził do kodu delay(20). To delay umożliwia przesłanie raptem 50 znaków na sekundę. Według mnie ten delay jest całkowicie zbędny. Prędkość i tak będzie "stabilizowana" przez UART. Drugi problem to wyjątkowa nieekonomiczność transmisji - każdy pakiet UDP, który zawiera wiele bajtów koniecznych do transmisji niesie ze sobą tylko jeden bajt informacji. W UDP standardowo nie ma kontroli, czy pakiet doszedł, a kod nie rozwiązuje tego problemu programowo. W przypadku gdy wiemy co wymieniamy np. krótkie sekwencje (kilkaset bajtów) to znacznie lepszym rozwiązaniem jest zgromadzenie takiej sekwencji i wysłanie jej w jednym pakiecie. Mamy wówczas pewność, że pakiet dojdzie w całości lub wcale nie dojdzie. Można się nawet pokusić o potwierdzenie otrzymania pakietu i retransmisję.