NOOB braucht Hilfe beim Sketch

Ich möchte ein Projekt bauen welche 3 Nema17 Stepper Steuert.

Als Shield habe ich ein Arduino UNO CNC Shield V3 mit DRV8825 Schrittmotor Treiber.

Auf dem Shield sind auch Ausgänge für Endschalter.

Steuerung soll Folgender maßen sein:

stepper 1 stepper2

stepper3

Motor 1 und 2 drehen rechts rum, Motor 3 Links. Zwischen den Motoren ist jeweils ein "Endstop" wenn

zwischen 1+2 der Endstop ausgelöst wird sollen sie umschalten auf 1+3 Links drehen. 2 Rechts drehen.

Wenn Endstop zwischen 1+3 auslöst umschalten auf 2+3 Rechts drehen 1 Links drehen. Wenn Endstop 2+3

auslöst wieder von Vorne.......usw Hoffentlich versteht das jemand Malen

da ich Arduino NOOB bin habe ich mich wohl schon Blind gelesen...... geschafft habe ich bislang das:

// defines pins numbers

const int stepX = 2;
const int dirX  = 5;
const int stepY = 3;
const int dirY  = 6;
const int stepZ = 4;
const int dirZ  = 7;
const int enPin = 8;
const int drehen = 50;
void setup() {

  // Sets the two pins as Outputs

  pinMode(stepX, OUTPUT);
  pinMode(dirX, OUTPUT);
  pinMode(stepY, OUTPUT);
  pinMode(dirY, OUTPUT);
  pinMode(stepZ, OUTPUT);
  pinMode(dirZ, OUTPUT);
  pinMode(enPin, OUTPUT);
  digitalWrite(enPin, LOW);
  digitalWrite(dirX, HIGH);
  digitalWrite(dirY, LOW);
  digitalWrite(dirZ, HIGH);
}

void loop() {
  // Enables the motor to move in a particular direction

  // Makes 200 pulses for making one full cycle rotation

  {
    if (drehen <= 0)
    {
      digitalWrite(stepX, HIGH);
      delayMicroseconds(1000);
      digitalWrite(stepX, LOW);
      delayMicroseconds(1000);
      digitalWrite(stepY, HIGH);
      delayMicroseconds(1000);
      digitalWrite(stepY, LOW);
      delayMicroseconds(1000);
      digitalWrite(stepZ, HIGH);
      delayMicroseconds(1000);
      digitalWrite(stepZ, LOW);
      delayMicroseconds(1000);
      drehen = drehen + 1
    }

Danke

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Außerdem entferne bitte die unnötigen Leerzeilen und formatiere den Code ordentlich (+T in der IDE hilft Dir dabei).

Gruß Tommy

Und bitte auch die unnützen Leerzeilen aus deinem Text löschen, dann wird auch dieser besser lesbar.

Hallo Wilbur,

Die Beschreibung was du machen möchtest ist schon recht detailliert. Aber was ist jetzt deine Frage?
Sollen das noch unvollständige Programm die unausgeschriebene Aufforderung sein dein Programm zu vollenden?
Wahrscheinlich nicht. Deshalb wäre es sehr hilfreich wenn du eine wirklich konkrete Frage stellen würdest.

Es mag sein, dass dir als NOOB keine "Fachfrage" einfällt. Das macht überhaupt nichts. Du wirst irgendeine Vermutung haben was für Codezeilen noch dazu müssen. Schreibe diese Vermutung als Frage. Dann haben wir einen konkreten Ansazpunkt. Ohne so eine Frage wirkt das auf mich wie "schreibe mal mein Programm fertig" oder wie "schreibe mir mal einen kompletten Anfänger-Kurs zugeschnitten auf mein Projekt.

Also einfach eine konkrete Frage posten

viele Grüße Stefan

Hallo Stefan, danke für deine Antwort. Nei es soll keiner das Prog. zu Ende schreiben.

Ich dachte da an einen Tip wie ich das angehen muss. Bislang drehen die Motoren ja erst mal, nur wie Frage ich die "endstop" ab und erkläre die Umschaltung der Motoren.

Da steige ich nicht durch.

wilbur245:
... nur wie Frage ich die "endstop" ab und erkläre die Umschaltung der Motoren.

Was ist das? Ein Taster? Welches Ereignis bezeichnest Du als "endstop"?

der Motor bzw das vom Motor angetriebene läuft gegen einen Mikroschalter.......zb beim 3d Drucker oder

Linear Schlitten. Ein einfacher Taster die sind auf dem Shield auch Definiert.

Nur das Abfragen und Umschalten begreife ich nicht.

Pro Motor ein Taster oder zwei Taster oder wie?

Der Sinn Deines "Motorballetts" erschließt sich mir leider nicht.

Nein nicht pro Motor sondern Pro Seite , es sind 3 Motoren im 3 Eck angeordnet....es soll eine Art Roboter werden wie zb Staubsauger, nur das der hier auf Getreide Fährt und im Raum Kreuz und Quer umher Fährt, wenn er anstößt ändert er die Richtung.....einer der 3 Motoren dreht dabei entgegengesetzt und bringt den so etwas aus der Bahn um nicht immer die Gleiche Linie zu Fahren. So soll auch verhindert werden das er sich im Kreis Dreht.....wegen dem Kabel.

[Unbenannt].jpg

Hallo Wilbur,

einen Taster der einen elektrischen Kontakt schließt kann man abfragen mit

// man muss angeben an welchem IO-Pin der Taster angeschlossen ist
// mal angenommen er ist an IO-PIN 12 angeschlossen
const int Endschalter = 12
if (digitalRead(Endschalter == HIGH) {
  mach was
}

ob man die Abfrage nun

if (digitalRead(Endschalter == HIGH)

oder

if (digitalRead(Endschalter == LOW)

lauten muss hänt davon ab auf welche Art und Weise man den Taster angeschlossen hat.
Wenn dir jetzt immer noch ziemlich unklar ist wie man es macht. Weißt du bis jetzt ziemlich wenig
und es empfiehlt sich sich Grundlagen zu erarbeiten. Es tut mir Leid das so schreiben zu müssen aber es ist wahr
Mit ganz wenig Grundlagenwissen würdest du wirklich wegen jedem Fitzelchen hier erneut nachfragen.
Du kannst das machen und ich werde auch antworten sofern du eine jeweils eine konkrete Frage stellst,
Ich vermute aber das dir das keinen Spaß macht. Deswegen fange mal an hier zu lesen

Grundlagen zu Elektronik und Arduino

Da werden die Grundlagen der Elektronik anhand vom Arduino erklärt.

Was ich noch nicht verstehe ist was meinst du mit

Ein einfacher Taster die sind auf dem Shield auch Definiert.

?
viele Grüße Stefan

Auf dem CNC Shield sind die Anschlüsse für insg. 6 mögliche Endstop.

https://forum.arduino.cc/index.php?action=dlattach;topic=694689.0;attach=372385

Ja und jetzt wäre gut du würdest als Fragender den potentiellen Antwortgebern so viel wie möglich an Arbeit abnehmen in dem du selbst im Datenblatt nachschaust wenn man das CNC-Shield auf den Arduino aufsteckt welche IO-Port nummern werden da mit den Endschaltern verbunden.

Oder wenn du nicht weist wie man diese IO-Port-Nummern herausfindest
eben genau das als konkrete Frage stellst und dann wenigstens aus dem Datenblatt zitierst oder einen Democode von AZ-delivery zur Verfügung stellst.

viele Grüße Stefan

wilbur245:
... es soll eine Art Roboter werden wie zb Staubsauger, nur das der hier auf Getreide Fährt und im Raum Kreuz und Quer umher Fährt, wenn er anstößt ändert er die Richtung ... wegen dem Kabel.

Vor meinem geistigen Auge fährt ein Mähdrescher selbständig über ein Getreidefeld, angetrieben von Schrittmotoren, als Treiber DRV8825, mit Energie versorgt durch ein Kabel.

Ne Kein Mähdrescher..... nur ein Kleiner Robot im Silo der über einen Sensor die Feuchtigkeit Loggt. Der soll aber nicht über den Arduino.....der Fährt nur mit.
Die Stepper sollen Bürstenwalzen statt Räder bekommen damit er nicht versinkt.

Die Pin für die Endstop sind 9-10-11 wie auf dem Uno angegeben

Mein Tipp sind die MobaTools, die per Bibliotheksmanager geladen werden können. Mit Beispiel Stepper_02 kannst Du anfangen. Anstelle von delayTime.running() fragst Du den Taster ab. Wegen des anderen Treibers dann MoToStepper myStepper( 200, A4988 ); und byte myStepper.attach( 2, 5 ); je nach "Achse".

Moin,

wilbur245:
der Motor bzw das vom Motor angetriebene läuft gegen einen Mikroschalter.......
Ein einfacher Taster die sind auf dem Shield auch Definiert.

Das wird schon.

Die Pin für die Endstop sind 9-10-11 wie auf dem Uno angegeben

Motor 1 und 2 drehen rechts rum, Motor 3 Links. Zwischen den Motoren ist jeweils ein "Endstop" wenn
zwischen 1+2 der Endstop ausgelöst wird sollen sie umschalten auf 1+3 Links drehen. 2 Rechts drehen.

Als ich das zuerst las, kam mir der Aufbau eines Rummel-Fahrgeschäftes in den Sinn.
Viel anders ist das hier aber tatsächlich nicht.

Als erstes musst Du für Deine Endschalter die Eingänge definieren und dann auf die Stellungen reagieren.
Da es Microschalter sind - also mechanisch - werden sie prellen

Das lässt sich ausmerzen. Bis dahin geht aber noch einiges an Wasser den Bach runter.

Vom Prinzip her hast Du ja bereits den Ansatz, 2 Motoren drehen in Richtung a - der andere in Richtung b.
Jetzt musst Du nur auf den "Anstoss" reagieren.

Kein Hexenwerk - lässt sich aufdröseln, aber von mir nocheinmal die Bitte: Modifiziere Deinen eingestellten Code so, das der auch lesbar ist. Bei sovielen Leerzeilen und alles ohne Einrückung, kommt kein Mensch hinterher.
Leerzeilen raus - STRG-T drücken - Und den Code da oben in Deinem Post ersetzen - geht unten rechts über modify.

StefanL38:
Oder wenn du nicht weist wie man diese IO-Port-Nummern herausfindest

Das was Du meinst, sind PIN! Ein Port ist etwas anderes. Und hat keine Nummern.

agmue:
Mein Tipp sind die MobaTools

Die Idee ist nicht schlecht - aber nur drei sich (fast gleichmässig) drehende Stepper und drei Ereignistasten und dazu einen absoluen Neuling - da steigt wohlmöglich der Frustfaktor... :wink:

Schönes Wochende!

my_xy_projekt:
Die Idee ist nicht schlecht - aber nur drei sich (fast gleichmässig) drehende Stepper und drei Ereignistasten und dazu einen absoluen Neuling - da steigt wohlmöglich der Frustfaktor... :wink:

Ich halte die MobaTools für dieses Projekt besonders geeignet, weil sie

  • die interruptgesteuerte Motorsteuerung enthalten, so daß selbst eine blockierende Programmierung die Motoren nicht aus dem Takt bringt
  • eine Tastenentprellung enthält
  • einen Ersatz für millis bereitstellt

Nach meiner Einschätzung benötigt der TO sowiso eine für ihn steile Lernkurve, um das Projekt zu einem Erfolg zu führen.

Selbstverständlich kann ich mich komplett irren :slight_smile:

Beispielsweise erinnere ich mich an RudiDL5, der verhalten anfing und mich dann mit Lichtgeschwindigkeit überholt hat. Seine Bescheidenheit habe ich damals fehlinterpretiert. Er war einer von denen, die mir OOP schmackhaft gemacht haben. Anleitung: Endlicher Automat mit millis()

agmue:
Beispielsweise erinnere ich mich an RudiDL5, der verhalten anfing und mich dann mit Lichtgeschwindigkeit überholt hat. Seine Bescheidenheit habe ich damals fehlinterpretiert. Er war einer von denen, die mir OOP schmackhaft gemacht haben. Anleitung: Endlicher Automat mit millis()

Danke für die Leseempfehlung :wink:

my_xy_projekt:
Danke für die Leseempfehlung :wink:

Ich hatte es eigentlich für Dich nicht als Leseempfehlung gedacht, aber bitte gerne ;D

Eine Suche im Forum nach "agmue anleitung" fördert noch mehr zu Tage, teilweise etwas angestaubt, aber auch mit Links zu vergleichbaren Themen.

Um den Frustfaktor niedrig zu halten, habe ich mit den MobaTools und einem Motor ein Beispiel zusammengestellt. Der Motor dreht endlos. Wird der Endtaster gedrückt, ändert sich die Drehrichtung.

#define MAX8BUTTONS
#include <MobaTools.h>
MoToStepper Step_X(200, A4988);
MoToTimer   delayTime;
enum {X_ACHSE};
const byte pinEndstop[] = { 9 };                 // pinEndstop_X
const byte anzahlTaster = sizeof(pinEndstop);    // Anzahl der angeschlossenen Taster

button_t getHW( void ) {
  button_t tasterTemp = 0;
  for (byte i = 0; i < anzahlTaster; i++) {
    bitWrite( tasterTemp, i, !digitalRead(pinEndstop[i]) );   // Fragt den Taster ab und merkt sich den Status
  }
  return tasterTemp;
}

MoToButtons Taster( getHW, 20, 500 );

void setup() {
  for (byte i = 0; i < anzahlTaster; i++)  {     // Bei Abfrage auf < kann man das -1 sparen
    pinMode(pinEndstop[i], INPUT_PULLUP); // gedrückt = LOW
  }
  Step_X.attach( 2, 5 );            // STEPpin, DIRpin
  Step_X.setSpeed( 800 );           // = 80 U/Min (motorspezifisch)
  Step_X.setRampLen( 50 );          // Beschleunigung (motorspezifisch)
}

void loop() {
  Taster.processButtons();
  static byte status;               // Schrittkettenstatus
  static int8_t richtung = 1;       // vorwärts = 1; stop = 0; rückwärts = -1

  switch (status) {
    case 0:
      Step_X.rotate(richtung);
      if (Taster.pressed(X_ACHSE)) {      // Endstop_X betätigt
        Step_X.rotate(0);                 // 0 = Stopp mit Rampe
        status++;
      }
      break;
    case 1:
      if ( !Step_X.moving() ) {     // warten bis die Bewegung abgeschlossen ist
        delayTime.setTime(100);     // Timer aufziehen
        status++;
      }
      break;
    case 2:
      if ( !delayTime.running() ) { // warten bis delay-Zeit abgelaufen ist
        richtung *= -1;             // Richtung wechseln
        status = 0;
      }
      break;
    default:
      status = 0;
  }
}

EDIT: Vorbereitung für mehrere Achsen

Ich danke Euch für die Erklärungen so langsam erkenne ich einiges.....mit fast 60 ist das Schwerer Stoff.

@agmue Dein Sketch finde ich ut nur habe ich DVR8825 Treiber und die will es einfach nicht erkennen.

Arduino: 1.8.13 Hourly Build 2020/04/21 12:33 (Windows 10), Board: "Arduino Uno"

sketch_jul11a:3:24: error: 'DRV8825' was not declared in this scope

MoToStepper Step_X(200,DRV8825);

^~~~~~~

exit status 1
'DRV8825' was not declared in this scope