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:
Serwa robota łączymy w następujący sposób:
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; } }