Skocz do zawartości
Elvis

Co wybrać dla ESP32 - Arduino, czy IDF

Pomocna odpowiedź

Mam pytanie jak w temacie wątku, czyli co wybrać jako bibliotekę do programowania ESP32: Arduino, czy ESP-IDF? Może ktoś ma doświadczenia z jedną, albo najlepiej obydwiema biblitekami?

Pytam głównie z ciekawości, bo ESP-IDF wydaje się nieco trudniejsza na początek, więc kiedy i dlaczego warto jej używać? Czy jest sens poświęcić na nią czas, czy lepiej pozostać przy Arduino?

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Jak zawsze trudno cokolwiek doradzić nie wiedząc co chcesz uzyskać.

Arduino ma tę zaletę, że jest (w miarę) przenośne, więc po pierwsze masz mniej nauki, po drugie możesz wykorzystać ten sam kod na wielu platformach (z drobnymi modyfikacjami). Poza tym z tego, co pamiętam, wszystkie funkcje z IDF masz nadal dostępne, więc jak nie wiesz jak coś zrobić funkcjami Arduino, to wołasz IDF-owe.

Natomiast programowanie w "czystym" IDF ma tę zaletę, że nie masz całego narzutu Arduino, co może mieć znaczenie jeśli rzeczywiście próbujesz wykorzystać pełne możliwości mikrokontrolera, do ostatniego bitu. Ale ESP32 jest na tyle potężne, że raczej wątpię, żebyś miał taką potrzebę.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

No właśnie jestem ciekaw czy faktycznie z biblioteki Arduino jest dostęp do wszystkich funkcji ESP32? Bo czytałem różne opinie, w tym takie że jednak Arduino oferuje tylko część funkcjonalności - ale nie wiem jak jest naprawdę ,stąd moje pytanie. Kolejna sprawa to ten mityczny narzut. Oczywiście też uważam, że jest, ale nie wiem jaki, czy ktoś ma jakieś faktyczne dane np. ile zajmuje program na ESP-IDF, a ile odpowiednik na bibliotekach Arduino? Jak jest z wydajnością?

Ciekaw jestem również jak wygląda sprawa dostępu do funkcji FreeRTOS-a pod Arduino - bo chyba standardowe biblioteki nie są przygotowane na wielowątkowość. Więc pierwsze pytanie, czy można korzystać z tego co daje RTOS, drugie - jak biblioteki Arduino działają w systemie wielowątkowym?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@krzychb dzięki za linka - co prawda sama odpowiedź nie do końca rozwiała moje wątpliwości, ale pod wpisem znalazłem list do książki Neil-a Koban'a: https://leanpub.com/kolban-ESP32

O ile rozumiem Arduino ma co najmniej jedną wadę związaną z brakiem wsparcia dla wielowątkowości - ktoś ma z tym jakieś doświadczenia? ESP32 ma dwa rdzenie, trochę szkoda byłoby nie dość że wykorzystywać tylko jeden to jeszcze w jednym wątku...

Udostępnij ten post


Link to post
Share on other sites

@krzychb, bardzo ciekawe linki, dzięki! Robiłeś jakieś ciekawe projekty na tym ESP32?

Udostępnij ten post


Link to post
Share on other sites

Ciekawe linki to zasługa Elvisa, który mnie sprowokował do odpowiedzi 🙂

Jeżeli chodzi o projekty to dużo radości dostarczyła ma analiza i uruchomienie sprzętowego generatora cosinus zaszytego w ESP32. Okazało się to stosunkowo prostym zadaniem. Ponieważ ESP32 ma atrakcyjną cenę i funkcjonalność, przekłada się to na liczbę użytkowników na GitHub i esp32.com gdzie łatwo uzyskać pomoc, także w przypadku mniej typowych projektów.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Z tego co widzę generator używa IDF zamiast Arduino. Coś mi się wydaje, że chcąc lepiej poznać esp32 bez IDF się nie obędzie. Chociaż może się mylę?

Udostępnij ten post


Link to post
Share on other sites

@Elvis sądzę, że warto zainwestować w poznanie IDF, ponieważ na jego bazie rozwijanych jest kilka interesujących środowisk pozwalających na implementację:

  • ESP-MDF - zdecentralizowanych, samo organizujących się sieci komunikacyjnych / mesh
  • ESP-ADF - sterowania głosem, odtwarzania muzyki z różnych źródeł i w rożnych formatach
  • ESP-FACE - wykrywania i rozpoznawania twarzy
  • itd...

Nie zamyka to dostępu do aplikacji stworzonych w środowisku Arduino, które po dostosowaniu mogą być wykorzystane jako komponent w IDF.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Ja jak na razie mocno się zawiodłem na bibliotece Arduino dla ESP32. W ramach przygotowań świątecznych chciałem podłączyć łańcuch diod WS2812 do ESP32 tak żeby choinka miała piękne podłączenie do internetu. Pierwszy prototyp podłączyłem na prawdziwym Arduino Uno i działało, chociaż bez dostępu do sieci.

Ponieważ byłem trochę leniwy, pomyślałem że dam szansę bibliotekom Arduino na ESP32 - uruchomiłem więc ten sam kod na esp i... okazało się że działa, ale nie do końca. Niektóre diody w łańcuch zapalają się w losowy sposób.

Więc na te święta choinka musiała się obyć bez IoT, a dla mnie był to kolejny dowód na marną jakość bibliotek Arduino 😞 Teraz planuję wysterować diody za pomocą IDF, ale raczej nie zdążę przed końcem Świąt 😞

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Jak wspominałem, biblioteka Arduino (NeoPixel) dla ESP32 nie nadaje się do obsługi diod WS2812B - właściwie nie nadaje się zupełnie do niczego.

Na szczęście IDF działa znacznie lepiej. Poniżej zdjęcia choinki IoT 😉 Na ESP32 działa prosty serwer UDP, dane przesyłane za pomocą tego protokołu sterują świeceniem diodek. Sama komunikacja przez WiFi oczywiście działa w sieci lokalnej, ale gdyby skonfigurować inaczej router, byłaby to prawdziwa choinka z dostępnem do internetu.

choinka2.thumb.jpg.d51aa01226fdc32906aee0767330c095.jpgchoinka.thumb.jpg.3bd0e9b4bf256cf21da87719550b6b5e.jpg

Wesołych Świąt!

Edytowano przez Elvis
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
19 godzin temu, Elvis napisał:

Ja jak na razie mocno się zawiodłem na bibliotece Arduino dla ESP32.

Też podczas testów miałem z tym różne problemy. Chyba niestety jest tak jak z Genuino101/Edisonem, które były zgodne z Arduino tylko na papierze. Im dłużej się tym człowiek zajmował tym było więcej problemów.

Udostępnij ten post


Link to post
Share on other sites

Ja kiedyś bawiłem się trochę biblioteką zgodną z Arduino na PIC32 i też były problemy z czymkolwiek poza podstawami.

Natomiast w przypadku WS2812B jest chyba jeszcze gorzej. Ale zacznijmy od początku - to nie jest biblioteka dostarczana przez producenta Arduino, z drugiej strony Adafruit wydaje się dość znaczącym graczem wśród dostawców modułów, więc po bibliotekach tej firmy można byłoby oczekiwać nieco więcej: https://github.com/adafruit/Adafruit_NeoPixel

W każdym razie Adafruit NeoPixel posiada wsparcie dla ESP32. Gdyby nie to, cała biblioteka nie byłaby zgodna z esp - niestety ale bibliteki same się nie przystosowują do nowej platformy i konieczne są w nich zmiany. Więc nawet używając bibliotek dla Arduino nie będziemy mieli dostępu do większości kodu, który został opracowany tylko dla AVR.


#if defined(ESP8266)
// ESP8266 show() is external to enforce ICACHE_RAM_ATTR execution
extern "C" void ICACHE_RAM_ATTR espShow(
  uint8_t pin, uint8_t *pixels, uint32_t numBytes, uint8_t type);
#elif defined(ESP32)
extern "C" void espShow(
  uint8_t pin, uint8_t *pixels, uint32_t numBytes, uint8_t type);
#endif // ESP8266

Właśnie funkcja espShow to podstawa biblioteki w wersji dla esp. Znajdziemy ją w pliku https://github.com/adafruit/Adafruit_NeoPixel/blob/master/esp8266.c

Poniżej kod pętli wysyłającej dane - z kodu usunąłem fragmenty dla esp8266 żeby było łatwiej czytać:

  for(t = time0;; t = time0) {
    if(pix & mask) t = time1;                             // Bit high duration
    while(((c = _getCycleCount()) - startTime) < period); // Wait for bit start

    gpio_set_level(pin, HIGH);

    startTime = c;                                        // Save start time
    while(((c = _getCycleCount()) - startTime) < t);      // Wait high duration

    gpio_set_level(pin, LOW);

    if(!(mask >>= 1)) {                                   // Next bit/byte
      if(p >= end) break;
      pix  = *p++;
      mask = 0x80;
    }
  }
while((_getCycleCount() - startTime) < period); // Wait for last bit

Teoretycznie kod wygląda dobrze, piny są ustawiane zgodnie z oczekiwaniami WS2812B.

Niestety tutaj najlepiej widać to czego się obawiałem odnośnie bibliotek Arduino w wersji dla ESP32 - zupełnego zignorowania obecności RTOS-a.

Kod pewnie działałby prawie dobrze w systemie jednowątkowym. Ale pomyślmy co się dzieje jeśli:

  • pojawia się przerwanie
  • następuje przełączenie do innego zadania

Pierwszy problem oczywiście występuje i w Arduino UNO, stąd tamte - pewnie lepiej przetestowane bibilioteki, wyłączają przerwania podczas komunikacji. W przypadku ESP32 można liczyć, że procesor jest tak szybki, że obsługa przerwań nie wpłynie na opóźnienia. Można też mieć nadzieję, że przerwania obsłuży drugi rdzeń... Ale kod nic nie robi, żeby te nadzieje spełnić.

Natomiast drugi problem jest znacznie poważniejszy. Mając działający FreeRTOS musimy być przygotowani na wywłaszczenie procesu - o ile się przed tym jakoś nie zabezpieczymy. A powyższy kod jak zwykle zostaje przy nadziei że jakoś to będzie. Więc mając nieobciążony system, biblioteka pewnie czasem mogłaby działać. Ale gdy inne zadania zajmą procesor, biblioteka rozsypie się zupełnie.

Niestety obecna wersja ma problemy nawet bez obciążania procesora pracą. Co 1ms wywoływany jest scheduler FreeRTOS-a, a jego działanie zajmuje trochę czasu.

Nie jest to mój wymysł, problem jest znany i od półtora roku nierozwiązany: https://github.com/adafruit/Adafruit_NeoPixel/issues/139

Efekt jest dobrze widoczny jeśli podłączymy anazliator stanów logicznych:

2018-12-26-140517_1918x1038_scrot.thumb.png.f37288ad1357afdebc4bd9a0f54778fa.png2018-12-26-140549_1918x1038_scrot.thumb.png.7f5eaa49d630f767e71f12c48f2539b3.png

Widoczne przerwy w komunikacji to właśnie wywołania FreeRTOS-a.

Dla mnie wniosek jest taki: biblioteki Arduino działają dobrze na Arduino. Niestety dla innych platform trzeba z nimi bardzo uważać - i nie ufać za bardzo, że są w 100% poprawnie napisane (w sumie nawet 20% to byłby optymistyczny szacunek).

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Z przyjemnością przeczytałem dokładne wyjaśnienia @Elvis 'a i mam podobne obserwacje.

W Adafruit_NeoPixel zrównano do najniższego wspólnego mianownika i krytyczne czasowo dla WS2812B przebiegi generowane są bezpośrednio z programu (bitbanging). W przypadku Arduino UNO jest to zrozumiałe ze względu na brak innych zasobów. Alternatywnym rozwiązaniem dla bardziej zaawansowanego ESP32 jest generowanie tych sygnałów sprzętowo, jak zrobiono to w sugerowanej w https://github.com/adafruit/Adafruit_NeoPixel/issues/139 bibliotece https://github.com/Makuna/NeoPixelBus. Ladyada przyjęła to rozwiązanie i zapewne będzie ono zastosowane również w Adafruit_NeoPixel.

Makuna zrobił tak wcześniej z doskonałym rezultatem dla ESP8266     nie pozostawiając szans uznanym na innych platformach bibliotekom Adafruit_NeoPixel i FastLED. Sądzę, że podobny rezultat osiągnął także dla ESP32.

Wracając to tematu tego wątku, chcąc pozostać przy Arduino, warto sprawdzać dostępność bibliotek pisanych od początku dla ESP32 -  "biblioteki same się nie przystosowują do nowej platformy" 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...