Libreria stepper

Che libreria mi consigliate di usare per questo driver?

Manuale driver DM860i : https://www.omc-stepperonline.com/download/DM860I.pdf

ciao :slight_smile:

in questo topic potresti trovare le info che ti servono :slight_smile:

in più su youtube ci sono diversi video dimostrativi :wink:

MD

Non ti consiglierei nessuna libreria per azionare un singolo motore! Devi inviare i segnali di step e la direzione, questo si fa benissimo scrivendo poche righe di codice. Porti HIGH il pin step, piccola pausa, porti LOW il pin step, e il motore fa un passo. Hai bisogno di fare molti passi!? Il tutto in un ciclo che ripete fino a raggiungere lo spostamento voluto.

Mentre se volessimo costruire una CNC non occorrerebbe una libreria ma un intero firmware "grbl".

Non ho bisogno costruire una cnc.
Ho bisogno di pilotare due nema 34 13nm 6A che controllano le due ruote di un grosso self balancing robot.

Quello che non riesco a capire è come trasformare questa piccola pausa di cui parla torn24 in velocitá angolare.

Se io dovessi muovere lo stepper di 30°/s, che delay dovrei utilizzare????

Qual'è la proporzione tra queste due valori?

Dipende anche dal tempo che arduino impiega a compiere un ciclo di loop?

Il delay() tra digitalWrite(step,HIGH) e digitalWrite(step,LOW) è per il segnale di step, il delay può essere molto piccolo.
Per controllare la velocità di rotazione o velocità angolare, faccio un delay() un ritardo tra step e step...

Quindi calcolo numero step per giro, numero step per 30 gradi! un secondo /step per 30 gradi, e trovo il delay tra step e step.

Esempio:

const byte STEP=10; // Pin step
const byte DIR=11; // Pin dir

int velocita=0;

void setup(){

    pinMode(STEP,OUTPUT);
    pinMode(DIR, OUTPUT);

}

void loop(){

     velocita=analogRead(A0);
     
     digitalWrite(DIR,HIGH);// Senso di rotazione
     for(int i=0;i<100;i++){
         stepMotore();
         delay(velocita);
     }
    digitalWrite(DIR,LOW);// Senso di rotazione
     for(int i=0;i<100;i++){
         stepMotore();
         delay(velocita);
     }

}

void stepMotore(){

        digitalWrite(STEP, HIGH);
        delayMicroseconds(100);
        digitalWrite(STEP, LOW);
        delayMicroseconds(100);
}

Grazie della risposta Torn24, adesso ho un'idea di cone utilizzare il driver.

Capisco che cosí il motore si muove ad una velocitá angolare inversamente proporzionale alla tensione che leggo sul pin A0.

Però il 100 Microsecondi della funzione step motore dove li hai presi? È un valore standard o lo calcolo? Dipende dal motore o dal driver?

E poi.. io dovrei trasformare una velocità angolare in delay.
Se ho capito bene.. la velocitá sarebbe:

Angolo di step/tempo di delay

Nel mio caso 800 step = 1 giro completo
Velocitá angolare voluta: 30° al secondo

0.45°(1step)/tempo delay=30°secondo

Tempo delay= 0.45/30=0.015 secondi

Tra due step ci devono essere 0.015 secondi per far ruotare lo stepper a 30°/s?

Che function uso allora?
delay(); o delayMicroseconds();

Sto sbagliando?

Il ritardo negli step li ho presi da esempi on line!

Per calcolare un delay tra step e step che mi dia APPROSSIMATIVAMENTE "c'è il tempo di esecuzione del codice che non teniamo conto".

360/ 30=12
800/12 =66,6 APPROSSIMATO 67 =step per 30 gradi

1000 "millesimi di secondo"/ step per trenta gradi 67=15 approssimato il delay tra step e step

per avere una velocità angolare VICINA a 30 gradi al secondo

Ci vedo un po' piú chiaro adesso..

Si, è meglio ragionare in step al secondo..

Divido un secondo per gli step da fare in questo secondo.

1000 millisecondi/67= 15millisecondi tra due step.

Quindi dovrei usare delayMicroseconds(15000);
in questo caso??

Come faccio a calcolare il tempo di esecuzione del codice?

Premettiamo che per fare un singolo STEP al driver occorrono due delay(), quindi in tempo per step deve essere diviso per due. Esempio voglio uno step ogni secondo essendo due i delay(), saranno di 500 millisecondi.

Non so cosa vuoi ottenere e come sarà il tuo programma definitivo, l'esecuzione del codice di un programma da parte di arduino è molto veloce, se il tuo programma non usa delay() che rallentano e non è molto "lungo" il tempo di esecuzione è brevissimo. Comunque non ci puoi fare niente se non usare una scheda con una frequenza maggiore di clock che aumenterebbe la velocità di esecuzione

Si potrebbe misurare approssimativamente il tempo di esecuzione usando millis() e stampando sulla seriale il tempo, ma non è un conteggio esatto pensando che millis() non è precisa.

void loop(){
    unsigned long tempo=millis(); // Tempo inizio esecuzione

    // Codice del programma di cui voglio misurare il tempo di esecuzione


    tempo=millis()-tempo; // Tempo impiegato

    Serial.println(tempo);
    delay(1000); // Il tempo del delay e della stampa su seriale non viene calcolato
}

Ciao,
Il codice per la misura del tempo di esecuzione mi sarà molto utile, ti ringrazio davvero.

Quello che vorrei ottenere è che l'angolo di inclinazione che ritorna un mpu6050 (da -90.00° a 90.00°)
venga trasformato in velocità angolare da arduino e trasmessa ai motori (e quindi alle 2 ruote) in modo che inseguano la posizione di 0.00° (Robot in equilibrio).

Ma a parte questo.. ai fini del mio problema sul funzionamento del driver non è rilevante.

//////

Premettiamo che per fare un singolo STEP al driver occorrono due delay(), quindi in tempo per step deve essere diviso per due. Esempio voglio uno step ogni secondo essendo due i delay(), saranno di 500 millisecondi.

//////

Forse sto facendo confusione però tra i delay della fuction stepMotore() che mi hai inviato;

void stepMotore(){

        digitalWrite(STEP, HIGH);
        delayMicroseconds(100);
        digitalWrite(STEP, LOW);
        delayMicroseconds(100);
}

E il delay della velocità.

Quando parli dei DUE delay intendi quelli della function?

è sempre valido quello che ci siamo detti sulla velocità angolare ovvero che per far ruotare il rotore a 67 step al secondo mi occorre un delay di 15 millisecondi nel loop?

Parlo della funzione stepMotore(); Se hai bisogno di un tempo di 15 millisecondi, devi dividerlo in due delay(). Se per fare un singolo step ho bisogno di due delay() e il tempo che deve impiegarci è 15 millisecondi, sarà 15/ 2 delay()!

L'esempio del programma che ti ho mostrato con la variabile velocità è un esempio di come regolare la velocità "giri al minuto" di un motore stepper! Se io volessi ottenere giri al minuto il programma andrebbe benissimo perché il tempo perso dalla funzione stepMotore() sarebbe trascurabile!

Nel tuo caso non va bene, perché hai velocità angolari molto elevate e lavori con delay() molto piccoli, quindi per quello che vuoi ottenere tu sei costretto a controllare la velocità di un singolo step, trascurabile invece se si vuole ottenere giri al minuto...

E le rampe di accelerazione - decelerazione?