Das ist Holunder Sirup. Sehr süße Pampe. Bei mir faulen Hund dauert es immer etwas, bis der Müll den Weg zur Tonne findet

Forum zur gegenseitigen Hilfe für Hobby´s, Spass und Technik, im Raum Penzberg, Garmisch, Bad Tölz, Seeshaupt
3;0;1;1000;4000;10
1;1;1;1000;32000;80
3;0;2;1000;4000;10
1;1;2;1000;32000;80
3;0;2;1000;4000;10
1;1;2;1000;48000;120
3;0;1;1000;4000;10
1;1;1;1000;48000;120
3;0;1;1000;4000;10
???Anstelle von 120mm
1;1;2;1000;48000;120
1;1;1;1000;48000;120
fährt er jeweils 43,84mm gem. Anzeige im Display
Code: Alles auswählen
/*
################################################################################################################
+++++++++++++++++++++++++++++++Kreuztisch_Pr._V3.5 vom 27.02.2022+++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Kreuztisch Steuerung mit Schrittmototoren erstellt mit der Mobatools Lib. die ich sehr empfehlen kann.
Die Fahrdaten werden mit Excel eingegeben, auf eine SD-Karte mit Trennung durch Semikolon exportiert,
und vom Arduino wieder ausgelesen.
Die beötigten Daten in einer Fahrdaten Zeile sind:
Position 1: Motor / Achse 1 - 3 für X, Y, Z
Position 2: Fahren ja / nein. Im Moment immer 1
Position 3: Dir, also rechts / links = 1 - 2
Position 4: Tempo 1 - 1000
Position 5: Schritte 1 - 250000
Das ist die Version 3.2 als erster Lauffähiger Code.
Die Pins des Kartenlesers sind beim Arduino Mega:
Miso Pin 50
Mosi Pin 51
SCK Pin 52
CS Pin 53
GND und VCC 5 Volt natürlich auch noch.
Der Kartenleser macht Karten bis 32GB
Mit FAT16/FAT32-Partition
Wenn die Fahrgeschwindigkeit zu gering ist, kann man in der Lib.Datei "MobaTools.h"
"#define CYCLETIME 200" ändern auf "#define CYCLETIME 100"
Dann das Programm nochmal neu auf den Arduino übertragen.
!!!Achtung!!! die Mobatools.d ist dann für dieses Programm i.O.
aber muss danach wieder in den ursprünglichen Zustand versetzt werden !!
Wir belegen mit SPI und I2C mindestens 27-30 Pin´s also fallen kleinere Arduinos aus.
Im Moment sind es nur 23 Pin´s aber für Spindel ein/aus, Kühlung, Absaugung,
sollte man sich die Möglichkeit offen halten. Also lieber mit 30 rechnen!!!
Ich habe immer gerne Luft nach oben, wenn ich was baue.
###############################################################################################################
*/
#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 automatik = 0;
//----------------Sonderzeichen-------------------
#define OHM "\xF4" // Zeichen für Ohm
#define AE "\xE1" // Zeichen für "ä"
#define OE "\xEF" // Zeichen für "ö"
#define SS "\xE2" // Zeichen für "ß"
#define OBEN "\x5E" // Zeichen für "hoch"
#define RECHTS "\176" // Pfeil nach rechts
#define LINKS "\177" // Pfeil nach links
#define UE "\365" // Zeichen für "ü"
#define GRAD "\337C" // Zeichen für "Grad" Celsius
//------------------------------------------------
#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 Bedienteil---
const byte button8Pin = A8; //---Fräsen Start Station------
//--------------Taste zum Entsperren, wenn Stopp durch fahren==0
const byte entsperrtaste = A9; // Taste die nicht im MoToButton integriert ist
//----------Tempo_Poti---------------------------------------------------------------
const byte potPin = A0; // Poti muss ein analoger Eingang sein
const int STEPS_REVOLUTION = 1600;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster02 300ms aussetzen
const unsigned long Pausezeit01 = 1000;
//--------Fahrdaten------------------------------------------------------------------
byte motor = 0; // Achsenauswahl 1-2-3 ist X-Y-Z
byte fahren = 1; // 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
float mm = 0;
float multiplikator = 25;
float teiler = 10000;
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);
pinMode(entsperrtaste, INPUT_PULLUP); // Eingang für Entsaperrtaste
//-----------------------------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)) // Ist SD Karte nicht ansprechbar?
{
Serial.println("Initialisierung fehlgeschlagen!");
lcd.setCursor (0, 0);
lcd.print(F("!! Karten_Fehler !!"));
while (1); // Wenn Karte nicht ansprechbar, ist hier Programm Ende !!!
}
lcd.setCursor (0, 1);
lcd.print(F(" "));
lcd.setCursor (0, 1);
lcd.print(F(" Karte ist bereit! "));
//-----------------------------------------------------------------------------------------
}
//=============================================================================================================
void loop() {
lcd.setCursor (0, 0);
lcd.print(F("Kreuztisch_Pr._V3.5 "));
//------SD_Karte öffnen zum Lesen-------------------------------------------------------
if (automatik == 1)
{
lcd.setCursor (0, 2);
lcd.print(F(" Automatik l"AE"uft "));
lcd.setCursor (0, 3);
lcd.print(F(" "));
lcd.setCursor (0, 1);
lcd.print(F(" "));
myFile = SD.open(filename);
if (myFile)
{
while (myFile.available())
{
if (fahren == 1)
{
leseZeile();
ausgabeZeile();
teileZeile();
ausgabeWerte();
}
else {
// ---------------Ist Taste Weiter gedrückt??---------------------------------
if (digitalRead(entsperrtaste) == 0)
{
fahren = 1;
lcd.setCursor (0, 2);
lcd.print(F(" Weiterfahren "));
}
}
}
// schließe die Datei:
myFile.close();
//Serial.println(F(" geschlossen!"));
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;
tempo = tempo1;
if (millis() - Sekundenablauf01 >= Pausezeit01) // 1000msec abgelaufen?
{
lcd.setCursor (0, 3);
lcd.print (F(" VSPEED = "));
lcd.setCursor (12, 3);
lcd.print (F(" "));
lcd.setCursor (12, 3);
lcd.print (vspeed);
Sekundenablauf01 = millis();
}
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) ) {
//Taster3 gedrückt
tempo = tempo1;
myStepperY.rotate( 1 ); // Stepper2 dreht vorwärts
}
if ( button.released(Button3) ) {
//Taster3 losgelassen
myStepperY.rotate(0); // Stepper2 stoppt
}
//Drehen Motor2 linksrum
if (button.pressed(Button4) ) {
//Taster4 gedrückt
tempo = tempo1;
myStepperY.rotate( -1 ); // Stepper2 dreht rückwärts
}
if ( button.released(Button4) ) {
//Taster4 losgelassen
myStepperY.rotate(0); // Stepper2 stoppt
}
//-----------------------------------------------------------------
// Drehen Motor3 rechtsrum
if (button.pressed(Button5) ) {
//Taster5 gedrückt
tempo = tempo1;
myStepperZ.rotate( 1 ); // Stepper3 dreht vorwärts
}
if ( button.released(Button5) ) {
//Taster5 losgelassen
myStepperZ.rotate(0); // Stepper3 stoppt
}
//Drehen Motor3 linksrum
if (button.pressed(Button6) ) {
//Taster6 gedrückt
tempo = tempo1;
myStepperZ.rotate( -1 ); // Stepper3 dreht rückwärts
}
if ( button.released(Button6) ) {
//Taster6 losgelassen
myStepperZ.rotate(0); // Stepper3 stoppt
}
if (button.pressed(Button7) ) {
//Taster7 gedrückt
automatik = 1; // Automatik von SD Karte starten
}
if ( button.released(Button7) ) {
//Taster7 losgelassen
}
if (button.pressed(Button8) ) {
//Taster8 gedrückt
automatik = 1; // Automatik von SD Karte starten
}
if ( button.released(Button8) ) {
//Taster8 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("eingelesene Zeile ist: "));
Serial.println(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);
mm = atoi(auswerteBuffer[5]);
schritte = (mm *10000) / 25;
if (b == 0)
{
lcd.setCursor (0, 3);
lcd.print(F(" "));
lcd.setCursor (0, 0);
lcd.print(F(" "));
//----Display Motor1-------------
if (motor == 1)
{
lcd.setCursor (1, 0);
lcd.print("Mot X");
lcd.print (F(" "));
if (richtung == 1)
{
lcd.print(F(RECHTS));
}
if (richtung == 2)
{
lcd.print(F(LINKS));
}
}
//----Display Motor2-------------
if (motor == 2)
{
lcd.setCursor (1, 0);
lcd.print("Mot Y");
lcd.print (F(" "));
if (richtung == 1)
{
lcd.print(F("v"));
}
if (richtung == 2)
{
lcd.print(F(OBEN));
}
}
//----Display Motor3-------------
if (motor == 3)
{
lcd.setCursor (1, 0);
lcd.print("Mot Z");
lcd.print (F(" "));
if (richtung == 1)
{
lcd.print(F(OBEN));
}
if (richtung == 2)
{
lcd.print(F("v"));
}
}
lcd.print (F(" "));
lcd.print(mm);
lcd.print("mm");
}
//-------------Motor 1 fahren------
if (motor == 1)
{
if (richtung == 1)
{
myStepperX.doSteps(schritte);
}
if (richtung == 2)
{
myStepperX.doSteps(-schritte);
}
motor = 0;
richtung = 0;
schritte = 0;
}
//-------------Motor 2 fahren------
if (motor == 2)
{
if (richtung == 1)
{
myStepperY.doSteps(schritte);
}
if (richtung == 2)
{
myStepperY.doSteps(-schritte);
}
motor = 0;
richtung = 0;
schritte = 0;
}
//------------Motor 3 fahren-------
if (motor == 3)
{
if (richtung == 1)
{
myStepperZ.doSteps(schritte);
}
if (richtung == 2)
{
myStepperZ.doSteps(-schritte);
}
if (fahren == 0)
{
lcd.setCursor (0, 2);
lcd.print(F(" --- BOHRSTOPP --- "));
}
motor = 0;
richtung = 0;
schritte = 0;
}
}//---------fahren ende-----------------
while (myStepperX.moving() > 0) {}
while (myStepperY.moving() > 0) {}
while (myStepperZ.moving() > 0) {}
}
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste