In questo articolo realizzeremo un listato per pilotare il nostro motore, nel mio caso i due motori, inviando comandi dalla tastiera del pc, il listato originale è quello riportato sul sito arduino, al quale ho applicato alcune modifiche per pilotare 2 motori e non uno solo, come nell’esempio.
Nel prossimo, ed ultimo, articolo di questa serie ti mostrerò un simpatico video in cui due motori compiono in simultanea dei movimenti in base ad una sequenza di comandi inviati dal pc collegato ad arduino.
Passiamo subito all’analisi del codice che ho modificato per pilotare 2 motori:
int motorPinx[] = {8, 9, 10, 11}; int motorPiny[] = {4, 5, 6, 7}; int countX = 0; int count2X = 0; int countY = 0; int count2Y = 0; int delayTime = 10; int val = 0; int lettura = 0; int letturaX = 0; int letturaY = 0; int pLetturaX = 0; int pLetturaY = 0; void setup() { Serial.begin(9600); for (countX=0; countX<4; countX++) { pinMode(motorPinx[countX], OUTPUT); } for (countY=0; countY<4; countY++) { pinMode(motorPiny[countY], OUTPUT); } } void moveForwardX() { if ((count2X == 0) || (count2X == 1)) { count2X = 16; } count2X>>=1; for (countX = 3; countX >= 0; countX--) { digitalWrite(motorPinx[countX], count2X>>countX&0x01); } delay(delayTime); } void moveBackwardX() { if ((count2X == 0) || (count2X == 1)) { count2X = 16; } count2X>>=1; for (countX = 3; countX >= 0; countX--) { digitalWrite(motorPinx[3 - countX], count2X>>countX&0x01); } delay(delayTime); } void stopX() { for (countX=0; countX<4; countX++) { digitalWrite(motorPinx[countX], LOW); } } void moveForwardY() { if ((count2Y == 0) || (count2Y == 1)) { count2Y = 16; } count2Y>>=1; for (countY = 3; countY >= 0; countY--) { digitalWrite(motorPiny[countY], count2Y>>countY&0x01); } delay(delayTime); } void moveBackwardY() { if ((count2Y == 0) || (count2Y == 1)) { count2Y = 16; } count2Y>>=1; for (countY = 3; countY >= 0; countY--) { digitalWrite(motorPiny[3 - countY], count2Y>>countY&0x01); } delay(delayTime); } void stopY() { for (countY=0; countY<4; countY++) { digitalWrite(motorPiny[countY], LOW); } } void loop() { lettura = Serial.read(); if ( lettura > 0) { Serial.print(delayTime); Serial.print('X: ', BYTE); Serial.print(letturaX, BYTE); Serial.print('Y: ', BYTE); Serial.print(letturaY, BYTE); Serial.print(' ', BYTE); Serial.println(lettura, BYTE); if ( lettura == 'q' || lettura == 'w' || lettura == 'e' ) { letturaX = lettura; } else { letturaX = pLetturaX; } if ( lettura == 'a' || lettura == 's' || lettura == 'd' ) { letturaY = lettura; } else { letturaY = pLetturaY; } } switch (letturaX) { case 'q': moveForwardX(); break; case 'w': moveBackwardX(); break; case 'e': stopX(); break; } switch (letturaY) { case 'a': moveForwardY(); break; case 's': moveBackwardY(); break; case 'd': stopY(); break; } pLetturaX = letturaX; pLetturaY = letturaY; }
Premetto che la mia idea è di pilotare 2 assi X e Y di una CNC, a tal proposito mi irferirò a ciascun motore con la lettera dell’asse corrispondente.
Le prime righe 1-13 settano le variabili che utilizzeremo per nel resto del codice, in particolare la riga 1 e 2 impostatno i pin che utilizzeremo per pilotare i due motori: 4,5,6 e 7 per l’asse Y e ,9,10 e 11 per l’asse X.
Anche le variabili che seguono sono distinte secondo l’assse di riferimento, fatta eccezione per “delayTime” che definisce la velocità di rotazione i funzione del tempo di attesa tra gli step dei motori, “val” e “lettura” che utilizzerò per memorizzare valori temporanei durante la rotazione.
Le linee 15-27 compongono la funzione di “setup” necessaria ad Arduino a inizializzare le variabili e predisporre, in questo caso, la comunicazione seriale, che utilizzerò per inviare i dati dal pc ad Arduino.
Il codice che segue è composto da funzioni per essere gestito facilmente e per duplicarlo agevolmente per i due assi.
La funzione moveForwardX() ( linee 25-30 ) farà ruotare di un un verso, che per convenzione di trattazione definiremo: avanti, l’albero del nostro motore. Il principio di funzionamento è quello dei numeri binari facendo shiftare ( >> ) il valore del contatore trasferito ai pin di arduino in modo continuo.
Allo stesso modo la funzione moveBackwardX() ( linee 32-41 ) imprimerà all’albero del nostro motore una rotazione nel verso contrario.
La funzione stopX() ( linee 43-45 ) ferma il motore portando a livello logico basso ( LOW ) tutti i pin della scheda Arduino.
Per l’asse Y ho duplicato le funzioni appena descritte cambiando l’array di pin in modo da imprimere comndi all’altro motore.
La funzione loop ( linee 69-126 ), defult Arduino, è eseguita ciclicamente e attende l’invio di una lettera dal pc mediante segnale seriale, le lettere q,w,e inviano comandi all’asse X; le lettere a,s,d inviano comandi all’asse Y.
Le linee 123 e 124 insieme alle righe 79 e 80 si assicurano che a cicli successivi eseguiti dalla funzione loop se non ci sono nuovi comandi restino validi quelli del cisclo precedente, in caso di variazione provvedono a impostarla verso i motori.
Curiosità: per la natura specifica del programma e dei comndi seriali gestiti da Arduino è possibile inviare contemporaneamente ( in un unico invio ) sia comandi all’asse X sia comandi all’asse Y (es.: qa -> rotazione di emtrambi gli assi in avanti, ws -> rotazione di entrambi gli assi indietro, qs -> rotazione X avanti e rotazione Y indietro, ecc… )
50 commenti
Vai al modulo dei commenti
Complimenti per i tutorial molto chiari e completi… e comprensibili anche da un neofita!
sono un un principiante con Arduino (ero presente all’Arduino Camp pero’ solo sabato 18).
ti volevo fare qualche domanda sui motori passo-passo. vorrei smontare una vecchia stampante e utilizzare i motori passo-passo.
mi puoi chiarire i parametri di datasheet dei motori passo-passo, quali sono i piu’ importanti per poterli pilotare con la scheda Arduino +integrato ULN2003A ?
grazie
massimo
Autore
Ciao Massimo,
mi spiace non esserci stato il 18, magari ci saremmo conosciuti.
Non mi ritengo un esperto, sto imparando ogni giorno cose nuove, come te e tanti altri
conosciuti all’Arduino Camp, e le condivido perchè i nostri passi siano di aiuto a chi
vuole iniziare.
Anche io ho smontato delle vecchie stampanti, la discarica di paese è un ottima fonte di
materiale a costo zero, ciò che ho trovato sono piccoli motori bipolari, non ho ancora
provato il loro uso in quanto l’ULN2003A non sembra ideale per questi motori, sto
studiando altri integrati, spero di poterti dare maggiori dettagli presto, magari in un
articolo.
Sulle caratteristiche di un motore passo-passo, ho imparato, che sono importanti il
numero di passi (step), es.: 200 è ottimale, a volte lo indicano in gradi (dec) 1.8 ( 360
/ 1.8 = 200 ), il voltaggio e l’amperaggio, quelli nel tutorial sono 12v 0.44A un po’
piccoli se devi muovere grossi carichi, nelle Cnc ad esempio si usano solitamente quelli
con attacco Nema23 da 2/2,5 A con una coppia da 1,2 o 1,8 Nm considera i dati con le
pinze, io li ho appresi documentandomi in Internet non ho ancora avuto modo di provarli.
Mauro
caio!
ho visto un tuo progetto riguardante i motori passo passo.
sarei interessato a costruire un mini centro di a 3 assi e muoverlo con i motori passo passo.
per quanto riguarda la parte fisica (meccanica) non ho problemi …sono in grado di costruire quasiasi cosa, ma a riguardo la parte elettrica e il modo di programmare sono molto scarso.
sei disposto a darmi una mano?
che tipo di motori devo comperare?
tutti i componenti che mi sevono?
e come devo collegarli?
e naturalmante la parte del programma?
quella che hai fatto con 2 motori va bene ma vorrei mettere anche il 3°
Paolo
Autore
Ciao Paolo, sono sempre contento quando si può collaborare, anche io vorrei realizzare una cnc con 3 assi e la parte meccanica un po’ mi crea problemi come il disegno CAD.
Per questo cerco collaborazioni come la tua. Ora sono lontano da casa e riprenderò i progetti al rientro 1/2 agosto. Se ti va possiamo aggiornarci dopo questa data.
Ciao Mauro
se il fatto che non sono laureato per te non è un problema si puo fare.
Io per quanto riguarda il disegno Cad, programmazione cnc e realizare quasiasi cosa con macchine utensili, ho veramente pochi limiti, mentre la programmazione C o simili sono alle prime armi e forse non riuscirò mai tanto di più.
Comunque io un cnc l’ho iniziato…
mi farebbe veramente piacere collaborare a qualche iniziativa
saluti Paolo
Autore
Ciao Paolo,
laurea??? nenache io lo sono 🙂 e non me la cavo male.
Per la programmazione non è un problema anche se io sto pensando a qualcosa di un po’ più immediato per una cnc.
Mi invii foto, disegni o qualche altra info sulla CNC che stai già realizzando? così procediamo assieme nelle fasi successive, invia pure tutto a info at mauroalfieri dot it.
Attendo tue info
Ciao
ciao mauro,
avrei bisogno di un grosso favore;
ho visto che con paolo state provando a realizzare una cnc a tre assi, potrei avare anche io qualche informazione in più riguardo alla programmazione, e potrei anche sapere se è possibile fare un programma per arduino che legga il codice g?
grazi anticipatamente
Autore
Ciao Paolo,
stiamo ancora lavorando al progetto e per adesso non abbiamo ancora nulla di pubblicabile e da condividere.
Per l’interpretazione del “gcode” con Arduino cerca il progetto RepRap con Arduino, sto seguendo anche io quella stada.
Quando avrai realizzato qualcosa di pubblicabile, e se lo vorrai, sono a tua disposizione per aiutarti a scrivere uno o più articicoli in merito.
Buon lavoro
Mauro
ciao mauro, in internet ho trovato un programma per arduino per una cnc a tre assi con arduino uno, l’ho provato, pero non mi fa caricare la libreria ad arduino.
Il sito è:http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1293881339/all
spero che tu ci riesca, e se vuoi mi fai sapere come hai fatto.
grazie..
paolo
Autore
Ciao Paolo,
di quelli presenti nel link che mi indichi quale è il sw su cui mi chiedi un aiuto?
Puoi darmi il link diretto? lo provo volentieri e se vuoi poi scriviamo un articolo in italiano a 4 mani su questo sw e qualche esperimento che avrai eseguito.
Grazie
ciao mauro,
questi 2 sono i link:il 1° http://www.mmcpix.com/CNC/CNCdriver.zip
è il programma per il computer ed il 2° http://www.mmcpix.com/CNC/GCode_Interpreter.zip è la libreria per arduino.Io li ho scaricati, il programma funziona, arduino xo non vuole accettare la libreria =(…. non so che fare… spero che tu ci riesca.Comunque per l’articolo per me va benissimo…
ciao mauro,
oggi sono riuscito a caricare ad arduino la libreria, però ho il motore che mi va a scatti, cosa può essere?
Autore
Ciao Paolo,
mi fa piacere che tu si sia riuscito autonomamente se vuoi aggiungi qual’era l’errore cos’ che altri amici appassionati possano risolvere con i tuoi suggerimenti.
I motori stepper si muovono per loro natura con scatti continui, da cui il nome stepper o passo-passo, se ritieni che si muovano troppo lentamente probabilmente esiste nello sketch un parametro che regola il deplay ( o ritardo ) nella rotazione e abbassando quel valore vedrai un movimento più fluido.
Io ticonsiglio di cercare quel parametro e modificarlo secondo la tua necessità, attenzione solo che in alcuni ambiti tipo le CNC la velocità ha molte controindicazioni, alcune pericolose.
Quando lo avrai finito mi farebbe piacere pubblicare il tuo progetto se mi mandi un piccolo articolo e le foto.
Ciao
ciao mauro,
l’errore stava solo nel fatto di aggiornare il programma di arduino, comunque non ho il problema della lentezza del motore, ma quella che al primo impulso fa un passo avanti e nel secondo uno in dietro. Ho provato anche a mudificare il posizionamento dei cavi in tutte le soluzioni possibili. però il risultato è uguale : avanti, indietro, avanti, indietro ecc… a te che ne sai, ti è mai capitato??
Autore
Ciao Paolo,
quello che desrivi è il più classico degli errori e dipende solitamente dal collegamento delle bobine, prova a seguire i miei articoli sui motori stepper troverai una tabella che ti aiuta a capire come identifiare le bobine del tuo motore, e come eseguire i primi semplici test di rotazione, copresi quelli puoi collegare il motore ad Arduino e uplodare lo sketch.
Se hai dubbi dopo aver letto e compilato la tua tabella, inviamela e provo a decifrarla io.
Ciao
ciao mauro, grazie mille adesso ci proverò e ti farò sapere…
ciao mauro,
è normale che ho valori diversi, tipo 18.8 , 37.4 , e poi nei miei motori i cavi sono a coppie, cioè (rosso,rossobianco) (giallo,giallobianco) e poi 2 soli nero e bianco.
Autore
Ciao Paolo,
si è corretto, ha eseguito le corrette misurazioni. Da quello che leggo il tuo motore è a 6 fili quindi simile a quello descritto in questo articolo:
https://www.mauroalfieri.it/elettronica/motori-passo-passo-unipolari-riconoscerne-le-fasi-seconda-parte.html
Come vedi dalla tabella i valori misurati sulla singola fase nel mio caso erano 20 ohm e sugli estremi di 2 fasi di 40 ohm, i valori che leggi tu sono del tutto simili, 18.8 dove io ho 20 e 37.4 dove ho 40.
Copila la tua tabella mettendo i dati come ti ho descritto e troverai le tue fasi.
Leggendo quello che mi scrivi direi che il tuo nero e nero e bianco sono i comuni, ma potrei sbagliare, se così fosse uno sarà il pin A e l’altro il pin B della mia illustrazione.
Come ti ho indicato in precedenza dopo aver compilato la tabella inviamela in jpg o altro formato ed io posso provare a dirti quali sono le fasi.
Ciao
Mauro
ciao mauro, come non detto , grazie alla tabella , ho riflettuto un po e ci sono riuscito . grazie per l’aiuto….
Autore
Sono contento, sia che i miei consigli ti siano stati utili sia che applicando un po’ di ragionamento sia diventato tutto più chiaro, è una conoscenza che ti rimarrà per sempre, e non solo per questo progetto, per questo ti ho invitato a ragionarci da solo.
La soddisfazione è maggiore se capisci tutto il meccanismo.
Mauro
i comuni erano il rosso bianco e il giallobianco, la tabella te l’ho inviata su facebook xk qui non ci riuscivo, comunque mi sapresti indicare un driver che abbia in ingresso step e dir e all’uscita le fasi del mio motore?
grazie infinitamente per l’aiuto….
Autore
Ottimo Paolo, dalla tabella che mi hai inviato sono giunto anche io alla stessa conclusione.
Cao Mauro complimenti per tutto quello che fai
io sono ancora alle prese con i motori possibile che ci siano motori non compatibili con l’arduino tipo m42sp-13nk Mitsumi 96 passi unipolare 4 fili non riesco proprio a farli girare ne con ULN2003 e tanto meno con la motorsheild_fe di futura elettronica vorrei proprio sapere dove commetto l’errore
il listato che proponi nella quinta parte mi da errore
sketch_dec26a.cpp: In function ‘void setup()’:
sketch_dec26a:16: error: ‘lt’ was not declared in this scope
sketch_dec26a:16: error: expected `)’ before ‘;’ token
sketch_dec26a:16: error: expected `;’ before ‘)’ token
sketch_dec26a:21: error: ‘lt’ was not declared in this scope
mi puoi spegare gentilmente
ciao a presto
Autore
Ciao Lorenzo,
grazie per i complimenti.
Non posso mettere la mano sul fuoco in merito alla compatibilità di Arduino con tutti i motori passo passo, anche perchè molto dipende da V e A di pilotaggio.
Tuttavia Arduino si limita ad inviare sol segnali alto e basso alle bobine, al max ti server un driver adatto per quel motore.
Un primo dubbio sei certo di possedere un unipolare? con 4 fili non ricordo esistano unipolari, al max bipolari.
Prima di iniziare qualsiasi epserimento leggi tutti i miei articoli sui motori passo-passo, in questo: https://www.mauroalfieri.it/elettronica/motori-passo-passo-come-riconoscerli.html ad esempio trovi la classificazione e come funzionano.
Vedrai che dopo aver letto gli articoli ti sarà più chiaro come funzionano, come pilotarli e perchè a te non funziona il driver acquistato.
Per il codice si tratta solo di un errore di copia e incolla dei caratteri sul web: < è in realtà un < mentre > è >, grazie per la segnalazione correggo il codice mostrato.
Ciao
Ciao si in effetti volevo dire bipolari
i tuoi articoli li ho letti ma non ne ne vado fuori continuerò a provare. ciao e grazie
riguardo il codice e andato avanti un pezzo
con la versione arduino 022 funziona
mentre con la 1.0 non riconosce la parola BYTE
As of Arduino 1.0, the ‘BYTE’ keyword is no longer supported.
Please use Serial.write() instead.
ciao ciao
Autore
I miei articoli si riferiscono a motori unipolari, i bipolari non puoi pilotarli con l’ULN2003 io ho acquistato degli SN754410NE come mostrato in questo post: http://www.arduino.cc/en/Reference/StepperBipolarCircuit su sito ufficiale, appena riesco provo i motori bipolari e scrivo un articolo.
Se risolvi prima tu e vuoi condividere con il tutti noi la tua esperienza inviami qualche riga di codice, foto e se riesci un video che pubblico volentieri la tua esperienza.
Ciao
Ho visto i tuoi lavori. Complimenti veramente! Premetto che ho scoperto il mondo di arduino da pochi mesi. Sto costruendo una stampante 3d che sfrutta la proiezione dlp e usa una resina uv. Penso di avere risolto tutto tranne un banale problema, che per me non è semplice da risolvere. Devo muovere un piano sull’asse z. Ho trovato tutto tranne la possibilità di posizionare ad un punto di partenza prestabilito il piano (uno zero relativo). Il software che uso non ha la possibilità, almeno io no sono capace di fare questa operazione che per me è indispensabile. Come posso programmare un movimento di un motore passo passo in modo che si posizioni sempre in quel punto? Se mi puoi aiutare te ne sarei grato.
Ciao Federico
Autore
Ciao Federico,
ho riportato la tue email in un commento per condividere con tutti gli utenti la tua richiesta e il tuo progetto, molto interessante.
Il problema che hai riscontrato pensa abbia origine dal fatto che per riportare in posizione zero il l’asse è necessario che arduino sappia di quanto si è spostato tale asse, in pratica quanti passi ha compiuto il motore.
Se questa info non arriva dal sw che stai usando, o se non riesci a ricavarla, penso che la soluzione sia lo spostamento manuale, potresti optare per 2 pulsanti con cui riposizionare il piano Z dopo la lavorazione.
Sul blog ci sono numerosi esempi su come pilotare i motori passo-passo e c’è sicuramente un articolo dedicato al pilotaggio con pulsanti.
L’alternativa che mi viene in mente è un sensore di finecorsa in posizione 0, potrebbe essere un semplice pulsante o un finecorsa ottico che dica ad Arduino “sei arrivato al punto 0”.
Se mi dici che tipo di motore stai utilizzando e quale soluzione pensi possa fare al caso tuo posso provare a darti qualche dritta.
Mauro
Ciao Mauro, ci siamo già sentiti in precedenza per quanto riguarda l’individuare le fasi di un motore passo passo, grazie al tuo aiuto sono riuscito a risolvere utilizzando la tua preziosissima tabella messa a disposizione su un precedente tutorial! Ora però mi sorgono alcuni problemi, io possiedo Arduino Uno e una scheda adafruit motor shield, vorrei pilotare questi due motori tramite l’invio di lettere da tastiera utilizzando la porta seriale di arduino solamente che non riesco ad assegnare il numero giusto dei pin che utilizza arduino per abilitare i motori sulla Adafruit motor shield! Se potresti aiutarmi indicandomi un listato al quale fare riferimento sarei veramente contento anche perché sono diversi giorni che provo senza alcun risultato!!! Grazie anticipatamente per l’attenzione e la disponibilità! Aspetto tue notizie.
Autore
Ciao Michele,
Il passo più complesso é individuare le fasi e tu lo hai già fatto.
Non ho mai provato la shield della Adafruit ma puoi certamente far riferimento al loro sito che é davvero ben fatto e descritto molto bene con tanto di esempi che ti occorrono.
Mauro
Buonasera
Complimenti per il tempo dedicato ad illustrarci quale fantastico mondo può essere quello di arduino!!
Premetto sono un neofita!!
Posseggo un Arduino MEGA 2560 collegata a due integrati L293 H-bridge per i motori.
Ho costruito una mini “CNC” utilizzando le guide ed i motori di due CD-rom, ho scaricato lo sketch per Arduino. Gli assi si muovono ma non riesco a fargli leggere il G-code, o meglio non legge proprio i dati di X e Y. Da tastiera, con i tasti q,w,e,a,s,d gli assi si muovono.
Cosa devo fare?
Ti ringrazio anticipatamente.
Federico2308
Autore
Ciao Federico,
prova a verificare che i dati in G-Code vengano letti e fatteli scrivere sul monitor seriale, successivamente potrai indagare sull’interpretazione dei comandi per capire dove si presenta l’errore.
Just signed in. Hello!
Salve Mauro complimenti per gli articoli. Stò costruendo una stampante 3D DLP e vorrei utilizzare Arduino uno rev. 3 per pilotare l’asse Z ed il tilt della vaschetta della resina se deciderò di utilizzare il sistema bottom up o il tergicristallo se utilizzerò il sistema top down. Ho già 4 driver TB6560HQ per motori passo passo che utilizzavo per una fresetta che pilotavo su parallela e Mach3 e in pratica vorrei sfruttare 2 driver per pilotare i 2 motori però dovendo utilizzare solo due pin “dir e clock” (per ogni integrato) che utilizzavo sulla parallela ora questi pin dove vanno collegati su Arduino Uno e come modifico il listato? Grazie anticipatamente per la tua risposta.
Autore
Ciao Claudio,
purtroppo non conosco il driver TB6560HQ per cui non saprei indicarti come modificare il codice, in ogni caso penso che non basti una modifica di questo sketch per passare da un esempio di controllo motori passo-passo ad uno di controllo di stampa DLP.
Se il driver TB6560HQ ha due soli pin per il controllo dei motori passo-passo puoi consultare i miei codici sulla easydriver che usa due soli pin per il controllo step e dir.
Ciao Mauro,
Volevo provare questo sketch per il controllo della fresa cnc, per gli assi X e Y, ma mi da errore nella compilazione ed esattamente sull’istruzione BYTE che non è dichiarata.
Non è piu utilizzata? come si può sostituire?
Grazie
Autore
Ciao Riccardo,
puoi togliere il BYTE dalla Serial.print();
Buongiorno Mauro,
risolto l’arcano della compilazione sostituendo “BYTE” con “bite()” ( funziona perfettamente :))
void loop() { lettura = Serial.read(); if ( lettura > 0)
{
Serial.print(delayTime);
Serial.print(‘X: ‘, bite());
Serial.print(letturaX, byte());
Serial.print(‘Y: ‘, byte());
Serial.print(letturaY, byte());
Serial.print(‘ ‘, byte());
Serial.println(lettura, byte());
Autore
Ciao Riccardo, puoi eliminare semplicemente la dicitura BYTE e funziona in modo identico.
Ciao Mauro, grazie mille ora proverò 🙂
mi sto ammattendo per la sequenza di collegamento dei cavi al motore…… non riesco a trovare la combinazione esatta.
ora mi ripasserò il tuo post sul modo di riconoscere le fasi 🙂
Ciao Mauro,
verificato e corretto lo sketch, funziona anche senza byte(), però non riesco ancora a trovare la giusta sequenza di collegamento dei cavi 🙁 mi sto demoralizzando…..
Autore
Ciao Riccardo,
se hai individuato le fasi in modo corretto la sequenza puoi trovarla come mostrato in un mio video su “come riconoscere le fasi” di un motore passo-passo.
Ciao Mauro,
Ho visto il video ed ho individuato le fasi, ma non mi da segni di vita….. ho controllato i motori e funzionano, applicando 3V sulle fasi, fanno lo step, ho controllato la tensione in uscita per il motore non risulta stabile(ovviamente) e oscilla tra i 3 e gli 11,5 V, deduco che il driver L298N funziona.
per riepilogare ho questa configurazione:
da arduino UNO uso i pin digitali 8,9,10,11 che nell’ordine li collego ai pin del driver IN1, IN2, IN3 e IN4 i quali sono collegati al L298N come segue:
IN1 > piedino 5
IN2 > piedino 7
IN3 > piedino 10
IN4 > piedino 12
e fin qui ci siamo…. dal motore ho 6 pin ma collegati ne sono solo 4 ossia :
1 rosso
2 non collegato
3 giallo
4 verde
5 non collegato
6 blu
verifica fasi con 3 volt
rosso (-) giallo (+) senso orario / verde (-) blu (+) senso orario
rosso (+) giallo (-) senso antiorario / verde (+) blu (-) senso orario.
Ti chiedo la cortesia di indicarmi quale può essere la combinazione dei collegamenti del motore alle 4 uscite, OUT1, OUT2, OUT3, OUT4.
Che sono rispettivamente collegate al L298N ai piedini 2, 3, 13, 14.
il risultato migliore che ho ottenuto, durante le varie prove, con lo sketch onerevolution, degli esempi, 1 stem orario e 1 step antiorario in modo ciclico, con la combinazione:
OUT1 > ROSSO
OUT2 > BLU
OUT3 > VERDE
OUT4 > GIALLO.
Spero essere stato chiaro nell’esposizione e che Tu riesca in qualche modo ad aiutarmi a sbrogliare la matassa 🙂
Ti ringrazio anticipatamente e Ti auguro un buon 1° Maggio 🙂
Riccardo
Autore
Ciao Riccardo,
senza il motore da testare mi riesce impossibile definire i collegamenti.
In ogni caso mi sembrano, a naso, sbagliate le associazioni che hai fatto tra OUT e colori, se le coppie sono rosso/giallo e verde/blu io avrei fatto:
OUT1 > ROSSO
OUT2 > GIALLO
OUT3 > VERDE
OUT4 > BLU
e poi controllato il tutto via Sw da sketch.
Ciao Mauro,
scusami per il ritardo nel risponderTi, ma mi sono preso una pausa riflessiva 🙂
cmq ho ripreso a provare con l’associazione dei colori come da te suggerito, inoltre ho trovato un video su youtube in spagnolo che spiega le fasi e le condizioni di alimentazione nei motori bipolari, con uno sketch per la verifica.
Devo dire che sono riuscito in qualche modo a far muovere il motore, ma non effettua una rotazione lineare, nel senso che senti il motore che vibra, poi fa qualche step in un senso o nell’altro poi si ferma a pensare, brontola, poi rifà uno step e così via. deduco che non ho ancora trovato la sincronizzazione delle fasi.
Ti allego il link del video, per capire di cosa parlo e se puoi darmi qualche suggerimento ulteriore.
grazie ancora per la pazienza 🙂
https://www.youtube.com/watch?v=lX_fO2QDe7g
Autore
Ciao Riccardo,
guarderò con interesse il video appena possibile.
In merito ai tuoi problemi sembra essere un problema di riconoscimento delle fasi o di insufficente alimentazione da parte del driver di controllo.
Se sei certo della sequenza delle fasi prova a variare il driver di controllo che stai utilizzando.
…ma ciao!
non mi è chiaro il codice dalla linea 25 alla 31 (o una qualsiasi delle funzioni di movimento).
In particolare non capisco perchè assegni il valore 16 se poi il primo utile è 8.
Subito dopo usi un comando >>= che non capisco.
>> serve per shiftare di TOT bit, ma >>= cosa fa? la stessa cosa?
Se si, si poteva assegnargli direttamente 8 e spostare la riga di shift dopo il for giusto?
E poi non mi è chiaro cosa fai nel digital write. è chiara la selezione del pin, ma il valore che gli assegni non capisco come è calcolato, ricavato. Potresti esplicitarlo?
Grazie mille!
Autore
Ciao Geppo,
ti invito a leggere come funzionano le funzioni bitwise sul sito arduino o su un manuale C per comprendere meglio lo sketch.
Per aiutarti posso dirti che il simbolo >>= è nella formula += ossia “operatore”= in cui l’operazione eseguita è assegnata direttamente alla variabile sulla sinistra; nel caso del += se scrivo a=0; a+=1; a vale 1,2,3 ad ogni ciclo con il >>= fai la stessa cosa con il valore 1.
Nel digitalWrite il secondo valore è dato dal valore raggiunto da count2X con lo shift rispetto al valore countX ( posizione del pin ) in & con 0x01 ( 0000 0001 ) spero possa esserti più chiaro.
Ciao Mauro.
volevo chiederti visto che sto progettando un centro di lavoro a 3 o più assi se e possibile usare il tuo listato con piu motori utilizzando il drive TB6600 per ogni asse al posto del integrato ULN2003A.
grazie e complimenti per i tutorial
Autore
Ciao Roberto,
se dovessi farlo io userei dei driver per motori passo-passo come i DRV8825 o gli A4988 della pololu.
Con molti meno segnali gestisci anche i miscro-step in modo davvero semplice.