Motori passo-passo, pilotarli con arduino – quinta parte

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… )

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/informatica/motori-passo-passo-pilotarli-con-arduino-quinta-parte.html

50 commenti

Vai al modulo dei commenti

    • Massimo il 6 Luglio 2011 alle 07:59
    • Rispondi

    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

    1. 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

    • paolo il 23 Luglio 2011 alle 21:34
    • Rispondi

    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

    1. 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

    • Paolo il 3 Agosto 2011 alle 11:06
    • Rispondi

    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

    1. 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

    • paolo il 6 Novembre 2011 alle 17:08
    • Rispondi

    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

    1. 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

    • paolo il 6 Dicembre 2011 alle 10:35
    • Rispondi

    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

    1. 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

    • paolo il 7 Dicembre 2011 alle 12:01
    • Rispondi

    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…

    • paolo il 13 Dicembre 2011 alle 21:33
    • Rispondi

    ciao mauro,
    oggi sono riuscito a caricare ad arduino la libreria, però ho il motore che mi va a scatti, cosa può essere?

    1. 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

    • paolo il 20 Dicembre 2011 alle 16:58
    • Rispondi

    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??

    1. 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

    • paolo il 22 Dicembre 2011 alle 19:11
    • Rispondi

    ciao mauro, grazie mille adesso ci proverò e ti farò sapere…

    • paolo il 24 Dicembre 2011 alle 11:49
    • Rispondi

    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.

    1. 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

    • paolo il 24 Dicembre 2011 alle 12:50
    • Rispondi

    ciao mauro, come non detto , grazie alla tabella , ho riflettuto un po e ci sono riuscito . grazie per l’aiuto….

    1. 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

    • paolo il 24 Dicembre 2011 alle 13:43
    • Rispondi

    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….

    1. Ottimo Paolo, dalla tabella che mi hai inviato sono giunto anche io alla stessa conclusione.

    • Lorenzo il 26 Dicembre 2011 alle 23:40
    • Rispondi

    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

    1. 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

    • Lorenzo il 30 Dicembre 2011 alle 15:16
    • Rispondi

    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

    1. 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

    • Federico il 13 Agosto 2012 alle 19:56
    • Rispondi

    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

    1. 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

    • Michele il 28 Dicembre 2013 alle 03:14
    • Rispondi

    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.

    1. 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

    • Federico2308 il 14 Marzo 2014 alle 19:14
    • Rispondi

    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

    1. 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.

    • RichmondSi il 30 Marzo 2014 alle 19:49
    • Rispondi

    Just signed in. Hello!

    • claudio capitani il 26 Agosto 2014 alle 17:42
    • Rispondi

    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.

    1. 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.

    • Riccardo il 17 Aprile 2015 alle 22:33
    • Rispondi

    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

    1. Ciao Riccardo,
      puoi togliere il BYTE dalla Serial.print();

    • Riccardo il 19 Aprile 2015 alle 11:45
    • Rispondi

    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());

    1. Ciao Riccardo, puoi eliminare semplicemente la dicitura BYTE e funziona in modo identico.

        • Riccardo il 25 Aprile 2015 alle 18:01
        • Rispondi

        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 🙂

          • Riccardo il 28 Aprile 2015 alle 14:19
          • Rispondi

          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…..

          1. 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.

            • Riccardo il 1 Maggio 2015 alle 15:37

            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

          2. 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.

    • Riccardo il 9 Maggio 2015 alle 01:20
    • Rispondi

    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

    1. 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.

    • geppo il 15 Aprile 2016 alle 12:07
    • Rispondi

    …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!

    1. 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.

    • roberto il 23 Maggio 2019 alle 15:34
    • Rispondi

    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

    1. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.