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
Wegbegrenzung für Schrittmotor
03.02.2019, 17:14
Beitrag #49
RE: Wegbegrenzung für Schrittmotor
Du schreibst:
Code:
if ((duration1 > 1700) && (val_1 >= 0));
Mit dem abschließenden ; ist die Aktion beendet. Es ist also egal ob die Bedingung erfüllt ist oder nicht, es passiert einfach nichts.

Dann schreibst Du:
Code:
if ((duration1 < 1600) && (duration1 > 1300))
ohne abschließende { . Dann wird bei erfüllter Bedingung auch nur bis zum nächsten ; ausgeführt. Das kann man so machen, aber ich weiß nicht ob es so gewollt ist.

Üblicherweise schreibt man das so:
Code:
if ((duration1 < 1600) && (duration1 > 1300)) {
    // Aufgaben
  }
So kann man dann eindeutig feststellen was passieren soll wenn if erfüllt ist.

Du hast wohl noch arge Probleme mit { und } setzen.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2019, 17:56 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2019 19:44 von Scouter.)
Beitrag #50
RE: Wegbegrenzung für Schrittmotor
Na das ist nicht das Einzigste, womit ich Probleme habe.Tongue

So, ich hab das nochmal von vorne aufgebaut und nun funktioniert das ganze schonmal, mit einer kleinen Einschränkung. Solange ich die Fernsteuerung aus habe, drehen die Motoren alle von alleine. Da der Empfänger eine Pulsweite von Null ausgibt, solange er keine Verbindung zum Empfänger hat, habe ich in die Zeilen
Code:
if (duration1 < 800)
    AB_Drehen->run(RELEASE);

jeweils für die vier RC-Kanäle eingefügt. Funktioniert auch so weit.
Nächstes Problem.
Wie bekomme ich da jetzt noch die Anfahr- und Bremsrampen rein? Und wie würden diese überhaupt aussehen?

Hier noch der aktuelle Sketch.

Code:
#include <Wire.h>
#include <Adafruit_MotorShield.h>

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *AB_Drehen = AFMS.getMotor(4);
Adafruit_DCMotor *AB_Heben = AFMS.getMotor(3);
Adafruit_DCMotor *CD_Drehen = AFMS.getMotor(2);
Adafruit_DCMotor *CD_Heben = AFMS.getMotor(1);
int Eingang1 = 12; //Empfängerkanal 1
int Eingang2 = 11; //Empfängerkanal 2
int Eingang3 = 10; //Empfängerkanal 3
int Eingang4 = 9; //Empfängerkanal 4
int Eingang5 = A0; //Poti 1
unsigned long duration1; //Pulslänge 1
unsigned long duration2; //Pulslänge 2
unsigned long duration3; //Pulslänge 3
unsigned long duration4; //Pulslänge 4

void setup() {
  AFMS.begin();  // create with the default frequency 1.6KHz  AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  pinMode(Eingang1, INPUT);
  pinMode(Eingang2, INPUT);
  pinMode(Eingang3, INPUT);
  pinMode(Eingang4, INPUT);
  AB_Drehen->setSpeed(255);
  //AB_Drehen->run(FORWARD); // turn on motor
  AB_Drehen->run(RELEASE);
  AB_Heben->setSpeed(255);
  //AB_Heben->run(FORWARD); // turn on motor
  AB_Heben->run(RELEASE);
  CD_Drehen->setSpeed(255);
  //CD_Drehen->run(FORWARD); // turn on motor
  CD_Drehen->run(RELEASE);
  CD_Heben->setSpeed(255);
  //CD_Heben->run(FORWARD); // turn on motor
  CD_Heben->run(RELEASE);
  Serial.begin(9600);
}
void loop() {
  Ueberwachen_Eingang1();
  Ueberwachen_Eingang2();
  Ueberwachen_Eingang3();
  Ueberwachen_Eingang4();
}
void Ueberwachen_Eingang1()
{
  duration1 = pulseIn(Eingang1, HIGH);
  Serial.println(duration1);
  if (duration1 < 800)
    AB_Drehen->run(RELEASE);
  if (duration1 > 1700)
    AB_Drehen->run(FORWARD);
  if ((duration1 < 1600) && (duration1 > 1300))
    AB_Drehen->run(RELEASE);
  if ((duration1 < 1300) && (duration1 > 800))
    AB_Drehen->run(BACKWARD);
  if ((duration1 < 1600) && (duration1 > 1300))
    AB_Drehen->run(RELEASE);

}
void Ueberwachen_Eingang2()
{
  duration2 = pulseIn(Eingang2, HIGH);
  Serial.println(duration2);
  if (duration2 < 800)
    AB_Heben->run(RELEASE);
  if (duration2 > 1700)
    AB_Heben->run(FORWARD);
  if ((duration2 < 1600) && (duration2 > 1300))
    AB_Heben->run(RELEASE);
  if ((duration2 < 1300) && (duration1 > 800))
    AB_Heben->run(BACKWARD);
  if ((duration2 < 1600) && (duration2 > 1300))
    AB_Heben->run(RELEASE);

}
void Ueberwachen_Eingang3()
{
  duration3 = pulseIn(Eingang3, HIGH);
  Serial.println(duration3);
  if (duration3 < 800)
    CD_Drehen->run(RELEASE);
  if (duration3 > 1700)
    CD_Drehen->run(FORWARD);
  if ((duration3 < 1600) && (duration2 > 1300))
    CD_Drehen->run(RELEASE);
  if ((duration3 < 1300) && (duration1 > 800))
    CD_Drehen->run(BACKWARD);
  if ((duration3 < 1600) && (duration2 > 1300))
    CD_Drehen->run(RELEASE);

}
void Ueberwachen_Eingang4()
{
  duration4 = pulseIn(Eingang4, HIGH);
  Serial.println(duration4);
  if (duration4 < 800)
    CD_Heben->run(RELEASE);
  if (duration4 > 1700)
    CD_Heben->run(FORWARD);
  if ((duration4 < 1600) && (duration4 > 1300))
    CD_Heben->run(RELEASE);
  if ((duration4 < 1300) && (duration1 > 800))
    CD_Heben->run(BACKWARD);
  if ((duration4 < 1600) && (duration4 > 1300))
    CD_Heben->run(RELEASE);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.02.2019, 20:06
Beitrag #51
RE: Wegbegrenzung für Schrittmotor
Hier mal ein Beispiel wie es für einen Antrieb aussehen könnte.
Zumindest Klammersetzung und Einrückung passt so.
Code:
void Ueberwachen_Eingang1() {
  uint8_t (i);
  duration1 = pulseIn(Eingang1, HIGH);
  val_1 = analogRead(Eingang7);
  delay(100);// debug value

  if ((duration1 > 1700) && (val_1 >= 0)) {
    AB_Drehen->run(FORWARD);
    for (i = 0; i < 255; i++) {
      AB_Drehen->setSpeed(i);
      //delay(8);
    }
  }

  if ((duration1 < 1600) && (duration1 > 1300)) {
    if ((val_1 = 0) && (val_1 = 1023)); {
      for (i = 255; i != 0; i--) {
        AB_Drehen->setSpeed(i);
        //delay(8);
      }
    }
  }

  if ((duration1 < 1300) && (val_1 <= 1023)) {
    AB_Drehen->run(BACKWARD);
    for (i = 0; i < 255; i++) {
      //delay(8);
      AB_Drehen->setSpeed(i);
    }
  }

  if ((duration1 < 1600) && (duration1 > 1300)) {
    for (i = 255; i != 0; i--) {
      AB_Drehen->setSpeed(i);
      //delay(8);
    }
  }

}
Die Funktion kann ich nicht ausprobieren, das kannst nur Du selbst weil Du die passende Hardware und Libraries hat.
Und probiere erst mal nur mit einem Antrieb. Erst wenn der funktioniert kannst du den duplizieren, sonst wirst Du mit der Fehlersuche nie fertig.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.02.2019, 21:51
Beitrag #52
RE: Wegbegrenzung für Schrittmotor
Ich danke dir für deine Mühe, ich werde mich am Wochenende nochmal dran setzen und probieren. Ergebnisse folgen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.02.2019, 22:20
Beitrag #53
RE: Wegbegrenzung für Schrittmotor
Ich hab deinen Sketch mal ausprobiert, leider funktioniert er nicht. Einige Motoren zucken nur und das mit oder ohne Eingabe über meine Fernsteuerung.
Stattdessen habe ich mal meinen Sketch überarbeitet und das Poti so eingebunden, das es nach meiner Vorstellung funktioniert. Leider fehlt mir halt immer noch die Anlauf- und Bremsrampe. Ich werde aber weiterhin probieren.

Hier nochmal mein aktuellen Sketch:

Code:
// Motoransteuerung über RC-Fernsteuerung

#include <Wire.h>
#include <Adafruit_MotorShield.h>

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *AB_Drehen = AFMS.getMotor(4);
Adafruit_DCMotor *AB_Heben = AFMS.getMotor(3);
Adafruit_DCMotor *CD_Drehen = AFMS.getMotor(2);
Adafruit_DCMotor *CD_Heben = AFMS.getMotor(1);
int Eingang1 = 12; //Empfängerkanal 1
int Eingang2 = 11; //Empfängerkanal 2
int Eingang3 = 10; //Empfängerkanal 3
int Eingang4 = 9; //Empfängerkanal 4
int Eingang5 = A0; //Poti 1
int Eingang6 = A1; //Poti 2
int Poti_1 = 0;
int Poti_2 = 0;
unsigned long duration1; //Pulslänge 1
unsigned long duration2; //Pulslänge 2
unsigned long duration3; //Pulslänge 3
unsigned long duration4; //Pulslänge 4

void setup() {
  AFMS.begin();  // create with the default frequency 1.6KHz  AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  pinMode(Eingang1, INPUT);
  pinMode(Eingang2, INPUT);
  pinMode(Eingang3, INPUT);
  pinMode(Eingang4, INPUT);
  pinMode(Eingang5, INPUT);
  pinMode(Eingang6, INPUT);
  AB_Drehen->setSpeed(255);
  AB_Drehen->run(RELEASE);
  AB_Heben->setSpeed(255);
  AB_Heben->run(RELEASE);
  CD_Drehen->setSpeed(255);
  CD_Drehen->run(RELEASE);
  CD_Heben->setSpeed(255);
  CD_Heben->run(RELEASE);
  Serial.begin(9600);
}
void loop() {
  Ueberwachen_Eingang1();
  Ueberwachen_Eingang2();
  Ueberwachen_Eingang3();
  Ueberwachen_Eingang4();

}
void Ueberwachen_Eingang1()
{

  uint8_t i;
  duration1 = pulseIn(Eingang1, HIGH);
  Serial.println(duration1);
  Poti_1 = analogRead(Eingang5);
  Serial.println(Poti_1);
  if ((duration1 < 800) || (Poti_1 > 1015) || (Poti_1 < 20)) {
    AB_Drehen->run(RELEASE);
  }
  if ((duration1 > 1700) && (Poti_1 < 1000)) {
    AB_Drehen->run(FORWARD);
  }
  if ((duration1 < 1600) && (duration1 > 1300)) {
    AB_Drehen->run(RELEASE);
  }
  if ((duration1 < 1300) && (duration1 > 800) && (Poti_1 > 10)) {
    AB_Drehen->run(BACKWARD);
  }
  if ((duration1 < 1600) && (duration1 > 1300)) {
    AB_Drehen->run(RELEASE);
  }
}
void Ueberwachen_Eingang2()
{
  duration2 = pulseIn(Eingang2, HIGH);
  //Serial.println(duration2);
  if (duration2 < 800) {
    AB_Heben->run(RELEASE);
  }
  if (duration2 > 1700) {
    AB_Heben->run(FORWARD);
  }
  if ((duration2 < 1600) && (duration2 > 1300)) {
    AB_Heben->run(RELEASE);
  }
  if ((duration2 < 1300) && (duration1 > 800)) {
    AB_Heben->run(BACKWARD);
  }
  if ((duration2 < 1600) && (duration2 > 1300)) {
    AB_Heben->run(RELEASE);
  }
}
void Ueberwachen_Eingang3()
{
  duration3 = pulseIn(Eingang3, HIGH);
  //Serial.println(duration3);
  if ((duration3 < 800) || (Poti_2 > 1015) || (Poti_2 < 20)) {
    CD_Drehen->run(RELEASE);
  }
  if ((duration3 > 1700) && (Poti_2 < 1000)) {
    CD_Drehen->run(FORWARD);
  }
  if ((duration3 < 1600) && (duration2 > 1300)) {
    CD_Drehen->run(RELEASE);
  }
  if ((duration3 < 1300) && (duration1 > 800) || (Poti_2 > 10)) {
    CD_Drehen->run(BACKWARD);
  }
  if ((duration3 < 1600) && (duration2 > 1300)) {
    CD_Drehen->run(RELEASE);
  }
}
void Ueberwachen_Eingang4()
{
  duration4 = pulseIn(Eingang4, HIGH);
  //Serial.println(duration4);
  if (duration4 < 800) {
    CD_Heben->run(RELEASE);
  }
  if (duration4 > 1700) {
    CD_Heben->run(FORWARD);
  }
  if ((duration4 < 1600) && (duration4 > 1300)) {
    CD_Heben->run(RELEASE);
  }
  if ((duration4 < 1300) && (duration1 > 800)) {
    CD_Heben->run(BACKWARD);
  }
  if ((duration4 < 1600) && (duration4 > 1300)) {
    CD_Heben->run(RELEASE);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.02.2019, 23:09
Beitrag #54
RE: Wegbegrenzung für Schrittmotor
(08.02.2019 22:20)Scouter schrieb:  Ich hab deinen Sketch mal ausprobiert, leider funktioniert er nicht.
...
Sorry, ich denke wir sollten da erst mal was zurecht rücken.

Was ich gepostet habe war nicht mein Sketch.
Es ist ein Teil von dem Sketch den du in Beitrag #48 gezeigt hast.
Ich habe lediglich versucht darin beispielhaft eine sinnvolle Klammersetzung zu verwirklichen.
Ich habe auch nicht versucht den Code auf Sinnhaftigkeit zu prüfen. Weil mir die Hardware fehlt ums es zu prüfen.
Was du jetzt präsentierst hat aber nichts mehr mit dem von mir korrigierten Beispiel zu tun.
In dem Code aus deinem Beitrag #48 konnte ich auch noch Hinweise auf die gewünschten Anlauf- und Bremsrampen finden. Die fehlen nun vollständig.
Zudem hatte ich vorgeschlagen erst mal nur einen Antrieb zu realisieren und erst wenn der funktioniert das funktionierende Ergebnis zu duplizieren.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2019, 01:15
Beitrag #55
RE: Wegbegrenzung für Schrittmotor
Alles richtig was du sagst. Das das nicht dein eigener Sketch ist, hab ich nicht mal gemerkt, also nichts für ungut.
Das ich die Anlauf- und Bremsrampen erstmal wieder heraus genommen habe, hat den Hintergrund, dass ich erstmal das Poti funktionsfähig einbinden wollte und das ist mir heute gelungen.
Nun will ich mich an die Rampen ran wagen.
Ich versuche auch alles erstmal mit nur einen Motor, auch wenn da noch drei weitere im Sketch stehen.
Ich frage mich inzwischen, ob eine for-Schleife überhaupt der richtige Ansatz ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2019, 13:59
Beitrag #56
RE: Wegbegrenzung für Schrittmotor
Ob eine for-Schleife für Dich das Richtige ist, musst du Dir selbst beantworten.
Du solltest dabei nur wissen dass das Programm immer in dieser for-Schleife fest hängt solange die Endbedingung nicht erfüllt ist.

Das bedeutet dass Motor 2, 3 und 4 nicht bearbeitet werden solange das Programm eine for-Schleife von Motor 1 bearbeitet. Das gilt natürlich auch für die for-Schleifen der anderen Motoren.
Jede for-Schleife blockiert also immer während sein Abarbeitungszeit das gesamte restliche Programm.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Projekt Portionierer mit Schrittmotor, Bluetooth hilfe Flieger 3 973 09.08.2018 13:02
Letzter Beitrag: Hilgi
  Endschalter für Schrittmotor clemens5555 10 3.194 18.04.2018 14:37
Letzter Beitrag: Tommy56
  Schrittmotor mit Puls/Richtung Steuern Günni 6 2.480 19.01.2018 10:30
Letzter Beitrag: Tommy56
  Schrittmotor Geschwindigkeit mit Wägezelle + HX711 Modul steuern Schrittmotor 10 4.109 30.08.2017 23:45
Letzter Beitrag: hotsystems
  Schrittmotor mit l298n Sequenz huber5093 10 3.486 26.04.2017 15:06
Letzter Beitrag: huber5093
  Haltestrom Schrittmotor reduzieren TimF 3 3.054 24.10.2016 12:33
Letzter Beitrag: Binatone
  Schrittmotor Clemens55555 9 4.380 25.08.2016 10:15
Letzter Beitrag: Binatone
  Schrittmotor soll auf Tasterdruck bis zum Endschalter fahren Wurstbemme 11 8.022 08.01.2016 11:56
Letzter Beitrag: hotsystems
  Piezosummer und Schrittmotor Gilbert Neon 0 1.345 20.12.2015 15:40
Letzter Beitrag: Gilbert Neon
  Problem mit 2 Potis und Schrittmotor Sven90 1 1.900 24.09.2015 10:19
Letzter Beitrag: Bitklopfer

Gehe zu:


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