Skocz do zawartości

Dziwne zachowanie - 3 arduino pro mini oraz 18 serw


Andulval

Pomocna odpowiedź

Witam wszystkich, nazywam się Michał.

Od razu zaznaczam że jestem początkującym w tematyce elektroniki i arduino.

Chcę zrobić robota-pająka, który ma 6 nóg, po 3 serwa na każdą, który ma być sterowany 3 płytkami arduino pro mini [ATMEGA168 5V 16MHz] (każda z nich ma 6 wyjść PWN, wieć steruje po dwie nogi robota).

serwa zasilane są z zasilacza 12v 3.33A, obniżone napiecie przez przewornice step-down, natomiast wszystkie arduina są zasilane z jednego źródła jakim jest zasilacz 5V. Wszystkie uziemienia są połaczone.

Przed połączeniem wszystkiego sprawdziłem osobno działanie poszczególnych elementów.

Jednak problem zaczął się gdy podpiąłem wszystko - wtedy nogi 'wyginają się' w nienaturalny sposób - serwa chcą wyjść poza zakres 180 stopni (serwa maja zakres pracy 0-180 stopni) i co ciekawe wszystkie w tą samą stronę.

Jeśli podepne po 3 piny PWN do kazdego z arduino wtedy działa, ale jeśli w trakcie pracy odłacze zasilanie serw i ponownie je podłacze - znowu serwa warjują.

Co do budowy: wyjscia wszystkich serw (vcc, gnd i sygnal sterujący) są bardzo blisko siebie, są ustawione gniazdo przy gnieździe dla zaoszczędzenia miejsca - czy mogą powstać przez to aż takie zakłócenia? a może jest jakaś inna przyczyna?

Z góry dzięki za odpowiedź.

Link do komentarza
Share on other sites

Jakie to serwa dokładnie?

Możesz pokazać jakiś minimalny kod, który demonstruje problem (a który da się uruchomić i sprawdzić)?

Wiesz, że 18 serw możesz spokojnie wysterować jednym Pro Mini?

[ Dodano: 26-07-2016, 11:21 ]

Zakładam, że nie dysponujesz żadnym oscyloskopem, analizatorem logiki albo choćby multimetrem z pomiarem częstotliwości?

[ Dodano: 26-07-2016, 11:24 ]

Jeszcze jedno. Weź multimetr i zmierz napięcie wychodzące z tej przetwornicy w obu przypadkach (kiedy działa i kiedy nie działa). Jaka to przetwornica? Ile prądu może dać?

Link do komentarza
Share on other sites

Dzięki za odpowiedź,

serwami są TowerPro SG90.

Co do wysterowania 18 serwami to wiem że te 6 pinów to sprzętowe generowanie PWN, a pozostałe chyba musiałbym zrobić programowo co stworzy mi - jeśli dobrze rozumiem opóźnienia na które nie wiem czy mogę sobie pozwolić.

niestety nie mam czym zmierzyć częstotliowści.

Przykładowa część programu, w zasadzie obecnie program składa się z takich komend - zmieniam tylko polozenia poszczegolnych serw i daje czas na ich przemieszczenie, np:

serwo2.write(71);

serwo3.write(65);

serwo1.write(125);

serwo5.write(71);

serwo6.write(65);

serwo4.write(55);

delay(100);

serwo2.write(72);

serwo3.write(70);

serwo1.write(120);

serwo5.write(72);

serwo6.write(70);

serwo4.write(60);

delay(100);

serwo2.write(73);

serwo3.write(79);

serwo1.write(115);

serwo5.write(73);

serwo6.write(79);

serwo4.write(65);

delay(100);

Przetwornica step-down LM2596 3,2V-35V 3A (jak wyczytałem na wyjściu max 3A z chlodzeniem)

Napięcie:

gdy działa (podłączone po 3 serwa do kazdego arduino, i nie moge odrazu wszystkich ich załączyć: muszę po chwili kolejne): napiecie leciutko skacze: ~4,86-4,91 V

gdy nie działa (gdy odłacze i podłacze zasilanie serw): 4.67 V

I jeszcze jedno zauważyłem, nie wiem czy istotne: gdy odłącze zasilanie serw (wiec odłącze przetwornice) to napięcie mierzone między jej wyjściowymi zaciskami wynosi 1,78 V

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Link do komentarza
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

No dobra. Nadal nie wiemy czemu dzieje się to, co opisujesz, ale mogę przynajmniej poprawić kilka błędnych założeń, które zrobiłeś.

Biblioteka Servo.h wbudowana w Arduino nie używa sprzętowego PWM i na Pro Mini obsługuje do 12 serw na raz, na dowolnych nóżkach (poza A6 i A7, oczywiście). Działa ona używając sprzętowego timera i ustawiając piny w przerwaniu. Ograniczenie do 12 serw wynika z faktu, że nie jest za dobrze zoptymalizowana oraz z tego, że autorzy starali się tak ją napisać, żeby nie wpływała za bardzo na działanie innych bibliotek, które mógłbyś w tym samym czasie wykorzystywać na tej samej płytce.

Spokojnie możesz uzyskać ten sam efektu używając dwóch płytek Pro Mini -- jednej do sterowania 18 serwami używając lepiej zoptymalizowanego kodu (na przykład takiego jak https://bitbucket.org/thesheep/controller/src ), a drugiej do wykonywania twojego programu i tylko przesyłania pozycji serw. Osobiście robię tak ze wszystkimi nowymi robotami, które buduję i dość dobrze mi się to sprawdza.

Co do problemów z serwami to bardzo mocno podejrzewam zasilanie, a dokładniej spadki napięcia w momencie, kiedy poruszasz wieloma serwami na raz. SG90 potrafi pobierać do 500mA na sztukę, a ty masz ich 18 -- to daje w najgorszym przypadku 9A -- raczej wątpię, żeby twoja przetwornica tyle wyciągnęła.

Możesz spróbować włączać serwa w setup() po kolei -- z niewielkim opóźnieniem pomiędzy nimi. Możesz też spróbować dodać duży kondensator (1000µF albo większy) zaraz za przetwornicą, żeby trochę złagodzić gwałtowne skoki poboru prądu.

  • Lubię! 1
Link do komentarza
Share on other sites

Ok, przyczyną występowania tych dziwnych zachowań był... wadliwy przewód który wychodził z przetwornicy i szedł do zasilania serw. Kabel ten bardzo się grzał. Po wymianie tego przewodu wszystko działa prawidłowo.

Co do tych bibliotek które mi poleciłeś mógłbyś może podać przykładowe wywołanie ruchu serwa na ustawiony kąt? Bo sam nie mogę do tego dojść.

Jeszcze raz dzięki za pomoc w rozwiązaniu problemu.

Link do komentarza
Share on other sites

To, co podlinkowałem działa na I2C, więc wgrywasz to na jedno arduino, łączysz nóżki A4 i A5 z drugim (oraz masy), a na drugim robisz coś w rodzaju:

byte numer_serwa = 6;
unsigned int dlugosc_impulsu = 1500;

Wire.beginTransmission(0x09);
Wire.write(numer_serwa);
Wire.write(dlugosc_impulsu >> 8);
Wire.write(dlugosc_impulsu & 0xff);
Wire.endTransmission();

gdzie długosc_impulsu=1500 to jest środek serwa, a lewe i prawe granice są od około 600µs do 2400µs, zależnie od modelu serwa. Podanie długości impulsu 0 wyłącza dane serwo.

  • Pomogłeś! 1
Link do komentarza
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!

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.