Skocz do zawartości
Celeba

Program sterujący ramieniem manipulacyjnym

Pomocna odpowiedź

Witam, zrobiłem ramię robota manipulacyjnego sterowane za pomocą potencjometrów z pamięcią.

Od razu mówię, że kod nie został napisany przeze mnie, a jedynie dostosowany do własnych potrzeb.

Program działa poprawnie, ramieniem można sterować, po wciśnięciu pierwszego przycisku można zapisywać pozycje, klikając drugi guzik - robot zaczyna wykonywać zapisane ruchy.

I teraz dwa moje pytania:

1. Jak zrobić, żeby serwa ruszały się wolniej?

2. Jak zrobić, żeby np po przytrzymaniu drugiego przycisku dało się znów dowolnie sterować ramieniem? Aktualnie jest tak, że muszę albo zresetować układ przyciskiem reset na arduino albo wyłączyć zasilanie.

//Code written by Ryan Chan; it is pretty inefficient, but gets the job done, I challenge you to make it more efficient!

//*IMPORTANT CHANGES IN VERSION 2: LEDs 4 and 5 have been moved to pins 7 and 8 respectively; Buttons 1 and 2 have been moved to pins 12 and 13 respectively. This is to make wiring easier.

#include <Servo.h>

Servo servo1; //Servos
Servo servo2;
Servo servo3;
Servo servo4;

const int LED1 = 0; //LEDs
const int LED2 = 1;
const int LED3 = 2;
const int LED4 = 12;
const int LED5 = 13;

const int button1 = 4; //Buttons
const int button2 = 6;

int button1Presses = 0; //Button values
boolean button2Pressed = false;

const int pot1 = A2;
const int pot2 = A3; 
const int pot3 = A0; 
const int pot4 = A1; 

int pot1Val; //Potentimeter values
int pot2Val;
int pot3Val;
int pot4Val;
int pot1Angle;
int pot2Angle;
int pot3Angle;
int pot4Angle;

int servo1PosSaves[] = {1,1,1,1,1}; //position saves
int servo2PosSaves[] = {1,1,1,1,1};
int servo3PosSaves[] = {1,1,1,1,1};
int servo4PosSaves[] = {1,1,1,1,1};

void setup() {
  servo1.attach(3); // Set up everything and will run once; attach servos and define the pin modes
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);

  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly: 
  pot1Val = analogRead(pot1); // This will read the values from the potentimeters and store it...
  pot1Angle = map(pot1Val, 0, 1023, 0, 178); // ... and this will map the values from the potentiometers to values the servos can use and store it for later use
  pot2Val = analogRead(pot2); 
  pot2Angle = map(pot2Val, 0, 1023, 0, 178);
  pot3Val = analogRead(pot3);
  pot3Angle = map(pot3Val, 0, 1023, 0, 178);
  pot4Val = analogRead(pot4);
  pot4Angle = map(pot4Val, 0, 1023, 0, 178);
  
  servo1.write(pot1Angle); // These will make the servos move to the mapped angles
  servo2.write(pot2Angle);
  servo3.write(pot3Angle);
  servo4.write(pot4Angle);

  
  if(digitalRead(button1) == LOW){ // This will check how many times button1 is pressed and save the positions to an array depending on how many times it is pressed; switch/case works like a if statement
    button1Presses++;
    switch(button1Presses){
      case 1:
        servo1PosSaves[0] = pot1Angle;
        servo2PosSaves[0] = pot2Angle;
        servo3PosSaves[0] = pot3Angle;
        servo4PosSaves[0] = pot4Angle;
        digitalWrite(LED1, HIGH);
        Serial.println("Pos 1 Saved");
        break;
      case 2:
         servo1PosSaves[1] = pot1Angle;
         servo2PosSaves[1] = pot2Angle;
         servo3PosSaves[1] = pot3Angle;
         servo4PosSaves[1] = pot4Angle;
         digitalWrite(LED2, HIGH);
         Serial.println("Pos 2 Saved");
         break;
      case 3:
         servo1PosSaves[2] = pot1Angle;
         servo2PosSaves[2] = pot2Angle;
         servo3PosSaves[2] = pot3Angle;
         servo4PosSaves[2] = pot4Angle;
         digitalWrite(LED3, HIGH);
         Serial.println("Pos 3 Saved");
         break;
       case 4:
         servo1PosSaves[3] = pot1Angle;
         servo2PosSaves[3] = pot2Angle;
         servo3PosSaves[3] = pot3Angle;
         servo4PosSaves[3] = pot4Angle;
         digitalWrite(LED4, HIGH);
         Serial.println("Pos 4 Saved");
         break;
       case 5:
         servo1PosSaves[4] = pot1Angle;
         servo2PosSaves[4] = pot2Angle;
         servo3PosSaves[4] = pot3Angle;
         servo4PosSaves[4] = pot4Angle;
         digitalWrite(LED5, HIGH);
         Serial.println("Pos 5 Saved");
         break;
    }
  }

  if(digitalRead(button2) == LOW){ // Pretty self-explnatory here
    button2Pressed = true;   
  }
  
  if(button2Pressed){ // if the boolean button2Press is true, then the servos will run though all their saved positions
    for(int i = 0; i < 5; i++){
        servo1.write(servo1PosSaves[i]);
        servo2.write(servo2PosSaves[i]);
        servo3.write(servo3PosSaves[i]);
        servo4.write(servo4PosSaves[i]);
        Serial.println(" potentimeter Angles: ");
        Serial.println(servo1PosSaves[i]);
        Serial.println(servo2PosSaves[i]);
        Serial.println(servo3PosSaves[i]);
        Serial.println(servo4PosSaves[i]);
        delay(1050);
      }
  }
  delay(300);
} 

 

Udostępnij ten post


Link to post
Share on other sites
Dnia 14.03.2020 o 17:52, Celeba napisał:

Jak zrobić, żeby serwa ruszały się wolniej?

https://github.com/netlabtoolkit/VarSpeedServo

Może to ci się przyda. Po prostu zamiast ustawić prędkość docelową to stopniowo do niej dochodzisz z pewną rozdzielczością i interwałem.

Udostępnij ten post


Link to post
Share on other sites

Dzięki bardzo, tego właśnie szukałem 

Udostępnij ten post


Link to post
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!

Gość
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...