Skocz do zawartości

ESP32 + PCA9685 czworonożny robot - stworzenie sterownika


Pomocna odpowiedź

Witam wszystkich, 

Jestem nowy na forum, a także zielony w temacie budowania konstrukcji takich jak czworonożny robot pająk. Proszę o pomoc ze sterownikiem do robota (12 serwomechanizmów SG90 - po trzy serwa na jedną nogę), gdyż nie wiem kompletnie jak się za to zabrać.

Serwomechanizmami steruje ESP32 do którego jest podpięty PCA9685, do którego z kolei jest podpiętych 12 serw. Przy pomocy biblioteki Adafruit steruję kątem wychylenia serwa. Jak na razie udało mi się sterować jednym serwem tak jak chciałem.

Natomiast kompletnie nie mam pojęcia jak sterować kilkoma serwami jednocześnie tak by robot wykonywał konkretny zaplanowany ruch. Czytałem bardzo dużo w internecie i jedynym artykułem który jest w miarę dla mnie zrozumiały jest to: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview , ale nie mam wiedzy jak to zastosować u siebie w konstrukcji. Czy byłby ktoś w stanie mi z tym pomóc?

Drugą bardzo istotną rzeczą jest szybkość poruszania się tych serw. Ale tutaj też nie wiem z jakiego rozwiązania miałbym skorzystać, tak by sterować szybkością działania serw. Ponieważ jest wiele artykułów na temat Arduino, ale nikt nie piszę o ESP32. Czy ktoś wie jak rozwiązać także problem szybkości poruszania się serw?

 

 

Edytowano przez Krystian1456
Link to post
Share on other sites
1 godzinę temu, Krystian1456 napisał:

jest wiele artykułów na temat Arduino, ale nikt nie piszę o ESP32

Biblioteka Adafruit działa dokładnie tak samo na Arduino, jak i na ESP32.

Link to post
Share on other sites

Jeśli programujesz w Arduino IDE to funkcję są praktycznie te same dla każdej płytki (w końcu po to jest Arduino IDE żeby się dało tak samo wszystko programować). Tyle, że to trochę bez sensu - masz na pokładzie FreeRTOS-a na dwurdzeniowym procku, a bawisz się z millis() jak na AVR-ach. Owszem, można programować ESP32 tak samo jak Arduino, ale w takiej sytuacji nie wykorzystujesz większości możliwości układu (choćby prawdziwego, a nie przyszywanego multitaskingu).

No - ale to wyższa szkoła jazdy, na razie pisz najprościej jak się da, bo wszystkiego na raz się przecież nie nauczysz.

 

  • Lubię! 2
Link to post
Share on other sites

Niestety wydawało mi się że znalazłem dobre artykułu odnośnie sterowaniem szybkością serw, ale niestety jest tam użyta funkcja delay(), która nie pomaga jeżeli chodzi o poruszanie kilkoma serwami jednocześnie z innymi prędkościami. Czy jest ktoś, kto byłby mi w stanie wytłumaczyć jak należy rozwiązać problem ze sterowaniem szybkością zmiany kąta serw? nie używając funkcji delay(), albo podesłać artykuły gdzie łopatologicznie jest to wytłumaczone?, ponieważ nie jestem w stanie sam rozwiązać tego problemu.

Link to post
Share on other sites
3 minuty temu, Krystian1456 napisał:

nie używając funkcji delay()

A dlaczego niby? To nie Arduino z osmiobitowym rachitycznym procesorkiem, tylko porządny 32-bitowy procek z dwoma rdzeniami i wbudowanym schedulerem rodem z freeRTOS-a. Tutaj "delay" oznacza "ja teraz poczekam, a inne zadania niech się w tym czasie wykonują, proszę mnie obudzić za ileś tam milisekund". Jeśli każde serwo czy choćby każda noga będzie na oddzielnym tasku - to wręcz musisz wywołać delay[1] aby pozwolić innym serwom/nogom się ruszać.

No, ale wybacz: jeśli jesteś - jak sam piszesz - zielony w tych sprawach to uprzedzam: temat nie jest do opanowania w ciągu kilku dni (chyba że znasz bardzo dobrze C/C++ i zetknąłeś się już z programowaniem równoległych procesów).

No, ale nie zrażaj się, próbuj, może coś wyjdzie!

---

[1] w ESP32/Arduino funkcja delay wywołuje po prostu vTaskDelay z odpowiednim parametrem, a ponieważ stała portTICK_PERIOD_MS wynosi tu 1 - nie ma problemu z przeliczaniem milisekund na ticki schedulera. To tak jakby ktoś miał coś przeciwko 🙂

  • Lubię! 1
Link to post
Share on other sites

@ethanak Rozumiem, w zasadzie faktycznie tak jak mówisz działa to trochę inaczej niż na AVR'ach. Niestety dzieje się bardzo dziwna rzecz. 

Mianowicie próbuję zrobić przykład jak z tego linku: https://forum.arduino.cc/index.php?topic=6381.0

Tutaj zwiększając lub zmniejszając delay() serwo powinno poruszać się szybciej albo wolniej. Natomiast w moim przypadku wygląda to tak, jakby cała pętla 'for' wykonała się od razu, milisekundy z funkcji delay() zsumowały się, a cały ruch wykonał się po zsumowanym czasie. Czyli finalnie program czeka kilka sekund i dopiero wykonuję cały ruch. 

W jaki sposób powinienem to zrobić inaczej, tak żeby serwo poruszało się płynnie wolniej lub szybciej? A nie czekało kilka sekund więcej, lub mniej na wykonanie całego ruchu?

 

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.