Robotická ruka ovládaná Joystickmi

lukas700602
Příspěvky: 22
Registrován: 10 úno 2019, 22:17
Reputation: 0

Robotická ruka ovládaná Joystickmi

Příspěvek od lukas700602 » 12 úno 2019, 19:46

Zdravím . Rád by som si vypočul názor na svoj projekt ohľadom môjho kódu pre ovládanie servo motorov v robotickej ruke pomocou joystickov . Za akékoľvek postrehy alebo opravy či dodatky ku kódu vopred ďakujem
kód :

Kód: Vybrat vše

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

//digital
const int SwitchPin1 = 10;
const int SwitchPin2 = 11;
//analog
const int XPin1 = A0;
const int YPin1 = A1;
const int XPin2 = A2;
const int YPin2 = A3;
//digital
const int button1 = 12; //Buttons
const int button2 = 13;

int button1Presses = 0;
boolean button2Pressed = false;

int x1Value = analogRead(XPin1);                //joystick value read
int y1Value = analogRead(YPin1);
int x2Value = analogRead(XPin2);
int y2Value = analogRead(YPin2);
int switchValue = digitalRead(SwitchPin1);

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);
  servo1.attach(5);
  servo1.attach(6);
  servo1.attach(7);

  pinMode(button1, INPUT);
  pinMode(button2, INPUT);

  Serial.begin(9600);

  digitalWrite(SwitchPin1, HIGH);
  digitalWrite(SwitchPin2, HIGH);
}




void loop() {
  int xValue1 = analogRead(XPin1);
  int xValue1Angle = map(xValue1, 0, 512, 0, 528);
  int yValue1 = analogRead(YPin1);
  int yValue1Angle = map(yValue1, 0, 1022, 0, 528);
  int xValue2 = analogRead(XPin2);
  int xValue2Angle = map(xValue2, 0, 512, 0, 528);
  int yValue2 = analogRead(YPin2);
  int yValue2Angle = map(yValue2, 0, 1022, 0, 528);
  int switchValue = digitalRead(SwitchPin1);
  
  servo1.write(xValue1Angle);
  servo2.write(yValue1Angle);
  servo3.write(xValue2Angle);
  servo4.write(yValue2Angle);

  if(digitalRead(button1) == HIGH){
    button1Presses++;
    switch(button1Presses){
      case 1:
        servo1PosSaves[0] = xValue1Angle;
        servo2PosSaves[0] = yValue1Angle;
        servo3PosSaves[0] = xValue2Angle;
        servo4PosSaves[0] = yValue2Angle;
        Serial.println("Pos 1 Saved");
        break;
      case 2:
        servo1PosSaves[1] = xValue1Angle;
        servo2PosSaves[1] = yValue1Angle;
        servo3PosSaves[1] = xValue2Angle;
        servo4PosSaves[1] = yValue2Angle;
        Serial.println("Pos 2 Saved");
        break;
      case 3:
        servo1PosSaves[2] = xValue1Angle;
        servo2PosSaves[2] = yValue1Angle;
        servo3PosSaves[2] = xValue2Angle;
        servo4PosSaves[2] = yValue2Angle;
        Serial.println("Pos 3 Saved");
        break;
      case 4:
        servo1PosSaves[3] = xValue1Angle;
        servo2PosSaves[3] = yValue1Angle;
        servo3PosSaves[3] = xValue2Angle;
        servo4PosSaves[3] = yValue2Angle;
        Serial.println("Pos 4 Saved");
        break;
      case 5:
        servo1PosSaves[4] = xValue1Angle;
        servo2PosSaves[4] = yValue1Angle;
        servo3PosSaves[4] = xValue2Angle;
        servo4PosSaves[4] = yValue2Angle;
        Serial.println("Pos 5 Saved");
        break;
  }
 }
  if(digitalRead(button2) == HIGH){
    button2Pressed = true;
  }

  if(button2Pressed){
    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(" Uhly Joysticku: ");
      Serial.println(servo1PosSaves[i]);
      Serial.println(servo2PosSaves[i]);
      Serial.println(servo3PosSaves[i]);
      Serial.println(servo4PosSaves[i]);
      delay(1050);
    }
  }
  delay(300);
}

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od jankop » 12 úno 2019, 21:51

Většina kódu je jednoduše uchopitelná, ale klidně jsi mohl v komentářích nebo tady popsat, jak si představuješ, že to bude fungovat.
Dle mého názoru je jakýkoliv program, který má pracovat v reálném čase a má v hlavní smyčce příkaz delay(), nedotažený a nemůže rozumně fungovat a hlavně nemůže být rozvíjen. Přitom stačí tak málo... například třeba "dýchání LED pásku", blbej název, ale řešení tam najdeš

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od jankop » 13 úno 2019, 11:41

Ještě doplním:

Toto je zbytečné - není v programu vůbec použito

Kód: Vybrat vše

int x1Value = analogRead(XPin1);                //joystick value read
int y1Value = analogRead(YPin1);
int x2Value = analogRead(XPin2);
int y2Value = analogRead(YPin2);
int switchValue = digitalRead(SwitchPin1);
SwitchPin1 používáš jako vstup i výstup

Kód: Vybrat vše

int switchValue = digitalRead(SwitchPin1);
digitalWrite(SwitchPin2, HIGH);
ale nikde nevidím pinMode(SwitchPin1, ...);
To platí i pro ostatní I/O. Řekl bych, že je dobrým zvykem vstup/výstup jasně definovat.

Nerozumím tomuhle mapování

Kód: Vybrat vše

int xValue1 = analogRead(XPin1);
  int xValue1Angle = map(xValue1, 0, 512, 0, 528);
  int yValue1 = analogRead(YPin1);
  int yValue1Angle = map(yValue1, 0, 1022, 0, 528);
  int xValue2 = analogRead(XPin2);
  int xValue2Angle = map(xValue2, 0, 512, 0, 528);
  int yValue2 = analogRead(YPin2);
  int yValue2Angle = map(yValue2, 0, 1022, 0, 528);
Myslel jsem si, že rozsah pro pozici serva je 0-180úhlových stupňů nebo cca 900 - 2100us. Ty tvoje hodnoty jsou podle mě úplně mimo.

Řekl bych, že ošetření tlačítka button1Presses v příkazu case je nedostatečné a bude dělat problémy.

Kód: Vybrat vše

 if(digitalRead(button1) == HIGH){
    button1Presses++;
    switch(button1Presses){
      case 1:
Když jsem u těch tlačítek, opravdu jsou při stisku v úrovni HIGH? Mimochodem zápis if(digitalRead(button1) == HIGH) lze pohodlně nahradit zápisem if(digitalRead(button1)).
Nějak se mi nezdá skutečnost, že button1Presses se při stisku tlačítka inkrementuje, ale nikdy se pak již nenuluje. To mi nějak nesedí. Je to opravdu správně?

lukas700602
Příspěvky: 22
Registrován: 10 úno 2019, 22:17
Reputation: 0

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od lukas700602 » 13 úno 2019, 18:24

Program má pracovať aj na bázy pamätania si pohybov ,Preto tá deklarácia a mapovanie . Joystick tieto hodnoty skutočne má nevidím dôvod prečo by s nimi servo nevedelo pracovať . Ako inak by si ošetril tlačidlo ?

lukas700602
Příspěvky: 22
Registrován: 10 úno 2019, 22:17
Reputation: 0

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od lukas700602 » 13 úno 2019, 18:28

Tak nakoniec si mal predsa len pravdu , hodnoty z joysticku musím nejako prekonvertovat na hodnoty vhodne pre servo . Nejaky napad by ste nemali ako ?

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od jankop » 13 úno 2019, 18:48

To je samozřejmě velmi jednoduché. Stačí si zjistit a poznamenat, jaké hodnoty ti čte Arduino v krajních polohách všech os joystiku.
min x1 = .. max x1 = ..
min x2= .. max x2 = ..
... ......
min y2=.. max y2 ..

Pak bys měl ověřit podle typu serv jaký mají rozsah pohybu, abys je neurval. Jedním z parametrů, který můžeš při jejich aktivaci zadat jsou totiž mezní polohy, to vřele doporučuji. Pak si zvolíš co budeš používat, mikrosekundy nebo úhel(je to asi úplně jedno) a podle těchto údajů prostě nastavíš parametry pro to mapování, které už v programu máš.

A co se týče tohohle

Kód: Vybrat vše

int x1Value = analogRead(XPin1);                //joystick value read
int y1Value = analogRead(YPin1);
int x2Value = analogRead(XPin2);
int y2Value = analogRead(YPin2);
int switchValue = digitalRead(SwitchPin1);
Ať si to má pamatovat co chce, tak to prostě v programu není použito. Dostáváš se dokonce do situace, že máš deklarovanou globální proměnou int switchValue a současně v loop() lokální proměnou int switchValue. To nemluvím o faktu, že definovat proměnné pomocí funkce analogRead() předtím, než definuješ V/V je cesta do pekel.
Naposledy upravil(a) jankop dne 13 úno 2019, 18:56, celkem upraveno 1 x.

lukas700602
Příspěvky: 22
Registrován: 10 úno 2019, 22:17
Reputation: 0

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od lukas700602 » 13 úno 2019, 18:52

Akým spôsobom dokážem zadať medzné polohy ? Servá majú 60 stupňové otočenie.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od jankop » 13 úno 2019, 18:59

Tos neřekl, že máš speciální serva. Běžná serva mají rozsah cca 0 - 180 stupňů tj. cca 900 - 2100 us.

lukas700602
Příspěvky: 22
Registrován: 10 úno 2019, 22:17
Reputation: 0

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od lukas700602 » 13 úno 2019, 19:02

maximálne , minimálne polohy mám zadefinované

Kód: Vybrat vše

#define min x1Value = 20
#define max x1Value = 1000
#define min y1Value = 20
#define max y1Value = 1000
#define min x2Value = 20
#define max x2Value = 1000
#define min y2Value = 20
#define max y2Value = 1000
Len nejako mi nedochádza ako ich dokážem zakomponovať do môjho mapovania.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Robotická ruka ovládaná Joystickmi

Příspěvek od jankop » 13 úno 2019, 19:03

lukas700602 píše:
13 úno 2019, 18:52
Akým spôsobom dokážem zadať medzné polohy ? Servá majú 60 stupňové otočenie.
Nedokážeš si najít popis defaultní knihovny servo?
https://www.arduino.cc/en/Reference/ServoAttach

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 17 hostů