• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ramię robota sterowane bezprzewodowo padem PS3
#1
Witam,

Próbuję zrobić robota, który sterowany jest bezprzewodowo padem od PS3. Jak na razie pad bezproblemowo komunikuje się z kontrolerem, servomechanizmy działają, ale problem leży w tym, że kod, który mam powoduje to, że gdy steruję gałkami pada i puszczę gałkę to silnik wraca do zerowej pozycji ( tak jak w sterowaniu samochodem koła powracaja do pozycji prostej). Czy da się tak zmodyfikować poniższy kod, a by silniki nie powracały do pozycji zerowej wraz z puszczeniem gałki kontrolera PS3?

Kod:

Kod:
#include <PS3BT.h>                                                   
#include <Servo.h>

USB Usb;
BTD Btd(&Usb);
PS3BT PS3(&Btd); 

Servo servo1;                                                         
Servo servo2;

void setup() {
  Serial.begin(115200);                                              
  if (Usb.Init() == -1) {                                            
    Serial.print(F("\r\nOSC did not start"));
    while(1); //halt
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));              
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  servo1.attach(5);                                                  
  servo2.attach(3);                                                  
void loop() 
{
  Usb.Task();

  if(PS3.PS3Connected || PS3.PS3NavigationConnected) {
    
    servo1.write(map(PS3.getAnalogHat(RightHatX), 0, 255, 0, 255));
    servo2.write(map(PS3.getAnalogHat(LeftHatY), 0, 255, 180, 0 ));
  }
  
    
    if(PS3.getButtonClick(PS)) {
      PS3.disconnect();
   }
}
 
Odpowiedź
#2
Witam 
Twój kod odczytuje na bieżąco w pętli loop() stan wychyleń manipulatorów i w funkcji map dostosowuje te wychylenia do kąta obrotu serwomechanizmów ramienia robota.
Jeśli puścisz manipulator, to po prostu wraca on do pozycji spoczynkowej, zatem to jego stan się zmienia.... a kod "podąża" za manipulatorem.
Cóż pewnie taka jest budowa pada i tego chyba nie da się zmienić. Jest tam pewnie mechanizm "samopowrotu".
Jak to ograć? Może samemu zrobić manipulatory w oparciu o zwykłe potencjometry obrotowe lub suwakowe (wartość dowolna pomiędzy 1 a 47 kOhm) Koniecznie liniowe (A).
Pozdrawiam
 
Odpowiedź
#3
Moim zdaniem da się to zrobić. Oto przykład:

https://www.youtube.com/watch?v=lU20muLyJDY
 
Odpowiedź
#4
Witam
No fakt... zamieszczony filmik nie dawał mi spokoju...
Nie znam bliżej budowy takiego pada ale podejrzewam, że jego manipulatory są mocno jeśli nie całkiem podobne do zwykłych joysticków, które można nabyć już za poniżej 10 zł.
Więc mamy do czynienia z proporcjonalna regulacją napięcia  jego odczytem na wejściu Analogowym.
Jak to ograć? Widzę, że serwo poprzez swoją bezwładność de facto nie nadąża za manipulatorem... i ten fakt mozna chyba wykorzystać. 
Trzeba doświadczalnie wypróbować taki schemat:
Najpierw należy oblukać jakie wartości zwraca manipulator w funkcji np.
PS3.getAnalogHat(RightHatX) ... gdy jest w pozycji spoczynkowej. 
Np. dla X to wartości pomiędzy 0-10 a dla Y 0-15 (teoretycznie, bo trzeba to zmierzyć i dodać jakąś tolerancję )
Czyli ustalamy sobie jakieś Xmax i Ymax... dla położeń spoczynkowych.
Potem modyfikujemy fragment kodu:
Kod:
Xmax=10; Ymax=15;
if(PS3.PS3Connected || PS3.PS3NavigationConnected) {
   int x= PS3.getAnalogHat(RightHatX);
   int y= PS3.getAnalogHat(LeftHatY);
   if(x>=Xmax) servo1.write(map(x, 0, 255, 0, 255));
   if(y>=Ymax) servo2.write(map(y, 0, 255, 180, 0 ));
 }

... teoretycznie powinno działać... jeśli wystarczająco szybko będziesz puszczał manetkę manipulatora.... to serwo nie będzie miało szansy podążać za nią :-) W razie czego zawsze można całość opóźnić dając tam np delay(10); :-)
To tak na szybko moje durne, teoretyczne przemyślenia :-)
Pozdrawiam
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości