Sterowanie ramieniem robota za pomocą joystick Arduino

Sterowanie ramieniem robota za pomocą joystick Arduino

Zobacz w jaki sposób możesz sterować wychyleniami ramienia robota za pomocą joysticka analogowego lub potencjometrów.

Aby sterować ramieniem robota opartym o arduino  łączymy Joystick do wejść analogowych na płytce nano shield według poniższego schematu:

Sterowanie ramieniem robota za pomocą joystick Arduino

Serwa robota łączymy w następujący sposób:

sterowanie serwo arduino joystick

Ramię robota do samodzielnego montażu jest to idealny model edukacyjny dla osób wchodzących w świat robotyki

KUP TERAZ

 

Sugerujemy aby serwa podłączyć w następującej kolejności:

  • Szczypce wejście 8
  • Dolne serwo odpowiedzialne za obrót wejście 9
  • Serwo sterujące do przodu i tylu (serwo po prawej stronie parząc od tyłu robota) wejście 10
  • Serwo podnoszące ramię do góry i dołu (serwo po lewej stronie patrząc od tyłu robota) wejście 11

Poniżej kod ARDUINO:

#include <Servo.h>

Servo Serwo_szczypce;
Servo Serwo_obracanie;
Servo Serwo_przod_tyl;
Servo Serwo_gora_dol;

int PotencjometrX;
int PotencjometrY;
int PotencjometrPrzycisk;
int mapX;
int mapY;

int opoznienie=10;

void setup() {
 
  Serial.begin(9600);
  Serwo_szczypce.attach(8); // Podpisnamy serwo szczypce do portu 8
  Serwo_obracanie.attach(9); //Podpisnamy dolne serwo (obracanie) do portu 9
  Serwo_przod_tyl.attach(10); // Podpinamy serwo przod/tyl (serwo po prawej stronie patrząc od tyłu robota) do portu 10
  Serwo_gora_dol.attach(11); // Podpinamy serwo gora/dol (serwo po lewej stronie) po portu 11
  ZamknijSzczypce(); // Wysolujemy funkcję zamknij szczypce
 }

void loop() {
  // Podpinamy kable zasilające potencjomentru odpowiednio do GND i +5V na płytce
  PotencjometrX=analogRead(2); // Czytamy podpięty kabel VRX od potencjometru z wejścia A2 (PIN S - sygnał)
  PotencjometrY=analogRead(1); // Czytamy podpięty kabel VRY od potencjometru do wejścia A1 (PIN S - sygnał)
  PotencjometrPrzycisk=analogRead(0); // Podpinamy Kabel SW do wejścia A0 (PIN S -sygnał) 
  if (PotencjometrPrzycisk==0) {ZamknijSzczypce();} // Gdy naciśniety jest przycisk uruchom funkcję zamknij szczypce
  mapX=map(PotencjometrX,0,1020,0,180); // Przeliczamy wartości z potencjometru na skalę dopuszczalną dla serwa 0-180 stopni
  mapY=map(PotencjometrY,0,1020,0,180); // Przeliczamy wartości z potencjometru na skalę dopuszczalną dla serwa 0-180 stopni
  Serial.println("X="+String(mapX)+" Y="+String(mapY)+" przycisk="+String(PotencjometrPrzycisk)); // Wysyłamy przeliczone wartości na monitor portu szeregowego aby zobaczyć je na komputerze
  ustawPozycjeSerwa(Serwo_obracanie,mapX,opoznienie); // wywołujemy funkcje do obracania serwem z parametrami z potencjometru
  ustawPozycjeSerwa(Serwo_gora_dol,mapY,opoznienie);
  ustawPozycjeSerwa(Serwo_przod_tyl,mapY,opoznienie);
 }

//// funkcje ///

void ZamknijSzczypce(){
   Serwo_szczypce.write(180); // Ustawiamy na serwie szczypiec wartość 180 aby je zamknąć
  }

// Poniższa funkcja zmienia położenie przekazanego do funkcji serwa do zadanej wartości  
void ustawPozycjeSerwa(Servo serwo,int pozycja_docelowa, int opoznienie) {

    if (serwo.read()==pozycja_docelowa){ // Jeżeli położenie serwo jest równe docelowemu - wychodzimy z funkcji
      return;
    }
    if (serwo.read()<pozycja_docelowa){ // Jeżeli położenie serwo jest mniejsze od docelowego , zwiększamy je o 1 aż do osiągnięcia celu
        while (serwo.read()<pozycja_docelowa){
          serwo.write(serwo.read()+1);
          delay(opoznienie);
      }
        return;
      }

      if (serwo.read()>pozycja_docelowa){ // Jeżeli położenie serwo jest większe od docelowego , zmniejszamy je o 1 aż do osiągnięcia celu
        while (serwo.read()>pozycja_docelowa){
          serwo.write(serwo.read()-1);
          delay(opoznienie);
      }
        return;
      }
    }