Arduino DUE und TMC2208 Stepper

Hallo zusammen,

möchte mit einem Arduino DUE per TMC2208 einen Schrittmotor ansteuern.

Die Konfiguration wie Motorstrom, Drehrichtung, MicroSteps usw. soll am TMC2208 per
UART Schnittstelle vorgeben werden.

Unter folgendem Link gibt es eine Libary für den TMC2208:

Leider scheint diese nicht mit dem DUE kompatibel zu sein.

Gibt es eine Möglichkeit diese Libary für den DUE anzupassen, oder gibt es
evtl. eine alternative Libary die zur Kombination DUE + TMC2208 passt ?

Grüße,
Dirk

Hallo
oder passt die Hardware nicht zusammen ?

Die Hardware sollte grundsätzlich zusammen passen.

Nehme ich einen Arduino Mega2560 funktioniert alles einwandfrei.

Verwende ich den gleichen Sketch für den DUE, bekomme ich beim Compilieren mit der Arduino IDE Fehlermeldungen die sich auf die eingebundene TMC2208 Libary beziehen.

Und die Fehlermeldungen sollen wir jetzt als "heiteres Fehlerraten" ermitteln?

Gruß Tommy

Hallo Tommy,
hier ist die Fehlermeldung:

WARNUNG: Bibliothek TMC2208Stepper-0.2.5 behauptet auf avr Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrem derzeitigen Board, welches auf sam Architektur(en) ausgeführt wird.
sketch\MyTMC2208_SoftwareSerialDUE.ino.cpp.o: In function `setup':
C:\Eigene Dateien\Arduino\MyTMC2208_SoftwareSerialDUE/MyTMC2208_SoftwareSerialDUE.ino:36: undefined reference to `TMC2208Stepper::beginSerial(unsigned long)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino Due (Programming Port).

Sofern benötigt hier auch noch der Programmcode:

// Define pins
#define EN_PIN    10  // LOW: Driver enabled. HIGH: Driver disabled
#define STEP_PIN  11  // Step on rising edge
#define RX_PIN    15  // Software Serial pins Serial Port 3
#define TX_PIN    14  // TX -> 1 kOhm -> RX -> PDN_UART TMC 2208
#define IN_PIN_CW  8  // Move Motor vorward Taster gegn GND
#define IN_PIN_CCW 9  // Move Motor backward Taster gegen GND

#include <TMC2208Stepper.h>

unsigned long startDelay = 10000;  // Start Delay Motorsteps (Micro Sec.) -> 100 Hz
unsigned long minDelay = 50;     // Min. Delay Motorsteps  (Micro Sec.)  -> 5 kHz max.
unsigned long stepDelay = 10;     // inc/dec Delay          (Micro Sec.)

#define SHUTTER_PIN  2          // digital out Auslöser 
#define STEP_PIN 11             // Step Pin
unsigned long shutterDelay = 100000;         // Auslöser gedrückt in µs
unsigned long minStepperDelay = 100;         // Minimale Pulsdauer für Schrittmotor in µs
unsigned long delayBetweenRelease = 4000000; // delay zwischen Auslösungen in µs
unsigned long delayAfterMove = 1000000;      // delay nach Move in µs
int abbruch = 0;                             // Stack abbruch
int prevMoveDirection = 0;                   // vorherige Bewegungsrichtung ggf. für Backlash
unsigned long stepsBacklash = 20;            // Steps für Backlash



// Create driver that uses SoftwareSerial for communication
// TMC2208Stepper driver = TMC2208Stepper(RX_PIN, TX_PIN);
TMC2208Stepper driver = TMC2208Stepper(&Serial3);


void setup() {
  driver.beginSerial(115200);
  driver.push();  // Push at the start of setting up the driver resets the register to default
  // Prepare pins
  pinMode(EN_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  // pinMode(DIR_PIN, OUTPUT);
  pinMode(IN_PIN_CW, INPUT_PULLUP);   // enable internal pullup resistor
  pinMode(IN_PIN_CCW, INPUT_PULLUP);  // enable internal pullup resistor

  driver.pdn_disable(true);     // Use PDN/UART pin for communication
  driver.I_scale_analog(false); // Use internal voltage reference
  driver.rms_current(200, 0.3);      // Set driver current = 500mA, 0.5 multiplier (default) for hold current and RSENSE = 0.11 (default). 
  // driver.rms_current(500, 0.1); // Set driver current = 500mA and 0.1 multiplier for hold current and RSENSE = 0.11 (default). 
  driver.mstep_reg_select(true);// Microstep resolution selected by MSTEP register
  driver.mres(8);               // micro step resolution
  driver.microsteps(32);        // Set driver microsteps 0..256
  driver.toff(2);               // Enable driver in software and controls duration of slow decay phase
  driver.shaft(0);              // direction CW or CCW

  digitalWrite(EN_PIN, LOW);    // Enable driver in hardware

  Serial.begin(115200);  // Serielle Schnittstelle initialisieren und warten, bis der Port geöffnet ist:
  while (!Serial) {
    ; // Warte, bis die serielle Schnittstelle verbunden ist. Wird für native USBs benötigt.
  }
}





void run_motor4(int IN_PIN) {
  unsigned int schleife = 0;

  delay(50);  // debounce

  driver.microsteps(16);
 
  while (!digitalRead(IN_PIN)) {  
    digitalWrite(STEP_PIN, true);     
    digitalWrite(STEP_PIN, false);     

    if (schleife < 700) {
      schleife += 1;
              
     if ((schleife >= 0) && (schleife < 4)) {
      delay(500);
     }
     if ((schleife >= 4) && (schleife < 7)) {
      delay(250);
     }
     if ((schleife >= 7) && (schleife < 15)) {     
      delay(125);
     }
     if ((schleife >= 15) && (schleife < 30)) {     
      delay(60);
     }
     if ((schleife >= 30) && (schleife < 70)) {     
      delay(25);
     }
     if ((schleife >= 70) && (schleife < 150)) {     
      delay(10);
     }
     if ((schleife >= 150) && (schleife < 250)) {     
      delay(5);
     }
     if ((schleife >= 250) && (schleife < 350)) {     
      delay(2);
     }
     if ((schleife >= 350) && (schleife < 500)) {      
      delayMicroseconds(700);
     }
     if ((schleife >= 500) && (schleife <= 700)) {               
      delayMicroseconds(200); 
     }
    }
   
    delayMicroseconds(70);  // min. 200 bei 4 microsteps, min. 100 bei 8 microsteps, min 50 bei 16 microsteps    
  }  
}




void loop() {
  if (!digitalRead(IN_PIN_CW)) {
    driver.shaft(0);              // CW or CCW     
    run_motor4(IN_PIN_CW);
  }
  if (!digitalRead(IN_PIN_CCW)) {
    driver.shaft(1);              // CW or CCW          
    run_motor4(IN_PIN_CCW);
  }  
}

Gruß,
Dirk

Die Lib passt halt nicht zum Due, steht doch eindeutig da.
Warum nimmst Du nicht die aktuellere. Auf Guthub zu deiner Lib steht:

This library has been superseded by the newer TMCStepper library which supports many more of the Trinamic stepper drivers and more MCU architectures.

Hallo,

habe es mit der von dir verlinkte Lib probiert, leider der gleiche Fehler:

WARNUNG: Bibliothek TMC2208Stepper-master behauptet auf avr Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrem derzeitigen Board, welches auf sam Architektur(en) ausgeführt wird.
sketch\MyTMC2208_SoftwareSerialDUE.ino.cpp.o: In function `setup':
C:\Eigene Dateien\Arduino\MyTMC2208_SoftwareSerialDUE/MyTMC2208_SoftwareSerialDUE.ino:36: undefined reference to `TMC2208Stepper::beginSerial(unsigned long)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino Due (Programming Port).

Hast Du die Lib richtig installiert? Also auch die cpp-Dateien? Das ist ein Linker-Fehler, der deutet oft auf solche Fehler hin.

Gruß Tommy

Habe die ZIP Datei entpackt und alle sich ergebenden Ordner/Dateien ins Verzeichnis ...\Arduino\libaries....
kopiert. So habe ich es bisher mit allen Libs gemacht.

Wähle ich den Mega2560 funktioniert auch alles, stelle ich auf den DUE um, kommt der Fehler.

Vermutlich ist die Lib nicht für den Due geeignet.

Gruß,
Dirk

Da gehören sie nicht hin, sondern nach \libraries.
Warum benutzt Du nicht die Funktion Sketch → Bibliothek einbinden → .ZIP Bibliothek einbinden?
Dann landet alles an der richtigen Stelle. Vorher aber die andere “Installation” löschen.

Gruß Tommy

Hallo,

hier wird etwas zu schnell geurteilt. Ich habe das ausprobiert. Die Lib ist zum Due inkompatibel.
Kommentiert man erste Zeile im setup die angemeckert wird aus

driver.beginSerial(115200);

kompiliert es. Die Lib wandert außerdem bei Due Auswahl nach "Inkompatibel", weil avr Architektur eingestellt ist.
Scheinbar nicht ohne Grund.

Alle Meldungen je nach Port

C:\Users\Doc\AppData\Local\Temp\arduino_build_17654\sketch\TMC2208_Simple.ino.cpp.o: In function `setup':

C:\Users\Doc\AppData\Local\Temp\arduino_modified_sketch_701710/TMC2208_Simple.ino:34: undefined reference to `TMC2208Stepper::beginSerial(unsigned long)'

collect2.exe: error: ld returned 1 exit status

Bibliothek TMC2208Stepper in Version 0.2.5 im Ordner: C:\Arduino IDE Portable\Due\arduino-1.8.13\portable\sketchbook\libraries\TMC2208Stepper wird verwendet

Fehler beim Kompilieren für das Board Arduino Due (Programming Port).

oder ------------------------------------------------------------------------------------------------

WARNUNG: Bibliothek TMC2208Stepper behauptet auf avr Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrem derzeitigen Board, welches auf sam Architektur(en) ausgeführt wird.

C:\Arduino IDE Portable\Due\arduino-1.8.13\portable\packages\arduino\hardware\sam\1.6.12\cores\arduino\syscalls_sam3.c: In function '_exit':

C:\Arduino IDE Portable\Due\arduino-1.8.13\portable\packages\arduino\hardware\sam\1.6.12\cores\arduino\syscalls_sam3.c:133:24: warning: unused parameter 'status' [-Wunused-parameter]

extern void _exit( int status )

C:\Users\Doc\AppData\Local\Temp\arduino_build_17654\sketch\TMC2208_Simple.ino.cpp.o: In function `setup':

C:\Users\Doc\AppData\Local\Temp\arduino_modified_sketch_835977/TMC2208_Simple.ino:34: undefined reference to `TMC2208Stepper::beginSerial(unsigned long)'

collect2.exe: error: ld returned 1 exit status

Bibliothek TMC2208Stepper in Version 0.2.5 im Ordner: C:\Arduino IDE Portable\Due\arduino-1.8.13\portable\sketchbook\libraries\TMC2208Stepper wird verwendet

Fehler beim Kompilieren für das Board Arduino Due (Native USB Port).

Sein Ordner wird auch stimmen, sonst würde eine andere Meldung kommen. Zudem muss man zwischen installierter IDE und Portable IDE unterscheiden.

Wenn installiert.
C:\Users\Username\Documents\Arduino\libraries\

Wenn Portable
C:\irgendwoVölligEgal\arduino-1.8.13\portable\sketchbook\libraries\

Hallo,

hab das mal versucht für ein mir nicht vorliegendes Board zu lösen. Wenn es funktioniert lag es an:

Software Serial war nur für AVR und LPC1768 gültig.
Weil das für den Due nicht zutrifft, gab es in der .cpp keine beginSerial Methode.

Im Sketch habe ich die Pins “geändert”. Dabei fiel auf das STEP_PIN zweimal definiert war. Wird bei defines nicht angemeckert sondern eiskalt überschrieben. Probiere mal aus. Im Anhang ist die geänderte Lib und der geänderte Sketch.

TMC2208Stepper.zip (34.9 KB)

masterdark.zip (1.87 KB)

Hallo Doc_Arduino,

habe es mit der von Dir geänderten Lib samt Sketch probiert, funktioniert einwandfrei.

Der einzige Unterschied zu vorher ist driver Zuweisung.
Während zuvor beim Mega folgende Varianten möglich waren:

#define RX_PIN 15 // Software Serial pins Serial Port 3
#define TX_PIN 14 // TX -> 1 kOhm -> RX -> PDN_UART TMC 2208
TMC2208Stepper driver = TMC2208Stepper(RX_PIN, TX_PIN);

oder

TMC2208Stepper driver = TMC2208Stepper(&Serial3);

Muss die Zuweisung nun so erfolgen:
TMC2208Stepper driver = TMC2208Stepper(Serial3);

Aber das ist für meine Anwendung völlig egal.

Vielen Dank für die Lösung,
Dirk

Habe noch eine andere Frage die das DUE Board betrifft.

Wenn ich einen Sketch (egal welchen) von der IDE auf den DUE übertrage, startet der Sketch danach sofort.

Wenn ich die USB Verbindung vom Board trenne und danach wieder herstelle, startet der Sketch nicht.
Ich muss erst den Reset Taster auf dem Board betätigen damit der Sketch startet.

Bei meinem MEGA Board ist das anders, sobald das Board per USB verbunden ist, startet der Sketch.

Ist das ein "besonderes" Verhalten vom DUE oder liegt das an meinem Bord ?

Es handelt sich um dieses Board aus der Bucht:
DUE 2012 Entwicklungsboard + USB - ATMEL Arduino komp. SAM3X8E 32-Bit Cortex-M3

Gruß,
Dirk

Dies ist ein bekannter Fehler der DUE. Es gibt ein sehr langes Thema zu diesem Thema im Forum, das der DUE gewidmet ist ...

Sie können jedoch einfach versuchen, delay(1000); hinzuzufügen. gleich zu Beginn des setup(). Manchmal ist das genug.

Danke für den Hinweis.

Ein delay(1000) gleich in der ersten Zeile des Setup Blocks hilft bei meinem DUE leider nicht.

Doc_Arduino:
Zudem muss man zwischen installierter IDE und Portable IDE unterscheiden.

Wenn installiert.
C:\Users\Username\Documents\Arduino\libraries\

Wenn Portable
C:\irgendwoVölligEgal\arduino-1.8.13\portable\sketchbook\libraries\

Rate mal, warum ich geschrieben habe.

Gruß Tommy

Hallo,

wegen der Seriellen. Bei Controllern mit nativen USB ist das etwas anders. Auch beim Arduino Micro mit seinem ATmega32U4. Du hast im setup irgendwo das hier stehen.

Serial.begin(115200);  // Serielle Schnittstelle initialisieren und warten, bis der Port geöffnet ist:
  while (!Serial) {
    ; // Warte, bis die serielle Schnittstelle verbunden ist. Wird für native USBs benötigt.
  }

Dann wartet der Sketch bis ein Terminal eine Verbindung aufnimmt.
Du bräuchtest wenn er wartet nur ein Terminal öffnen.

Wenn das nervt, kommentierst du den while Block aus. Dann startet der immer durch.

Nachteil dieser Methode ist, falls du zwischendrin merkst dir fehlen die seriellen Ausgaben, dann musste nach Terminal öffnen nochmal reseten. Zwischendrin Terminal öffnen wie beim Uno/Mega klappt nicht mehr. Probiere das mal aus. Beim öffnen vom seriellen Monitor der IDE sollten alle Boards automatisch reseten. Beim öffnen "fremder" Terminals läuft das Board ohne Reset weiter. Hier muss man drandenken diese Verbindung auch wieder manuell zu disconnecten.

Tommy56:
Rate mal, warum ich geschrieben habe.

Du hast scheinbar nur deine Portable vor Augen. Mit installierter IDE gibts in dem Sinne kein Sketchbook Ordner. Die Sketche können breit verstreut auf der Platte liegen. Wenn dennoch alle Libs gefunden werden sollen gehören die Libs wie gezeigt nach Documents\Arduino\libraries, genau wie das der TO auch gemacht hatte. Daran war nichts falsch.

Egal wo der Ordner liegt (bei mir E:\sketchbook für alle IDE) ist das der Ordner, in dem die Sketchverzeichnisse liegen → deshalb .
Ansonsten habe ich seine unvollständige Pfadangabe als \libraries interpretiert. Das kann evtl. falsch gewesen sein.

Gruß Tommy