Skocz do zawartości

Sterowanie serwami przez arduino za pomocą pololu maestro servo controller


Kajeloki

Pomocna odpowiedź

Witam. Ostatnio razem z kilkoma kolegami pracujemy nad projektem ramienia robotycznego. Pod względem sprzętowym -ramie jest już gotowe. Niestety ze strony programowej jest trochę (a nawet o wiele) gorzej. Otóż kod przeze mnie napisany jakby nie powoduje komunikacji pomiędzy arduino a pololu maestro. Zaznaczam, że wgrałem bibliotekę pololu, odwiedziłem kilkanaście stron o pololu i kodzie do sterowania serwami z arduino i nic to nie dało. Serwa są dobrze podłączone bo sprawdzałem za pomocą maestro servo control (program do pololu maestro servo controller) i wszystko ładnie działało. Jeśli ktoś ma jakieś doświadczenie z pololu, mógłby się za mną podzielić? Potrzebuje tego kodu na środę - 08.11.2017

Link do komentarza
Share on other sites

Używałem tego kontrolera do mojego pierwszego robota. Z tego co pamiętam, to komunikacja z kontrolerem jest po serialu. Nic nie napisałeś na temat tego jak masz ten kontroler podłączony do Arduino, jakie komendy wysyłasz, jakie dostajesz odpowiedzi, itd. Możesz zamieścić jakiś minimalny przykład kodu, który ci nie działa oraz schemat połączeń? Bo z tego, co opisałeś na razie trudno cokolwiek wywnioskować.

Link do komentarza
Share on other sites

Oto mój kod :

#include <SoftwareSerial.h>
#include <PololuMaestro.h>



MicroMaestro maestro(Serial1);

SoftwareSerial mySerial(8, 9);

void setup() 
{
  // Set the serial port's baud rate.
  Serial1.begin(9600);
  Serial.begin(57600);
 while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB port only
 }


 Serial.println("Goodnight moon!");

 // set the data rate for the SoftwareSerial port
 mySerial.begin(4800);
 mySerial.println("Hello, world?");

}

void loop() 
{
 if (mySerial.available()) {
   Serial.write(mySerial.read());
 }
 if (Serial.available()) {
   mySerial.write(Serial.read());
 }

 maestro.setSpeed(1, 20);
 maestro.setAcceleration(1, 0);
  // Set the target of channel 0 to 1500 us and channel 1 to 1750 us.

 maestro.setTarget(1, 2000);
 maestro.getPosition(1, 2000);

 // Wait 2 seconds.
 delay(2000);

 // Set the target of channel 0 to 1250 us and channel 1 to 2000 us.

 maestro.setTarget(1, 7000);

 // Wait 2 seconds.
 delay(2000);
}

Korzystam z Arduino Pro Micro i Pololou Maestro Micro 6, w zamierzeniu jest sterowanie serwami za pomocą aplikacji na telefon łączącej się przez moduł bt z arduino, a arduino połączone pinami TX i RX do Pololu RX i TX

Link do komentarza
Share on other sites

No dobra, bardzo ładnie, ale nie możesz na początek dla testu napisać prostszego programu, który tylko rusza którymś serwem i nie używa trzech różnych portów szeregowych? Tak żeby sprawdzić co nie działa.

Masz w ustawieniach swojego Maestro takie same parametry transmisji?

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

Ok. Zrobiłem tak jak powiedziałeś. Załadowałem przykładowy kod do sterowania serwem i podpiąłem zasilanie. Nic się nie działo. Zmieniłem parametry xxx (maestro.setTarget(1, xxx)) na inne (z zakresu 550 - 2500, ponieważ taki zakres jest ustawiony na Pololu) i serwo się ruszyło, ale tylko raz i nic więcej. Jakbyś mógł to weź mi wytłumacz jak to jest z tym "maestro.setTarget(x, y)" , co do "x" to wiem, że jest to numer kanału, a "y"? Jest to ta sama wartość co w Maestro Controll Center "Target"?

#include <PololuMaestro.h>


MicroMaestro maestro(Serial);


void setup()
{

 Serial.begin(9600);
}

void loop()
{

 maestro.setSpeed(1, 0);


 maestro.setAcceleration(1, 0);


 maestro.setTarget(1, 6000);
 delay(2000);


 maestro.setSpeed(1, 10);
 maestro.setAcceleration(1,127);


 maestro.setTarget(1, 7000);
 delay(2000);


 maestro.setSpeed(1, 20);
 maestro.setAcceleration(1,5);


 maestro.setTarget(1, 5000);
 delay(2000);
}
Link do komentarza
Share on other sites

https://github.com/pololu/maestro-arduino/blob/master/PololuMaestro.h#L59-L76

Czyli target to długość impulsu, jaka ma być wysłana do serwa, w jednostkach 1/4 µs. Ponieważ większość serw ma środek na 1500µs, to 6000 ustawi ci je na środek.

Jaką masz ustawioną prędkość transmisji, bity parzystości, bity stopu, etc.?

[ Dodano: 05-11-2017, 14:35 ]

Chodzi mi o te ustawienia: https://www.pololu.com/docs/0J40/5.a

Link do komentarza
Share on other sites

Ok sprawdziłem wszystko. Baud mam na 9600, resztę tak samo jak na screenie. Zmodyfikowałem program, podłączyłem zasilanie i serwo wykonało jeden ruch - wycentrowało swoją pozycję (1500u).

#include <PololuMaestro.h>


MicroMaestro maestro(Serial);


void setup()
{

 Serial.begin(9600);
}

void loop()
{

 maestro.setSpeed(1, 0);


 maestro.setAcceleration(1, 0);


 maestro.setTarget(1, 6000);
 delay(2000);





 maestro.setTarget(1, 2200);
 delay(2000);





 maestro.setTarget(1, 8000);
 delay(2000);
}
Link do komentarza
Share on other sites

Nie przypominam sobie. A gdzie dokładnie ten numer się zmienia? To jest ten "Device number" w "Maestro Control Center" czy o coś innego ci chodzi? Jeśli chodzi o ustawienia domyślne to w "Pololu Maestro User's Guide" jest napisane, że "Device number" wynosi 12.

Link do komentarza
Share on other sites

Dobra, mój błąd. Jak podasz device number, to używa innego protokołu, jak nie podasz, to używa tego, który obsługuje tylko 1 urządzenie. Swoją drogą spróbować można.

Czego ja bym jeszcze spróbował, to odczytanie pozycji serwa -- przynajmniej się przekonasz, czy komunikacja działa.

Link do komentarza
Share on other sites

A może mógłbyś mi napisać jakiś prosty kod np na obracanie serwa od jednej skrajnej pozycji do drugiej? Serwo jest podłączone pod kanał 1 i w Pololu Maestro Control Center jego wartości graniczne to 550 - 2500. Bo ogólnie to potrzebuje kodu do sterowania serwami przez bt za pomocą suwaków, a to jest tylko po to by sprawdzić czy wszystko działa poprawnie i się trochę ogarnąć co i jak, żeby później jakiejś gafy w kodzie nie popełnić.

[ Dodano: 05-11-2017, 20:33 ]

Ok kod działa 😃 Przerzuciłem się z micro na uno i zadziałało. Coś jest nie tak z UART na micro i dla tego nie działało.

Jeszcze pytanko. Wiesz może jak się piszę kod właśnie pod takie suwaki? Chodzi mi o to, żeby wartość, która jest wyznaczona przez suwak była przesyłana do arduino, przypisywana do danego elementu (jednego z serw), przesyłana dalej do pololu i wczytywana jako "target" dla danego serwa. Jakbyś mógł przesłać jakiś przykładowy kod z wytłumaczeniem co jest od czego lub jakiś link do strony z takim czymś to byłbym wdzięczny.

Link do komentarza
Share on other sites

A może mógłbyś mi napisać jakiś prosty kod np na obracanie serwa od jednej skrajnej pozycji do drugiej? Serwo jest podłączone pod kanał 1 i w Pololu Maestro Control Center jego wartości graniczne to 550 - 2500. Bo ogólnie to potrzebuje kodu do sterowania serwami przez bt za pomocą suwaków, a to jest tylko po to by sprawdzić czy wszystko działa poprawnie i się trochę ogarnąć co i jak, żeby później jakiejś gafy w kodzie nie popełnić.

[ Dodano: 05-11-2017, 20:33 ]

Ok kod działa 😃 Przerzuciłem się z micro na uno i zadziałało. Coś jest nie tak z UART na micro i dla tego nie działało.

Jeszcze pytanko. Wiesz może jak się piszę kod właśnie pod takie suwaki? Chodzi mi o to, żeby wartość, która jest wyznaczona przez suwak była przesyłana do arduino, przypisywana do danego elementu (jednego z serw), przesyłana dalej do pololu i wczytywana jako "target" dla danego serwa. Jakbyś mógł przesłać jakiś przykładowy kod z wytłumaczeniem co jest od czego lub jakiś link do strony z takim czymś to byłbym wdzięczny.

Ale to ma być kod na komputer, czy na smartfona? Bo jak na komputer to mogę pomóc.

Link do komentarza
Share on other sites

Ok jest nowa sprawa. Otóż podczas testów z wykorzystaniem pololu nastąpiło zwarcie i pololu poszło się bujać (a przynajmniej jakaś jego część, w każdym bądź razie nie działa poprawnie), więc przerzuciłem się bezpośrednio na arduino. Przy tym korzystałem z pomocy jakiejś osoby która bardziej się na tym zna niż ja. Potwierdziła moją wersję z uszkodzonym pololu i pomogła mi przy kontrolowaniu serw z arduino. No i tutaj pojawił się problem. Na początku po podłączeniu serwa analogowego i wgraniu do arduino prostego przykładowego kodu wszystko ładnie działało. Niestety w przypadku serw cyfrowych nie było już tak kolorowo. Obydwa serwa (zarówno to które było podpięte pod pololu w momencie zwarcia, jak i to które nie było podpięte) zachowywały się jakoś dziwnie. Otóż nie reagowały wcale na kod, tylko w środku coś tykało. Później jakimś cudem zaskoczyły i normalnie działały. Na drugi dzień złożyliśmy z kolegami ramię i podłączyliśmy zasilanie. Efekt był taki jak tuż po awarii - serwo analogowe działą a cyfrowe tylko tykają w środku. Wiecie może, co jest prawdopodobną przyczyną takiego zachowania i czy to tykanie może oznaczać coś poważnego (np uszkodzenie serwa)? Tutaj wstawiam link do serw cyfrowych:https://botland.com.pl/serwa-typu-standard/9167-serwo-feetech-fr0115m-standard.html

A na dole wstawiłem jeszcze załącznik do schematu.

2091333197_schematramienia.thumb.png.955b38f0764db47f8496c884e0818297.png

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.