Motori passo-passo bipolari comandati da interruttori – quinta parte

Il tuo esperimento con i motori passo-passo bipolari inizia a diventare interessante, se hai seguito i precedenti articoli avrai realizzato il tuo controllo motore passo-passo bipolare con Arduino e un SN754410NE.

Motore stepper bipolare due pulsanti e un potenziometro

Nella quarta parte hai affrontato il problema della velocità di rotazione ed una prima soluzione per risolvere l’inconveniente dovuto ad una eccessiva velocità di successione dei segnali alle bobine che hanno come effetto collaterale la completa immobilità del motore e l’emissione di un sibilo.

L’aracano per evitare tutto questo è l’introduzione di un delay o tempo di ritardo tra una fase e la successiva.

Se il motore vuoi che compia un giro completo in un tempo da te stabilito puoi calcolare prima di impostare lo sketch, ad esempio se vuoi che il tuo motore compia un giro completo in un secondo non hai che da dividere il secondo per le fasi ( passi o step ) che il motore impiega per eseguir un giro completo.

Siccome il delay di Arduino lavora in millisecondi ossia 1 secondo = 1000 millisecondi, se il motore con cui stai lavorando è un 200 step ossia impiega 200 passi per compiere un giro, il calcolo è presto fatto: 1000/200 => 10/2 = 5 millisecondi; imposta quindi a 5 il delay.

Il problema vero è quando non sai a quale velocità devi far ruotare il motore, per cui non puoi calcolare anticipatamente il valore del delay da impostare.

Ed ecco che lo schema in figura:

Motore stepper bipolare due pulsanti e un potenziometro

ti mostra una possibile soluzione, inserendo un potenziometro da 10KΩ, come nello schema potrai regolare la velocità di rotazione mediante lo sketch presentato nella quarta parte di questa serie di articoli con qualche piccola modifica:

#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;
int delayTime = 100;
int pinPot = 0;

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

void loop() {
  ora = digitalRead(ORARIO);
  ant = digitalRead(ANTIOR);
  int readPot = analogRead( pinPot );
  int delayTime = map(readPot,0,1024,10,1000);

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

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

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 già visto la modifica da fare, riguarda le linee 12, 22, 28 e 29.

linea 12: definisci una nuova variabile di tipo integer in cui memorizzare il numero di pin a cui hai collegato il pin centrale del potenziometro, nella figura il pin è connesso al pin A0 (analogico 0);

linea 22: è all’interno della funzione setup() per cui è una istruzione di settaggio eseguita all’avvio dello sketch, imposti il  pinPot, assegnato alla linea 12, in modalità INPUT indicando ad Arduino di leggere da questo pin i valori analogici che gli saranno inviati attraverso il potenziometro.

linea 28: leggi il valore del potenziometro attraverso il pin 0 analogico, e memorizzi il valore nella variabile readPot;

linea 29: utilizzi la funzione map(valore,valmin,valmax,outputvalmin,outputvalmax) per rimappare dei valori di input su dei valori di output, in pratica questa funzione accetta come primo parametro il valore da rimappare (readPot) il cui valore oscilla tra valmin ( 0 ) e valmax (1024 ) il passaggio da 0 a 1024 è il valore acquisito dal pin 0 in base alla posizione dell’alberino del potenziometro; tale valore viene rimappato in funzione dei valori di output min e max ( parametro 4 e 5 della funzione map ); nell’esempio i valori da 0 a 1024 sono rimappati da 10 a 1000 ma puoi provare a variare questi valori per adattarli al tuo progetto.

Buon divertimento.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori-quinta-parte.html

57 comments

Skip to comment form

    • Stinghertube on 24 febbraio 2012 at 20:19
    • Reply

    Salve Mauro,
    proprio quello che cercavo!
    Per ora non posso fare delle prove perchè non ho ancora l’arduiono..
    Intanto complimenti per il suo blog.
    (utente youtube modifica faro)

    1. Sono contento, a breve pubblicherò dei tutorial sulla motorshield che ho preso con arduino da robot-domestici, proprio su come pilotare i passo-passo.

      Se hai altri dubbi cerca nel sito e se non trovi articoli soddisfacenti scrivimi.

      Mi piacerebbe pubblicare il tuo progetto.

      Mauro

  1. Il seguente sketch è provato e funzionante Saluti Franco

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

    int motorPinx[] = {8, 9, 10, 11};
    int sequenzaO[] = {0,2,1,3};
    int sequenzaA[] = {3,1,2,0};
    int countX = 0;
    int countY = 0;
    int ora = 0;
    int ant = 0;
    int delayTime = 50;
    int pinPot = 0;

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

    void loop() {
    ora = digitalRead(ORARIO);
    ant = digitalRead(ANTIOR);
    int readPot = analogRead( pinPot );
    int delayTime = map(readPot,0,1024,10,1000);

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

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

    void orario(){
    //int sequenzaO[] = {0,2,1,3};
    int val = LOW;
    for (countX=0; countX<4; countX++){
    if (countX == countY){val = HIGH;}
    else{val = LOW;}
    digitalWrite(motorPinx[sequenzaO[countX]], val);
    }
    countY++;
    if (countY == 4){
    countY = 0;
    //delay(delayTime);
    }
    }

    void antiorario(){
    //int sequenzaA[] = {3,1,2,0};
    int val = LOW;
    for (countX=0; countX<4; countX++){
    if (countX == countY){val = HIGH;}
    else{val = LOW;}
    digitalWrite(motorPinx[sequenzaA[countX]], val);
    }
    countY++;
    if (countY == 4){
    countY = 0;
    //delay(delayTime);
    }
    }

    1. Ciao Franco, il tuo sketch è corretto, differisce da quello scritto nell’articolo per alcuni nomi di variabile ( Count2X con CountY) e per un differente approccio alla rotazione. La sequenza è una sia che tu voglia ruotare l’alberino in senso orario sia antiorario, non cambia in quanto non cambia la geometria del motore; semplicemente la rotazione oraria incrementa i Count (X e 2X o Y) con ++ e la rotazione antioraria le decrementa —

      Mauro

        • Bernardo on 26 gennaio 2015 at 19:41
        • Reply

        ciao mauro,
        ho scritto il codice di “frappaweb” e funziona tutto, volevo chiederti però se sapevi come pilotare allo stesso modo un motore stepper (precisamente ho un 28ybt-48) con 2 pulsanti e il potenziometro.

        ti ringrazioo!!

        1. Ciao Bernardo,
          il codice che hai copiato è simile al mio, infatti “frappaweb” ha copiato e modificato il mio adattandolo al suo progetto.
          Il codice dei due pulsanti ed un potenziometro dipende da cosa vuoi che faccia il potenziometro.

            • Bernardo on 27 gennaio 2015 at 18:13

            potrei contattarti in privato?
            comunque a me interessa solo comandare questi stepper con i 2 pulsanti, il potenziometro non mi interessa tanto posso regolare la velocità nel programma (fissandola definitivamente).

          1. Ciao Bernardo,
            l’email è riservata ai progetti su commissione, purtroppo non riesco a dar seguito a tutte le richieste di progetti ed aiuto che ricevo ed ho dovuto dividere chi desidera solo dei consigli può usare il blog, chi desidera commissionarmi un progetto può utilizzare la casella email.

            • Bernardo on 27 gennaio 2015 at 20:13

            Comunque ho provato a collegare quello stepper con lo stesso programma del motore bipolare e funziona lo stesso solo che gira lentissimo e con il potenzionetro non riesco a regolare la velocità.

          2. Ciao Bernardo se il motore è un bipolare lo sketch va benissimo.
            Se hai un motore unipolare ti bastano poche righe di differenza ed adatti lo sketch al tuo scopo.

            La velocità potrebbe dipendere dal delay impostato o dalla meccanica del motore.

            • Bernardo on 30 gennaio 2015 at 17:44

            infatti….mica potresti aiutarmi??perchè ho provato e non riesco proprio a farlo girare in entrambi i versi.

          3. Ciao Bernardo,
            il tuo è un motore bipolare o unipolare?

    • Ennio on 18 maggio 2012 at 23:01
    • Reply

    Ciao Mauro
    innanzi tutto ti faccio i miei comlimenti per il tuo sito ben fatto e molto interessante, sopratutto per chi come me è alle prime armi che ho appena acquistato Arduini uno rev3 e la scheda Motor Shield perchè avendo alcuni motori passo passo ero curioso di imparare ad pilotarli.Ho provato alcuni sketch con i quali sono riuscito a far girare il motore (bipolare)senza nessun problema grazie alle tue spiegazioni molto chiare e ben fatte,il problema adesso è riuscire a farlo funzionare con i pusanti e il potenziometro che regola la velocità,ho trafficato un po con il tuo esempio di sketch ma non sono riuscito a risolvere il problema (non ho molta esperienza sulla programmazione),puoi aiutarmi ad venirne a capo? Magari con uno sketch che faccia girare il tutto con il motor shield?I collegamenti del motore pulsanti ed potenziometro funzionano,il motore si muove a scatti avanti ed indietro e se diminuisco il potenziometro si blocca, non gira bene come dovrebbe,credo dipenda dalla configurazione che gestisce le fasi del motore.Ti ringrazio anticipatamente e ti saluto cordialmente.

    1. Ciao Ennio,
      grazie per i complimenti.
      l’articolo che hai commentato contiene esattamente quello che ti occorre, a parte il fatto che non utilizza la motor shield.
      Il potenziometro non fa altro che aumentare o diminuite il tempo tra un passo ed il successivo, non dovrebbe mai fermare il motore per più di un secondo tra un passo ed il successivo ( vedi linea 29 ).
      Da come descrivi il problema sembra che a minimo (10 millisecondi) il motore che stai utilizando non riesca a gestire i passi, prova ad aumentare questo valore a 100.
      Colgo il tuo suggerimento e prossimamente proverò a scrivere un tutorial apposito.

      Mauro

    • Michael on 20 settembre 2012 at 18:08
    • Reply

    Ciao Mauro!! intanto complimenti per questo post veramente interessante e realizzato ad hoc!! Ho provato il tuo schema con un motore stepper attaccato al carrello della stampante(il carrello su cui sono montati i toner) e funziona!! l’unico problema è ke si muove a scatti il carrello, mentre originariamente si muoveva in modo molto fluido e molto + velocemente!! a cosa è dovuto questo rallentamento e questo movimento a scatti secondo te??

    1. Ciao Michael,
      Potrebbe essere dovuto al delayTime che introduce un ritardo, se leggi la spiegazione dell’articolo c’è scritto ogni riga a cosa serve e puoi capire come modificare il codice per fargli eseguire quello che ti occorre.

      Se hai bisogno di aiuto sono a disposizione.

      Mauro

    • paolo on 12 novembre 2012 at 11:49
    • Reply

    ottimo argomento
    ma quale modifica posso fare al circuito per comandare anche un motore unipolare?
    grazie
    mille
    paolo

    1. Ciao Paolo,
      sul blog ci sono degli articoli dedicati al movimento dei passo-passo unipolari, quello che cambia sono il modo in cui il motore deve essere collegato e la sequenza di movimento che non sarà più per fasi alternate ma sequenziali.

      Mauro

    • aNTONIO on 24 novembre 2013 at 19:34
    • Reply

    Ciao Mauro complimenti per i tutorial sono bellissimi, ne ho letti parecchi e ho imparato tante cose ma ora mi sono incasinato in uno sketch e non riesco a venirne fuori.
    Praticamente ho usato il tuo schema per collegare il motore step con i pulsanti e il potenziometri e cercando di pilotare il motore a mezzi passi riesco a variare la velocità con il potenziometro ma non riesco a invertire il senso di rotazione, potresti aiutarmi per favore?

    1. Ciao Antonio,
      ti invito a leggere alla fine di ogni articolo ci sono due avvisi, uno dei quali chiede di non inserire codice nei commenti in quanto mi arriva illeggibile.

      Per invertire il senso di rotazione di un motore passo-passo devi semplicemente ripercorrere al contrario le fasi che hai eseguito.

      Se hai una sequenza di fasi A-B-C-D dovrai eseguire D-C-B-A.

      Mauro

  2. Buonasera,
    complimenti per i tutorial fatti molto bene! Ho seguito le varie parti, io sto eseguendo lo sketch con un Nema 17, ho notato che l’integrato surriscalda parecchio è un problema del motore o devo utilizzare un altro integrato?

    grazie!

    1. Ciao Giorgio,
      potrebbe essere colpa di entrambi, se il motore assorbe una corrente superiore a quella che il driver è in grado di erogare quest’ultimo si scalda di certo.

      Mauro

        • giorgio on 5 marzo 2014 at 13:19
        • Reply

        Grazie per la risposta. Più precisamente il Nema 17 che utilizzo è il modello 42BYGHW811 con caratteristiche:

        NEMA-17 Bipolar 4-wire
        Step angle: 1.8°
        Holding Torque: 4800g-cm @ 2.5 Amps

        tensione funzionamento 3,1V

        Secondo lei devo cambiare Driver, per esempio un l298?

        Oppure collego il circuito con doppia alimentazione come spiegato benissimo nel suo Blog?

        Se il motore passo passo funziona a 3,1V, devo rispettare tale tensione oppure posso usare anche 5V?

        Ultima domanda, se dovessi cambiare driver, posso utilizzare sempre questo sketch?

        grazie e scusi per le troppe domande

        1. Ciao Giorgio,
          il problema non è tanto il voltaggio, che devi comunque rispettare a 3,1v, ma l’amperaggio perchè 2,5A per fase sono troppi per molti driver comuni, puoi provare la BigEasy driver.
          Lo sketch dipende da che driver per motori passo-passo scegli di usare, comunque nel blog ci sono anche degli sketch per controllare altri driver stepper.

    • Vittorio on 26 maggio 2014 at 22:31
    • Reply

    Buona sera Mauro, sto provando a motorizzare un condnsarore variabile con uno stepper dello starter kit diarduino uno, ho effettuato svariati tentativi variando i valori della riga 29 ma l’albero o del motore vibra ma non gira. Pensi che devo provare con un altro tipo di motore?
    Grazie in anticipo e complimenti per il sito.

    1. Ciao Vittorio,
      se proprio non riesci con questo tipo di circuito ti consiglio di leggere gli articoli dedicati alla EasyDriver che semplifica molto la movimentazione dei motori e ti permette di gestire il 1/2, 1/4, 1/8 di passo, migliorando la precisione nella regolazione.

    • Marco on 14 agosto 2014 at 19:11
    • Reply

    Ciao Mauro, ancora non ho lasciato perdere tutto, sto insistendo ho provato con un motore passo passo bipolare e pare che provando uno dei tuoi sketch mi funziona cioè gira, però ho notato che girando e trattenendo un po l’albero con le mani si riesce a fermarlo, sapevo che questi motori hanno 1 coppia abbastanza buona cioè mantengono bene il passo, è normale questo?
    comunque ho provato lo sketch con motorshield FE e motore bipolare e però al posto di quella motorshield io ne ho una diversa è più piccola misura 4x4cm, vabbè a parte questo, funziona.

    Poi visto che funziona ne ho provato un altra con il cambio di rotazione, anche questo funzionava, aveva sempre quel problema di forza, non vorrei poi se un giorno “se non me stufo prima” di adattare il progetto a un lavoro definitivo e se poi il motore non riesce a tenere il passo, (vorrei dire il motore è abbastanza resistente ed è bello pesante misura 4lungh.x4largh.x2,5h cm) anche questo qui sketch funziona.

    Adesso stavo provando questo di questa pagina, collegato il tutto ho usato un potenziometro di 4k7 perchè quello da 10k non ce l’ho a disposizione, però premendo sia il pulsante orario sia quello antiorario il motore mi fa 1-2 passi avanti e 1 indietro e il pot. che deve variare la velocità nn fa nessun effetto il motore l’ho collegato come sempre e per i collegamenti ho seguito il circuito lì disegnato,
    ti chiedo se possibile cosa potrebbe mancare che mi è sfuggito?
    cosa avrei sbagliato secondo te?

    1. Ciao Marco, sono contento che non demordi 🙂
      Molte motor shield sono simili a quella che uso io ed a quella ufficiale arduino ma sfruttano lo steso chip e quindi le stesse uscite.
      Per la coppia del motore devi controllare le caratteristiche tecniche, in generale i motori passo-passo non offrono una coppia elevata a meno di non prendere un passo-passo motoridotto.
      Per sapere se va bene per il tuo progetto ti consiglio di calcolare, in fase di progettazione, la coppia necessaria e acquistare il motore adeguato.

      Lo sketch presentato potrebbe presentare differenze da quelli da te usati in precedenza, prova a controllare se ce ne sono ed adatta questo sketch al tuo progetto, avrai notato che la velocità è regolata dal potenziometro sulla base del delay tra le fasi, puoi anche adattare gli altri a questa funzione.
      Controlla che il potenziometro venga correttamente letto da arduino, con il monitor seriale, e che rilevi valori tra 0 e 1023.

        • Marco on 18 agosto 2014 at 15:23
        • Reply

        Ciao Mauro, per controllare valori sul monitor seriale devo mettere l’istruzione Seria.begin(9600); in void setup all’inizio
        e Serial.print(pinPot); in void loop sotto la riga int readPot = analogRead( pinPot );
        ho caricato il codice su Arduino però sul monitor seriale mi da sempre valore 0 ripetutamente

        invece se scrivo Serial.print(readPot); sul monitor seriale mi da 1023 ripetutamente
        ho anche sostituito il potenziometro con uno di 2,2 Mohm invece di 4K7 però niente da fare

        mi pare che il potenziometro non me lo legge affatto
        dammi 1 consiglio?

        1. Ciao Marco,
          la prima riga è sbagliata la seconda è corretta.
          Tuttavia dipende dove hai collegato il potenziometro, ti consiglio di leggere le mie lezioni del corso base per capire come funziona il monitor seriale e come collegare il potenziometro per leggerlo.
          Commenta quelle lezioni se hai dubbi.

            • Marco on 19 agosto 2014 at 10:43

            Ciao Mauro, adesso riesco a leggere il potenziometro, ok.
            il problema persiste sulla rotazione del motore, misurando sulle fasi la tensione non mi arriva a 3V dei 12V di alimentazione scelta, il fatto è che si muove xò non capisco dove sbaglio perchè la sequenza delle fasi l’ho trovata prendendo il motore a parte e provando con il tester le fasi, nello sketch precedente m’ha funzionato, lasciando invariato il collegamento ho solo caricato questo sketch, ho cercato di invertire i pin su questa riga
            int motorPinx[] = {7, 8, 10, 12}; questi sono i pin che uso io per comodità
            e in questa riga
            int sequenza[] = {1,3,2,4}; però questa non ho capito che funzione ha

          1. Ciao Marco,
            nella descrizione dello sketch trovi riga per riga a cosa servono.
            La sequenza serve a definire come muovere le fasi in funzione di come le hai collegate, nel mio caso 1,2,3,4 nel tuo potrebbe essere differente.
            Leggi bene l’articolo e troverai gli errori che stai facendo come per il potenziometro, se proprio non riesci usa l’altro sketch aggiungendo le parti di questo che ti servono.

    • Marco on 14 agosto 2014 at 19:20
    • Reply

    Ciao Mauro, mi sono dimenticato di dirti la motorshield L298N che sto usando è più semplice dell’altra questa rimane esterna ad Arduino e devo fare IO i collegamenti, ed ha solo 4 pin di ingresso e 4 uscite per il motore 4 diodi di ricircolo e l’integrato L298N.
    Mentre la motorshield L293D andava attaccata direttamente ad Arduino, era difficile perchè come mi hai detto il codice doveva essere scritto specifico per questa.
    con questo ti volevo dire che con quello che ti ho detto sopra la schedina per me non centra, però non so quale è il problema.
    Grazie

      • Marco on 16 agosto 2014 at 10:30
      • Reply

      …..segue il primo messaggio.
      Ho misurato la tensione sui morsetti ma non arriva a quella stabilita ho aumentato anche il tempo a 2 sec, ma il problema non è questo, perchè poi sugli esempi precedenti che ho testato anche riducendo a 100 millisec lo faceva girare il motore

      1. Ciao Marco,
        vedi la mia risposta dettagliata.

    1. Ciao Marco, ho immaginato che la schedina fosse esente dal problema.
      Il diverso funzionamento potrebbe dipendere dalla gestione delle fasi e del potenziometro.

    • Marco on 12 novembre 2014 at 00:30
    • Reply

    Ciao Mauro
    non so dove posso farti questa domanda perciò te la scrivo qui,
    io tempo fa ho acquistato Arduino Uno completo di integrato ATMEGA328P ma poi invece di cancellare e riprogrammare più volte l’integrato ne ho comprato un altro di integrato ATMEGA328P, il problema è che, quando vado a caricare la sketch sull’Arduino con l’integrato nuovo mi da errore di sincronizzazione,
    cosa può essere?
    lo sketch caricato sull’integrato già esistente va a buon fine mentre quello nuovo no
    Se pensi alla porta USB ti dico che è sempre la stessa, perchè di solito se la porta USB non fosse quella usata di sempre mi da l’errore di non sincronizzazione, perciò devo scegliere la porta giusta tramite software di Arduino

    Ti volevo chiedere poi dove posso trovare sui tuoi appunti il collegamento dell’Arduino ATMEGA328P, se lo dovessi usare una volta programmato con Arduino Uno fuori dalla medesima scheda, cioè cosa gli serve del minimo indispensabile per farlo funzionare?

    1. Ciao Marco,
      il nuovo integrato che hai acquistato probabilmente è senza bootloader, prima dovrai caricarlo.
      Per informazioni su come caricare il bootloader, come collegare arduino senza la board puoi cercare sul web, so che ci sono molti tutorial che lo descrivono, io personalmente non ho scritto alcun tutorial su tale argomento.

        • Marco on 15 novembre 2014 at 11:10
        • Reply

        Ciao Mauro,
        grazie sono riuscito a caricare il bootloader sull’ATMEGA328 nuovo trovando il circuito che lo può fare e poi sono riuscito a caricarci lo sketch

        1. Ottimo Marco,
          se ti va di condividere questa tua esperienza mandami le foto, descrizione e schermate che la pubblichiamo per tutti coloro che vogliono fare la stessa cosa.

    • Vito on 29 gennaio 2015 at 13:28
    • Reply

    Gent.mo Mauro
    Sto sperimentando arduino in collegamento con una stampante 3D. Vorrei pilotare un areatore che va a corrente 220 seguendo le dinamiche del motor step dell’estrusore. Il driver di quest’ultimo fornisce una tensione di 3.1V e una corrente di 2.5A, è un NeMa 17 bipolare. Penso di utilizzare arduino per ricevere il segnale da uno dei fili che parte dal driver ed alimenta il motor step e poi collegare arduino ad un relè, funzionante a 220, che pilota l’areatore a seconda del lavoro del motor step stesso. L’idea è di collegarlo al pin 13 di arduino. Supponendo che il segnale di tensione 3.1 sia sufficiente come segnale High x il pin 13, temo che possa arrivare un flusso di corrente elevato sullo stesso pin bruciando la scheda arduino.
    Come posso fare?

    Ti chiedo supporto perché non saprei come risolvere il problema.

    1. Ciao Vito,
      il tuo dubbio riguarda la possibilità che una corrente di ritorno attraverso il relay possa danneggiare arduino?
      Se ho compreso bene il problema la soluzione potrebbe essere un optoisolatore che ti eviti contatto elettrico tra relay e pin arduino.

    • Vito on 30 gennaio 2015 at 13:58
    • Reply

    Grazie Mauro per la Tua risposta. Ciò che temo , e’ di bruciare Arduino, poiché la corrente che prelevo per per immetterla su Arduino come segnale di imput, e’ quella stessa che alimenta una delle fasi del motore bipolare, essendo di amperaggio 2,5 ampere e 3,1V.. Mi sbaglio ? Se devo attenuare l’amperaggio cosa devo fare?
    Per poi immettere il segnale su arduino basta introdurlo su un PIN come il 13 e la massa sul GND oppure e’ errato? Mauro grazie attendo la Tua Risposta.

    1. Ciao Vito,
      non penso di aver compreso il tuo dubbio …

    • Vito on 30 gennaio 2015 at 17:55
    • Reply

    Scusa Mauro, sicuramente ciò che chiedo e’ banale, ma per me forse e’ un eccesso di prudenza. Dato che prelevo il segnale direttamente dalla corrente di alimentazione del drive di uno step motor gestito da un’altra scheda che non e’ Arduino , tensione 3,1V e corrente 2,5 ampere di cui un capo lo innesto sul pin 13 di arduino mentre l’altro lo innesto nel GND di arduino . Temo C he la corrente di 2,5 ampere siano eccessivi per Arduino dato che gestisce 40 mampere ( se non ricordo male) per ogni pin e non so se sto facendo i giusti collegamenti. In questo caso Arduino mi servirebbe per gestire un rele a 220 che comanda un areatore a seconda della rotazione di un motore step gestito da un’altra scheda. Credo che l’unico segnale per me possibile per gestire le due cose sia quello di prelevare la tensione del motorino comandato da questa scheda e convogliarla su arduino che a seconda gli impulsi mi gestisce il rele sull’areatore. Non so se sto facendo la giusta manovra e i giusti collegamenti su Arduino. Ti ringrazio per la Tua pazienza!!

    1. Ciao Vito,
      la corrente, o assorbimento, è proporzionale a quella richiesta dal dispositivo, in questo caso arduino.
      E’ come un rubinetto, mi perdonino gli elettronici puri, anche se il tubo eroga potenzialmente 4Lt al minuto nessuno ti impedisce di aprirlo poco e ottenere solo un filo d’acqua.
      In ogni caso se ci metti un optoisolatore il problema lo eviti al 100%

    • Vito on 1 febbraio 2015 at 21:45
    • Reply

    Grazie Mauro sei stato gentilissimo era ciò che volevo sapere. Sono riuscito nell’intento e funziona benissimo!!
    Un saluto e ancora un grazie per la Tua chiarezza e disponibilità.
    A presto Vito.

    • Bruno on 18 gennaio 2016 at 17:26
    • Reply

    Salve, è da pochissimi giorni che ho una scheda Arduino Uno R3. Ho provato a realizzare questo schema, ma ovviamente non funziona. Immagino che sia per il driver che sto usando, un uln2003A (versione montata su basetta con led indicatori di fase). Vorrei solo la conferma, perchè ho ordinato il driver che lei ha usato, ovvero il SN754410NE. Ci riproverò appena arriva.
    Può consigliarmi un buon manuale per studiare Arduino?

    Saluti
    Bruno

    1. Ciao Bruno,
      il driver corretto per questo esperimento è quello mostrato.
      Se cambi il driver dovrai scrivere uno sketch adatto.

      Per il manuale ti posso consigliare quello del Kit Arduino ufficiale che trovi in vendita su robotics-3d.com

    • Bruno on 20 gennaio 2016 at 09:44
    • Reply

    Grazie Mauro. Sul manuale che mi ha indicato, troverò spiegazioni su cosa differisce la compilazione degli sketch in base al driver utilizzato? Altrimenti dove posso trovare documentazione in merito?

    Buona giornata

    Bruno

    1. Ciao Bruno,
      i manuali presenti nei kit sono generici e fatti per aiutare tutti a muovere i primi passi con arduino, se ti occorrono manuali specifici devi ricercarli nel web o in qualche negozio di elettronica.

    • Bruno on 27 gennaio 2016 at 10:46
    • Reply

    Salve Mauro, in tutta sincerità ho provato svariate volte a far funzionare questo “circuito” ma senza risultato. Ho usato gli stessi componenti da te utilizzati. Sono sicuro che da qualche parte sto sbagliando ma non capisco dove. Mi era venuto un dubbio: io ho usato motori nema17, ma seguendo lo schema, li alimento praticamente dai 5 volt di arduino. Premendo i pulsanti il motore “tenta di girare” ma non lo fà. So che il comando dei pulsanti arriva correttamente perchè se premo orario il motore tenterà di girare in quel verso (ma senza riuscirci). Se in moto orario prendo il perno e tento di farlo ruotare in senso antiorario offre resistenza, mentre se lo accompagno in senso orario lo sento “libero di girare”.
    Sto sbagliando l’alimentazione? Dovrei alimentare il driver con una tensione opportuna? I motori emettono un leggero ronzio. Ho provato anche a cambiare il delay ma senza risultato (i motori hanno 200 passi e applicando la tua formula ne derivano 5 ms di delay).

    C’è qualcosa che posso provare o controllare?

    Buona giornata.
    Bruno

    1. Ciao Bruno,
      di certo l’alimentazione è fondamentale, se i tuoi motori sono dei 12v devi usare un adeguata alimentazione.
      Aggiungi che la corrente erogata dai 5v di arduino potrebbe non essere sufficente ai motori; molto dipende dalle caratteristiche del motore e NEMA17 non indica null’altro che il tipo di attacco/flangia di giunzione meccanica.
      Per i tempi, hai letto bene la formula, parte dal principio che tu conosca le caratteristiche meccaniche del motore e la velocità necessaria a compiere un giro completo, se questa informazione non la conosci puoi solo provare con delay alti per verificare il movimento.

    • Bruno on 29 gennaio 2016 at 16:19
    • Reply

    Ok. Credo di aver capito dov’è il problema. Forse sono stato fuorviato da cio che ho letto sul web circa l’alimentazioni di questi motori. Leggevo spesso che si potevano alimentare con diversi valori di voltaggio ma devo aver capito male il concetto. Di seguito le caratteristiche dei miei motori:

    Modello motore: 42BYGHW208
    n° di fili: 4
    Angolo di step: 1,8°
    Passi per giro: 200
    Tensione: 12V
    Corrente: 0,4A
    Resistenza di fase: 30 ohm
    Induttanza di fase: 37 mH
    Coppia: 2600 g.cm
    Diametro asse: 5mm

    Per gli step, avevo impostato bene il delay.

    E’ chiaro che serve necessariamente la 12V. Mi hanno appena consegnato tre Easy Driver, proseguirò con le prove, e questa volta li alimenterò nel modo coretto. Grazie per l’aiuto Mauro.

    1. Ottimo Bruno.

    • umberto on 28 aprile 2017 at 19:32
    • Reply

    Ciao,
    utilizzando un driver l298n, posso decidere il verso di rotazione tramite pulsanti?
    puoi indicarmi qualche articolo?
    Grazie.

    Umberto

    1. Ciao Umberto,
      puoi provare a seguire il ragionamento e lo schema di collegamento usato con la motor shield per il controllo dei motori passo-passo.
      Ho scritto e spiegato come fare in un articolo sul blog.
      Utilizza il motore di ricerca in alto a destra per trovare l’articolo.

Lascia un commento

Your email address will not be published.

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