Kreuztisch mit Schrittmotoren bestücken

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Also das mit dem Excel aus der Speicherkarte lesen und in einzelne Variablen zerlegen, das ist hartes Brot :agt: Aber ich habe ja Zeit. Jetzt wird erst mal geschlafen. Dann gehts wieder frisch ans Werk :(oo):

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Bin noch nicht wirklich weiter gekommen. Und als ich meine Bücher ausgepackt habe und im ArduinoCC Forum nachgefragt habe, war dann Spieleabend angesagt. Naja, das habe ich dann der Arbeit vorgezogen :(o): :oo:

Jetzt habe ich wenigstens beim Spieleabend ein paar Gewinne eingefahren, wenn ich schon bei der Arbeit auf dem Holzweg bin. Aber es gab ein paar Antworten im ArduinoCC. Da werde ich mich dann morgen mit neuen Elan drüber machen. Heute bin ich erst mal sehr müüüüüüde :eek:

Morgen muss ich auch in meinem Hausmeisterjob was tun. Aaaaaber dann geht los. :(V):

Grüße aus dem kalten Ohlstadt.
Franz :oo:

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

So ich habe eine mehr als gute Hilfe im ArduinoCC Forum bekommen. Das muss ich jetzt nur noch einbauen ins vorhandene Programm. Dann sollte ich mit den Excel Daten die ich eingebe, etwas fräsen oder Bohren können. Wenn du am WE Zeit hast, könnten wir uns das dann mal anschauen.

Franz

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Wie weit bist du mit deinem Umbau? Hängen die Motoren auch schon dran?

Ich habe mir jetzt mal einen Joystick bestellt, dass ich beim fahren auf Position nicht mit 4 Knöpfen hantieren muss, sondern einfach nur mit den Joystick. Für die Z-Achse bleibt ich bei knöpfen, wobei es auch 2 Punkt Joysticks gäbe. Oder man nimmt für die Z-Achse auch einen 4 Punkt, und fährt mit der einen Richtung rauf runter, und mit recht und links macht man Fräsmotor ein / aus. Wäre auch noch eine Möglichkeit. Naja, ist alles noch offen.

Franz

Benutzeravatar
e69-fan
Beiträge: 237
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von e69-fan »

Hallo Franz,

ich habe den kompletten Tisch umgebaut, d.h. die Achsen gedreht und die y-Achse durch eine längere ersetzt. Die Stepper befinden sich dann links und hinten. Die y- Ackse geht dann seitlich an der Säule vorbei. Die Stepper sollen leicht von der Achse abgezogen werden und bei Bedarf werden sie durch eine Kurbel oder ein Handrad ersetzt. Ebenso wichtig erscheint mir ein optimaler Staubschutz und ein Anschluss für die Absaugung.

Über den Schaltschrank habe ich mir auch schon Gedanken gemacht - Mal sehen was der Fundus hergibt.

Das Netzteil habe ich auch bekommen. Hoffentlich funktioniert es - billigste Chinaware ohne jegliche Dokumente bzw. Prüfzeichen. Naja, kann man ja austauschen.

Ansonsten warte ich auf Deine ersten Probefahrten.

Schönen Abend - Wolfgang
Grüße aus der Heimat der E69

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe das hier bestellt. Kommt am Montag. Ja, ansonsten hatte ich heute keine Lust mehr, am Programm zu arbeiten. Ich habe manchmal nen Durchhänger, da bin ich dann etwas müde. Aber vielleicht mache ich heute Abend noch ein bischen weiter.
e69-fan hat geschrieben:
Do 13. Jan 2022, 20:39
Ebenso wichtig erscheint mir ein optimaler Staubschutz und ein Anschluss für die Absaugung.
Über den Schaltschrank habe ich mir auch schon Gedanken gemacht - Mal sehen was der Fundus hergibt.
Das Netzteil habe ich auch bekommen. Hoffentlich funktioniert es - billigste Chinaware ohne jegliche Dokumente bzw. Prüfzeichen. Naja, kann man ja austauschen.
Ich habe ein Netzteil mit CE. Aber das ist doch eh alles das selbe. Alles aus China. Staubschutz ja, da habe ich mir auch ein paar Gedanken gemacht, aber die Umsetzung kommt nach dem das Zeug erst mal so läuft, wir ich es mir vorstelle. Der Schaltschrank ja, da dachte ich an ein PC Gehäuse, aber ich habe leider alles weggeschmissen beim Umzug nach Ohlstadt. Ich schaue mal ob ich gelegentlich zu einem Kunden nach München komme, da könnte ich so viele haben wie ich will. Oder ich schaue mal in Ebay.

Servus, schönen Abend
Franz

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich bin jetzt schon seeeeehr weit. Hatte nochmal Hilfe von ArduinoCC Forum. Aber jetzt denke ich bin ich da, wo ich hin wollte. Also das alles, was ich jetzt beisammen habe, selber mit Büchern lernen, das ist seeeeeehr schwer. Ich glaube da gingen 1-2 Monate ins Land, bis ich das auf dem Schirm habe. Aber dadurch dass ich erst mal einen Code bekommen habe, der mein Problem gelöst hat, habe ich einen Grundstock um damit jetzt wieder selber klar zu kommen. Ich muss nur noch diese beiden Programmteile Befehl für Befehl zerpflücken und testen, dann bin ich fit. Aber das ist ne Fleisßaufgabe für danach. Wenn der Tisch erst mal läuft. Dann möchte ich das nächste mal nicht mehr fragen müßen, sondern einfach machen. In dem Teil sind lauter Befehle, die ich noch in keiner Deutschen C Anleitung gefunden habe. Sogar in dem fetten C++ Programmierer Buch habe ich die Befehle nur erwähnt, aber nicht erklärt, gefunden. Aber das schaue ich dann nochmal nach. Kann mir eigentlich nicht wirklich vorstellen, dass die diese Befehle einfach untern Tisch fallen lassen. Dafür sind die zu wichtig. Wahrscheinlich war ich nur zu blöd zum suchen. :(o): :(o): Wir werden sehen.

Schönen Abend :(V):
Franz

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Also bei mir schaut es schon seeeehr gut aus. Ich habe noch eine Kleinigkeit zu machen,dann ist die Beta 0.1 wohl am Start. Also Programmmässig. Was mir dann noch fehlt ist die Z-Achse und der Fräskopf. Das mache ich dann kommendes Monat. wenn du eher bereit bist, dir fehlt ja nur die Z-Achse, dann könnten wir ja bei dir schon mal starten.

Servus
Franz

PS: Wenn du dieses WE mal kommen willst, dann rühre dich wann du Zeit hast. Ich muss dir ja dann noch zeigen wie es funktioniert, mit dem auf den Nullpunkt fahren, eine Karte in Excel schreiben, und abfahrt.

Benutzeravatar
Admin
Administrator
Beiträge: 525
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Soooo, jetzt habe eine Lauffähige Version. Da werde ich sicher noch drann rumbauen. Aber es läuft erst mal.

Hier das Programm, wie es im Moment ist. Es läuft derzeit am Arduino Mega. Ich habe alle Serial.print() Geschichten auskommentiert. Nur Fehlermeldungen lasse ich noch ausgeben. Alles andere wird übers Display angezeigt. Also das Display sollte man schon haben. Ich habe noch keine Z-Achse, deshalb ist bei mir jetzt erst mal Pause.

Code: Alles auswählen

////////// Beispiel 3 für MoToStepper - Betreiben eines bipolaren Steppers mit step/dir und enable  ////////////
/*  Beispiel für die Ansteuerung eines bipolaren Steppers über 4 Taster und
    ein Poti ( für die Geschwindigkeit )
    In diesem Beispiel werden neben der Stepperklasse (MoToStepper), auch die MoToButtons
    und der MoToTimebase genutzt.
    Der Spulenstrom wird abgeschaltet, wenn der Stepper nicht läuft.
    Die Taster müssen gegen Gnd schalten, es sind keine Widerstände notwendig
    Button1:  Dreht rechts, solange Taster gedrückt
    Button2:  Dreht links, solange Taster gedrückt
    Button3:  1 Umdrehung rechts
    Button4:  1 Umdrehung links
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---SD Kartenleser-------------------------------
#include <SPI.h>
#include <SD.h>
File myFile;
byte gelesen = 0;
const byte chipSelectPin = 53;
const String filename = "Mappe1.csv";
char zeilenBuffer[30];
char auswerteBuffer[6][8];
byte durchgaenge = 0;
byte automatik = 0;
//------------------------------------------------
#define MAX8BUTTONS // spart Speicher, da nur 8 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
// Pindefinitions - change to your needs
//----------Motor 1-------------------------------
const byte dirPin1       = 5;
const byte stepPin1      = 4;
const byte enaPin1       = 6;
//----------Motor 2-------------------------------
const byte dirPin2       = 9;
const byte stepPin2      = 8;
const byte enaPin2       = 10;
//----------Motor 3-------------------------------
const byte dirPin3       = 44;
const byte stepPin3      = 43;
const byte enaPin3       = 45;
//----------Taster--------------------------------
const byte button1Pin   = A1; //---Motor1 links---
const byte button2Pin   = A2; //---Motor1 rechts--
const byte button3Pin   = A3; //---Motor2 links---
const byte button4Pin   = A4; //---Motor2 rechts--
const byte button5Pin   = A5; //---Motor3 links---
const byte button6Pin   = A6; //---Motor3 rechts--
const byte button7Pin   = A7; //---Fräsen Start---
const byte button8Pin   = A8; // Frei
//----------Tempo_Poti---------------------------------------------------------------
const byte potPin       = A0;   // Poti muss ein analoger Eingang sein
const int STEPS_REVOLUTION = 1600;
//--------Fahrdaten------------------------------------------------------------------
byte motor = 0;               // Achsenauswahl 1-2-3 ist X-Y-Z
byte fahren = 0;              // Motoren bewegen
byte richtung = 0;            // Richtung der Bewegung 1 oder 2
int tempo1 = 0;               // Tempo für Handsteuerung, wird vom Poti eingestellt
int tempo2 = 0;               // Tempo zum Fräsen
int tempo = 0;                // Wird vom Programm zur übergabe benutzt
unsigned long schritte = 0;   // Schritte die der Motor fahren soll
//-----------------------------------------------------------------------------------
//Stepper einrichten ( 1600 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepperX( STEPS_REVOLUTION, STEPDIR );  // 1600 Steps/ Umdrehung
MoToStepper myStepperY( STEPS_REVOLUTION, STEPDIR );  // 1600 Steps/ Umdrehung
MoToStepper myStepperZ( STEPS_REVOLUTION, STEPDIR );  // 1600 Steps/ Umdrehung
// Taster einrichten
// Den Tasternamen die Indizes 0...7 zuordnen
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 };
// muss als byte definiert sein, damit ein enfaches sizeof funktioniert
const byte buttonPins[] = { button1Pin, button2Pin, button3Pin, button4Pin, button5Pin, button6Pin, button7Pin, button8Pin};
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
// the speed pot ist read only every 'speedintervall' ms

int vspeed = 0;                 //Steppergeschwindigkeit in U/min*10
//==============================================================================================================
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  //-----------------------------Motor 1----------------------------------------------------
  myStepperX.attach( stepPin1, dirPin1 );
  myStepperX.attachEnable( enaPin1, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperX.setSpeed( 200 );
  myStepperX.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );                  // 100ms Tickerzeit
  //------------------------------Motor 2-----------------------------------------------------
  myStepperY.attach( stepPin2, dirPin2 );
  myStepperY.attachEnable( enaPin2, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperY.setSpeed( 200 );
  myStepperY.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  //-----------------------------Motor 3------------------------------------------------------
  myStepperZ.attach( stepPin3, dirPin3 );
  myStepperZ.attachEnable( enaPin3, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperZ.setSpeed( 200 );
  myStepperZ.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  //------------------------------------------------------------------------------------------
  //----------CD_Kartenleser aktivieren-------------------------------------------------------
  pinMode(SS, OUTPUT);
  Serial.begin(9600);
  while (!Serial)
    Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelectPin))
  {
    Serial.println("Initialisierung fehlgeschlagen!");
    while (1);
  }
  //Serial.println("Initialisierung abgeschlossen .");
  //-----------------------------------------------------------------------------------------
}
//=============================================================================================================
void loop() {
  lcd.setCursor (0, 0);
  lcd.print(F("Kreuztisch_Pr._V3.2 "));
  //------SD_Karte öffnen zum Lesen-------------------------------------------------------
  if (automatik == 1)
  {
    myFile = SD.open(filename);
    //Serial.print(filename);
    if (myFile)
    {
      //Serial.println(F(" geöffnet!"));
      while (myFile.available())
      {
        //Serial.print(F("Durchgaenge= "));
        //Serial.println(durchgaenge);
        durchgaenge ++;
        leseZeile();
        ausgabeZeile();
        teileZeile();
        ausgabeWerte();
      }
      // schließe die Datei:
      myFile.close();
      //Serial.println(F(" geschlossen!"));
      //while (1);
      automatik = 0;
      lcd.setCursor (0, 2);
      lcd.print (F("                    "));
      lcd.setCursor (0, 2);
      lcd.print (F(" Karte abgearbeitet "));
    }
    else
    {
      // Wenn die Datei nicht geöffnet wurde, drucke einen Fehler :
      //Serial.print("Fehler beim öffnen von ");
      //Serial.println(filename);
    }
  }
  //--------------------------------------------------------------------------------------
  button.processButtons();          // Taster einlesen und bearbeiten

  // Speed alle 100ms neu einlesen und setzen
  if ( speedIntervall.tick() ) {
    // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 1800);  //Poti mappen auf 2 ... 180 Umdr/Min
    //min speed =2 and max speed =180 rpm
    tempo1 = vspeed;
    myStepperX.setSpeed( tempo );
    myStepperY.setSpeed( tempo );
    myStepperZ.setSpeed( tempo );
  }
  //----------------------------------------------------------------
  // Drehen Motor1 rechtsrum
  if (button.pressed(Button1) ) {
    //Taster1 gedrückt
    tempo = tempo1;
    myStepperX.rotate( 1 );          // Stepper1 dreht vorwärts
  }
  if ( button.released(Button1) ) {
    //Taster1 losgelassen
    myStepperX.rotate(0);             // Stepper1 stoppt
  }

  //Drehen Motor1 linksrum
  if (button.pressed(Button2) ) {
    //Taster2 gedrückt
    tempo = tempo1;
    myStepperX.rotate( -1 );         // Stepper1 dreht rückwärts
  }
  if ( button.released(Button2) ) {
    //Taster2 losgelassen
    myStepperX.rotate(0);    // Stepper1 stoppt
  }
  //-----------------------------------------------------------------
  // Drehen Motor2 rechtsrum
  if (button.pressed(Button3) ) {
    //Taster1 gedrückt
    tempo = tempo1;
    myStepperY.rotate( 1 );          // Stepper2 dreht vorwärts
  }
  if ( button.released(Button3) ) {
    //Taster1 losgelassen
    myStepperY.rotate(0);             // Stepper2 stoppt
  }

  //Drehen Motor2 linksrum
  if (button.pressed(Button4) ) {
    //Taster2 gedrückt
    tempo = tempo1;
    myStepperY.rotate( -1 );         // Stepper2 dreht rückwärts
  }
  if ( button.released(Button4) ) {
    //Taster2 losgelassen
    myStepperY.rotate(0);            // Stepper2 stoppt
  }
  //-----------------------------------------------------------------
  // Drehen Motor3 rechtsrum
  if (button.pressed(Button5) ) {
    //Taster1 gedrückt
    tempo = tempo1;
    myStepperZ.rotate( 1 );          // Stepper3 dreht vorwärts
  }
  if ( button.released(Button5) ) {
    //Taster1 losgelassen
    myStepperZ.rotate(0);             // Stepper3 stoppt
  }

  //Drehen Motor3 linksrum
  if (button.pressed(Button6) ) {
    //Taster2 gedrückt
    tempo = tempo1;
    myStepperZ.rotate( -1 );         // Stepper3 dreht rückwärts
  }
  if ( button.released(Button6) ) {
    //Taster2 losgelassen
    myStepperZ.rotate(0);            // Stepper3 stoppt
  }
  if (button.pressed(Button7) ) {
    //Taster7 gedrückt
    automatik = 1;
  }
  if ( button.released(Button7) ) {
    //Taster7 losgelassen
  }
  //-----------------------------------------------------------------

}
//=========================================================================================
void leseZeile()
{
  char myChar = '\0';
  static byte bufferPosition = 0;
  if (bufferPosition == 0) memset(zeilenBuffer, '\0', sizeof(zeilenBuffer));
  while (myFile.available() && myChar != '\n')
  {
    myChar = myFile.read();
    if (isPrintable(myChar))
    {
      zeilenBuffer[bufferPosition] = myChar;
      bufferPosition++;
    }
  }
  // Hier ist ZeilenEnde / DateiEnde
  bufferPosition = 0;
}
//=========================================================================================
void ausgabeZeile()
{
  //Serial.print(F("eingelsene Zeile ist: "));
  //Serial.println(zeilenBuffer);
  lcd.setCursor (0, 0);
  lcd.print (F("                    "));
  lcd.setCursor (0, 0);
  lcd.print (zeilenBuffer);
}
//=========================================================================================
void teileZeile()
{
  // zeilenbuffer in auswerteBuffer umschreiben
  memset(auswerteBuffer, '\0', sizeof(auswerteBuffer) / sizeof(auswerteBuffer[0]));
  strcpy (auswerteBuffer[0], strtok(zeilenBuffer, ";"));
  strcpy (auswerteBuffer[1], strtok(NULL, ";"));
  strcpy (auswerteBuffer[2], strtok(NULL, ";"));
  strcpy (auswerteBuffer[3], strtok(NULL, ";"));
  strcpy (auswerteBuffer[4], strtok(NULL, ";"));
  strcpy (auswerteBuffer[5], strtok(NULL, ";"));
  //Serial.println(F("Puffer geteilt!"));
}
//========================================================================================
void ausgabeWerte()
{
  for (byte b = 0; b < sizeof(auswerteBuffer) / sizeof(auswerteBuffer[0]); b++)
  {
    //Serial.print(F("Wert "));
    //Serial.print(b);
    //Serial.print(F(" ist: "));
    //Serial.println(auswerteBuffer[b]);
    motor = atoi(auswerteBuffer[0]);
    fahren = atoi(auswerteBuffer[1]);
    richtung = atoi(auswerteBuffer[2]);
    tempo = atoi(auswerteBuffer[3]);
    myStepperX.setSpeed(tempo);
    myStepperY.setSpeed(tempo);
    myStepperZ.setSpeed(tempo);
    schritte = atoi(auswerteBuffer[4]);

    lcd.setCursor (0, 2);
    lcd.print(F("                    "));
    lcd.setCursor (0, 2);
    lcd.print(motor);
    lcd.print (F("/"));
    lcd.print(fahren);
    lcd.print (F("/"));
    lcd.print(richtung);
    lcd.print (F("/"));
    lcd.print(tempo);
    lcd.print (F("/"));
    lcd.print(schritte);
    //-------------Motor 1-----------------
    if (motor == 1)
    {
      if (richtung == 1)
      {
        myStepperX.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperX.doSteps(-schritte);
      }
      fahren = 0;
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
    //-------------Motor 2-----------------
    if (motor == 2)
    {
      if (richtung == 1)
      {
        myStepperY.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperY.doSteps(-schritte);
      }
      fahren = 0;
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
    //------------Motor 3------------------
    if (motor == 3)
    {
      if (richtung == 1)
      {
        myStepperZ.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperZ.doSteps(-schritte);
      }
      fahren = 0;
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
  }//---------fahren ende-----------------
  while(myStepperX.moving()>0){}
  while(myStepperY.moving()>0){}
  while(myStepperZ.moving()>0){}
}

Benutzeravatar
e69-fan
Beiträge: 237
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von e69-fan »

Super, dann werde ich Mal einen MEGA besorgen.

Schönen Abend - Wolfgang
Grüße aus der Heimat der E69

Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste