Motori passo-passo bipolari comandati da interruttori – terza parte

Applica le tue conoscenze al tuo progetto! Se hai letto la prima e la seconda parte di questa serie di articoli avrai certamente raggiunto il livello di conoscenza adeguata alla realizzazione del tuo progetto.

Con due semplici pulsanti puoi far ruotare il motore in senso orario o antiorario fino al raggiungimento del punto desiderato, questo movimento applicato ad esempio ad un ingranaggio che traduce il movimento rotatorio in movimento lineare, ad esempio mediante delle viti trapezie in una cnc, ti consente di posizionare l’utensile della CNC nel punto desiderato.

Lo sketch che ho utilizzato per realizzare il video dimostrativo è:

#define LED 13
#define ORARIO 2
#define ANTIOR 3

int motorPinx[] = {8, 9, 10, 11};
int sequenza[] = {1,3,2,4};
int countX  = 0;
int count2X = 0;
int ora = 0;
int ant = 0;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(ORARIO, INPUT);
  pinMode(ANTIOR, INPUT);
  for (countX=0; countX<4; countX++)
  {
    pinMode(motorPinx[countX], OUTPUT);
  }
}  

void loop() {
  ora = digitalRead(ORARIO);
  ant = digitalRead(ANTIOR);

  if (ora == HIGH) {
    orario();
  }  

  if (ant == HIGH) {
    antiorario();
  }
}

void orario()
{
  int val = LOW;
  for (countX=0; countX<4; countX++)
  {
    if (countX == sequenza[count2X]) val = HIGH;
    else                             val = LOW;

    digitalWrite(motorPinx[countX], val);
  }
  count2X++;
  if (count2X == 4) count2X = 0;
}

void antiorario()
{
  int val = LOW;
  for (countX=3; countX>=0; countX--)
  {
    if (countX == sequenza[count2X]) val = HIGH;
    else                             val = LOW;

    digitalWrite(motorPinx[countX], val);
  }
  count2X--;
  if (count2X < 0) count2X = 3;
}

Avrai sicuramente notato che non differisce molto da quello già illustrato nella seconda parte di questa serie di articoli, la differenza principali sono:

linea 03: definisci una nuova variabile di tipo array int ossia un array di valori tutti di tipo integer, a ciascuna posizione di questo array assegna uno dei pin a cui hai collegato il driver SN754410NE;

linea 04: definisci un altro array di tipo integer questa volta dovrai assegnare a ciascuna posizione dell’array la corrispondente fase da portare a livello HIGH; questa linea è fondamentale per comprendere il funzionamento di tutto lo sketch, se lo confronti con lo sketch proposto nell’articolo noterai che la sequenza di eccitazione delle bobine del motore passo passo porta a livello alto in successione la fase 1, poi la 3, poi la 2 ed infine la 4. Se al posto del motore bipolare avessimo avuto un motore unipolare la sequenza sarebbe stata 1,2,3 e 4;

linea 05-06: definisci due variabili di tipo integer che utilizzerai in seguito;

nella funzione setup() aggiungi le linee necessarie a impostare il corretto funzionamento dei pin a cui è connesso il motore mediante il driver SN754410NE;

linee 16-19: esegui un ciclo basato sulla variabile countX che ad ogni passaggio si incrementa di un pinto fino al numero 3, ricorda che gli array partono dall’indice 0, per cui un array di 4 elementi avrà un indice che parte da 0 fino a 3 (4-1); All’interno del ciclo per ciascun pin definito nella variabile motorPin assegna la funzione di OUTPUT al pin selezionato;

la funzione loop è identica a quella descritta in questo articolo, cambiano le due funzioni accessorie orario() e antior():

linea 37: definisci una variabile di tipo integer a cui assegni il valore LOW, a prima vista potrebbe sembrare un errore, devi ricordare che per Arduino LOW e HIGH sono in realtà la trasposizione di due valori 0 e 255 rispettivamente.

linea 38: definisci un ciclo for che partendo dal valore 0 di countX fino al raggiungimento del valore 3 (vedi linea 16) incrementa il valore di countX ad ogni nuovo passaggio;

linea 40: è un altro passaggio chiave dello sketch, confronta il valore assunto ad ogni passaggio dalla variabile countX con il valore del pin da portare a livello HIGH, per farlo ti occorre sapere a quale fase della sequenza è arrivata la rotazione del motore; puoi servirti di un indice count2X che incrementi ogni volta che viene richiamata la funzione orario(), vedi linea 45; in pratica la prima volta che chiami la funzione orario() il valore di count2X è 0 (impostato alla linea 08) la sequenza all’indice 0 è 1; la seconda volta che chiami la funzione orario il valore di count2X sarà 2, incrementato dalla prima chiamata e la sequenza ( sequenza ) all’indice 1 è 3; tutto questo si traduce nel valore HIGH invito al pin motorPinx alla posizione countX;

linea 41: è l’alternativa alla verifica eseguita alla linea 40, in pratica per tutti i pin che non soddisfano la condizione descritta nella linea 40 imposti a LOW il valore da inviare;

linea 43: mediante la funzione digitaWrite(pin,valore) invii il valore impostato (val) al pin di Arduino corrispondente a motorPinx[countX];

linea 45: incrementa di 1 il valore della variabile count2X in modo che alla successiva chiamata della funzione orario() la sequenza proceda eccitando la fase successiva;

linea 46: esegui un contollo in cui verifichi che la variabile count2X non sia arrivata a 4, limite superiore dell’array sequenza[] in tal caso la reimposti a 0 per ricominciare il ciclo di rotazione.

linee 49-61: esegui le stesse operazioni viste per la fnzione orario() ma in verso opposto per cui sia la variabile countX sia la variabile count2X, invece di incrementarsi ad ogni ciclo for ed ad ogni chiamata, si decrementano producendo la rotazione antioraria.

Se qualche passaggio non ti è chiaro, commenta questo articolo ed io ti chiarirò i passaggi poco chiari, non è semplice quello che hai letto, potrebbe essere necessatio un approfondimento.

Buon divertimento.

  • 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/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori-terza-parte.html

51 commenti

2 ping

Vai al modulo dei commenti

    • emiliano il 29 Gennaio 2012 alle 18:18
    • Rispondi

    salve.ho un prob,quando spingo i pulsanti il motore fa un fischio e non si muove,ho ricontrollato tutto ma niente.premetto che funziona tutto perchè ho fatto tutti gli step a partire dall’integrato,e il motore gira regolarmente,grazie

    1. Ciao Emiliano, il problema che evidenzi sembra essere dovuto al fatto che la sequenza inviata da Arduino per eseguire la rotazione è troppo veloce rispetto al motore, ne risulta che non fa in tempo a spostare l’albero prima he il segnale si inverte.
      Hai provato lo sketch della prima parte o della seconda parte di questa serie di articoli?
      A breve pubblicherò un articolo che potrà chiarire meglio il problema ed aiutarti a risolverlo.

      Ciao

    • emiliano il 30 Gennaio 2012 alle 23:39
    • Rispondi

    è proprio come dici tu,infatti,eseguendo lo sketch per regolare la velocità,quando intervenivo sul potenziometro,arrivato alla max velocità,il motore entrava in stallo,producendo un sibilo.Gli sketch dei pulsanti(il 1°e il 2°)funzionano alla grande.Aspetto con impazienza il tuo prossimo articolo,sicuro che sarà ricco ed esauriente come i precedenti!!

    1. Ciao E. oggi pubblico un articolo che spiega la tua esperienza e mostra come intervenire.
      Sto preparando anche una evoluzione dello sketch ma voglio prima testarla bene.

  1. Salve Mauro, come tutti ti ringrazio per le interessanti nozioni che ci regali. Sono un neofita dei motori passo passo, ho letto attentamente le tue lezioni che mi hanno permesso di capire il funzionamento di un vecchio motore che avevo in magazino.
    Volevo collegarlo alla mia scheda arduno uno per poterlo pilotare con due plsanti. E’ un motore a sei fili ed ho individuato i comuni, li piloto con un ci L293D ma non sono riuscito a capire dove devo collegare i fili comuni delle dei due avvolgimenti.
    Ti saluto e ti ringrazio anticipatamente.

    1. Ciao Franco,
      Grazie per i complimenti e per aver letto gli articoli comprendo da ciò che mi chiedi che hai dedicato del tempo alla lettura e forse non è chiara la mia spiegazione. I comuni vanno a massa ( negativo ) in realtà puoi collegarli anche al positivo se conti di eccitare le bobine con un segnale LOW invece di quello HIGH, questo in linea di principio, non ricordo se l’L293 può lavorare in questa modalità.

      Mauro

  2. Grazie Mauro, sono riuscito a far fuzionare il tutto, per provare i vari sketch vorrei sostituire il motore con dei led secondo te è possibile?

    1. Interessante quesito, secondo me è possibile, devi aver chiaro come si alternano le polarità altrimenti risci di veder accenderai solo 2 led.
      Inoltre sono necessarie delle adeguate resistenze, a 5v potrebbero bastare delle 470ohm.
      Quasi quasi ci provo anche io 🙂

      Mauro

    • Gianni il 9 Giugno 2012 alle 22:11
    • Rispondi

    Ecco
    scusa se ho usato una tua citazione… :
    “Con due semplici pulsanti puoi far ruotare il motore in senso orario o antiorario fino al raggiungimento del punto desiderato, questo movimento applicato ad esempio ad un ingranaggio che traduce il movimento rotatorio in movimento lineare, ad esempio mediante delle viti trapezie in una cnc, ti consente di posizionare l’utensile della CNC nel punto desiderato”
    Nel mio caso il movimento verticale avanti ed indietro servirebbe a far muovere un pupazzo …ma non ho idea di come trasformare (a basso costo possibilmente dato che ho visto i prezzi degli attuatori lineari…che non posso permettermi..) da rotatorio a verticale ..
    Potresti indicarmi se esistono soluzioni Hardware adatte allo scopo e dove potrei acquistarle ?

    Perdonami l’insistenza………

    1. Ciao Giovanni,
      il movimento lineare puoi ottenerlo con soluzioni dipendenti da quanta forza e precisione ti occorre:
      – vite trapezia, costa un op’ di euro
      – cinghia la puoi ricavare da una vecchia stampante o scanner compresa di motore passo-passo
      – asse filettato e bullone, costa pochissimo in un ferramenta

      Penso che il bello sia far correre la fantasia e inventarsi quella che più piace.

      Mauro

      • Gianni il 20 Giugno 2012 alle 19:14
      • Rispondi

      Ciao Mauro
      Continuo con le mie “lucubrazioni” e comincio a comprendere timidamente i listati .
      Ho invece problemi sui collegamenti per ottenere l’esatto contenuto del video (il motore comandato dai due interruttori….
      Ho letto i tutorial ma non riesco a realizzare tutti i collegamenti hardware per ottenerlo!
      esiste uno schema globale da qualche parte che possa farmi comprendere come collegare i due interruttori con il resto del circuito ? Se provo con i due sw soltanto tutto ok i led si accendono correttamente!
      Stessa cosa per pilotare il motore ! Ma non riesco (vittima della mia ignoranza) a capire come si collegano tra loro i due circuiti!
      Interessante il tuo resoconto sulla giornata di Torino!
      Appena riuscirò a capire qualcosa di più prometto di impegnarmi a sottoporre un progetto Open per collegare Kinect (sulla quale stò facendo una serie di esperienze interessanti che mi piacerebbe condividere
      Ciao e scusami se sono stato prolisso!

      1. Ciao Gianni,
        da quanto leggo hai fatto passi da gigante, sono contento.
        Riassumo per essere certo di aver capito, sei riuscito:
        1. a collegare gli i pulsanti ed ottenere che dei led si accendano;
        2. a far girare il motore passo-passo;

        Il problema adesso è che non riesci a farli funzionare insieme?
        Lo sketch che stai seguendo fa proprio questo, i pulsanti su che ingressi Arduino li hai collegati? e il motore?

        Mauro

          • Gianni il 21 Giugno 2012 alle 08:56
          • Rispondi

          Carissimo
          Questo è l’hardware che sto usando per le mie tragicomiche prove:
          http://bildr.org/blog/wp-content/uploads/2011/05/EasyDriver-Stepper-Motor-Driver2-400×722.png

          Dove dovrei collegare i due interruttori per ottenere il funzionamento rispettando il tuo listato?

          Per quanto riguarda il collegamento del motore ho rispettato i pin dello sketch (int motorPinx[] = {8, 9, 10, 11} )
          Per i due interruttori a che pin dovrei connetterli rispetto al circuito del link indicato per mantenere l’impostazione dello sketch ?

          Grazie molte Mauro per il tuo interessamento e per la pazienza infinita….ti sono debitore, magari un… caciucco alla livornese che ne dici ? Se mia moglie sgancia la ricetta giusta (quella top secret..) si potrebbe anche pubblicare…..

          Buona giornata.

            • Gianni il 21 Giugno 2012 alle 09:09

            Scusami ma evidentemente parlare di Caciucco a quest’ora mi ha dato alla testa……il link all’immagine è riferito all’utilizzo dell’easy driver (che mi hanno regalato) e non al tuo circuito con gli sn…

            Tuttavia anche in questo caso non saprei come collegare i due interruttori ed adattare il programma ma forse pretendo troppo dalle mie frammentarie nozioni,,,
            Mi perdonerai!

          1. Mi era parso strano, non vedevo la congruenza 🙂
            Nessun problema, nell’articolo sono citati altri due articoli precedenti, uno dei due è https://www.mauroalfieri.it/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori.html in cui puoi vedere come collegare i pulsanti.

            Il mio consiglio è di leggerli tutti e tre, sono divisi proprio per guidarti un pezzo alla volta 🙂

            Se ti occorre aiuto dopo che li hai letti, scrivimi.

            Mauro

          2. Il link che mi hai inviato non usa un SN754410NE ma un driver di pilotaggio, tra le altre cose interessante, che shield è?

            Per il caciucco accetto l’invito, se mi trovo dalleparti di livorno ti scrivo e magari lo mangiamo assieme.
            Le ricette “segrete” sono belle fino a che restano tali 🙂

            Mauro

    • Gianni il 14 Giugno 2012 alle 08:14
    • Rispondi

    Perdonami Mauro
    Ho letto i tutorial passo passo e sono interessato a realizzare il circuito con sn754410 ne con collegati due pulsanti (normalmente aperti?) per avanzamento avanti indietro comandato dai due pulsanti.
    Tuttavia essendo un neofita non riesco a capire quali componenti sono necessari e quali, e non riesco a capire come fare il circuito completo! non sarebbe possibile avere uno schema per un superprincipiante come me su come realizzare il progetto finale in una bread board ?
    Te ne sarei eternamente grato il mio indirizzo privato è nel campo mail del form.
    Scusami, ho provato a ragionarci su ma non riesco farlo.
    Grazie molte!! e perdonami l’insistenza.

    1. Ciao Gianni,
      nel blog ci sono altri tutorial legati ai motori bipolari: https://www.mauroalfieri.it/?s=bipolari
      prova a leggere anche quelli, in alcuni c’è anche lo schema che chiedi.

      Se li hai già letti raccontami il problema che hai incontrato e cosa non è chiaro così posso darti qualche dritta 🙂

      Mauro

      • Gianni il 21 Giugno 2012 alle 10:00
      • Rispondi

      Questo è il link del driver
      http://bildr.org/2011/06/easydriver/

      Ho provato a pilotare uno stepper ed ha funzionato egregiamente con uno sketch che ho trovato su un tutorial,
      anche in questo caso ho provato a collegare i due interruttori ma mi sono perso……
      E’ una schedina che mi dicono a bassissimo costo distribuita anche in Italia e mi pare “facile da usare” in particolar modo dai principianti come me……(se vuoi te ne mando una)
      Ecco il listato:

      //////////////////////////////////////////////////////////////////
      //©2011 bildr
      //Released under the MIT License – Please reuse change and share
      //Using the easy stepper with your arduino
      //use rotate and/or rotateDeg to controll stepper motor
      //speed is any number from .01 -> 1 with 1 being fastest –
      //Slower Speed == Stronger movement
      /////////////////////////////////////////////////////////////////

      #define DIR_PIN 2
      #define STEP_PIN 3

      void setup() {
      pinMode(DIR_PIN, OUTPUT);
      pinMode(STEP_PIN, OUTPUT);
      }

      void loop(){

      //rotate a specific number of degrees
      rotateDeg(360, 1);
      delay(1000);

      rotateDeg(-360, .1); //reverse
      delay(1000);

      //rotate a specific number of microsteps (8 microsteps per step)
      //a 200 step stepper would take 1600 micro steps for one full revolution
      rotate(1600, .5);
      delay(1000);

      rotate(-1600, .25); //reverse
      delay(1000);
      }

      void rotate(int steps, float speed){
      //rotate a specific number of microsteps (8 microsteps per step) – (negitive for reverse movement)
      //speed is any number from .01 -> 1 with 1 being fastest – Slower is stronger
      int dir = (steps > 0)? HIGH:LOW;
      steps = abs(steps);

      digitalWrite(DIR_PIN,dir);

      float usDelay = (1/speed) * 70;

      for(int i=0; i 1 with 1 being fastest – Slower is stronger
      int dir = (deg > 0)? HIGH:LOW;
      digitalWrite(DIR_PIN,dir);

      int steps = abs(deg)*(1/0.225);
      float usDelay = (1/speed) * 70;

      for(int i=0; i < steps; i++){
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(usDelay);

      digitalWrite(STEP_PIN, LOW);
      delayMicroseconds(usDelay);
      }
      }

      1. Volentieri se ne hai una in più la provo con piacere, e ci scrivo un tutoril su come usarla in un po di progetti.
        Ti invio privatamente l’indirizzo.

        Mauro

          • Gianni il 21 Giugno 2012 alle 12:50
          • Rispondi

          ok! molto volentieri

    • Gianni il 14 Giugno 2012 alle 17:33
    • Rispondi

    Ecco Mauro
    vorrrei comandare un motore passo passo con due interruttori normalmente aperti per ottenere un movimento verticale (avanti ed indietro) ho letto tutti i tuoi tutorial a riguardo ma da buon neofita non riesco ad adattare il tuo progetto perchè non ho trovato gli sn754410ne ma unicamente alcuni L293D.
    Ho guardato i due datasheet ma non riesco a capire le modifiche che dovrei apportare al circuito hardware in termine di collegamenti (dato che mi sembra di capire che i due IC non sono equivalenti) e poi tantomeno sono sicuro di quali modifiche servirebbero al listato.
    Insomma sono in stato confusionale…
    Nel frattempo ho vagliato alcune possibilità per tradurre il movimento rotatorio in verticale nei due sensi e penso di cercare la soluzione con vite senza fine, anche se ancora ci stò pensando.
    Chiedo troppo se quando puoi mi invii uno schema complessivo con i due interruttori compresi per i due moti (avanti ed indietro) ma con il L293D al posto dell’introvabile (almeno per me) sn754410ne ?

    Chiaramente compatibilmente con il tuo tempo…
    So cmq che altri come me hanno la stessa esigenza…(abche se io sicuramente sono il più imbranato)

    Grazie di tutti i consigli che dai , davvero preziosi,

    1. Ciao Gianni,
      quando ho iniziato questo blog ne sapevo quanto te o anche meno, non demoralizzarti il bello di Arduino è che puoi provare e riprovare quante volte vuoi, e in rete ci sono migliaia di tutorial, progetti e schemi.

      La tua richiesta è stata accolta, seguimi nelle prossime settimane pubblicherò qualche schema e sketch che possa essere utile a te ed anche ad altri appassionati.

      Mauro

    • Liborio il 21 Giugno 2012 alle 20:11
    • Rispondi

    Ciao Mauro,
    anche io sono alle prime armi, e sto cercando di capire come posso fare a comandare uno stepper con un pulsante in maniera che ad ogni impulso il motore avanzi di 15 gradi. sicuramente è semplice, ma non ci sono finora riuscito.
    arduino è la 2009, con EasyDriver ed il mot è un nema 17.
    Grazie
    Liborio

    1. Ciao Liborio,
      inizio subito col dirti che il NEMA17 se non ricordo male è un 1,8° per passo il che vuol dire che per compiere 15° dovresti fargli eseguire 8,33333 passi, e questo non è possibile, puoi realizzare angoli che siano multipli di 1,8: 1,8-3,6-5,4-7,2-9-…
      Detto questo non conosco la EasyDriver puoi mandarmi un link o uno schema di questa scheda?

      Mauro

    • Gianni il 29 Luglio 2012 alle 12:13
    • Rispondi

    Ciao Mauro
    Scusa il disturbo ma non sò come uscire da una situazione paradossale (mea culpa) !
    Ho il seguente stepper :
    Angolo passo-passo: 1,8°
    Numero di fasi: 2
    Resistenza per fase: 55 ohm
    Induttanza per fase: 80 mH
    Resistenza d’isolamento: 100 Mohm min. (500 Vdc)
    Classe d’isolamento: class B
    Inerzia del rotore: 54 g.cm²
    Massa: 0,23 kg
    Alimentazione: max. 15,4 V
    Consumo: 0,28 A
    Coppia di tenuta (coppia che, con motore alimentato, si oppone alla rotazione): 2,4 kg x cm
    Coppia residua (coppia che si oppone alla rotazione dell’albero di un motore non alimentato): 120 g x cm
    Dimensioni: 42,3 x 42,3 x 37 mm

    Ti chiedo aiuto perchè ho visto che lo stesso identico stepper lo hai usato in alcuni tuoi contributi (per esempio nel progetto Dolly ma anche in altri)

    Per questo motore vorrei trovare il giusto modo per trasformare il moto da rotatorio a verticale in entrambe le direzioni
    Non so a chi rivolgermi per trovare tutto ciò che serve (vite senza fine chiocciola oppure ingranaggi….)
    Il moto verticale al massimo sarà di circa 10-15 cm e la forza richiesta è decisamente esigua (alzare ed abbassare un piccolo pupazzo in plexiglass o legno comandando lo stepper con due interruttori sù e giù)
    Tu riusciresti a darmi indicazioni a chi potrei rivolgermi per comprare tutto l’occorrente.
    Ho guardato in rete ma sono confuso e non vorrei fare acquisti inutili, stesso discorso mi sono rivolto a piccole officine e a piccoli e grossi ferramenta/utensilerie, ma invece di suggerire soluzioni si aspettano tutti una mia richiesta precisa che , data la mia ignoranza in merito, non ho
    Tu puoi aiutarmi in qualche modo anche solo indicarmi cosa e dove devo comprare tutto l’occorrente ?
    Ti ringrazio per l’infinita pazienza.
    Gianni

    1. Ciao Gianni,
      la difficoltà che mi racconti è di tipo meccanico, campo in cui non sono ferratissimo.
      Considerando il tipo di utilizzo che ne devi fare e le forza/pesi in gioco io opterei per una barra filettata da collegare all’alberino mediante foro centrale se hai dimestichezza con un trapano a colonna, in alternativa puoi prendere una barra filettata della stessa sezione dell’albero motore ed un pezzo di tubo metallico (ottone, alluminio,ferro) con sezione interna simile all’alberino.

      Crei un manicotto con il tubo e lo fermi sulla filettata e sull’alberino con dei fori trasversali, avendo cura di bucare insieme tubo e alberino perché sia in asse, dovrebbe essere più semplice.

      In meccanica esistono devo manicotti già fatti ma costano un po’ e sono utilizzati in ambito professionale, puoi provare da un rivenditore di modellismo che potrà consigliati, di solito i modellisti si immedesimano nel problema e ti aiutano a trovare una soluzione.

      Mauro

        • Gianni il 30 Luglio 2012 alle 17:25
        • Rispondi

        Grazie Mauro proverò

    • arnaldo il 27 Giugno 2013 alle 09:25
    • Rispondi

    Ciao Mauro, scusami se ti disturbo..cerco di non farlo mai..Ho un problema con lo sketch proposto. Premetto che il cablaggio del mio L293 funziona benissimo con il tuo sketch ( orario-antiorario senza interruttori ) e che la prova Led con gli interruttori è perfetta)..quando carico lo sketch completo che prevede l’uso dei due pulsanti e premo i pulsanti…non va bene. Lo stepper, alla pressione dei pulsanti, fa qualche strano movimento ma non altro.
    Puoi a aiutarmi?….Mi potresti spiegare meglio come funziona l’array {1,3,2,4} ?
    1 e 4 sono il pin dell’ L293 e 2,3 quelli dei pulsanti su Arduino o sto facendo confusione ??
    Grazie per la tua pazienza..e cordiali saluti.
    Arnaldo

    1. Ciao Arnaldo,
      non disturbi se vuoi informazioni per imparare.
      La sequenza 1,3,2,4 rappresenta le fasi del motore, ogni volta che richiami la funzione orario o la funzione antior la variabile count2X incrementa il valore o lo decrementa, questo determina in che fase si trova il motore.

      Se il tuo motore non si muove o emette un sibilo é probabilmente dovuto ad un eccessiva velocità nella sequenza delle fasi, prova ad aggiungere un delay (100) prima della chiusura delle funzioni orario() e antior() poi modifica 100 aumentandolo o diminuendolo per trovare il tempo di rotazione che ti occorre.

      Mauro

    • arnaldo il 27 Giugno 2013 alle 12:58
    • Rispondi

    Dopo qualche ulteriore prova ho visto che premendo i pulsanti il motore si avvia nella giusta direzione ma non riesce ad andare avanti….è come se non avesse giusta potenza…..ma mi chiedo: come mai con lo sketch orario.antiorario va benissimo?…….E’ veramenee strano …lo stepper ha una resistenza di 5 OHM quindi presumo che con i soli 5 Volt di Arduino debba andare come del resto va con l’altro sketch..
    Scusami ancora.
    Arnaldo

    1. Ciao Arnaldo,
      questo tuo test mi conferma quanto risposto al precedente.
      Il problema é risolvibile con un delay, semplicemente il tuo motore non può eseguire la sequenza di rotazione alla velocità in cui arduino gliela imposta.

      Come consiglio: alimenta sempre il motore con una fonte esterna, eviti di bruciare arduino o peggio la porta del tuo Pc per elevato carico richiesto dal motore.

      Mauro

    • arnaldo il 28 Giugno 2013 alle 08:49
    • Rispondi

    Grazie mille per i tuoi suggerimenti…Spero di provare in giornata e ti informerò sui risultati.
    Sei veramente gentile….non è una dote molto diffusa oggi.
    Cordialmente.
    Arnaldo

    • arnaldo il 28 Giugno 2013 alle 17:11
    • Rispondi

    Caro Mauro, ho fatto la prova inserendo il delay(100)….Il mistero è che il pulsante Orario adesso va benissimo ma l’antiorario non funziona affatto….Ovviamente posso assicurarti che è cablato alla stessa maniera dell’altro con la stessa resistenza a terra ( ho usato 1 Kohm ,,come da tue istruizoni sul precedente tutorial)…ho provato a cambiare pulsante ma nulla….
    Grazie per il tuo aiuto.
    Arnaldo

    1. Ciao Arnaldo,
      prova a farti scrivere sul monitor seriale il valore letto dal comando analogRead sul pin a cui il pulsante è connesso.

      Mauro

    • arnaldo il 29 Giugno 2013 alle 09:42
    • Rispondi

    Ciao Mauro,
    fatto…ho inserito nello sketch le istruzioni per leggere il valore del pin ( nel mio caso 3 ) sulla seriale. Il valore è 1…e lo steppe comunque esegue movimenti rapidi avanti-indietro di qualche step…la cosa strana è che per un attimo sembrava andare!!!!!
    Ho provato a cambiare il valore del delay da 100 a 150 ma niente.
    Non voglio assolutamente disturbarti…visti da lontano questi problemi sono soltanto noiosi da esaminare…
    Una curiosità…la resistenza Marrone Nero Rossa vale 1000 Ohm (..quindi 1K ( 1×1000) come mai molti la riportano 10K se 10K=10.000 ? vedo questo ( per me errore ) da varie parti….
    Cordiali saluti.
    Arnaldo

    1. Ciao Arnaldo,
      stai leggendo dalla seriale il delay?
      Prova a farti scrivere da arduino, sempre sulla seriale, cosa legge probabilmente quando scrivi 100 o 150 lui legge solo 1 perché tu non crei un buffer di lettura del valore.

      Per fare rapidamente dei test con il tuo motore ti consiglio di prendere un potenziometro e collegarlo ad un pin analogico libero, leggere il valore e usare questa lettura come delay, variando il potenziometro potrai variare da 0 a 1023 millisecondi.

      Trovi un tutorial su questo argomento.

      La differenza tra 1K e 10K come colore é l’ultima fascia, 1K rossa, 10K arancio é probabile che negli schemi su internet l’arancio si veda rosso, é colpa della risoluzione cromatica dei video.
      Per questo che rilascia schemi sul web preferisce scrivere il valore della resistenza da usare.

      Mauro

    • arnaldo il 29 Giugno 2013 alle 16:57
    • Rispondi

    Ciao Mauro, su arduino forum al link seguente

    http://forum.arduino.cc/index.php/topic,152747.0.html

    ho trovato uno sketch che ho testato e mi funziona…Non è elegante come il tuo che a me serve di più perchè consente di eseguire movimenti ad ogni pressione del pulsante mentre quello visto consente solo di andare avanti e indietro ad ogni pressione dei pulsanti…Comunque questo mi ha confermato che non ho fatto errori stupidi di cablaggio dei componenti e questo mi conforta….
    Mi piacerebbe però eseguire anche il tuo elegante sketch ….Quando e se puoi dammi una mano.
    Il ponte che uso è L293.
    Cordialmente.
    Arnaldo

    • arnaldo il 1 Luglio 2013 alle 09:35
    • Rispondi

    Ciao Mauro, se ti sei seccato …sei giustificato -:)…..
    Ho collegato il potenziometro ad A0 il valore letto = 261…Ho impostato questo delay ma sempre la stessa cosa ..il pulsante impostato sul pin 2 va e quello sul pin 3 fa un passo indietro ed uno avanti. E’ proprio questo pin che sembra non eseguire le istruzioni del programma. Ho cambiato anche la restenza sul pulsante passandola da 1K a 5.2KOhm…( so che questo probabilmente non serve..).
    Comunque se ti va facci un pensierino atrimenti…ti capisco.
    Per me è solo una questione di capire bene le cose…
    Cordialmente.
    Arnaldo

    1. Ciao Arnaldo,
      non sono affatto seccato, anzi la tua curiosità e voglia di capire mi spinge a spiegarti ciò che chiedi.
      Se ti indico degli articoli da leggere è solo per evitare di riscrivere lunghi commenti quando esistono articoli da farti consultare.

      Un solo pulsante funziona e questo mi induce a pensare che la prima parte dello sketch sia corretta ed anche i collegamenti.
      Prova a leggere il valore restituito dal pin a cui hai collegato il primo pulsante e quello letto sul secondo confrontandoli.

      Il potenziometro è ok, puoi ruotarlo verso lo 0 per ridurre i tempi di attesa tra le fasi.

      Mauro

    • arnaldo il 1 Luglio 2013 alle 15:17
    • Rispondi

    Ciao Mauro e grazie…il mistero rimane ed è scoraggiante. Comunque volevo fare il punto con alcune considerazioni banali:
    Ho usato esattamente lo sketch da te pubblicato sopra..copia ed incolla.
    Il motore gira benissimo con lo switch 2
    Con lo switch 3 invece ho notato che fa due step indietro ed uno avanti.( ho fatto varie prove con il delay ed cosi come ti dico..)
    Con l’altro sketch tuo senza interruttori va benissimo.
    Con lo sketch che ti menzionavo trovato sul forum arduino non ha problemi ( dx e sx vanno bene).
    Il tuo sketch ovviamente funziona perfettamente con il tuo hardware …
    Il mio hardware è composto da un L293D ed uno stepper MITSUMI….
    Non sarà che con questi componenti si dovrebbe cambiare qualcosa nel listato di Arduino?Perdonami se
    dico qualche banalità……ma devo imparare e con un maestro come te sarebbe un peccato non farlo.
    Ho esguito quasi tutti i tutoria da te pubblicati sui motori ed altro e non ho mai avuto problemi….e per questo anocora un grazie.
    Arnaldo

    1. Ciao Arnaldo,
      ti ringrazio per i complimenti e non dici banalità, a mio avviso potrebbe esserci anche un errore nello sketch, non darei per scontato che funzioni sempre.
      Sarebbe molto interessante ed istruttivo se tu riuscissi a risolvere il mistero.
      Probabilmente con il tuo Hardware è necessario apportarVi delle modifiche, se ti va di provare ad eseguire le modifiche e condividerle con altri appassionati mi farebbe piacere.

      Mauro

    • arnaldo il 1 Luglio 2013 alle 20:07
    • Rispondi

    Ciao Mauro,
    grazie…..va bene…proviamo…non si sa mai..
    Arnaldo

    • stefano il 29 Marzo 2014 alle 19:34
    • Rispondi

    ciao mauro mi chiamo stefano, molto bello il tuo blog vorrei porti un quesito ho fatto muovere un motore passo passo bipolare in senso orario con due interruttori, ad ogni interruttore ho applicato un tempo diverso per avere due velocità, una lenta e un veloce questo è lo sketch:

    < codice rimosso in automatico >

    siccome vorrei fare funzionare il motore in questione anche in senso antiorario sempre con le due velocità distinte e con altri due interruttori ma come ho provato a scrivere un altro sketch con 4 interruttori non funziona il motore gira da subito senza considerare gli interruttori. questo è lo sketch:

    < codice rimosso in automatico >

    ti ringrazio in anticipo mi congratulo per le tue spiegazioni sempre esaurienti nel tuo blog, e infine la domanda è come devo scrivere lo sketch per poter far andare il motore con quattro interruttori mettendo due velocita per ogni senso. ciao e grazia.

    1. Ciao Stefano,
      come hai potuto leggere in fondo ai miei articoli ti chiedo di non incollare codice nei commenti.
      Aggiungi che rispondo volentieri alle richieste di aiuto ma non ho il tempo di scriver sketch oltre ai progetti su commissione.
      Ti invito a leggere tutti i miei articoli sui motori passo-passo e sono certo che apprenderai facilmente come risolvere le difficoltà di cui mi scrivi.

    • Michele il 11 Luglio 2015 alle 21:50
    • Rispondi

    Salve mauro, volevo farle innanzitutto i complimenti per i suoi progetti, e poi volevo chiederle se al posto dei pulsanti potessi mettere due relè comandati da smartphone via wifi/bluethooth premetto che sono novello nella programmazione ma mi piace molto la programmazione e sto seguendo i tutorial per imparare al meglio in attesa di una sua risposta la ringrazio….

    1. Ciao Michele,
      grazie per i complimenti.
      La soluzione è possibile e puoi utilizzare la shield della Lemontech ( vedi sponsor in alto a destra ) che è già equipaggiata con il bluetooth ed i relay ed ha già il codice scritto per essere controllata da smartphone.

      Per iniziare o risolvere un problema immediato è la soluzione più rapida, in generale se vuoi sperimentare puoi controllare il motore direttamente via bluetooth, sempre con la shield Lemontech ma eliminando i pulsanti ed usando i relay per accendere magari due spie una per ciascuna direzione, ad esempio.

      Purtroppo per questa ultima soluzione non ho uno sketch da suggerirti.

        • Michele il 13 Luglio 2015 alle 13:03
        • Rispondi

        Ok grazie vale la stessa cosa per quanto riguarda il i servo rc giusto??

        1. Ciao Michele,
          dipende da come vuoi controllare il servo.

    • Alessandro Romano il 28 Aprile 2018 alle 19:35
    • Rispondi

    Ciao!
    a me servirebbe un progetto simile ,ma al premere del pulsante mi deve far girare il motore in un solo verso ,ma con giro impostato a 45 gradi alla volta e si ferma.Quindi ripremo e compie un altro giro di 45 gradi
    come posso modificare il progetto attuale ?

    1. Ciao Alessandro,
      ti consiglio di leggere e comprendere la mia descrizione dello sketch ed intervenire solo sul numero di passi che vuoi far compiere fino a raggiungere i 45°.
      Il numero di passi dipende dal tuo motore e puoi calcolarlo con la formula: ([n passi]/360) * 45

  1. […] Motori passo-passo bipolari comandati da interruttori – terza parte […]

  2. […] questo articolo prendo spunto dal commento alla terza parte di questa serie di articoli da parte di un appassionato come te e me. Il problema di cui mi ha reso […]

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.