Arduino verbindet sich nicht per UART mit TMC2208

Hallo,

ich habe einen Arduino Mega 2560 und möchte mit ihm einen MKS TMC2208 V2 Steuern und per Uart konfigurieren.

Ich habe den Beispielcode von GitHub - teemuatlut/TMC2208Stepper genommen und ein wenig verändert.

#define EN_PIN    53                 // LOW: Driver enabled. HIGH: Driver disabled
#define STEP_PIN  52                 // Step on rising edge
#define DIR_PIN   51                 // Direction Pin

#include <TMC2208Stepper.h>             // Include library
TMC2208Stepper driver = TMC2208Stepper(&Serial2);  // Create driver and use
                         // HardwareSerial2 for communication

void setup() {
 Serial.begin(115200);             // Init used serial port
 Serial2.begin(115200);             // Init used serial port
 while(!Serial);                 // Wait for port to be ready
 while(!Serial2);
 Serial.println("TMC2208: Hi!"); //print a message

if(Serial2.available()>0)
{
 Serial.println("TMC2208: Noob!"); //print a message
}
 // Prepare pins
 pinMode(EN_PIN, OUTPUT);
 pinMode(STEP_PIN, OUTPUT);

 driver.pdn_disable(1);              // Use PDN/UART pin for communication
 driver.I_scale_analog(0);           // Adjust current from the registers
 driver.rms_current(700);            // Set driver current 700mA
 driver.microsteps(256);            // Set driver microsteps
 driver.toff(0x2);               // Enable driver

 digitalWrite(53, LOW);              // Enable driver
 digitalWrite(51, HIGH);              // CW or CCW
}

void loop() {
 digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Step
 delayMicroseconds(500);
}

ich habe alles so angeschlossen wie im beispiel (und vref auf 1,5v eingestellt) aber wenn ich microsteps verändere verändert sich die geschwindigkeit vom motor nicht.

Wäre nice wenn mir jemand helfen könnte.

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.

Gruß Tommy

schon geändert :slight_smile:

Hast du das denn auch mal mit dem originalen Beispielsketch probiert ?

Die beiden while im Setup darfst du gern wegnehmen.

ja, ich hatte lediglich die step/enable pins geändert und bei "TMC2208Stepper driver = TMC2208Stepper(&Serial);" serial zu serial2 geändert

ManMadeDesaster:
ja, ich hatte lediglich die step/enable pins geändert und bei "TMC2208Stepper driver = TMC2208Stepper(&Serial);" serial zu serial2 geändert

Das sehe ich anders, wenn ich die beiden Sketche vergleiche hastdu mehr verändert.

Das solltest du rückgängig machen, dann wirds auch funktionieren.
Z.B. die while-Schleifen im Setup. Wozu brauchst du die ?

ich habe mich falsch ausgedrückt. Ich hatte es am Anfang mit dem Originalen Sketch probiert jedoch mit den Geänderten Pins und Serial zu Serial2 geändert. Danach habe ich den anderen Code hinzugefügt (so wie es im Hauptpost aussieht). Ich versuche es dennoch nochmal mit dem originalen.

ManMadeDesaster:
ich habe mich falsch ausgedrückt. Ich hatte es am Anfang mit dem Originalen Sketch probiert jedoch mit den Geänderten Pins und Serial zu Serial2 geändert. Danach habe ich den anderen Code hinzugefügt (so wie es im Hauptpost aussieht). Ich versuche es dennoch nochmal mit dem originalen.

Das ist gut so.
In deinem Sketch sind Dinge drin, die du nicht brauchst und nur stören.

Und was ich in deinem Sketch vermisse, ist ein "driver.push".
Denke ohne dem gehts nicht.

#define EN_PIN    53                 // LOW: Driver enabled. HIGH: Driver disabled
#define STEP_PIN  52                // Step on rising edge

#include <TMC2208Stepper.h>             // Include library
TMC2208Stepper driver = TMC2208Stepper(&Serial2);  // Create driver and use
                          // HardwareSerial0 for communication

void setup() {
  Serial2.begin(115200);             // Init used serial port

  // Prepare pins
  pinMode(EN_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);

  driver.pdn_disable(1);              // Use PDN/UART pin for communication
  driver.I_scale_analog(0);           // Adjust current from the registers
  driver.rms_current(500);            // Set driver current 500mA
  driver.toff(0x2);               // Enable driver

  digitalWrite(53, LOW);              // Enable driver
}

void loop() {
  digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Step
  delayMicroseconds(500);
}

jetzt kann ich die Stromstärke einstellen. Kann es sein, dass der befehl für die Microsteps falsch war und deswegen keine Drehzahlveränderung passierte? Ich hatte ja anfangs auch versucht die Stromstärke zu verändern, hatte aber keine Veränderung im Drehmoment gefühlt (eventuell war der unterschied der Stromstärken zu gering) und deswegen die Microsteps hinzugefügt, damit ich definitiv sehe, ob sich was ändert.

Liest du eigentlich auch, was wir dir schreiben ?

Und wo ist jetzt im Setup deine 2. Serielle??

sorry, ich hatte nochmal den original code genommen und bei den zwei unteren serial vergessen sie zu serial2 umzubenennen, dann hat es logischerweise nicht funktioniert. Ich wollte dann schreiben, dass ich noch immer nichts per uart verändern kann und hatte den code schon hier in den Post kopiert. Dann ist mir aufgefallen, dass diese beiden noch geändert werden müssen, was ich dann auch gemacht habe, aber hier im Post habe ich vergessen es umzuändern.

Liest du eigentlich auch, was wir dir schreiben ?

Ja, wieso?

Weil du wieder die while im setup hast.

Wozu ist die da ?
Und dann ändere deinen letzten geposteten Sketch. Das irritiert doch nur.

Ich sehe die while immer noch.
Ein drittes mal, die brauchst du nicht.

das while ist im Original code auch drin.

der andere Post ist schon geändert. Ich habe es jetzt im übrigen hinbekommen, die Microsteps verändern zu können.

Ich musste noch beim Setup " driver.mstep_reg_select(1);" hinzufügen.

Also scheint jetzt soweit alles zu funktionieren. Danke trotzdem für die Hilfe :slight_smile:

Das ist jetzt der komplette code:

int incomingByte = 0;

#define EN_PIN    53                 // LOW: Driver enabled. HIGH: Driver disabled
#define STEP_PIN  52                 // Step on rising edge
#define DIR_PIN   51                 // Direction Pin

#include <TMC2208Stepper.h>             // Include library
TMC2208Stepper driver = TMC2208Stepper(&Serial2);  // Create driver and use
                          // HardwareSerial2 for communication

void setup() {
  Serial.begin(115200);             // Init used serial port
  Serial2.begin(115200);             // Init used serial port


  // Prepare pins
  pinMode(EN_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);

  driver.pdn_disable(1);              // Use PDN/UART pin for communication
  driver.I_scale_analog(0);           // Adjust current from the registers
  driver.rms_current(700);            // Set driver current 700mA
  driver.mstep_reg_select(1);
  driver.mres(8);
  driver.microsteps(256);            // Set driver microsteps
  driver.toff(0x2);               // Enable driver

  digitalWrite(53, LOW);              // Enable driver
  digitalWrite(51, HIGH);              // CW or CCW
}

void loop() {
  digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Step
  delayMicroseconds(5);
}

Gut, dass es jetzt funktioniert.

Ich habe den von dir angezeigten Beispielsketch vor mir, da ist keine while-Schleife drin.
K.A. wo du das her hast.

Die wird bei einem Arduino micro o.ä. gebraucht, aber nicht beim Mega oder Uno.

in dem Sketch in der von mir im Hauptpost verlinkten Seite steht das While drin. Aber ist auch im Prinzip egal :slight_smile:

... Millionen an Fliegen könne nicht irren ... Scheiße schmeckt gut ...

Ja, im Prinzip ist's egal - wenn man eine Fliege ist!

ManMadeDesaster:
in dem Sketch in der von mir im Hauptpost verlinkten Seite steht das While drin. Aber ist auch im Prinzip egal :slight_smile:

Ok, hast Recht.

Ich bin davon ausgegangen, du verwendest ein Beispiel aus der Library.
Dieses Beispiel ist komplett mit 2 seriellen Schnittstellen.

Dennoch....egal ist es nicht, weil nicht nötig und irritierend.