INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Servo Steuerung PCA9685 und Joystick
03.03.2020, 17:38 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2020 17:39 von MicroBahner.)
Beitrag #9
RE: Servo Steuerung PCA9685 und Joystick
(03.03.2020 17:22)Timon schrieb:  also die ersten int const variaben habe ich eingesetzt um für den Servocontroller einen verständlichen wert im setup mitzuteilen -> soll bei jedem start/reset eine art home Position bewirken.
Um die ging es mir garnicht - obwohl das auch ziemlich sinnfrei ist. Da kannst Du die Konstanten auch gleich in den pwm.setPWM() -Anwesungen im setup eintragen.

Es geht um die Variablendefinitionen im loop. Die werden bei jedem loop Durchlauf neu angelegt und initiiert. Ist dir der Unterschied zwischen lokalen und globalen Variablen klar?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:21
Beitrag #10
RE: Servo Steuerung PCA9685 und Joystick
So habe jetzt versucht so gut wie es geht alles zu beschreiben

Code:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
//Manche Werte oder variablen kann ich nicht genau zuordnen da ich mehrere Skeches zusammen gewürfelt habe
//Darunter der vereinfachte Sketch für den Servocontroller von ROBOJAX und den Ultraschallsensor sketch von HOWTOMEACHATRONICS

#define SERVOMIN  125                    //Minimaler Wert des Servocontrollers = 0°   Grad am Servo
#define SERVOMAX  575                    //Maximaler Wert des Servocontrollers = 180° Grad am Servo


const int trigPin = 9;                   //Definiere den Ausgangspin des Ultraschallmodules
const int echoPin = 10;                  //Definiere den Eingangspin des Ultraschallmodules

const int beep = 13;                     //Definiere die Pin für den BUZZER
const unsigned long Ontime1 = 200;       //Definierte "AN" zeit des BUZZERS
const unsigned long interval1 = 600;     //Definierte "Aus" zeit des BUZZERS
unsigned long previousMillis1;

long duration;                           //Variable zum errechnen der Distanz
int distance;                            //Variable zum errechnen der Distanz

uint8_t servonum = 0;                    //Aus dem Sketch von Robojax Übernommen

const int buttonone  = 2;                //belegung und definierung der 6 Steuerköpfe(TTP223 Touchknöpfe)
boolean buttononestate;
const int buttontwo  = 3;
boolean buttontwostate;
const int buttonthree = 4;
boolean buttonthreestate;
const int buttonfour = 5;
boolean buttonfourstate;
const int buttonfive = 6;
boolean buttonfivestate;
const int buttonsix  = 8;
boolean buttonsixstate;

void setup() {


  pinMode(trigPin, OUTPUT);          // Setzt den trigPin als Ausgang
  pinMode(echoPin, INPUT);           // Setzt den echoPin als Eingang

  pinMode(buttonone, INPUT);         //TTP223  Schalterknopf für Servo 1 Drehteller
  pinMode(buttontwo, INPUT);         //TTP223 Schalterknopf für Servo 2 Primärer Hauptarm
  pinMode(buttonthree, INPUT);       //TTP223 Schalterknopf für Servo 3 Sekundärer Hauptarm
  pinMode(buttonfour, INPUT);        //TTP223 Schalterknopf für Servo 4 Kopf Drehservo
  pinMode(buttonfive, INPUT);        //TTP223 Schalterknopf für Servo 5 Kopf Neigungsservo
  pinMode(buttonsix, INPUT);         //TTP223 Schalterknopf für Servo 6 Greifzange
  pinMode(beep, OUTPUT);             //Definiert Beep als BUZZER Ausgang

  lcd.init();                        //Iniziere 16x2 LCD mit I2C
  lcd.backlight();                   //Hintergrundbeleuchtung AN


  float Servohomepos1 = 239.5 + 125;    //Homepositionen
  float Servohomepos2 = 356.25 + 125;
  int Servohomepos3 = 475 + 125;
  int Servohomepos4 = 190 + 125;
  float Servohomepos5 = 29.027 + 125;
  float Servohomepos6 = 197.916 + 125;


  Serial.begin(115200);
  Serial.println("6 Axis Robotarm with ServoDriver (PCA9685)");

  pwm.begin();
  pwm.setPWMFreq(60);

  pwm.setPWM(0, 0, Servohomepos1);          //setzt bei jedem start oder reset alle Servos auf die positionen
  pwm.setPWM(1, 0, Servohomepos2);
  pwm.setPWM(2, 0, Servohomepos3);
  pwm.setPWM(3, 0, Servohomepos4);
  pwm.setPWM(4, 0, Servohomepos5);
  pwm.setPWM(5, 0, Servohomepos6);

  yield();
}

void loop() {

  int InkrementalWertx;           //einzelne variablen für die achsen/Servos da ein schlagartiges ändern eines winkels unerwünscht ist
  int InkrementalWerty1;          //das konnte ich noch nicht so richtig umsetzten
  int InkrementalWerty2;
  int InkrementalWerty3;
  int InkrementalWerty4;
  int InkrementalWerty5;
  int inkrementvalue;            //wird dafür benutzt um eine winkelangabe aus den anderen werten abzulesen da diese von 0 auf 180 gemappt wird


  int potiValue = analogRead(A0);   //Potentiometer zur regulierung der Inkrementalwertverändrung
  int VRX = analogRead (A1);        //Joystick X Achse nur für den Drehteller
  int VRY = analogRead (A2);        //Joystick Y Achse für die übrigen Achsen
  int SW  = analogRead (A3);        //Joystick druckknopf Noch frei evtl zur öffnug der Greifzange

  buttononestate = digitalRead(buttonone);
  buttontwostate = digitalRead(buttontwo);
  buttonthreestate = digitalRead(buttonthree);
  buttonfourstate = digitalRead(buttonfour);
  buttonfivestate = digitalRead(buttonfive);
  buttonsixstate = digitalRead(buttonsix);




  //int VRXmap = map(VRXmap, 0, 1023, 125, 600);             //Sinnfrei da diese variable im endeffekt nicht für den Servocontroller gebraucht wird
  //int VRYmap = map(VRYmap, 0, 1023, 125, 600);            
  int speedValue = map(potiValue, 0, 1023, 0, 50);           //Poti für die inkrementalwert veränderung je mehr desto schneller die bewegung
  int degreeValue = map(inkrementvalue, 125, 575,   0, 180); //Mapping um auf dem Display eine gradzahl zu bekommen


  Serial.print(" VRX ");
  Serial.print(VRX);
  Serial.print("|");
  Serial.print(" VRY ");
  Serial.print(VRY);
  Serial.print("| ");
  Serial.println(speedValue);
  Serial.print(" ");
  Serial.print(inkrementvalue);
  Serial.print(" ");


  if (buttononestate == HIGH ) {                       // Wenn Knopf eins (Drehteller) = HIGH dann soll der inkrementalwertx gesetzt werden
    pwm.setPWM(0, 0, InkrementalWertx);                // Mein Konflikt ist dabei das ich Eigentlich vermeiden wollte das ein Sprung auf eine bestimmte Position erfolgt
    if (VRX > 550 && InkrementalWertx < 575) {         // Wenn der Joystick x in eine Richtung bewegt wird UND der inkrementalwert unter 575 ist
      InkrementalWertx += speedValue;
    }
    else {
      InkrementalWertx ==575;                          // kann der wert erhöht werden andernfalls wird der wert auf 575 gesetzt
    }                                                  // Gedacht um den bereich zu begrenzen da der wert über den nutzbereich hinausschießt

    if (VRX < 500 && InkrementalWertx > 125) {         // Wenn der Joystick in die andere richtung bewegt wird und der InkrementalWert über 125 ist kann er verinngert werden
      InkrementalWertx -= speedValue;
      inkrementvalue = InkrementalWertx;
    }
    else {
      InkrementalWertx ==125;                          // Falls dieser wert kleiner ist wird er auf 125 gesetzt
    }

   }
if (buttontwostate == HIGH ) {                       //die x achse ist mein testobjekt da es das gleiche für die anderen achsen ist...wenns funktionert  :-)
    pwm.setPWM(1, 0, InkrementalWerty1);
    if (VRY > 550 && InkrementalWerty1 <= 575) {
      InkrementalWerty1 += speedValue;
    }
    if (VRY < 500 && InkrementalWerty1 >= 125) {
      InkrementalWerty1 -= speedValue;
    
    }
   }
  if (buttonthreestate == HIGH ) {
    pwm.setPWM(2, 0, InkrementalWerty2);
    if (VRY > 550 && InkrementalWerty2 <= 575) {
      InkrementalWerty2 += speedValue;
    }
    if (VRY < 500 && InkrementalWerty2 >= 125) {
      InkrementalWerty2 -= speedValue;

    }

   }
  if (buttonfourstate == HIGH ) {
    pwm.setPWM(3, 0, InkrementalWerty3);
    if (VRY > 550 && InkrementalWerty3 <= 575) {
      InkrementalWerty3 += speedValue;
    }
    if (VRY < 500 && InkrementalWerty3 >= 125) {
      InkrementalWerty3 -= speedValue;

    }

   }
  if (buttonfivestate == HIGH ) {
    pwm.setPWM(4, 0, InkrementalWerty4);
    if (VRY > 550 && InkrementalWerty4 <= 575) {
      InkrementalWerty4 += speedValue;
    }
    if (VRY < 500 && InkrementalWerty4 >= 125) {
      InkrementalWerty4 -= speedValue;
    }

   }
  if (buttonsixstate == HIGH ) {
    pwm.setPWM(5, 0, InkrementalWerty5);
    if (VRY > 550 /*&& InkrementalWerty5 <= 575*/) {
      InkrementalWerty5 += speedValue;
    }
    if (VRY < 500/* && InkrementalWerty5 >= 125*/) {
      InkrementalWerty5 -= speedValue;
    }

  }


  digitalWrite(trigPin, LOW);       //Berechnug der Entfernung
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  Serial.print("Distance: ");       //An Seriellen Monitor Schicken
  Serial.print(distance);
  Serial.print(" ");



  if (distance < 5) {                            //Wenn ein gegenstand Näher als 50mm ist soll die Greifzange Schließen
    pwm.setPWM(5, 0, 197.916 + 125);             //Ergibt einen Winkel von c.a 75° greifzange ist dann geschlossen
    if (millis() - previousMillis1 > Ontime1) {  //Wenn die Entfernug geringer als 50mm ist soll als warnzeichen der Buzzer piepen aber auch nur 3 mal
      digitalWrite(beep, LOW);

    }

    if (millis() - previousMillis1 > interval1) { //Zeitzyklus für den Buzzer
      previousMillis1 = millis();
      digitalWrite(beep, HIGH);
    }
  }

  lcd.setCursor(0, 0);          //ausgabe an das LCD display
  lcd.print("Servo: ");        
  lcd.setCursor(0, 1);
  lcd.print("Winkel:");
  lcd.setCursor(7, 1);
  lcd.print(degreeValue);      //soll den Winkelwert der ausgewälten Servos angeben
  if (degreeValue < 100);      // falls der winkelwert höher als 100 ist soll ein leerzeichen augegeben werden
  {
    lcd.print(" ");
  }
  lcd.setCursor(12, 0);
  lcd.print("V:");
  lcd.setCursor(14, 0);
  lcd.print(speedValue * 2);  //gibt den geschwindigkeitswert an *2 da bei voller geschwindigkeit 100 stehen soll
  if (speedValue < 100);
  {
    lcd.print(" ");

  }
  lcd.setCursor(12, 1);
  lcd.print("Grad");

  if (buttononestate == HIGH) {   //wenn knopf 1 aktiv ist soll eine 1 ausgegeben werden das gleiche gilt für die anderen servos/achsen
    lcd.setCursor(6, 0);
    lcd.print("1");
  }
  else {
    lcd.setCursor(6, 0);
    lcd.print(" ");
  }
  if (buttontwostate == HIGH) {
    lcd.setCursor(7, 0);
    lcd.print("2");
  }
  else {
    lcd.setCursor(7, 0);
    lcd.print(" ");
  }
  if (buttonthreestate == HIGH) {
    lcd.setCursor(8, 0);
    lcd.print("3");
  }[/quote]
  else {
    lcd.setCursor(8, 0);
    lcd.print(" ");
  }
  if (buttonfourstate == HIGH) {
    lcd.setCursor(9, 0);
    lcd.print("4");
  }
  else {
    lcd.setCursor(9, 0);
    lcd.print(" ");
  }
  if (buttonfivestate == HIGH) {
    lcd.setCursor(10, 0);
    lcd.print("5");
  }
  else {
    lcd.setCursor(10, 0);
    lcd.print(" ");
  }
  if (buttonsixstate == HIGH) {
    lcd.setCursor(11, 0);
    lcd.print("6");
  }
  else {
    lcd.setCursor(11, 0);
    lcd.print(" ");
  }
  //delay(1);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:25
Beitrag #11
RE: Servo Steuerung PCA9685 und Joystick
(03.03.2020 17:38)MicroBahner schrieb:  
(03.03.2020 17:22)Timon schrieb:  also die ersten int const variaben habe ich eingesetzt um für den Servocontroller einen verständlichen wert im setup mitzuteilen -> soll bei jedem start/reset eine art home Position bewirken.
Um die ging es mir garnicht - obwohl das auch ziemlich sinnfrei ist. Da kannst Du die Konstanten auch gleich in den pwm.setPWM() -Anwesungen im setup eintragen.

Es geht um die Variablendefinitionen im loop. Die werden bei jedem loop Durchlauf neu angelegt und initiiert. Ist dir der Unterschied zwischen lokalen und globalen Variablen klar?

Ja das ist mir grade aufgefallen ich habe den ganzen code formal bearbeitet. Ich habe die definierten zahlen entfernt allerdings tut sich immer noch nichts
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:36 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2020 18:39 von MicroBahner.)
Beitrag #12
RE: Servo Steuerung PCA9685 und Joystick
Zumindest eines deiner Grundprobleme ist, dass Du den Unterschied zwischen lokalen und globalen Variablen nicht verstehst. So ziemlich alle deiner lokalen Variablen im loop müssten globale Variable sein ( oder zumindest static lokal - aber soweit wollen wir jetzt noch garnicht gehen ).
Deshalb hast Du auch die Sprünge in deinen Bewegungen, da Du dir die Positionen deiner Servos ( die InkrementalWert... ) so nicht dauerhaft merken kannst.

P.S. die ehemaligen int zu float zu machen, macht auch keine Sinn, da Du nur Ganzzahlen an dein PWM-Shield übergeben kannst. Die float-Konstanten sind sinnlos. Du kannst deine Servos nur mit ganzzahligen Werten steuern.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:37
Beitrag #13
RE: Servo Steuerung PCA9685 und Joystick
Wenn Du Deinen Code bearbeitet hast, solltest Du die neue Version wieder einstellen, dass eine gemeinsame Diskussionsgrundlage besteht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:38
Beitrag #14
RE: Servo Steuerung PCA9685 und Joystick
[/quote]Um die ging es mir garnicht - obwohl das auch ziemlich sinnfrei ist. Da kannst Du die Konstanten auch gleich in den pwm.setPWM() -Anwesungen im setup eintragen.
ja stimmt seidenn die werden in den loop gesetzt und bei aktivierung eines home tasters soll die homefahrt ausgeführt werden oder liege ich da falsch?

Es geht um die Variablendefinitionen im loop. Die werden bei jedem loop Durchlauf neu angelegt und initiiert. Ist dir der Unterschied zwischen lokalen und globalen Variablen klar?
[/quote]

Meinst du mit global und lokal ,dass die variablen im setup nur einmal beim start/reset gesetzt werden und im loop immer wieder gesetzt werden?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:40
Beitrag #15
RE: Servo Steuerung PCA9685 und Joystick
(03.03.2020 18:36)MicroBahner schrieb:  Zumindest eines deiner Grundprobleme ist, dass Du den Unterschied zwischen lokalen und globalen Variablen nicht verstehst. So ziemlich alle deiner lokalen Variablen im loop müssten globale Variable sein ( oder zumindest static lokal - aber soweit wollen wir jetzt noch garnicht gehen ).
Deshalb hast Du auch die Sprünge in deinen Bewegungen, da Du dir die Positionen deiner Servos ( die InkrementalWert... ) so nicht dauerhaft merken kannst.

P.S. die ehemaligen int zu float zu machen, macht auch keine Sinn, da Du nur Ganzzahlen an dein PWM-Shield übergeben kannst. Die float-[u]Konstanten sind sinnlos. Du kannst deine Servos nur mit ganzzahligen Werten steuern.
also fürs erste die home pos variablen im setup entfernen und gerundet eintragen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 18:41
Beitrag #16
RE: Servo Steuerung PCA9685 und Joystick
Du solltest Dein Quoting korrigieren, so geht der Sinnzusammenhang verloren.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  von delay auf millis umgestellt, klappt nur nicht. Servo Geschwindigkeit einstellen. gutschy 8 229 21.02.2021 15:22
Letzter Beitrag: gutschy
  Drehscheibe mit 270° Servo aldidilein 4 208 20.02.2021 11:20
Letzter Beitrag: aldidilein
  Thermostat Steuerung für Fußbodenheizung FALLout 16 665 24.01.2021 19:53
Letzter Beitrag: Tommy56
Question Steuerung Lineartisch AnS 40 3.333 06.01.2021 11:37
Letzter Beitrag: MicroBahner
  Blaulicht steuerung Alexander307 33 1.499 24.12.2020 15:49
Letzter Beitrag: Tommy56
  Mouse Steuerung - Absolut und Relativ, Aulösung/Skalierung Arduino4Fun 10 530 15.12.2020 18:14
Letzter Beitrag: Tommy56
  Terrarium Steuerung kintaro 13 607 12.12.2020 22:55
Letzter Beitrag: hotsystems
  Steuerung meines Gartenweges Iron_Daddy 9 1.088 11.12.2020 15:18
Letzter Beitrag: Bitklopfer
  Servo im Programm über einen Taster betätigen CB2311 26 1.325 08.12.2020 19:21
Letzter Beitrag: Tommy56
  Aquarium Steuerung sopolka 9 1.808 11.11.2020 20:15
Letzter Beitrag: sopolka

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste