In questi giorni ho provato un nuovo driver per motori passo-passo il drv8825 stepper driver prodotto dalla pololu.
Il drv8825 stepper driver ha delle interessanti caratteristiche elettriche ed è sufficientemente piccolo per essere impiegato anche nei progetti in cui lo spazio è ridotto.
Caratteristiche del drv8825 stepper driver
Sul sito del produttore pololu puoi trovare molte informazioni su questo drriver per motori stepper o passo-passo bipolari:
nella tabella riportata sopra avrai notato che il drv8825 stepper driver può controllare motori stepper fino a 45v e 2,2A per fase con una risoluzione fino a 1/32 di passo semplicemente variando il segnale presente sui pin definiti M0,M1 ed M2 secondo lo schema seguente:
Collegamento del drv8825 stepper driver
Il drv8825 stepper driver è dotato di 16 pin a cui collegare:
- il motore stepper bipolare;
- il microcontrollore, io uso arduino;
- l’alimentazione esterna;
- l’alimentazione del driver stesso;
- il pin di reset;
- il pin per attivare la modalità sleep;
per collegare il motore puoi seguire la seguente figura:
in cui ho fotografato le connessioni delle 2 fasi del motore rispettando i colori dei fili uscenti dal motore.
I pin RESET e SLEEP puoi collegarli direttamente al pin positivo come riportato nello schema di collegamento del produttore oppure puoi controllarli da arduino portanto ad HIGH i pin a cui li colleghi.
Nei collegamenti per questo progetto ho riutilizzato i 5 pulsanti collegati tra loto mediante la rete di resistenze da 330ohm in cascata, tecnica mostrata in questo tutorial:
ciascun pulsante invia una tensione differente al pin A0 di arduino per effetto della rete di resistenze.
Misurando il singolo valore rilevato puoi dedurre quale pulsante è stato premuto e legare la pressione del pulsante ad una azione dello sketch.
Lo sketch di controllo con 5 pulsanti
Per il controllo del motore passo passo mediante il drv8825 stepper driver ed i cinque pulsanti ho realizzato questo sketch:
#define DIR 2 #define STEP 3 #define BUTTON A0 #define M0 4 #define M1 5 #define M2 6 int SELECT[] = {0,20}; // pulsante A int LEFT[] = {500,520}; // pulsante B int RIGTH[] = {670,690}; // pulsante C int UP[] = {760,780}; // pulsante D int DOWN[] = {810,830}; // pulsante E int dPause = 100; int dirLevel = HIGH; /**********************************************************/ void setup() { pinMode(DIR, OUTPUT); pinMode(STEP, OUTPUT); pinMode(M0, OUTPUT); pinMode(M1, OUTPUT); pinMode(M2, OUTPUT); pinMode( BUTTON,INPUT ); Serial.begin( 9600 ); Serial.println( "Test" ); } /**********************************************************/ void loop() { int buttonPress = ctrlButton( analogRead( BUTTON ) ); if ( buttonPress == 1 ) { // 1/2 Step dPause = 50; digitalWrite(M0, HIGH ); digitalWrite(M1, LOW ); digitalWrite(M2, LOW ); } if ( buttonPress == 2 ) { // 1/4 Step dPause = 25; digitalWrite(M0, LOW ); digitalWrite(M1, HIGH ); digitalWrite(M2, LOW ); } if ( buttonPress == 3 ) { if ( dirLevel == HIGH ) dirLevel = LOW; else dirLevel = HIGH; } if ( buttonPress == 4 ) { digitalWrite(M0, LOW ); digitalWrite(M1, LOW ); digitalWrite(M2, LOW ); } if ( buttonPress == 5 ) { return; } digitalWrite( DIR,dirLevel ); stepGo(); } /**********************************************************/ int ctrlButton( int button ) { if ( SELECT[0] <= button && button <= SELECT[1] ) { return 1; } if ( LEFT[0] <= button && button <= LEFT[1] ) { return 2; } if ( RIGTH[0] <= button && button <= RIGTH[1] ) { return 3; } if ( UP[0] <= button && button <= UP[1] ) { return 4; } if ( DOWN[0] <= button && button <= DOWN[1] ) { return 5; } return 0; } /**********************************************************/ void stepGo() { Serial.println( dPause ); digitalWrite(STEP, HIGH); delayMicroseconds(dPause); digitalWrite(STEP, LOW); delayMicroseconds(dPause); }
la prima osservazione che puoi fare è che lo sketch presenta pezzi di codice che hai già incontrato in altri sketch e progetti presentati, ma andiamo con ordine, alle linee 01-07 definisci i pin Arduino a cui è collegato il drv8825 stepper driver, il pin 2 al pin di direzioe ( DIR ) ed il pin 3 al pin di step ( STEP ), i pulsanti sono collegati tutti al pin A0 ed i pin 4,5 e 6 sono connessi rispettivamente ai pin M0,M1,M2 con cui puoi controllare la risoluzione del motore.
int SELECT[] = {0,20}; // pulsante A int LEFT[] = {500,520}; // pulsante B int RIGTH[] = {670,690}; // pulsante C int UP[] = {760,780}; // pulsante D int DOWN[] = {810,830}; // pulsante E
linee 09-13: sono le stesse viste negli articoli dedicati ai pulsanti collegati come in questo progetto e simili a quelle che hai incontrato per la connessione della KeyPad LCD, che utilizza il medesimo sistema per ridurre al minimo il numero di pin necessari;
void setup() { pinMode(DIR, OUTPUT); pinMode(STEP, OUTPUT); pinMode(M0, OUTPUT); pinMode(M1, OUTPUT); pinMode(M2, OUTPUT); pinMode( BUTTON,INPUT ); Serial.begin( 9600 ); Serial.println( "Test" ); }
linee 20-31: definisci la funzione setup() il cui scopo è impostare la modalità di funzionamento per i pin DIR, STEP,M0,M1,M2,BUTTON e attivare il Monitor Seriale;
linea 37: richiama la funzione ctrlButton() il cui scopo è restituire il valore un valore numerico da 0 a 5 in funzione del pulsante premuto, è la funzione che si occupa di eseguire tutte le verifiche necessarie alla pressione di un pulsante. Assegna il valore restituito dalla funzione alla variabile buttonPress;
if ( buttonPress == 1 ) { // 1/2 Step dPause = 50; digitalWrite(M0, HIGH ); digitalWrite(M1, LOW ); digitalWrite(M2, LOW ); }
linee 39-45: controlli che il valore restituito dalla ctrlButton() sia 1, che indica la pressione del primo pulsante ed imposti a 50 il tempo di pausa tra uno step ed il successivo oltre alla combinazione HIGH,LOW,LOW dei pin M0,M1 ed M2 che secondo lo schema del produttore indicano al DRV8825 stepper driver di lavorare con il 1/2 passo;
if ( buttonPress == 2 ) { // 1/4 Step dPause = 25; digitalWrite(M0, LOW ); digitalWrite(M1, HIGH ); digitalWrite(M2, LOW ); }
linee 47-53: similmente alle linee 39-45 verifichi la pressione del 2° pulsante e imposti a 25 il tempo di pausa tra gli step e i pin M0,M1 ed M2 in modalità 1/4 di passo.
linee 55-58: alla pressione del 3° pulsante cambi la direzione di rotazione del motore;
linee 60-65: imposta il ciclo di rotazione a paso intero portando a LOW tutti e tre i pin M0,M1 ed M2;
linea 67: la pressione del 5° pulsante invia allo sketch un segnale di return che blocca il loop() e lo fa ripartire, è un trucco per interrompere il moto del motore;
linee 69-70: imposta la direzione di rotazione in funzione della variabile dirLevel impostata alle linee 56-57 e richiama la funzione StepGo() che comunica al drv8825 stepper driver di compiere un passo nella direzione stabilita;
void stepGo() { Serial.println( dPause ); digitalWrite(STEP, HIGH); delayMicroseconds(dPause); digitalWrite(STEP, LOW); delayMicroseconds(dPause); }
linee 89-96: definisci la funzione stepGo() che invia i segnali al driver per far avanzare il motore, per farlo invia un segnale HIGH al pin STEP, attende il tempo impostato nella variabile dPause e riporta a LOW tale pin, attende quindi un altro tempo dPause in Microsecondi.
Il video del drv8825 stepper driver in azione
Ecco un video del funzionamento di questo progetto:
Buon divertimento !!!
98 commenti
1 ping
Vai al modulo dei commenti
Buongiorno Mauro,
sono agli inizi con Arduino e ho un problema su un progetto che ho effettuato.
Ho Arduino UNO che gestisce la shiel motori di Arduino con collegato un motore stepper.
Devo effettuare un numero di step precisi in direzione orario e antiorario alla pressione di due tasti.
Fin qui tutto bene, il mio sketch funziona perfettamente e anche di controllare lo stato di un micro che deve inibire la rotazione se premuto.
Devo però proseguire con la mia applicazione ottenendo lo stesso risultato anche quando su un PIN di Arduino ricevo un segnale o LOW o HIGH, in poche parole quando arriva un segnale sul PIN devo fare ruotare orario lo stepper, ad un altro segnale sempre su stesso PIN deve ruotare antiorario.
Qui mi sono bloccato perchè non riesco a fare funzionare sia i tasti che il segnale LOW/HIGH del PIN.
Grazie mille anticipatamente per la collaborazione e complimenti per tutto il tuo lavoro.
Autore
Ciao Maurizio,
mi piacerebbe comprendere di che progetto si tratta in quanto descritto come hai fatto ho difficoltà a capire cosa tu voglia ottenere.
Se non ho interpretato male la tua esigenza vuoi che al cambio di stato di un pin accada qualcosa, ti consiglio di valutare l’uso degli interrupt di arduino su cui trovi un articolo nel Blog.
Mauro
Caro Mauro, complimenti per l’aiuto che ci dai.
Sto provando a connettere un Nema 17 alla scheda Arduino 1 mediante il Pololu DRV8825, esattamente quello che hai presentato tu il 2 settembre. Potresti inviarmi lo schema di dettaglio come hai fatto in passato con la BigEasyDriver? Nel mio caso vorrei solo muovere un motore. Saluti e grazie in anticipo
Autore
Ciao Marco,
lo schema di collegamento lo trovi sul sito del produttore: pololu di cui ho inserito il link nell’articolo.
Mi è sembrato superfluo duplicare l’immagine o peggio copiarla 🙂
Mauro
Perfetto! Sì ho visto dal sito, ma poiché mi è capitato di vedere altre varianti, pensavo avessi utilizzato altro schema. Grazie mille.
Marco
Buongiorno Mauro,
ho iniziato da poco a divertirmi con Arduino e ora vorrei realizzare il mio primo progetto, un sistema di puntamento.
Inizialmente vorrei poter semplicemente orientare un laser utilizzando dei pulsanti.
Ho quindi la necessità di muovere, magari anche in maniera rapida, il laser o qualsiasi altro oggetto (massimo 5-6 kg) sugli assi x e y.
Mi trovo davanti due problemi:
– utilizzare motori stepper come quello dell’articolo o motori dc
– quale driver abbinare ai motori per controllarli con arduino
Spero tu mi possa aiutare.
Grazie
Ugo
Autore
Ciao Ugo,
il tuo progetto è interessante.
Per la scelta del driver è necessario che tu definisca prima che tipo di motore intendi utilizzare in quanto non solo varia da motore stepper a motore DC ma sopratutto varia tra differenti motori passo-passo.
Ti consiglio di leggere i miei articoli dedicati ai motori passo passo per comprendere come funzionano e che caratteristiche possiedono.
Ho scritto anche un articolo in cui trovi le differenze tra un motore passo-passo, un motore DC ed un servomotore che ti consiglio di leggere.
Nel tuo caso potrebbero andar bene tutti e tre i tipi la differenza la farà il livello di precisione che vuoi raggiungere e la meccanica che utilizzi per spostare il puntatore.
Mauro
Ciao Mauro, innanzitutto Buon Anno,
Sto realizzando un braccio robotico (un po bizzarro) per il mio Rover.
Ho scelto per lo spostamento Destra Sinistra un motore Passo Passo che avevo un Bipolare un 23LM-C355V, come controller ho usato un DRV8825 Stepper Motor Driver Carrier, High Current, ne ho già bruciato uno e prima di continuare la mia domanda è questa :
Come alimentazione per il motore ho usato quella del rover cioè 12 volt 35 Ampere, mentre come alimentazione logica ho presa quella da Arduino cioe’ 5V.
Ho caricato lo sketch preso da internet come esempio prima di creare uno adeguato, ma era solo per vedere se girava, ma aimè ha solo fatto alcune vibrazioni e poi più niente, ho notato che il chip del Driver scottava ed ho staccato tutto.
Dalla tua esperienza sai dove ho sbagliato ? Forse non dovevo alimentarlo con una batteria da 35 A ? o dovevo pilotare il motore con una tensione molto piu’ bassa ?
Scusami se per te è banale questa mia perplessità su questi motori, ma è la prima volta che affronto un problema del genere.
Grazie per il tuo aiuto !!!
Autore
Ciao Ciro,
la domanda non é affatto banale, io stesso posso solo ipotizzare delle cause:
1. assorbimento del motore, controlla che il motore abbia bisogno di una corrente (A) inferiore a quella massima erogabile dal DRV8825 che mi sembra sia di 2A
2. fasi invertite: controlla di aver collegato correttamente le fasi del motore, puoi leggere i miei articoli su come riconoscere le fasi di un motore bipolare, se due fasi successive si oppongono alla rotazione potresti avere un assorbimento eccessivo da parte del motore
3. passi troppo ravvicinati: ogni motore passo passo ha bisogno di un tempo minimo per compiere uno step, di solito io uso il delay, se hai ridotto o annullato il tempo di attesa tra una fase e la successiva potresti aver causato eccessivo assorbimento del motore
4. riduzione dei passi: il driver DRV8825, se non ricorso male, può eseguire 1/2,1/4,1/8,1/16 di passo, controlla di non aver impostato una riduzione non attuabile che manda in crisi il driver quando tenta di spostare l’albero motore.
Mauro
Grazie della tua risposta, ho letto il tuo tutorial su come trovare le fasi, anche se i colori nei cavetti sono diversi ma essendo un motore di recupero i cavetti già erano saldati in un connettore e controllando i terminali con il tester come hai fatto tu stavano anche messi in sequenza giusta cioè due a due ROSSO GIALLO – BLU ARANCIO, ho provato anche con un alimentatore 5 volt ed ho visto che il motore ad ogni impulso faceva uno scatto in avanti e dopo la sequenza ne faceva uno indietro, questo mi fa capire che almeno le connessioni erano fatte bene.
domani faccio un ulteriore prova controllando le connessi dei contatti sul driver.
Mauro una domanda, ma devo solo utilizzare i contatti DIR e STEP per il movimento, B1 / B2 – A1 / A2 per i contatti del motore, VMOT e GND tensione motore e per la logica?? io ho utilizzato lo schemino che porta la 5v di arduino su RESET e SLEEP del DRV8825 (non è che questo lo ha fatto saltare ?
Mi puoi indicare per il tuo Sketch che connessioni hai usato ?
PS: Da premettere che io non userò bottoni per l’azionamento, mi basterà farlo girare fino a quando non lo decido da programma quando arrestarlo.
Grazie ancora.
Autore
Ciao Ciro,
non mi è chiara la frase: “il motore ad ogni impulso faceva uno scatto in avanti e dopo la sequenza ne faceva uno indietro” lo scatto indietro non è corretto a mano che tu non abbia sbagliato la sequenza.
Per il RESET e SLEEP è uno degli schemi di collegamento suggeriti dal produttore ed anche io li ho utilizzati senza problemi, la fusione del driver è imputabile ad un eccessivo assorbimento delle fasi a mio avviso.
Nel mio scketch ho utilizzato proprio il collegamento che hai visto in foto e suggerito dalla Pololu, vedi sopra, ho aggiunto i controlli M1,M2 ed M3 per impostare le riduzioni di fase secondo la tabella riportata dal sito della pololu.
Mauro
I dati dello Stepper sono :
Step Angle 1.8 , Rated Voltage 2,50, Rated Current 2.00 A
Credo che questi dati siano compatibili con questo Driver.
L’unia cosa Mauro, ma i terminali A1 A2 e B1 B2 li decidiamo noi al momento che troviamo
la coppia o è una sequenza stabilita dal fornitore, ti dico questo perchè il fornitore indica i colori delle due bobine
ma non i 2 terminali.
Se i dati che ti ho fornito anche per te vanno bene , mi resta solo pensare che forse (non ne sono sicuro) avrò invertito 1 delle due fasi, rivedrò la tua clip, perchè non riesco a vedere la sequenza che usi.
Grazie
Autore
Ciao Ciro,
i dati sono buoni, il driver drv8825 regge carichi superiori ai limiti che mi hai fornito.
La sequenza delle fasi puoi ricavarla con un altro mio tutorial che mostra un video su come farlo.
Prova a leggere anche gli altri tutorial sui motori passo-passo che ho scritto, verifica che tutto sia corretto sul tuo motore.
Se il costruttore non ti indica la fase A e la fase B puoi solo provare empiricamente a ricavartele tu.
Mauro
Ciao Mauro, solo una Info, ho letto qualche tuo Thread dove si parlava di motori Stepper, ho visto che per i tuoi motori usi le coppie di colori Giallo-Blu’ / Verde-Rosso.
Io ho acquistato un motore questo http://www.robot-italy.com/it/stepper-motor-unipolar-bipolar-200-steps-rev-57-56mm-3-6v-2-a-phase.html
ma non mi trovo con i colori che usi tu. Secondo lo schema fornito dal fornitore, mi confermi che devo usare i colori Nero-Verde 1° Bobina e Rosso-Blu’ 2° Bobina??
NB: Userò questo stepper come Bipolare.
Grazie ancora.
Autore
Ciao Ciro,
ti consiglio di leggere i miei post su come riconoscere le fasi per capire come collegare il tuo motore.
Non avendolo mai visto rischio di darti un errato suggerimento.
Mauro
Dear Mauro, what models of the engine and power supply did you used?
Autore
Hi Aynur,
I use one LiPo battery 11,1v as power supply.
Ciao Mauro mi potresti togliere un dubbio che mi perseguita da un pò?
Volevo acquistare questo driver, essendo abbastanza potente. Ma leggendo i vari datasheet dei motori mi accorgo che vengono alimentati a 12V (per esempio questo http://www.robot-italy.com/it/nema-17-stepper-motor-with-cable.html) oppure 2,4V come questo(http://www.robot-italy.com/it/42byghw811-nema-17-bipolar-48mm-stepper.html). Il rated voltage è la tensione che devo applicare alla scheda per far funzionare il motore?
Vedo che questa scheda funziona DA 8,2V in su.
O il rated volt indicato nei datasheet dei motori non è importante?
Grazie in anticipo per le risposte
Autore
Ciao Marco,
in nessuna parte dell’articolo mi riferisco al “related voltage” e non ho trovato questa dicitura neppure sul datasheet del produttore.
L’alimentazione del motore che questo driver accetta va da 8.25v a 45v applicata al VMOT
grazie Mauro,
infatti il mio problema era capire se potevo utilizzare questo driver nonostante su alcuni datasheet riportano la rated voltage di 2,5V, ma a quanto pare la risposta è negativa
Grazie ancora
Autore
Si Marco, la risposta é negativa. Prova con la BigEasy Driver a memoria non ricordo il voltaggio minimo.
Ciao Mauro,
anche io, come Ciro, ho problemi di surriscaldamento.
Dopo pochi secondi il driver scotta, dopo una ventina di secondi il motore non gira più e dopo un minuto circa riprende a funzionare.
Suppongo quindi, non essendo previsto nel tuo sketch un tale ritardo, sia a causa di una protezione del circuito.
Il motore é un Wantai NEMA 17 42BYGHW811 e il driver DRV8825 é in grado di erogare gli ampere richiesti.
Ho letto il tuo articolo sulle fasi, le ho individuate e corrispondono agli schemi della pololu e della wantai.
Dopo aver letto la risposta che hai dato a Ciro, ho aumentato nello sketch il delay tra le fasi ed evito di ridurre i passi.
Ho controllato mille volte i collegamenti ed anche provato ad inserire un condensatore da 100 tra VMOT e GND, come suggerito dalla pololu qui:
http://www.pololu.com/product/2133
Cosa può essere?
L’ alimentatore che uso é recuperato da un vecchio pc e non sono noti gli ampere, potrebbe essere la causa?
Grazie mille
Luca
Autore
Ciao Luca,
da datasheet il motore riporta 2,5A per fase e il drv8825 2,2A ( With sufficient additional cooling. ) penso sia in questa differenza che tu debba cercare il problema.
Inoltre se il motore è collegato meccanicamente ad un sistema di trazione o meccanico in genere controlla che tale sistema non opponga elevata resistenza.
Grazie mille Mauro,
ho controllato anche io é vero!!!!
ho acquistato entrambe su reprapworld ma prima ho chiesto se il driver fosse ok con i motori.
la risposta: “DRV8825 is great. High current and acceptable heat production.”
Strano pensavo fossero affidabili.
Spero di poterglieli restituire, comunque dovrei acquistarne altri, ma quali?
Se li usassi comunque brucerei tutto?
Ciao Mauro,
sono alle primissime armi con Arduino e l’elettronica in generale…ho avuto in prestito dei componenti per sperimentare e fare studi.
Ora sto usando il driver DRV8825 con questo motore: https://www.sparkfun.com/datasheets/Robotics/SM-42BYG011-25.pdf alimentato con un trasformatore universale (di quelli con la rotellina per selezionare i V) da 1A settato su 12v.
Vorrei sapere se e come posso farlo andare più veloce, e fargli cambiare direzione e velocità a piacere tramite script.
Devo cambiare motore o c’è modo di farlo andare più veloce? Come posso capire la velocità massima raggiungibile dal motore che sto usando? Se non è indicato il motore che sto utilizzando potresti linkarmi un motore che mi permetta di far muovere un pannello di legno/forex di circa 300/400gr velocemente?
Grazie in anticipo per il supporto e complimenti per gli articoli!
Saluti
Rodolfo
Autore
Ciao Rodolfo,
per variare la velocità del motore devi agire sul delay tra le fasi riducendolo o aumentandolo.
Per la direzione esiste il pin apposito che trovi descritto nell’articolo e nello sketch.
Mauro
tendrías el esquema eléctrico del circuito que publicaste aquí?
Autore
Ola Alejandro,
El esquema para conectar el drv8825 es publicado el fabricante.
Los botones están conectados en serie con las resistencias a 330ohm
Ciao Mauro, Io ho un Sanguinololu V1.3a con assemblati i driver: “CoolDRV8825 Stepsticks”
Posso pilotare motori nema 23 o nema 24 o nema 34 senza avere problemi????
Grazie mille!!
Roberto
Autore
Ciao Roberto,
dipende dall’assorbimento dei motori.
NEMA23, NEMA24 e NEMA34 indica solo uno standard meccanico, della stessa famiglia di motori trovi tensioni e correnti differenti.
Devi valutare le caratteristiche dei motori che scegli con quelle supportate dal datasheet del drv8825
Ciao Mauro e complimenti per il tuo sito. Ieri sera ho provato il tuo sketch con un DRV8825 ed un NEMA17 12V 200 passi ma non ho avuto il tempo di approfondire il testing perche’ vorrei modificare lo sketch per provare le altre modalita’ di microstepping fornite dal driver, lo faro’ stasera. Una premessa. Ho da poco realizzato una scheda GoTo per telescopi basata sul progetto open chiamato PicGoto (gruppo spagnolo, il sito ) con una coppia di questi NEMA17 pilotati appunto dagli 8825. I motori pero’ hanno un comportamento strano, quando vengono utilizzati a microsteps superiori ad 1/4, ‘saltellano’. Nel senso che, prima di completare ogni ciclo completo di alimentazione delle fasi, sembra ‘stallare’ per un attimo, per poi riprendere ma con uno step piu’ ampio per recuperare la rotazione. Una sorta di singhiozzo … Non sapendo come viene effettivamente pilotato lo stepper via software dai PIC mi sono detto, proviamo su breadboard il comportamento con il nostro amato Arduino, ed eccomi qui. Mi sembra che pilotati con il tuo sketch questo comportamento ‘a singhiozzo’ non accada. E’ quindi una questione software o, come ho letto da qualche parte dipende dalle caratteristiche intrinseche del motore e/o driver? Avrei poi un paio di domande sul tuo sketch ma le rimando ad altro post, mi sembra di essermi dilungato gia’ troppo …
Grazie ancora per la tua disponibilita’.
Autore
Ciao Gigi,
se con arduino il comportamento a singhiozzo non avviene escluderei il problema meccanico e mi dirigerei verso quello sw o elettrico ( collegamenti )
Ora i dubbi sullo sketch. Hai definito dPause all’inizio uguale a 100us, quindi dPause conserva questo valore fino a quando non si preme uno dei pulsanti 1 o 2 (1/2 e 1/4 steps) che lo ridefiniscono a 50 e 25us rispettivamente. Questo e’ per mantenere la velocita’ del motore costante? In secondo luogo, perche’ nella condizione buttonPress=4 (Full steps) non si ridefinisce dPause=100?
Perdona per il mio post precedente che e’ un po’ ‘out of topic’ …
Ciao
Autore
Ciao Gigi,
hai ragione ho dimenticato di ridefinirlo, non ricordo il perché al tempo in cui ho scritto questo articolo non mi sono accorto della dimenticanza.
Grazie per le risposte speedy, Mauro.
La velocita’ dei motori si regola variando il dPause, giusto?
Autore
Si Gigi,
se vuoi approfondire il perché e come gestirla ti consiglio di leggere anche gli altri articoli che ho dedicato ai motori passo-passo.
Scoprirai i limiti e le potenzialità di questi motori.
Ciao.
Mi sto arrovellando il cervello da un giorno perché non capisco come devo alimentare i driver per avere una giusta tensione di alimentazione sul motore. Devo alimentare questo motore che va a 12V.
(http://www…..com/item/5x-DC-12V-4-phase-5-wire-gear-stepper-motor-full-metal-Gear-reduction-step-motor/1591883814.html)
Se uso gli easy driver devo alimentarli ad una tensione ben superiore ai 12V , perché l’easy si “mangia” una parte di alimentazione. Ora ho acquistato dei driver come quelli della pololu con il A4988.
http://www……..com/item/4PCS-LOT-Pololu-StepStick-A4988-stepper-motor-driver-Heatsink-for-3D-Printer-Reprap-RAMPS1-4-Sanguinololu/1801708257.html
La mia domanda è la seguente: anche i driver che ho comprato si “mangeranno” della tensione?
oppure se li alimento con 12V i motori verranno alimentati a 12V?
Un ultima cosa: i motori che ho comprato hanno 5 fili con uno in comune agli avvolgimenti.
Posso utilizzare questo motore come un semplice bipolare non utilizzando il filo on comune?
Ti ringrazio anticipatamente per l’attenzione.
Autore
Ciao Roberto,
ti chiedo la cortesia di non incollare link nei commenti quando ti riferisci a siti che non vendono materiale originale o certificato dal produttore, mi spiacerebbe far pubblicità su google a tali venditori.
Per quanto riguarda l’uso dei driver che hai acquistato devi provarli in quanto non solo non sono quelli da me descritti e provati in questo articolo, forse ho recensito i driver originali pololu A4988, ma sopratutto non essendo essi orginali il comportamento potrebbe rivelarsi completamente differente da quello dei driver da me testati.
In merito all’uso di un motore unipolare come bipolare la risposta è si puoi usarlo escludendo il comune, trovi numerosi articoli dedicati ai motori stepper sul blog in cui descrivo come sono fatti e come funzionano.
Ciao Mauro
Sono dilettante in elettronica (scuola radio elettra), con i capelli bianchi e tante idee per passare bene il mio tempo libero ovviamente con i miei limiti.
Da poco tempo (meno di un anno) mi sono avvicinato ad arduino ed è subito diventato un robusto interesse, anche perché si capisce che è un mondo che permette, con pazienza, di ottenere risultati.
Mi è parso utile presentarmi per far capire la mia preparazione… scarsa… con una robusta volontà.
Vorrei essere più preciso per la ragione del mio dire sono un camperista ed attualmente per vedere la TV utilizzo un kit della LIDL che devo dire funziona benissimo considerato anche il costo molto basso.
Attualmente il suo sistema di puntamento è affidato alle mie mani e un po’ della mia pazienza. Devo dire che dopo un certo numero di tentativi riesco ad ottenere dei risultati soddisfacenti.
Purtroppo i limiti sono facilmente intuibili, la scomodità di orientare e poter vedere il risultato sulla TV mentre si cerca il satellite.
La mia idea sarebbe quella di far muovere l’antenna parabolica satellitare rinviando in cabina i comandi per il movimento senza dover soffrire troppo.
La mia intenzione e di utilizzare un sistema che utilizzi due arduino Nano, date le sue ridotte dimensioni, e due drv 8825 per comandare i due motori passo passo e per fare muovere i motori e utilizzare dei potenziometri (encoder).
Per visualizzare i movimenti vorrei usare un visore a cristalli liquidi che lavori in I2c.
Io ho già iniziato a mettere insieme i pezzi che mi sono procurato su ebay a prezzi contenuti.
In sostanza ho realizzato due circuiti con i millefori, che dovrebbero comunicare tra di loro via onde radio.
Uno con arduino nano, il visore a cristalli liquidi e i due encoder per i movimenti, da mettere in cabina.
Uno con arduino, i due drv 8825 e un dispositivo di orientamento tipo GY80 che vorrei allontanarlo dal contenitore per non soffrire del magnetismo dei passo passo e posizionarlo a bordo della parabola dell’antenna e tramite il nano trasmettere i dati da visualizzare sul display dell’altro nano.
Per la comunicazione tra i due circuiti ho pensato a due circuiti a a 2,4 Ghz anch’essi comperati su ebay
Credo che l’impegno per me si tantissimo forse molto ambizioso ma io vorrei provarci.
Ho pazienza e spero anche il tempo.
Ovviamente per me le difficoltà maggiori sono nella programmazione dei due nano in modo che possano parlarsi e ricevere tra di loro e comandare i vari dispositivi.
Ho cominciato a raccogliere alcuni programmi su internet e cerco di metterli insieme.
Purtroppo le difficoltà sono tantissime cerco di non arrendermi.
Puoi dirmi se è possibile, puoi darmi dei consigli, puoi aiutarmi?
se del caso ti allego delle immagini sul fin qui eseguito.
Grazie
Giovanni
Autore
Ciao Giovanni,
il tuo progetto è ambizioso ma con buona volontà penso realizzabile.
Hai tanto da studiare, ne avrei anche io, ma sopratutto il dubbio maggiore che ho è la possibilità di controllare due encoder con arduino.
Da quanto ne so io ogni encoder ha bisogno di 2 interrupt per essere controllato ed arduino uno, nano, micro ha a disposizione una sola coppia di pin per l’interrupt.
Ciao Mauro
Grazie per la tua disponibilità e cortesia.
Per la mia scelta degli arduino nano sono state le dimensioni ridotte ed una forte similitudine con l’arduino uno che avevo inizialmente visto ed acquistato su ebay.
La mia scarsissima conoscenza degli arduino e degli encoder non mi ha permesso di fare delle scelte migliori.
Diciamo che ho una buona manualità nell’eseguire le cose, circuiti, saldature ecc… e data la mia origine pochissimo la programmazione.
Ho anche una buona manualità per quanto concerne la meccanica che in parte ho già disegnato e che credo di riuscire a realizzare.
Spero con pazienza e qualche aiuto di riuscire nel mio intento, ho una robusta volontà e se non dovessi riuscire nell’intento pazienza ho passato parte del mio tempo libero facendo delle cose che mi piacciono ed affascinano.
Naturalmente sono disponibile a rivedere la mie scelte iniziali nell’ipotesi che siano irrealizzabili.
Ovviamente sarà mia premura comunicare i progressi che riuscirò ad ottenere.
Volevo anche sapere è possibile allegare delle foto?
Grazie
Giovanni
Autore
Ciao Giovanni,
nei commenti no, questo perché manca la funzionalità ed i link a siti temporanei che ti permettono di allegare foto sono sconsigliati per non inficiare la corretta informazione e il degrado del ranking sui motori di ricerca.
Ciao Mauro
Ho fatto tesoro delle tue indicazioni sugli interrupt disponibili per il nano, solo due e ogni encoder ne vuole due.
Va da se che devo cercare un arduino con più possibilità di interrupt magari con un ingombro maggiore..
Guardando nel sito arduino sono stato attratto da arduino Yun se no sbaglio con 5 interrupt,.
E’ dotato di I2C.
7 pin in PWM.
Oltremodo dispone di Wi Fi che potrei usare per fare dialogare i due YUN.
Cosa ne pensi?
E’ il caso che io mi orienti sui due yun, una in cabina, con il display, i due encoder e uno sul tetto con i due drv8825 e il Gy-80?
Grazie
Giovanni
Autore
Ciao Giovanni,
certamente la Yùn è una delle schede che preferisco e le caratteristiche che evidenzi sono interessanti per il tuo progetto.
Ho solo il dubbio che una comunicazione WIFi su TCP con protocollo da definire possa complicarti il progetto in un ambiente ridotto in cui i moduli XBee o RF potrebbero renderlo una passeggiata 🙂
LA Yùn è basata sulla Leonardo per cui se ti occorrono 5 interrupt la Leonardo potrebbe essere ideale.
Controlla bene l’uso dell’I2C mi sembra che sia la Leonardo sia la Yùn utilizzino 2 pin destinati agli interrupt per l’I2C, riducendo a soli 3 interrupt utilizzabili se vuoi sfruttare la comunicazione I2C.
Ciao Mauro
Guardando nel sito arduino Leonardo come dici tu ha 5 interrupt,.
E’ dotato di I2C.
7 pin in PWM.
L’I2C lo pensato per fare dialogare sia il display sia il GY-80, che vorrei mi desse la posizione dell’antenna visualizzata sul display, sui due assi zenit e azimut.
Direi che avendo io già due moduli rf non ho bisogno di WiFi perché i due arduino possano parlarsi e in questo caso il numero dei fili da cabina a tetto sono solo il + e – del 12 volt e l’antenna.
Cosa ne pensi?
E’ il caso che io mi orienti sui due Leonardo, una in cabina, con il display, i due encoder e uno sul tetto con i due drv8825 e il Gy-80?
Oppure il Leonardo in cabina ed il nano sul tetto avendo io già due nano?
Grazie
Giovanni
Autore
Ciao Giovanni,
io farei tutto con un unico controllore, Leonardo, portando sul tetto sia i fili di alimentazione sia quelli di controllo dei motori.
Se non vuoi portarti dei fili per i motori puoi ripiegare per un Leonardo in cabina ed un nano, dei due che già possiedi, per il controllo dei motori.
Ciao Mauro
Scusami ma guardando con più attenzione nel sito arduino ho visto un arduino Mega 2560 con 6 interrupt, 2, 3, 18, 19, 20, 21 che potrebbe essere messo in cabina, anche se è più voluminoso.
Cosa ne pensi?
Grazie
Giovanni
Autore
Ciao Giovanni,
l’arduino MEGA è di sicuro un ottimo prodotto e con 6 interrupt puoi leggere 3 encoder, anche se mi sembra che anche in questo caso i pin 20 e 21 siano I2C o Seriali.
Ciao Mauro
Avendo io bisogno, in cabina, di due soli comandi per l’orientamento della parabola per mezzo degli encoder gli interrupt che mi servono sono 4.
Naturalmente ho bisogno dell’I2C per collegarmi al display, che ho già a mie mani, con solo due fili, ovviamente più l’alimentazione, al fine di visualizzare i dati forniti dal GY-80 che mi dovrebbe dire come è orientata la parabola e di conseguenza, grazie alle numerose tabelle sull’orientamento dei satelliti ruotarla per mezzo degli encoder fino al valore richiesto.
Ora in cabina mi serve ancora connettere al Mega, che a questo punto sarà l’arduino giusto, il modulino RF per le comunicazioni da cabina a tetto.
Ora l’insieme dei componenti fisici per la cabina dovrebbe andare bene.
Per il tetto io devo, per mezzo di arduino e dei due DRV8825, movimentare la parabola (ovviamente in questa fase tralasciando tutta la parte meccanica) ma devo anche collegare il gy-80 e il modulo RF per la comunicazione tra gli arduino.
Ora il mio dubbio è:
Quale arduino usare per il tetto?
Autore
Ciao Giovanni,
penso tu possa usare per il tetto l’arduino nano se ti bastano i pin per collegare tutto ciò che hai previsto.
Ciao Mauro
Mi scuso se non ho precedentemente spiegato il perché io parli di alcuni componenti come i DRV 8825, il GY-80 ecc., la ragione vera e che io avendo una disponibilità economica limitata ed avendo fatto un giro su ebay di fornitori di componenti cinesi mi sono fatto una idea… e mi sono lasciato attrarre dal prezzo per pezzo molto allettante e dal fatto che non vi era costo per la spedizione e da una sbagliata fretta di fare.
Purtroppo ho comperato uno schermo LCD I2c, due drv8825 due moduli rf a 2.4 GHz con micro della NORDIC il nRF24LU1P, due encoder e due nano, credendo andassero bene.
Alcune scelte come il cercare di ridurre al minimo i fili è dettata dalla difficolta nel fare passare i fili in posti molto stretti e difficoltosi con l’aumentare del diametro del cavo.
Ora cerco di vedere se posso utilizzare i componenti che ho e ovviamente correggendo gli errori grossolani, cercando di spendere il meno possibile..
Ragionando per un attimo senza pensare a che arduino utilizzare sul tetto penso che per ogni DRV8825 servano due pin, uno per lo step e uno per il dir ma non so se devo usare dei pin PWR o no, e quindi servono quattro pin… .
Del GY-80, che dovrebbe dialogare tutto in I2c, mi servono solo due componenti, il HMC55883L (bussola) e il ADSL345 (accelerometro) e qui aumentano le mie indecisioni nell’utilizzo dei pin, a questo si aggiunge un’altra incertezza sul modulo a RF della NORDIC.
Ora decidere che arduino scegliere mi diventa difficile, e non vorrei continuale a sbagliare… €€€€€€€.
Quale arduino usare?
Cosa mi consigli?
Grazie
Giovanni
Autore
Ciao Giovanni,
mi era sembrato avessimo già superato la scelta di quale arduino utilizzare.
Io potrei studiare almeno 3 soluzioni differenti per il medesimo problema e crearti tanta confusione in più.
Se vuoi un vero consiglio è “fermati”, “ragiona su quello che desideri fare”, “valuta la strada migliore per le tue conoscenze” e solo dopo agisci.
Qualche tempo fa ho scritto un articolo che ti invito a leggere: https://www.mauroalfieri.it/elettronica/progetto-arduino-dove-iniziare.html
Ciao Mauro
Ho letto l’articolo Ok, mi fermo, rifletto e ragiono e vediamo.
Grazie
Giovanni
Autore
Giusto atteggiamento 🙂
Ciao Mauro, prima di tutto: GRAZIE!!
Vorrei un semplice chiarimento. Ho utilizzato una scheda Easy driver per comandare uno sTEPPER NEMA 16, ora desidero utilizzare la scheda DRV8825 con un altro stepper appena più potente del precedente. Leggendo gli sketch mi è tutto abbastanza chiaro, ma vorrei una conferma:
nella Easy Driver potevo impostare il numero di Steps che il motore doveva compiere sia in una direzione sia nell’opposta. In questo sketch
void stepGo() {
Serial.println( dPause );
digitalWrite(STEP, HIGH);
delayMicroseconds(dPause);
digitalWrite(STEP, LOW);
delayMicroseconds(dPause);
}
Il numero di Steps è rappresentato dalla variabile “STEP”? Quindi se voglio far compiere 1800 step in una direzione mi basterà assegnare alla variabile STEP il valore 1800?
Te lo chiedo solo perchè dall’esempio pubblicato il motore gira in continuo fino a quando non riceve un comando diverso, quindi nell’esempio riportato credo che la variabile STEP valga sempre 1 , è corretto?
Grazie!
Andrea
Autore
Ciao Andrea,
ti invito a leggere meglio la descrizione dello sketch. La funzione stepGo() non definisce il numero di step da compiere ma controlla solo il pin STEP del driver.
Ciao Mauro ,potresti gentilmente spiegarmi come posso far girare normalmente un motore passo passo senza usare M1-M2-M3 cioe facendolo girare sempre full step ?
Autore
Ciao Raffaele, basta lasciarli non collegati o inviare loro il segnale LOW, se ricordo a memoria la tabella.
Ti ringrazio , a questo punto mi bastano solo DIR e STEP ora nelle righe di programma come dovrei scrivere ?non so perche non trovo nulla il problema lo ho solo con lo STEP perche DIR e solo un 1,0 per la direzione se protrsti scrivere 4 righe per farlo giare normalmente ,Grazie
Autore
Ciao Raffaele,
è scritto nella descrizione riga per riga come fare.
Non saprei cosa altro scrivere.
Grazie.
Vuoi dire cioè che i passi da compiere si esprimo in unità di tempo anzichè in numero di step?
ovvero 1/4 di step ogni 25 ms per impostazioni a 1/4 e così via?
Scusa ma devo ricredermi sul fatto che sia tutto abbastanza chiaro…. HIHI..
In sostanza non mi è chiaro come impartire l’istruzione di compiere un certo numero di step al motore….
Autore
Ciao Andrea,
forse il codice può ingannare tuttavia ho scritto dei commenti per chiarire i punti critici.
La funzione stepGo() si occupa di eseguire solo il passo, ossia di fornire l’impulso al driver, quante volte la chiami lo definisci tu nel loop() o in qualsiasi altro punto dello sketch che scrivi.
Grazie Mauro, ieri sera ero giunto a questa conclusione pensando di inserire un ciclo for …. che richiamasse la funzione stepGo() per ogni step che desidero far compiere al motore a prescindere dalla direzione… credo sia questo il metodo, grazie mille!!
Io non capisco, ho collegato tutto come hai detto, bobine del motore ok, m0 m1 m2 ok, gnd sleep e reset ok, V in ingresso 12V ..appena collegato fumatina grigia..è andato? Non so se riprovare a collegare mi fa abbastanza paura ricollegare la batteria solo per provare.. Grazie..
Autore
Ciao Romeo,
sei certo di possedere il medesimo driver e che sia originale della pololu come il mio?
Bastano poche differenze e le connessioni potrebbero non essere corrette, inoltre ricordo male o tu avevi già avuto problemi simili con la easy-driver, non sei nuovo alla fusione dei driver perchè connessi in modo errato.
Ciao Mauro, grazie dell’utilissimo sito!
Sto provando un mototre nema 17 1,7(A) 200step (1,8geg/step) con una confiugrazione uguale alla tua (arduino e drv8255)
Collegando un potenziometro su A0 collegato direttamente alla variabile delay dello sketch sto provando a cambiare variare la velocità del motore. Purtroppo sto riscontrando che il motore ha dei range in cui entra in crisi (l’albero motore invece di continuare a girare più lentamente o più velocemente inizia a tremare e va avanti e indietro in maniera incontrollato), poi uscito da questi piccoli range torna “normale”.
Cambiare linearmente la velocità del motore senza “intoppi” mi servirebbe per creare uno slider motorizzato per una fotocamera. La precisione è importante e anche la fluidità.
Autore
Ciao Davide,
i range in cui il motore “entra in crisi” sono dovuti, probabilmente, ai limiti meccanici del motore stesso, dovresti trovarli nel sito del produttore.
Premesso che il motore passo-passo è il meno indicato per uno slider di precisione a causa delle vibrazioni e della scarsa fluidità a regimi lenti, ti consiglio di scegliere un motore che possa supportare i regimi che ti interessa raggiungere.
Ciao Mauro volevo farti una domanda se potevo alimentare a 24 volt ramps1.4 e mega 2560 .prima di bruciare tutto. Grazie in anticipo.
Autore
Ciao Giuseppe,
devi consultare il datasheet del costruttore perché so che alcune lo supportano ma non è una info valida in assoluto.
Salve Mauro,
dallo schema di collegamento fornito dal produttore viene indicato di inserire un condensatore elettrolitico sull’alimentazione del motore. Dal video che hai postato non mi sembra che tu lo abbia inserito nel circuito, (o per lo meno non lo vedo io?)
Autore
Ciao Cesare,
sarebbe utile inserirlo, io negli esperimenti, poiché sono progetti che durano pochi minuti lo ometto usando una alimentazione stabilizzata.
Ciao Mauro,
Se volessi pilotare tre motori stepper contemporaneamente , con tre driver separati, potrei impartire in modo sequenziale tre istruzioni “StepGo”, una per ogni set di pin relativi ad ogni motore?
Ovvero un loop che chiama in sequenza una funzione StepGo1 per far compiere uno step al primo driver, una funzione StepGo2 per far compiere uno step al secondo driver ed una funzione StepGo3 per far compiere uno step al terzo driver, ?
In questo caso le pause immagino che dovrebbero essere diminuite, considerando che prima che lo stesso motore riceva la successiva istruzione deve attendere che anche gli altri due stepper ricevano le relative istruzioni.
In questo modo il comportamento sarebbe quasi simile ad un movimento simultaneo dei tre motori.
Grazie
Autore
Ciao Andrea,
come teoria è corretta.
Ciao Mauro,
Ho 45 anni e sono un appassionato di Informatica ed Elettronica.
Da parecchi Anni Avevo qualche progettino in mente ma putroppo il tempo che posso deicare alle mie passioni è pochissimo. Qualcosa avrei voluto realizzare con i PIC e mi ero anche organizzato con un emulatore e un programmatore, ma poi voui per il tempo a disposizione vuoi per altri motivi è rimasto tutto irrealizzato. Ma Vengo al dunque , ho scoperto Arduino un anno fa circa ed ho deciso di iniziare con uno dei progetti :un Inseguitore Solare Astronomico. Grazie ai tuoi consigli ed a tanto materiale recuperato in rete sono riuscito, in modo abbastanza facile a realizzare tutta la parte elettronica e buona parte di quella Meccanica. Preciso che Non sono un Teorico, più che altro ho una buona manualità con la meccanica e l’elettronica ed essendo un ex programmatore PASCAL mi è risultato facile imparare quel po di “C” che serve per usare ARDUINO.
Ho scelto di utilizzare La versione Nano di Arduino e per la parte dei motori /driver ho utlizzato appunto il Driver che hai provato tu usandoli in accoppiata ad ei Motori recuperati da vecchie stampanti ad aghi, questi sono targati come 5V 1,1A. – 1.8 gradi Ho letto che questi driver hanno un’escursione di tensione così estesa in modo da poter aumentare la velocià di motori che lavorano con tensioni minori. Infatti con tensioni basse 9-12v non riesco ad aumentare la velocità se non perdendo coppia.
Il problema che ho riscontrato e per cui sto quì a chiderti un consiglio è il seguente:
Nella routine di Inseguimento faccio calcolare la posiizione Teorica, Azimuth ed Elevazione, dopo di che la trasformo in passi da Eeguire per i motori, a questo punto se i passi da eseguire sono 1 o 2 succede che il motore fa come se volesse muoversi ma in relaltà non si muove, anzi sembra che a volte vada nel senso opposto in modo quasi impercettibile, o meglio, ogni volta che do un passo singolo da fare si comporta in modo differente: o non si muove, o va indietro oppure va in avanti in moto quasi impercettibile . Tieni conto che per minimizzare i consumi ho sfruttato la funzione SLEEP che abilito subito prima di dare la sequenza dei passi e disabilito subito dopo . I motori sono comunque accoppiati a riduttori meccanici e sono momentanemente senza alcun carico. Per quanto riguarda il Delay ne ho scelto uno che mi desse una coppia al motore tale da non riuscire qualsi a fermarlo con le dita. L’alimentazione che sto usando è 16V con batterie al piombo con un delay di 1200 MicroSec..
Quando invece do da fare più di 6/7 passi il motore si muove in modo corretto (non sono però sicuro se sto perdo passi per qualche motivo) . Ti posso dire però che se lo faccio andare in manuale in una direzione con la stessa tensione e lo stesso Delay ha una coppia bestiale.
i due driver sono stati montati su una mille fori con un unico Condensatore da 220mF e li sto pilotando in modalità Full-Step.
Spero tu mi possa aiutare a risolvere questo intoppo e di aver dato tutte le informazioni necessarie.
Attendo impaziente un tuo riscontro.
Ciao
Giuseppe
Autore
Ciao Giuseppe,
prova ad utilizzare una libreria per il controllo degli stepper, io ho provato la AccelStepper e mi sembra abbia una ottima risposta anche con questi driver, che uso anche io riscontrando talvolta i tuoi problemi su pochi passi.
Prossimamente pubblicherò degli articoli proprio sull’uso di alcune librerie di controllo degli stepper.
… dimenticavo…
Visto che sto usando la versione nano e che sono arrivato oltre l’80% della memoria , il compilatore ha iniziato a darmi un’ allarme …. tipo: “Attenzione – potrebbero esserci problemi di stabilità” … mi devo preoccupare? Inoltre l’uso della libreria accelstepper utilizza parecchie risorse?
Non vorrei essere costretto a cambiare modello di Arduino adesso che avevo quasi terminato la parte software.
Grazie ancora
Giuseppe
Ciao Mauro,
Ti aggiorno sui progressi che sto facendo , se così li vogliamo chiamare.
Sto utilizzando la libreria da te suggerita , riesco a fargli fare le accellerazioni anche se in questa fase ci sono molte vibrazioni (forse dovrei regolre la corrente del DVR8825 ?) ma non riesco a fargli fare il singlo passo.
Ho provato ad impostare 2 passi al secondo e li esegue correttamente in un unico “RUN” di oltre 2000 passi, Se invece gli chiedo di farmi un passo in un RUN si comporta come ti ho spiegato nel primo post.
la routine che faccio eseguire per ogni asse è la seguente dopo ovviamente aver calcolato una nuova posizione:
MOT_AZ.moveTo(OBTstepAZ);
if (MOT_AZ.distanceToGo()!=0) {
MOT_AZ.enableOutputs();delay(50);
while (MOT_AZ.run()==true) {} ;
delay(50);
MOT_AZ.disableOutputs();
}
AZ_pos=OBTstepAZ;
ho immesso dei ritardi prima e dopo l’abilitazione del PIN sleep pensando che la corrente avesse bidogno di stabilizzarsi , ma niente da fare.
Sono al punto di partenza.
non riesco prprio a capire dov’è il problema.
se puoi dammi un’indizio … una strada da percorrere… qualche altro tentativo da fare…
grazie in anticipo
un saluto
Giuseppe
Autore
Ciao Giuseppe,
non ho compreso cosa tu stia facendo con il codice che mi invii.
Certamente impostare la corrente di controllo è un buon punto di partenza, poi ti suggerirei di verificare con un motore differente ed infine anche con un driver differente, potrebbe essere un problema meccanico del motore od elettrico del motore o del DRV8825 che stai utilizzando.
Un altro suggerimento è di dotare il drv8825 di una aletta di raffreddamento con apposito bi-adesivo che trasferisca correttamente il calore.
Autore
Ciao Giuseppe,
una risposta alla volta:
1. l’80% della memoria evidenzia un uso eccessivo di questa risorsa che potrebbe portare a saturarla con relativo innesco di reset;
2. se la libreria suggerita occupa troppe risorse prova a cercarne una meno esosa;
3. se cambi per andare verso una Mega, ad esempio, non dovrai cambiare molto.
Ciao Mauro,
Intanto grazie per la tua disponibilità.
Mi stai quindi suggerendo che si tratta di un problema di timing?
Ho incominciato a dare un occhiata alla libreria che mi hai suggerito ed ho visto che usa una funzione per gestire anche il pin SLEEP…. mi pare si chiami Enable
Approfitto per chiederti visto che gia usi questa libreria : uso giá il protocollo I2c per il display e l’orologio che so impegna gli interrupt. Questa libreria fa uso di interrupt o vado liscio senza problemi?
Grazie ancora
Giuseppe
Autore
Ciao Giuseppe,
mi indichi le fonti da cui hai letto che la I2C della RTC impegni degli interrupt, non ho trovato info nel web.
So, ed ho scritto anche un articolo, dedicato ai TIMER ( 3 su arduino/genuino uno e 6 sulla Mega ).
Ciao Mauro,
Intanto scusami … ho fatto un pò di confusione con i post.
Vado in ordine :
1)
In effetti non avevo letto sul WEB il fatto che la Libreria I2C facesse uso di Interrupt … In effetti se me lo chiedi così è molto probabile che la mia fonte era poco attendibile. Tuttavia ho dato un’occhiata adesso sul WEB ed ho trovato sul Forum di Arduino un Topic titolato ” Hardware Interrupt and I2C interference – how to resolve (Read 1 time)” nel quale Leggo :” The data coming in and going out with I2C is with interrupts, those interrupts will delay other interrupts.”
E’ probabile che stia facendo io confusione o che non mi sia spiegato correttamente.
Cerco di spiegarmi meglio :
Da quel che mi ricordo gli interrupts Hardware sono delle procedure la cui attivazione è legata ad un evento esterno su un determinato Pin. (sinceramente non ho studiato di recente mi perdonerai e mi correggerai se dico qualche castroneria) Credevo quindi che la libreria I2C usasse qualche interrupt per creare la comunicazione sincronizzata fra il Master e lo Slave.
In passato mi ricordo di aver letto anche che una Routine di Interrupt non può essere interrotta se non da un’altra con priorità maggiore (almeno era così sui PC quando giravano gli MS-DOS sugli Intel 8088).
Avevo quindi il timore che la libreria AccelStepper usasse Interrupt e che potesse interferire con la comunicazione I2C, ecco perchè la domanda.
2)
In effetti hai ragione : la parte di sketch così postata (soprattutto senza commenti ) non dice niente….
provo a spiegarmi meglio.
Quello che segue si trova in un Ciclo, e succede alla parte dove faccio calcolare la posizione del Sole e la trasformo in passi-motore.
MOT_AZ.moveTo(OBTstepAZ); //Assegno posizione da raggiungere (calcolata) per l’asse AZIMUTH
if (MOT_AZ.distanceToGo()!=0) { // Se ho movimento da fare allora entro nel blocco del ciclo del RUN
MOT_AZ.enableOutputs(); // Abilito il PIN nSLEEP
delay(50); // Aggiungo ritardo (se non erro il datasheet dice 1.7ms min)
while (MOT_AZ.run()==true) {} ; // Ciclo RUN fino al raggiungimento della posizione
delay(50); //Altro Delay per stabilizzare la posizione del motore
MOT_AZ.disableOutputs(); // disabilito il PIN nSLEEP
}
Prima di fare altre prove ho regolato la corrente con il trimmer del Driver che ha avuto come effetto la riduzione delle vibrazioni durante le rampe di accellerazione e decellerazione.
Inoltre ho verificato che il driver non scalda per niente quindi per adesso direi niente dissipatore.
Le prove che ho eseguito sono le seguenti :
1)Eliminato l’uso del Pin nSLEEP dallo sketch. Quindi col Motore sempre eccitato la proceura di insguimento funziona alla grande: il motore segue ogni singolo passo che gli viene impartito dal Driver.
2)
Testato lo sketch come sopra postato e commentato. Quando ho un singolo passo da fare esso provoca :
un passo nel senso opposto nel momento in cui abilito nSLEEP, dopo di che esegue il singolo passo col RUN(). Risultato : il motore ha perso un passo ed è sempre allo stesso posto. Ho provato ad aumentare i delay per osservare meglio il fenomeno e posso confermarti quanto suddetto : al momento che vengono rieccitate le Bobine fa un passo indietro, dopo di che esegue correttamente il passo con il comando RUN();
3)
Ho provato a gestire la sequenze come riportato nel DataSheet nella parte dove mostra la sequenza del Timing. Ho introdotto quindi anche l’uso del Pin ENBL come recita il Datasheet : non è cambiato nulla. il motore si comporta allo stesso modo.
Come avrai capito è fondamentale nel mio progetto che riesca a non perdere passi tenendo nel contempo i consumi a bada .
A questo punto non mi resta che fare i tentativi da te suggeriti : cambio Driver e Cambio motore. … e vediamo l’effetto che fa.
Adesso sono al 92% della memoria ma dovrò ottimizzare un po di codice …. spero di riuscire a tenere il Nano altrimenti dovrò cambiare il layout Hardware.
Non so se posso postarti Foto di quello che sto realizzando ma mi piacerebbe avere un tuo parere/giudizio visto che è la prima volta che mi cimento. Avrei piacere, magarì quando e se riuscirò a completare il progetto, di condividere l’esperienza.
Un saluto ed un ringraziamento per la tua Attenzione
alla prossima
Giuseppe
Autore
Ciao Giuseppe,
cerco di rispondere seguendo la tua numerazione, iniziamo dai chiarimenti su quanto scritto in precedenza:
1. ho letto l’articolo, quello che deduco io, anche dai link di approfondimento contenuti, è che arduino impiega del tempo per eseguire le ISR ( Interrupt Service Request ) come l’I2C che devono essere ridotte e quanto più atomiche è possibile per evitare lunghe pause nell’esecuzione del codice.
Se ho interpretato bene ti è sufficiente ridurre le routine di comunicazione al minimo per evitare interferenze sui tempi. Nel tuo caso usi l’I2C per interrogare l’ora dell’RTC per cui il tempo impiegato è nell’ordine dei microsecondi e non dovresti incorrere in problemi.
2. Adesso il dice mi è più chiaro a parte la linea “delay(50); // Aggiungo ritardo (se non erro il datasheet dice 1.7ms min)” non comprendo il valore 1.7ms = 50 detto che il delay funziona in millisecondi
Passando poi alle prove che hai eseguito:
1. ok
2. l’abilitazione dell’nSLEEP potrebbe essere un effetto causato dal driver in fase di attivazione, francamente nei miei progetti non ho mai utilizzato la modalità nSLEEP in quanto sono movimenti continui ( tipo stampanti 3D ) in cui una volta partito il driver funziona fino al termine dell’opera. Tuttavia se è un effetto che ottieni sempre potresti usare un workaround: quando attivi nSLEEP imposti che i passi siano n+1 in cui n è il numero da compiere a cui sommi 1 per compensare il movimento contrario eseguito dal motore.
3. direi che se si tratta di un effetto del fw presente sul driver non puoi correggerlo dal microcontrollore, dovresti sostituire il fw del driver, ma non sono certo sia possibile.
Se vuoi risparmiare energia lasciando i motori “non alimentati” durante i periodi di sleep puoi provare con il suggerimento al punto 2.
Mi farebbe molto piacere ricevere un articolo scritto da te da condividere a tuo nome, magari anche con un video del sistema in funzione. Puoi, quando il progetto sarà ultimato, inviarmi tutto il materiale come descritto nella pagina: https://www.mauroalfieri.it/collabora.html
Ciao Mauro,
Ho provato il tuo sketch per testare il DRV8825, e devo dire che continua a darmi problemi su problemi.
Per fare le prove sto alimentando il driver con un alimentatore da banco e gli fornisco 12V perchè successivamente alimenterò tutto con una batteria ad acido a 12V
Inanzitutto il motore rimane a vibrare o a fischiare e non parte se non premo il primo o secondo pulsante, e non avverto la riduzione dei passi del motore nè tantomeno la riduzione della sua velocità quando premo gli altri tasti.
Sembra proprio non funzionare correttamente tant’è che spesso ignora pure gli input di alcuni dei bottoni.
Un altro problema ricorrente è che dopo un po’ di tempo il driver crasha, e smette di funzionare. Dopo un po’ torna ad andare, ma non ho capito con criterio si blocca nè tantomeno con che criterio riparte.
Non riesco a capire quale possa essere il problema, ho provato anche altri sketch online ma il motore non sembrava mai perfettamente funzionante, e la storia dei crash è davvero fastidiosa.
Hai qualche idea di quale possa essere il problema?
Ti ringrazio in anticipo!
Autore
Ciao Christian,
Stai usando un arduino originale e dei driver pololu e non clonati giusto? Le anomalie che mi segnali io non le ho mai riscontrate, mi riferisco ai crash, per i movimento del motore potrebbe essere un errore sui tempi troppo ristretti tra comando e pause di step.
Ciao Mauro e grazie della tua risposta.
L’Arduino è originale, ma forse i driver non sono Pololu, sto usando questa versione: [ link rimosso ]
Per quanto riguarda il movimento del motore, se il porblema fosse quello da te menzionato, come potrei fare per risolverlo?
Autore
Ciao Christian,
Ti chiedo il semplice rispetto delle regole del blog tra queste é vietato incollare link a siti di vendita non-line generalisti o non originali.
Per i tempi puoi aumentarli, nello sketch é spiegato come funziona per aiutarti a capire come eseguire le modifiche.
Per i malfunzionamenti dei driver, crash come li chiami tu, sono più orientato ad un problema legato alla manifattura del driver.
Non mi hai detto che motore usi, intendo le caratteristiche elettroniche e meccaniche, potrebbe essere la causa.
Chiedo scusa, non sapevo dell’esistenza di questa regola.
I motori che utilizzo sono dei Nema 17, modello 42BYGHW609 a 1.7A., dovrebbero andare bene con questo tipo di driver.
Nel frattempo proverò ad aumentare i tempi per gli step del motore.
Autore
Ciao Christian, le regole sono scritte in fondo ad ogni articolo che leggi, ti consiglio sempre di leggere bene ciascuna descrizione perché oltre alle regole ci sono dei piccoli trucchi o descrizioni che pubblico proprio per aiutarti con i tuoi esperimenti.
Ciao Mauro, prima di tutto complimenti per il sito e per il tuo lavoro, trovo sempre articolari chiari e molto utili.
Secondo, sto riscontrando parecchi problemi nel far funzionare il driver DRV8825: dopo aver eseguito tutti i collegamenti seguendo le istruzioni riportate sul sito della Polulu ed aver tarato la Vref il motore continua a non funzionare (lo stepper è un Nema 17 con un assorbimento di 1.5A). Quello che noto è che anche collegando arduino al driver senza aver carico nessuno sketch, giusto per alimentare la logica, si sente un “bip” intermittente emesso dal motore (la cosa si verifica anche con lo sketch caricato poi); il suono si stoppa quando scollego o il pin SLEEP o RESET dai 5v. Ho provato anche a verificare le fasi del motore e sono corrette. Altro particolare che ho notato è che scambiando l’ordine di alimentazione della singola fase (A1 con A2) il motore da qualche segno di vita in più, ma non gira proprio come se le fasi fossero invertite (giustamente), ma almeno fa vedere di “ricevere corrente”, mentre nella configurazione giusta ho solo il bip e nessun segno di movimento. Infine ho provato anche ad aumentare di poco la Vref per vedere cosa succedeva, ma il motore emetteva un fischio continuo.
Sapresti cosa c’è che non va e cosa sto sbagliando?
Ti ringrazio in anticipo per il tuo aiuto, un saluto
Fulvio
Autore
Ciao Fulvio,
prova ad aumentare i tempi tra una fase e la successiva, a titolo di test metti 1000 millisecondi.
Spesso il sibilo che senti è legato all’alternarsi delle fasi che sono troppo veloci e non eseguibili dal motore.
Ciao Mauro,
ho quasi finito di montare un robot x orto di precisione (www.farmbot.io) . Vorrei sostituire motore Nema 17 stepper
ed encoder delle seguenti caratteristiche
Motor resolution: 200 steps/revolution(1.8 deg/step)
winding type:bipolar
voltage:12V
Current draw: 1.68A
Wiring: 4 wire
Shaft diameter :5mm diameter
Mount Hole pattern: 4x M3 holes,standard 17 pattern
Encoder Resolution : 360 lines revolution
Encoder output :differential
sono alla prima esperienza di montaggio e probabilmente ho fulminato qualcosa (il resto funziona bene).
Ti chiedo cortesemente da quale fornitore (non americano) potrei fornirmi .
Grazie comunque x l’attenzione e cordiali saluti
Luigi
Autore
Ciao Luigi,
io solitamente acquisto da robotics-3d.com i miei stepper, sono a Roma, indica pure che te li ho indicati così ti possono dare dei consigli su cosa acquistare.
Grazie Mauro dei tutorial ti seguo sempre con attenzione!
Ciao Mauro ti seguo da sempre da quando ho iniziato con arduino, però ho un problema che a me sembra banale:
vorrei fare un semplice start end stop con un motore nema 17, un drv8825 e due pulsanti
ma non riesco.
i miei pin sono:
pin 4 start
pin 5 stop
pin 6 dir
pin 7 stp
pin 8 enable
ho ponticellato rst,slp,mov0,mov1,mov2, collegati con 5 v come da costruttore
Autore
Ciao Ruggero,
hai già letto i miei articoli sul controllo motori e pulsanti? Dovrei averne scritti qualcuno per la Easy Driver ma puoi applicare i medesimi concetti al drv8825.
Io devo usare gli stessi driver su dei nema 17 bifase … misurando la resistenza degli avvolgimenti posso calcolare la corrente .. per poi regolare i driver ..?!
Autore
Ciao Mauro,
esiste una formula che ho riportato anche in qualche articolo dedicato alle stampanti 3D con cui calcolare corrente e tensione corretti per questo tipo di driver.
[…] Gli ultimi progetti a cui sto lavorando, tipo il Dolly, utilizzano i motori passo-passo e richiedono un driver di controllo come il pololu md20a che ho acquistato tempo fa e provato in questo articolo. […]