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
Abstandsmessung für grbl
10.03.2014, 06:34
Beitrag #1
Abstandsmessung für grbl
Hallo Community,

ich habe ein Problem wo ich noch nicht weiß wie ich es umsetzen kann.
Ich habe einen Abstandsmesser der mir über den seriellen Monitor Stannungswerte von 2-4 Volt ausgibt. Nun Möchte ich im grbl (oder auch extra) eine Steuerung bauen mit einem Schrittmotor der in eine Richtung fährt solange bis der Wert vom Abstandsmesser erreicht ist. Ist das möglich ?
Ich habe den Code zum ansteuern des Motors, und denke das man mit einer
IF Schleife das lösen könnte.
Also nach dem Prinzip "IF (Messwert) < (Sollwert) dann Motor weiter drehen"

Wäre super wenn Ihr mir da vielleicht einige Tipps geben könntet, da ich mich
mit der Programmierung noch nicht wirklich auskenne.

Viele Grüße
MAB Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2014, 21:59 (Dieser Beitrag wurde zuletzt bearbeitet: 10.03.2014 22:01 von Stich73.)
Beitrag #2
RE: Abstandsmessung für grbl
Hallo;
eine if / else ist eine Abfrage Vergleichbar mit Exel "Wenn" das dann dies ansonsten was anderes.

Code:
if ((digitalRead(Relais) == HIGH)){  //Bedingung die erfüllt werden soll
digitalWrite(9, LOW); // wenn Bedingung erfüllt tue das
lcd.print("Anlage Aus"); //Ausgabe auf LCD auch möglich

else {   // Ansonsten
delay(1000);}  //Wenn Bedingung nicht erfüllt tue dies.  
}



Schleifen sind do while Abfragen aber Vorsicht ind die Schleife noch mit einbauen das der Sensor einen Wert liefert sonnst läuft die Schleife bei defekten Sensor ewig.
Code:
// Die Schleife läuft so lange wie der Wert z nicht größer gleich 65 ist.
// Erst dann springt die Abfrage weiter zur nächten Schritt.
    
do {
     z = analogRead (A0);  // liest den analog Pin und setzt ihn gleich mit z.
  
     digitalWrite(10, LOW);    // Relais aus
      delay (1000);            // Zeitverzögerung zur beruhigung des Systemes.            
     } while (z <= 60);       // Fragt ab ob kleiner gleich 60 ist.
                           // wenn nein wird die Schleife wiederholt solange bis die Bedingung erfüllt wurde. Wird nichts anderes an Steuerungen erfolgen.

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2014, 01:52
Beitrag #3
RE: Abstandsmessung für grbl
(10.03.2014 21:59)Stich73 schrieb:  Hallo;
eine if / else ist eine Abfrage Vergleichbar mit Exel "Wenn" das dann dies ansonsten was anderes.

Code:
if ((digitalRead(Relais) == HIGH)){  //Bedingung die erfüllt werden soll
digitalWrite(9, LOW); // wenn Bedingung erfüllt tue das
lcd.print("Anlage Aus"); //Ausgabe auf LCD auch möglich

else {   // Ansonsten
delay(1000);}  //Wenn Bedingung nicht erfüllt tue dies.  
}



Schleifen sind do while Abfragen aber Vorsicht ind die Schleife noch mit einbauen das der Sensor einen Wert liefert sonnst läuft die Schleife bei defekten Sensor ewig.
Code:
// Die Schleife läuft so lange wie der Wert z nicht größer gleich 65 ist.
// Erst dann springt die Abfrage weiter zur nächten Schritt.
    
do {
     z = analogRead (A0);  // liest den analog Pin und setzt ihn gleich mit z.
  
     digitalWrite(10, LOW);    // Relais aus
      delay (1000);            // Zeitverzögerung zur beruhigung des Systemes.            
     } while (z <= 60);       // Fragt ab ob kleiner gleich 60 ist.
                           // wenn nein wird die Schleife wiederholt solange bis die Bedingung erfüllt wurde. Wird nichts anderes an Steuerungen erfolgen.

Gruß

Hallo Stich73,

danke erst mal für den tollen Ansatz.
Mit diesen konkreten Infos verstehe ich so langsam das Prinzip Wink.

Ich erkläre noch mal im einzelnen mein Problem.
Ich habe mir einen Laserplotter gebaut der bis jetzt auf 2 Achsen läuft.
Die X und die Y Achse positionieren den Laser über "grbl" auf dem Arbeitsbereich.
Soweit funktioniert schon alles. Ich wollte jetzt aber gerne eine Z Achse mit einbauen (Hardwaremäßig schon angebaut). Dazu habe ich ein altes DVD Laufwerk benutzt an dem der Laser angebracht ist.
Sinn und Zweck des ganzen soll sein das man ja unterschiedliche Werkstücke von der Höhe her hat. Der Laser soll sich vom Abstand her selbst auf den benötigten Brennpunkt anhand der Höhenmessung einstellen.
Den Anstandssensor habe ich mal zum testen an A0 gehangen und die Werte über den Serial Monitor ausgegeben mit folgenden Programm...

// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
Serial.println(voltage);
}

Der Sensor arbeitet in 3 Bereichen.
1. Bereich (im Erfassungsbereich, aber zu weit entfernt). Der Serial Monitor liefert einen Wert von ca. 4.89 - 4.80.
2. Bereich (Genauer Bereich der angefahren werden soll). Der Serial Monitor liefert einen Wert von ca. 4.29 - 4.20.
3. Bereich (im Erfassungsbereich, aber zu nah). Der Serial Monitor liefert einen Wert von ca. 3.79 - 3.70.

Der Schrittmotor des DVDs fängt bei grbl ganz oben an wenn er auf das Werkstück fährt.
Sobald die Position erreicht ist soll der Schrittmotor herunterfahren bis der Abstandssensor den Wert zwischen 4.29 und 4.20 erreicht hat. Dann stopp.
Also müßte man im grbl eine Routine einbauen die die Werte überprüft.
Du hattest ein Beispiel gegeben mit...

} while (z <= 60);

Kann ich diese Abfrage auch mit den Kommazahlen machen die mir ausgegeben werden ?
Wie z.B.: } while (z <= 4.25); ???

Wenn ja, dann wäre nur noch das Problem wie man diese Schleife in die Routine des Schrittmotors einbaut.
Ich habe bisher zum testen dieses Script verwendet...

-------------------
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);


void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");

AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(10); // 10 rpm
}

void loop() {

myMotor->step(100, FORWARD, DOUBLE);
myMotor->step(100, BACKWARD, DOUBLE);
}

Danke schon mal für die Infos Smile
MAB Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2014, 17:24
Beitrag #4
RE: Abstandsmessung für grbl
Hallo,

so langsam wirds komplieziert für mich.
Code:
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);


void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");

AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(10); // 10 rpm
}

void loop() {

myMotor->step(100, FORWARD, DOUBLE);
myMotor->step(100, BACKWARD, DOUBLE);
}
Also mit dem Code geht mal irgenwie garnichts.
Du schreibst Motro Forwärts dannach gleich wieder rückwärts.
Mal so ein Gesammt Code und dann genau beschreiben wo was geändert werden soll.
Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.03.2014, 03:29
Beitrag #5
RE: Abstandsmessung für grbl
(11.03.2014 17:24)Stich73 schrieb:  Hallo,

so langsam wirds komplieziert für mich.
Code:
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);


void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");

AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(10); // 10 rpm
}

void loop() {

myMotor->step(100, FORWARD, DOUBLE);
myMotor->step(100, BACKWARD, DOUBLE);
}
Also mit dem Code geht mal irgenwie garnichts.
Du schreibst Motro Forwärts dannach gleich wieder rückwärts.
Mal so ein Gesammt Code und dann genau beschreiben wo was geändert werden soll.
Gruß

Hi,

das war auch nur ein Beispiel Sketch zum ansteuern eines Steppers.
Klar, in dem Sketch dreht der nur ne kurze Zeit vorwärts und dann wieder rückwärts.
Mir ging es eher darum wie ich aus diesen Codeschnippseln ein funktionierendes
Programm machen kann. Also wie bei dem oben erwähnten Problem mit der Abstandsmessung (in Form des von Dir vorgeschlagenen Codes) und einer Stepper Routine. So das z.B. der Stepper anläuft und wenn der Wert aus der Routine erreicht ist er wieder anhält.

Viele Grüße
MAB Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.03.2014, 06:36
Beitrag #6
RE: Abstandsmessung für grbl
OK habs Verstanden mach mal was fertig.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.03.2014, 20:42
Beitrag #7
RE: Abstandsmessung für grbl
Hallo,
bitte noch die genaue Ansteuerung des Motores machen habe das mal so geschrieben.
Gruß
Code:
// ES WIRD KEINE HAFTUNG FÜR NACVOLGENDEN CODE ÜBERNOMMEN. !!!!
// Dieser Code dient nur als Bsp. und muss für die Analge angepasst werden.
// Keine Garantie auf Richtigkeit des Codes.
// Bei zerstörung des Gerätes oder Verletzung an Personen wird der Beteriber und Inbetriebnehmer der Analage zur Haftung gebeten.
// Der Code ist auf alle Stör.- Endschalterzustände zu prüfen.
// INTEGER A-D werden als Interne Hilfen benötigt um bei änderungen nicht alle Abfragen ändern zu müssen.


//Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

int Taster1 = 1;  // Abwärts
int Taster2 = 2;  // Aufwärts
int Taster3 = 3;  // Stop
int Taster4 = 4; // Notaus Achtung immer mit 5V+ Versorgen da der Notaus Kreis immer als öffner geschalten werden muss.
int analogPinA = 0; // 4,25V Endschalter abwärst erreicht. 0-1V Endschalter aufwärts erreicht.
int Motor = 5;
int A;   // wird den Analogpin in der Abfrage ersetzen.
int B;   // Sollwert Vorgabe für Endschalter abwärts
int C;   // Dient als Selbsterhalt nach dem Start so dass der Taster Abwärts nicht immer wieder gedrückt werden muss.
int D;   // Dient als Selbsterhalt nach dem Start so dass der Taster Aufwärts nicht immer wieder gedrückt werden muss.
void setup() {
  
pinMode (Taster1, INPUT);
  pinMode (Taster2, INPUT);
  pinMode (Taster3, INPUT);
  pinMode (Taster4, INPUT);
  pinMode (Motor, OUTPUT);
Serial.begin(9600); // set up Serial library at 9600 bps

//AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

//myMotor->setSpeed(10); // 10 rpm
}

void loop() {
Serial.println("Stepper test!");
delay(2000);


A =  analogRead(0); // Setzte A = mit analogPin.

B = 869; // Wert für den AnalogPin INPUT  1023 = 5V  /  869 = 4,247V / 870 = 4,2521V

  // Motor steht still beim drücken des Starttaster1 beginnt die Analge zu arbeiten und fährt Abwärts.
  // Bei bewegung des Motores wird C auf 1 gesetzt und aktieviert dadurch die Abfrage immer wieder,
  // Bist Stopp gedrückt wird oder der Abstand zu gering ist.
  // Mann kann auch den Ausdruck "|| C == 1 aus der 1. Abfrage löschen muss dann aber die 2. mit dazunehmen.
if(Taster1 == Taster2){
  Serial.println("Finger weg sonst knallts!!!");
delay(1000);}
  else{
  if(A >= B && Taster1 == HIGH && Taster4 == HIGH){
    Serial.println("Abstand zu gering");
    delay(5000);}
    else {
  if (Taster1 == HIGH || C == 1 && Taster4 == HIGH && Taster3 == LOW && A <= B){  //Abfrage ob Einschalter gedrückt wurde. Notaus nicht an. Anlalog größer 4,25.
  // myMotor->step(100, FORWARD, DOUBLE);
   Serial.println("Motor abwärts");
    C = 1;
    D = 0; }
  else {
    C = 0;
  Motor = LOW;
  Serial.println ("Motor Stopp");}
  
  //Wenn die Anlage läuft arbeitet nu noch diese Abfrage.
  
  // if(C 0= 1 && Taster4 == HIGH && Taster3 == LOW && A <= B){
   // Serial.println("Motor abwärts");
   // myMotor->step(100, FORWARD, DOUBLE);
  // }
  // else {
   //  C = 0;
  // Motor = LOW;
  // Serial.println ("Motor Stopp");
// delay(2000); }
      }
  

// Anlage startet beim drücken des Tasters 2 und fährt aufwärts;
if (A <=1 && Taster2 == HIGH && Taster4 == HIGH){
  Serial.println("Endschalter auf kontrollieren");
  D = 0;
  Motor, LOW;
  delay(5000);}
  else{
  
if (Taster2 == HIGH || D== 1 && Taster4 == HIGH && Taster3 == LOW && A >=1){  //Abfrage ob Einschalter gedrückt wurde. Notaus nicht an. Anlalog kleiner =1.
   // myMotor->step(100, BACKWARD, DOUBLE);
   Serial.println("Motor aufwärts");
    D = 1;
    C = 0; }
    else {
      Motor = LOW;
      D = 0;
    delay(2000);}

// Anlage fährt bis Analogpin auf 1 steht oder Stopp gedrückt wird.
// Bei benutzung muss in der der Vorhergehenden Abfrage das "|| D ==1" gelöscht werden
// if (D == 1 && Taster4 == HIGH && Taster3 == LOW && A <=1){  //Abfrage ob Einschalter gedrückt wurde. Notaus nicht an. Anlalog kleiner =1.
   // myMotor->step(100, BACKWARD, DOUBLE);
  // Serial.println("Motor aufwärts");
  //  D = 1;
  //  C = 0; }
  //  else {
   //   D = 0;
   // delay(2000);}
  }


// Stoppt den Motor bei Tastendruck.

if ((Taster4 == LOW) || (Taster3 == HIGH)){
C = 0;
D = 0;
  Motor = LOW;
Serial.println("Motor Stopp");
delay(2000);
}
if (Taster4 == LOW){   // Bei gedrücktem Notaus bleibt die Anlage für 5sec. gesperrt.
  Serial.println("NOTAUS kontrollieren");
  C = 0;
  D = 0;
  Motor = LOW;
delay(5000);}
  }
   }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2014, 06:58
Beitrag #8
RE: Abstandsmessung für grbl
(12.03.2014 20:42)Stich73 schrieb:  Hallo,
bitte noch die genaue Ansteuerung des Motores machen habe das mal so geschrieben.
Gruß
Code:
// ES WIRD KEINE HAFTUNG FÜR NACVOLGENDEN CODE ÜBERNOMMEN. !!!!
// Dieser Code dient nur als Bsp. und muss für die Analge angepasst werden.
// Keine Garantie auf Richtigkeit des Codes.
// Bei zerstörung des Gerätes oder Verletzung an Personen wird der Beteriber und Inbetriebnehmer der Analage zur Haftung gebeten.
// Der Code ist auf alle Stör.- Endschalterzustände zu prüfen.
// INTEGER A-D werden als Interne Hilfen benötigt um bei änderungen nicht alle Abfragen ändern zu müssen.


//Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

int Taster1 = 1;  // Abwärts
int Taster2 = 2;  // Aufwärts
int Taster3 = 3;  // Stop
int Taster4 = 4; // Notaus Achtung immer mit 5V+ Versorgen da der Notaus Kreis immer als öffner geschalten werden muss.
int analogPinA = 0; // 4,25V Endschalter abwärst erreicht. 0-1V Endschalter aufwärts erreicht.
int Motor = 5;
int A;   // wird den Analogpin in der Abfrage ersetzen.
int B;   // Sollwert Vorgabe für Endschalter abwärts
int C;   // Dient als Selbsterhalt nach dem Start so dass der Taster Abwärts nicht immer wieder gedrückt werden muss.
int D;   // Dient als Selbsterhalt nach dem Start so dass der Taster Aufwärts nicht immer wieder gedrückt werden muss.
void setup() {
  
pinMode (Taster1, INPUT);
  pinMode (Taster2, INPUT);
  pinMode (Taster3, INPUT);
  pinMode (Taster4, INPUT);
  pinMode (Motor, OUTPUT);
Serial.begin(9600); // set up Serial library at 9600 bps

//AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

//myMotor->setSpeed(10); // 10 rpm
}

void loop() {
Serial.println("Stepper test!");
delay(2000);


A =  analogRead(0); // Setzte A = mit analogPin.

B = 869; // Wert für den AnalogPin INPUT  1023 = 5V  /  869 = 4,247V / 870 = 4,2521V

  // Motor steht still beim drücken des Starttaster1 beginnt die Analge zu arbeiten und fährt Abwärts.
  // Bei bewegung des Motores wird C auf 1 gesetzt und aktieviert dadurch die Abfrage immer wieder,
  // Bist Stopp gedrückt wird oder der Abstand zu gering ist.
  // Mann kann auch den Ausdruck "|| C == 1 aus der 1. Abfrage löschen muss dann aber die 2. mit dazunehmen.
if(Taster1 == Taster2){
  Serial.println("Finger weg sonst knallts!!!");
delay(1000);}
  else{
  if(A >= B && Taster1 == HIGH && Taster4 == HIGH){
    Serial.println("Abstand zu gering");
    delay(5000);}
    else {
  if (Taster1 == HIGH || C == 1 && Taster4 == HIGH && Taster3 == LOW && A <= B){  //Abfrage ob Einschalter gedrückt wurde. Notaus nicht an. Anlalog größer 4,25.
  // myMotor->step(100, FORWARD, DOUBLE);
   Serial.println("Motor abwärts");
    C = 1;
    D = 0; }
  else {
    C = 0;
  Motor = LOW;
  Serial.println ("Motor Stopp");}
  
  //Wenn die Anlage läuft arbeitet nu noch diese Abfrage.
  
  // if(C 0= 1 && Taster4 == HIGH && Taster3 == LOW && A <= B){
   // Serial.println("Motor abwärts");
   // myMotor->step(100, FORWARD, DOUBLE);
  // }
  // else {
   //  C = 0;
  // Motor = LOW;
  // Serial.println ("Motor Stopp");
// delay(2000); }
      }
  

// Anlage startet beim drücken des Tasters 2 und fährt aufwärts;
if (A <=1 && Taster2 == HIGH && Taster4 == HIGH){
  Serial.println("Endschalter auf kontrollieren");
  D = 0;
  Motor, LOW;
  delay(5000);}
  else{
  
if (Taster2 == HIGH || D== 1 && Taster4 == HIGH && Taster3 == LOW && A >=1){  //Abfrage ob Einschalter gedrückt wurde. Notaus nicht an. Anlalog kleiner =1.
   // myMotor->step(100, BACKWARD, DOUBLE);
   Serial.println("Motor aufwärts");
    D = 1;
    C = 0; }
    else {
      Motor = LOW;
      D = 0;
    delay(2000);}

// Anlage fährt bis Analogpin auf 1 steht oder Stopp gedrückt wird.
// Bei benutzung muss in der der Vorhergehenden Abfrage das "|| D ==1" gelöscht werden
// if (D == 1 && Taster4 == HIGH && Taster3 == LOW && A <=1){  //Abfrage ob Einschalter gedrückt wurde. Notaus nicht an. Anlalog kleiner =1.
   // myMotor->step(100, BACKWARD, DOUBLE);
  // Serial.println("Motor aufwärts");
  //  D = 1;
  //  C = 0; }
  //  else {
   //   D = 0;
   // delay(2000);}
  }


// Stoppt den Motor bei Tastendruck.

if ((Taster4 == LOW) || (Taster3 == HIGH)){
C = 0;
D = 0;
  Motor = LOW;
Serial.println("Motor Stopp");
delay(2000);
}
if (Taster4 == LOW){   // Bei gedrücktem Notaus bleibt die Anlage für 5sec. gesperrt.
  Serial.println("NOTAUS kontrollieren");
  C = 0;
  D = 0;
  Motor = LOW;
delay(5000);}
  }
   }

Hallo Stich,

erstmal vielen vielen Dank für die Mühe die Du Dir gemacht hast.
Ich habe festgestellt das meine Z Achse zu schwach ist um die Last zu heben.
Muß da erst mal noch etwas basteln bis ich das testen kann.
Ich denke nächste Woche werde ich mich dann mit der Ansteuerung beschäftigen können.
In diesem Sinne erst mal ein schönes WE und danke nochmal Smile

Viele Grüße
MAB Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  GRBL auf Arduino Jürgen55 3 916 26.11.2015 19:56
Letzter Beitrag: hotsystems
  grbl antwortet nicht Robs09 2 899 06.02.2015 22:43
Letzter Beitrag: Robs09
Rainbow Abstandsmessung mit Ultraschall JoeDorm 8 3.852 16.11.2014 13:35
Letzter Beitrag: ardu_arne
  GRBL Pinanorndung ändern für FabScan-Shield V1.1 StefanL38 0 1.470 19.04.2014 16:16
Letzter Beitrag: StefanL38
  Grbl make sascha35 2 1.589 23.07.2013 20:47
Letzter Beitrag: sascha35
  GRBL auf Arduino... Irgendwie klappt's nicht... Aem 14 11.854 09.06.2013 16:39
Letzter Beitrag: Woodeye

Gehe zu:


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