Motor Shield FE e motore bipolare

Continua la serie di articoli su come utilizzare la “Motor Shield Fe” ed Arduino iniziata qualche settimana fa con il primo articolo: Tutorial: Motor Shield FE – prima parte.

motor-shield-fe-e-bipolare

In queste settimane hai sperimentato come costruirla, testarla e pilotare due motori in CC ( Corrente Continua) ma la motor shield FE può essere utilizzata che per pilotare un motore passo-passo, unipolare o bipolare, e quindi la puoi usare per la tua CNC o stampante 3D autocostruita.

Inizio dai motori bipolare perchè sono più difficili da gestire ma anche più semplici da trovare nelle stampanti di recupero, non a caso la maggior parte dei commenti ai miei articoli giungono proprio da appassionati in possesso di questo tipo di motore, più che dei motori unipolari.

La motor shield ha 2 moresetti, da due contatti ciascuno, a cui connettere le 2 fasi del motore.

Ti starai chiedendo come due fasi, non possiede 4 fasi un motore bipolare? si, ma in realtà gli avvolgimenti sono pilatati a due a due, ciascuno polarizzando correttamente la bobina corrispondente, se ti occorrona magiori informazioni su questo tipo di motori e sulla loro geometria ti invito a leggere: Motori passo-passo unipolari, riconoscerne le fasi – prima parte.

Collegamento:

individua le fasi del motore la prima, la seconda, la terza e la quarta, collega la prima e la terza ai morsetti del motore A e la seconda e quarta ai morsetti del motore B, come in figura:

connettori-motor-shield-fe

ed ecco lo sketch di esempio che puoi utilizzare:

/*
 * Sketch Test Motori Shield FE
 *
 * @author: Alfieri Mauro
 * @see:    https://www.mauroalfieri.it
 *
 * @licenze: Creative common
 */

int motorPinDirA = 2;
int motorPinDirB = 8;
int motorPinPwmA = 3;
int motorPinPwmB = 9;
int delayTime = 100;

void setup() {
  pinMode(motorPinDirA, OUTPUT);
  pinMode(motorPinDirB, OUTPUT);
  pinMode(motorPinPwmA, OUTPUT);
  pinMode(motorPinPwmB, OUTPUT);
}

void loop() {

  digitalWrite(motorPinDirA, HIGH);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, HIGH);
  digitalWrite(motorPinPwmB, LOW);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, HIGH);
  digitalWrite(motorPinPwmA, LOW);
  digitalWrite(motorPinPwmB, HIGH);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, HIGH);
  digitalWrite(motorPinPwmB, LOW);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, LOW);
  digitalWrite(motorPinPwmB, HIGH);
  delay(delayTime);

}

Faccio una premessa, la motor shield fe si basa sul driver a ponte H L298, in particolare questo driver accetta 4 segnali di input: IN1, IN2, IN3, IN4 e 2 segnali di enable EN1 ed EN2.

A cosa server tutto questo: nella motor shield fe i pin ENx sono ciascuno l’abilitazione della coppia di INx corrispondente, in pratica perchè IN1 e IN2 accettino un segnale e lo commutino su OUT 1 e OUT2 (uscite corrispondenti) è necessario che EN1 sia ad un livello logico alto (+5v); uguale situazione è valida per IN3 e IN4 con EN2.

Devi considerare anche che IN1 e IN2 sono pilotati da segnali invertiti mediante l’utilizzo di transistor ripetto ad un unico pin che li collega ad Arduino, analogamente avviene per IN3 e IN4.

Questo comporta che se IN1 è a livello logico alto ( +5v ) IN2 è certamente a livello logico basso  ( 0v ).

Compresa questa premessa ecco come funziona lo sketch:

linee 10-11: definisci le due variabili di tipo integer a cui sono collegati i pin di controllo della direzione A e B, ossi a IN1 e IN3, e di conseguenza sono invertiti IN2 e IN4, questi pin puoi modificarli sulla motor shield spostando i ponticelli illustrati nella figura sotto;

linee 12-23: definisci i pin collegati ai segnali PWM, in questo esempio non li utilizzerai come tali per cui sono solo i pin di enable EN1 e 2, anche questi li puoi modificare grazie ai ponticelli di selezione presenti sulla scheda e rappresentati in figura:

jumper-dir-e-pwmmotor-shield-fe

in figura i pin DIRA è connesso al pin 2 di arduino, DIRB al pin 8, PWMA al pin 3 e PWMB al pin 9 come nello sketch, puoi spostare tutti i ponticelli come preferisci, ricorda di cambiare le impostazioni dei pin nello sketch;

linea 14: definisci un tempo di attesa, nell’esempio di 100 millisecondi, di attesa tra una fase e la successiva;

linee 17-20: imposta tutti i pin definiti alle linee precedenti come pin di OUTPUT mediante il comando pinMode di arduino.

linee 25-28: è la prima fase del motore, abilita la conduzione degli input IN1 e 2 portando a livello logico alto il PWM corrispondente, a sua volta connesso all’EN1, quindi PWMA impostato a livello logico alto ( +5v ), e IN1 a livello logico alto (PinDirA), di conseguenza IN2 andrà da solo a livello logico basso portando l’uscita OUT2 a 0v;

linea 29: imposta il tempo di attesa delayTime come definito alla linea 14;

linee 31-34: è la seconda fase, ad essere interssati in questo caso sono i pin DirB e PwmB che vanno a livello logico alto per consentire a IN3 e EN2 di andare a livello logico alto e di conseguenza all’OUT3;

linea 35: imposta il tempo di attesa come alla linea 29;

linee 37-40: è la fase 3 e il segnale su EN1 deve tornare ad essere alto, per portare in conduzione IN1 e IN2 secondo il segnale impostato su DirA, quindi imposta DirA a LOW ( 0v ) per ottenere che IN1 vada a livello logico basso e IN2 alto;

linea 41: imposta il tempo di attesa come alla linea 29;

linee 43-46: è l’ultima fase del motore, ad essere coinvolto è tutto il canale B, per cui PwmB va a livello logico alto e DirB a livello logico alto, tradotto sul tuo L298 significa IN3 a 0v e IN4 a +5v;

linea 47: imposta il tempo di attesa come alla linea 29;

a questo punto il ciclo ricomincia dalla linea 25, facendo compiere all’albero motore altri 4 passi.

E’ importante che ti sia chiaro che ogni fase corrisponde da un passo del motore ma che allo stesso tempo 4 passi non è detto che facciano compiere un giro completo al motore, quando il motore è un 48 passi, ad esempio, sono necessari 12 cicli loop() di arduino per compiere un giro completo ( 48 / 4 = 12 ).

Guarda il video dimostrativo dello sketch:

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/motor-shield-fe-e-motore-bipolare.html

50 commenti

1 ping

Vai al modulo dei commenti

    • Stinghertube il 3 Aprile 2012 alle 22:41
    • Rispondi

    Salve Mauro,
    sto seguendo con interesse le tue guida e mi servirebbe una mano..

    • Stefano il 6 Aprile 2012 alle 11:54
    • Rispondi

    Salve Mauro,
    Sono uno studente della facoltà di Architettura e mi sto affacciando al mondo arduino da pochi giorni perchè vorrei costruirmi una Fresa CNC. Premetto che non ho molta esperienza a riguardo e tanto meno di arduino, è una settimana che mi affaccio a questo mondo….

    Volevo porti un paio di questioni
    Ho acquistato una arduino uno rev3 ed un motor shield Arduino rev3 e poi ho recuperato un motorino stepper da una vecchia stampante. Son riuscito a far fare qualche giro al motore grazie al tuo aiuto 🙂
    ho collegato lo shield sopra arduino usato l’alimentatore di un vecchio computer per alimentare il motore e con qualche modofica sul tuo codice il motore gira :). (grazie mille)

    Ora la questione sarebbe, come faccio a tradurre un file .dxf in un codice di arduino? Esiste un interprete da dxf a arduino (gratuito)?

    Grazie mille e complimenti!
    Stefano

    1. Ciao Stefano,
      garzie per i conplimenti.
      Non so se esita un inerprete diretto dxf -> Arduino, le CNC solitamente lavorano con il G-code che è un linguaggio specifico ed esistono delle liberie e sketch che ti consentono di dare ad Arduino in input un G-code ed ottenere il movimento dei motori.
      Sicuramente esiste un modo per convertire il tuo dxf in g-code, anche se io non sono ferratissimo su questo argomento, dovrenne essere un sw di CAM.

      Se hai voglia pubblica le modifiche che hai fatto al mio sketch così altri neo-appassionati possono trarne aiuto.

      Mauro

    • Stefano il 10 Aprile 2012 alle 21:24
    • Rispondi

    Grazie della risposta Mauro 🙂

    Ho trovato qualche informazione interessante, vi posto un sito dove si può trovare un interprete G code per arduino (sviluppato per usare la stamante Reprap)

    http://reprap.org/wiki/Arduino_GCode_Interpreter

    Inoltre metto anche il codice che ho scritto modificando quello postato da Mauro:

    Il programma farà fare al motore una serie di giri in senso orario e una serie di giri in senso antiorario.

    ————–

    int dist = 0;

    //Variabili da settare in base a come collego i fili sui vari motor shield
    int motorPinDirA = 12;
    int motorPinPwmA = 3;
    int motorPinDirB = 13;
    int motorPinPwmB = 11;
    int delayTime = 5;
    int delayTime2 = 2000;

    //Dico ad arduino quali output utilizzare
    void setup () {
    pinMode(motorPinDirA, OUTPUT);
    pinMode(motorPinDirB, OUTPUT);
    pinMode(motorPinPwmA, OUTPUT);
    pinMode(motorPinPwmB, OUTPUT);
    }

    //Imposto i comandi da eseguire
    void loop() {

    // A+ acceso
    digitalWrite(motorPinDirA, HIGH);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);

    //B+ acceso
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinDirB, HIGH);
    digitalWrite(motorPinPwmB, HIGH);
    delay(delayTime);

    //A- acceso
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);

    //B- acceso
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmB, HIGH);
    delay(delayTime);

    dist = dist + 1;

    //Imposto il numero di giri che il motore fa in senso orario
    //(1000 non sono i giri ma varia in base al tipo di motore e il numero di step che impiega per fare n giro)
    if (dist == 1000){

    delay(delayTime2);

    //Imposto il numero di giri che il motore fa in senso ontiorario
    for (int i = 0; i < 1000; i++){

    // A+ acceso
    digitalWrite(motorPinDirA, HIGH);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);

    //B- acceso
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmB, HIGH);
    delay(delayTime);

    //A- acceso
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);

    //B+ acceso
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinDirB, HIGH);
    digitalWrite(motorPinPwmB, HIGH);
    delay(delayTime);

    dist = 0;
    }
    }
    }

      • Giacomo Saccone il 4 Ottobre 2012 alle 15:54
      • Rispondi

      Non mi tornano i pin: 12, 3, 13, 11.

      Giacomo

      1. Ciao Giacomo,
        la motor shield fe ti permette di settare i pin da utilizzare mediante jumper, tuttavia la sequenza che hai scritto non è realizzabile ed io non la utilizzo da nessuna parte.

        Mauro

    • Fabio il 20 Aprile 2012 alle 21:27
    • Rispondi

    Ciao Mauro, mi sono avvicinato da poco al magico mondo di arduino, anche grazie alle tue splendide spiegazioni, volevo chiedesti un aiuto: vorrei costruire un piano che consenta spostamenti x e y, in pratica due slitte tra loro perpendicolari. Come posso gestire due motori passo passo? Avrei bisogno di una vera e propria lista della spesa con tutto hardware necessario….
    Grazie.
    Fabio

    1. Ciao Fabio,
      quello che vuoi realizzare è un piano per CNC, trovi molti articoli sui motori passo passo nel blog, prova a leggerli e redarre una lista adatta alle tue esigenze, es.: motori bipolari o unipolari, vuoi che esegua codice G-code o lo spostamento avviene in altro modo (pulsanti, potenziometri, sensori, ecc…) cerca di indivisuare il tipo di motore che ti occorre (n. di step, corrente e potenza) poi con queste informazioni e molte altre che scoprirai leggendo gli articoli scriviamo una lista della spesa.

      Mauro

    • Fabio il 22 Aprile 2012 alle 17:33
    • Rispondi

    Ciao Mauro, grazie per la risposta. La mia idea e’ quella di costruire un sistema di spostamento sugli assi x e y per movimentare una macchina fotografica di medio formato (peso circa 3kg). Lo spostamento dovrebbe avvenire con 4 pulsanti (destra/sinistra e avanti/dietro). Pensavo anche di aggiungere un quinto pulsante per resettare il piano ad inizio lavoro, in modo da partire sempre al centro dei due assi. Come hardware avrei pensato: arduino uno rev3, la motor shield fe che che hai recensito e motore passo passo bipolare da 2,5A. Naturalmente per complicare un pochino il software credo che sia giusto aggiungere 4 microinterruttori come fine corsa. Cosa ne pensi?
    Grazie.
    Fabio

    1. Ciao Fabio,
      hai già letto questa serie di articoli?
      https://www.mauroalfieri.it/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori.html
      Penso siano proprio quello che cerchi, manca solo il pulsante di reset ma puoi facilmente realizzarlo modificando uno degli sketch proposti.

      Mauro

    • Fabio il 25 Aprile 2012 alle 19:45
    • Rispondi

    Grazie Mauro,
    ho raccolto tutti i tuoi articolo e ho cominciato…lo studio.

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

      Veramente interessante il tuo Blog
      Sono nuovo di Arduino e Dovrei pilotare un motore passo passo con arduino uno e easy driver avrei la necessità di trasformare il movimento rotatorio in spostamento verticale ho le idee confuse a proposito cosa potrei usare una vite senza fine collegata al motore ? Ho visto che esistono anche attuatori lineari allo scopo ma hanno prezzi che non posso permettermi.
      Ho citato easy driver perche è un driver già montato (mi sono cimentato con le saldature per il kit driver ma mi sono fermato alla saldatura del chip smd (vista cosi cosi e mano tremolante…..(quindi niente shield …)

      L’escursione verso l’alto sarebbe attorno ai dieci centimetri circa ma potrebbe bastare anche molto meno. grazie ancora e complimenti anche per le ricette …..

      1. Ciao Giovanni,
        per l’SMD puoi risolverlo chiedendo a chi vende la shield se ne forniscono una già assemblata, o cercando un fornitore che offra il servizio di montaggio.

        Per il movimento lineare esistono varie soluzioni, dipende 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

        Sono le prime idee che mi sono venute, ce ne sono di sicuro altre.
        Se qualche lettore del blog ne ha può suggerirle.

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

        Mauro

          • Gianni il 10 Giugno 2012 alle 08:44
          • Rispondi

          Grazie Mauro

          Avevo già provato a chiedere almeno ai negozi di torino per la smd ma nessuno fornisce il servizio montaggio.
          Se qualcuno può indicarne uno ….sarò felice…
          Stesso discorso per passo passo , mi piacerebbe trovare passo passo già con opportuna vite trapezio (o altro) già montata…ma non saprei a chi rivolgermi…

          Ancora grazie…

          1. Per il montaggio mi sembra che robot-domestici lo faccia.
            Se proprio non trovi nessuno dimmelo che mi faccio spedire un kit e ti do il servizio di montaggio.
            Sarò a Torino per l’Arduino Camp probabilmente domenica prossima.

            Le viti di solito si trovano facilmente nelle fiere di elettronica, forse da qualche parte ho il riferimento di un ragazzo da cui spesso acquisto, devo cercarlo. Fossi in te valuterei anche l’idea di fare un giro in discarica dove i makers come noi trovano tantissimo materiale e idee.
            E’ pieno di vecchie stampanti e scanner da smontare a costo 0.

            Mauro

    • Gianni il 10 Giugno 2012 alle 15:49
    • Rispondi

    Grazie Mauro

    Proverò ancora a cercare

    • Luigi il 10 Agosto 2012 alle 17:07
    • Rispondi

    Ciao, i tuoi articoli sono interessanti come sempre.
    Ho acquistato sia l’integrato SN754410 sia la Shield Fe. Ho provato con il primo integrato e adesso sto saldando la Fe. La mia domanda è, che differenze ci sono fra i due driver nel comandare un motore bipolare?
    La Shield Fe offre dei vantaggi?

    1. Ciao Luigi,
      dal punto di vista elettronico non ci sono grandi differenze a parte il fatto che la Motor Shield Fe è già organizzata con tutti i componenti e occorrono e testata, i circuiti fai da te non hanno questa caratteristica, ma se sei bravo a costruirteli e testarli possono essere validissimi.

      Per la differenza tra i due driver c’è con l293 in package differenti da quello smd della shield perché supporta maggiori correnti e può montare alette di raffreddamento, ma sulla Shield è stato scelto un package che riducesse gli ingombri.

      Quanto al modo di pilotare i motori bipolari sul blog trovi molti esempi, non solo miei, per eseguire anche i 1/2 passi. Provali per sfruttare al massimo il tuo motore.

      Mauro

    • Giacomo Saccone il 14 Settembre 2012 alle 11:44
    • Rispondi

    Ciao!
    Ho montato il motore e le schede esattamente come nel tuo video!
    Sono riuscito a comandare il mio motore bipolare e a fargli fare 1 giro solo (o porzioni di giro)…

    Adesso le cose mi si complicano: dovrei comandare, insieme a questo, separatamente, un altro motore bipolare.

    Volevo sapere: posso semplicemente aggiungere un’altra motorshield su quella che ho già montato sopra arduinoUNO? O devo usare 2 arduinoUNO separate?

    1. Ciao Giacomo, puoi montare più Motor Shield insieme in quanto per ognuna puoi definire i pin da usare.

      Il mio consiglio se il numero di motori cresce è di passare a un driver per motori bipolari tipo quelli della pololu o simili, io ne ho uno che mi ha regalato un appassionato lettore come sostegno al blog e presto ci farò un articolo.

      Il vantaggio immediato è che con soli 2 pin ( direzione e step ) puoi comandare un motore e poi che definisci solo gli impulsi di step e la direzione ed al resto pensa lui, sono driver costruiti a posta e costano intorno ai 20 euro ciascuno, il solo costo di una nuova Motor Shield li ha già ripagati entrambi 🙂

      Se mi racconti il tuo progetto magari posso darti qualche dritta in più rispetto alla semplice soluzione di piccoli bug.

      Mauro

        • Giacomo Saccone il 14 Settembre 2012 alle 18:29
        • Rispondi

        Ti ringrazio tantissimo dell’interessamento e dell’aiuto,

        Il driver che mi consigli va bene per 2 motori bipolari? Ormai ho già una scheda arduinoUNO e una motorshield_fe…mi consigli di comprare un driver pololu o una nuova motorshield_fe???

        Il mio esperimento consiste nell’iniettare, tramite 2 siringhe, aria in una vasca di liquido, in modo da studiare la crescita e il distacco delle bolle.
        Le siringhe sono montate sopra 2 slitte micrometriche e gli avanzamenti sono regolati dalla rotazione di 2 pomelli (avanzamento di 0,5mm/giro). Una siringa è piena d’aria, l’altra è piena di liquido.
        Io devo inserire un volume di aria veramente piccolissimo, pari AL MASSIMO ad 1/100 di giro del pomello!!
        e poi spingere questo volume fino all’orifizio posto dentro la vaschetta di liquido con l’altra siringa (piena di fluido).
        Le rotazioni dei pomelli devono essere controllati separatamente da due motori passo passo, riesco ad arrivare a 1/100 di rotazione grazie a delle cinghie (maledetta costosissima micromeccanica!) e ai rapporti di trasmissione (altrimenti avrei al massimo 1/48 di giro con i motori di cui dispongo…).

        Visto che ci sono, vorrei chiederti un altro consiglio: arrivato a fine corsa, dovrei ricaricare la siringa d’aria: esiste una valvola a tre vie controllabile numericamente???

        Giacomo Saccone

        1. Ciao Giacomo,
          progetto molto interessante.
          Per le schede ho guardato su robot-domestici.it i prezzi: la motor shield costa meno di quello che ricordavo, il driver consigliato è l’Easy Driver che costa meno di 15 euro, ma il risparmio non è tantissimo.

          Il vantaggio, ma sarebbe da verificare, è che con questo driver puoi regolare anche i microstep, riporto l’info del produttore:

          MS1 and MS2 pins broken out to change microstepping resolution to full, half, quarter and eighth steps (defaults to eighth)

          Così a occhio potresti regolare anche i microstep con risoluzione di 1/2, 1/4, 1/8

          Per la valvola a 3 vie non ne conosco, prova a cercare nel mondo delle elettrovalvole magari esiste quello che fa al caso tuo.

          Mauro

    • Giacomo Saccone il 4 Ottobre 2012 alle 16:00
    • Rispondi

    Ciao Mauro,

    Ho sistemato il mio motore bipolare ma credo di sbagliare qualcosa:
    il mio obiettivo è far fare un giro in un verso e un giro nell’altro…ma per ora oscilla e basta!!! Cosa sbaglio??? Sbaglio a mettere i fili??

    Questo è il mio sketch:

    int motorPinDirA = 2;
    int motorPinDirB = 8;
    int motorPinPwmA = 3;
    int motorPinPwmB = 9;
    int delayTime = 50;
    int fermo = 0;

    void setup() {
    pinMode(motorPinDirA, OUTPUT);
    pinMode(motorPinDirB, OUTPUT);
    pinMode(motorPinPwmA, OUTPUT);
    pinMode(motorPinPwmB, OUTPUT);
    }

    void loop() {

    if (fermo<49)
    {
    fermo ++;
    digitalWrite(motorPinDirA, HIGH);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);

    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, HIGH);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinPwmB, HIGH);
    delay(delayTime);

    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, HIGH);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);

    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinPwmB, HIGH);
    delay(delayTime);
    }
    else
    {
    digitalWrite(motorPinDirA, LOW);
    digitalWrite(motorPinDirB, LOW);
    digitalWrite(motorPinPwmA, LOW);
    digitalWrite(motorPinPwmB, LOW);
    delay(delayTime);
    }
    }

      • Giacomo Saccone il 4 Ottobre 2012 alle 16:36
      • Rispondi

      i fili sono:

      + giallo e rosso
      + blu e arancio

      (li ho accoppiati così in quanto sono gli unici accoppiamenti che presentano resistenza diverse da zero)

      ho supposto:

      giallo e blu: positivi; arancio e rosso negativi.

      Ho collegato: A1:blu, A2:arancio, B3: arancio, B4: rosso;

      1. Ciao Giacomo,
        da quello che scrivi sembra che tu abbia individuato i fili in modo corretto almeno per gli accoppiamenti.
        La sequenza è cosa differente, per trovarla io ho scritto un tutorial con video in cui mostro un metodo empirico, pratico sperimentale, per trovarla.

        Mauro

    1. Ciao Giacomo,
      quasi certamente è un problema di collegamento.
      Nel Blog trovi alcuni articoli in cui mostro come accoppiare i fili dei motori bipolari e come riconoscere le fasi, c’è anche un video.

      Prova a leggerli e magari commentali se qualcosa non ti è chiaro.

      Mauro

    • alessandro il 14 Novembre 2012 alle 23:42
    • Rispondi

    ciao mauro vorrei chiederti un aiuto.
    sto cercando di provare una scheda controllo motori con arduino.
    funziona, ma il voltaggio in uscita ai vari motori dc è circa dimezzato.
    alimento scheda arduino uno e scheda controllo motori tutto con 4,8 v ma ai motori arrivano solo 2,4 circa.
    cosa potrebbe essere?
    la scheda è questa:
    http://www.ladyada.net/make/mshield
    grazie alessandro

    1. Ciao Alessandro,
      non ho mai provato questa scheda motori, tuttavia la tensione che stai utilizzando è insufficente anche solo per alimentare Arduino.
      In questa pagina: http://www.ladyada.net/make/mshield/use.html trovi le specifiche di funzionamento e 4.5v è proprio il minimo.

      Prova ad alimentare Arduino con 7-9v e verificare la tensione ai motori.
      In alternativa la shield ha la possibilità di essere alimentata dall’esterno, prova.

      Mauro

    • Paolo il 27 Novembre 2012 alle 19:06
    • Rispondi

    Caro Mauro, come molti ti chiedo anch’io un aiuto. Ho provato a seguire le tue utilissime indicazioni per pilotare un motore passo passo con la motor shield FE, ma siccome non succede niente, ho il dubbio (forte) di avere saldato male i componenti del kit, in particolare il chip. Non so come fare per capire se va o no. Ho però una Motor shield di Arduino, per la quale non trovo istruzioni per come fare i collegamenti e farla funzionare. Mi sai indicare qualche tutorial?Non sono del mestiere, ma mi appassiona la robotica.
    Grazie in anticipo. Paolo

    1. Ciao Paolo,
      cerco di aiutarti, che tipo di shield hai?
      Sigla, info scritte su o altro così posso verificare se esistono tutorial.

      Inoltre tutte le motor shield sono pensate per far girare motori in continua ( CC ) perova con un motore in CC per verificare che i due canali funzionino.
      Non è detto che con tutte le motor shield funzioni il controllo di motori passo-passo, io ci sono riuscito con la Motor Shield Fe.

      Mauro

      • Alberto il 16 Gennaio 2014 alle 22:53
      • Rispondi

      Ciao mi chiamo Alberto ho avuto lo stesso problema, hai controllato i cavallotti??

      1. Ciao Alberto,
        a quale problema ti riferisci?

        Mauro

    • Paolo il 28 Novembre 2012 alle 15:36
    • Rispondi

    Ciao Mauro, e grazie per rispondermi. La motor shield che non mi funziona, e per la quale ho dubbi sul mio operato di saldatore, e quella che hai mostrato tu nei tuoi tutorial la Motor Shield FE. Quella che vorrei provare in alternativa è la Arduino Motor Shield (arduino.cc/en/Main/ArduinoMotorShieldR3 – Questo shield mette a disposizione due canali separati, chiamati A e B ed ognuno utilizza 4 piedini di Arduino per scegliere la direzione della rotazione , per variare la velocità, per frenare velocemente e per misurare la corrente che fluisce attraverso il motore. In totale questo shield usa 8 pin. È possibile utilizzare ciascun canale separatamente per pilotare due motori DC o combinarli per pilotare un motore passo-passo bipolare. Lo shield è in grado di fornire 2 ampere per ogni canale, per un totale massimo di 4 ampere per tutto lo shield.).
    Ti dirò che mi sento un po’ imbranato.
    Grazie ancora.

    Paolo

    1. Ciao Paolo,
      se il tuo scopo è pilotare un motore bipolare passo-passo io ti consiglio l’EasyDriver:

      – costa uguale o meno;
      – trovi i tutorial sul blog;
      – ne possiedo uno e ti posso aiutare;

      Mauro

    • Paolo il 28 Novembre 2012 alle 17:40
    • Rispondi

    Grazie Mauro.
    Farò così.

    • Manlio Mencuccini il 9 Febbraio 2013 alle 17:47
    • Rispondi

    Ho da pochi giorni acqistato arduino che sperimterò. Avevo già costruito tanti anni fa un robot con pezzi della fischertecnik ed una programmazione in basic, adesso lo ho ripescato dal ripostiglio e vorrei rmetterlo in funzione. Mi manca , perche rotto, il terminale della piattina multicolore 20 pin si trovano ? se si dove?
    Grazie per l’aiuto

    1. Ciao Manlio,
      purtroppo non conosco il fischertecnik, ma se si tratta di una piattina di fili potresti rivolgerti al tuo rifornitore di componenti elettrici, magari puoi riadattare quella dei vecchi HD a 40pin.

      Mauro

    • Michele il 14 Aprile 2013 alle 22:29
    • Rispondi

    Ciao Mauro, scusa nuovamente per il disturbo,
    grazie alla tua tabella ho risolto il problema di individuare le fasi del motore passo passo bipolare però ora
    si presenta un altro problema, come sempre per chi non è esperto come me, ho acquistato la scheda adafruit
    motor stepper http://www.adafruit.com/products/81 per arduino, ho collegato i 4 cavi del mio motore, ho caricato uno sketch per testare il motore ma succede che dopo 30/40 secondi di esercizio l’integrato che gestisce il motore, L293D inizia a riscaldarsi e sono costretto a staccare tutto per non bruciarlo! Il motore è preso da una stampante epson sigla EM-243 STH-39H112-01 probabilmente da quel poco che ne posso capire l’assorbimento di corrente del motore è forse troppo elevato quindi l’integrato scalda, se fosse così sapresti indicarmi un circuito o una scheda di potenza da realizzare per pilotare questo motore, in realtà ne vorrei pilotare due sempre tramite arduino se possibile o eventuali altre soluzioni!
    Grazie mille come sempre per l’attenzione, scusa se mi sono dilungato troppo, aspetto tue notizie!

    • Andrea il 15 Giugno 2013 alle 14:39
    • Rispondi

    Ciao Mauro,

    con il motor shield fe e’ possibile fare delle regolazioni ? C’e’ in qualche modo la possibilita’ di misurare la corrente assorbita dai due motorini in modo da scrivere le pwm in uscita proprio per far ruotare i due motorini alla stessa velocita’ ? Sto costruendo il mio primo robottino, si tratta del robot beginner kit con il motor shield fe e vedo che il mio robottino va davvero storto per che i due motorini non ruotano alla stessa velocita’, hai qualche idea ?

    grazie.

    ciao.

    Andrea.

    1. Ciao Andrea,
      interessante esperienza quella che stai provando.
      Penso che misurare la corrente non sia indicativo della differenza di rotazione tra i due motori, potrebbero assorbire medesima corrente e ruotare in modo differente o peggio, a causa di un problema meccanico, potresti rilevare corrente superiore da parte del motore che fa più fatica ad avanzare.

      In ogni caso con la Motor Shield Fe non puoi rilevare tale differenza.
      Puoi aggiungere due sensori infrarossi che leggano le rotazioni dei motori mediante le due ruote a raggi presenti nel kit.

      In questo modo potresti misurare le rotazioni e compensare.

      Mauro

    • Alberto il 16 Gennaio 2014 alle 22:51
    • Rispondi

    Ciao Mauro, ho iniziato a conoscere Arduino alla tua lezione Starter.
    La mia ambizione era quella di poter gestire un motore P-P, pur non avendo nozioni di elettronica e tanto meno di programmazione .
    Grazie alla tua lezione scolastica e quelle , altrettanto valide “virtuali” il motore ha mosso i primi….” passi”.
    Grazie Andrea mi chiedo senza questi tutorial Italiani cosa avrei combinato.

    1. Ciao Alberto,
      bellissima testimonianza 🙂

      Mauro

    • Michele il 15 Giugno 2014 alle 11:40
    • Rispondi

    Buongiorno Mauro e complimenti per il sito, è una miniera di informazioni per noi appassionati alle prime armi con Arduino. Sono un neo appassionato di Arduino, ho comprato inizialmente uno starter kit con cui ho preso subito confidenza con i vari pin, sensori, sketch ecc…. Ora mi piacerebbe realizzare un semplice cnc a 3 assi, per cui ho comprato 3 motorshield FE (assemblate senza problemi) e 3 stepper bipolari; ho provato ad utilizzare la libreria stepper e ho creato 3 istanze (asse X, Y, Z) con cui posso pilotare i motori in velocità e direzione, però non mi è possibile muoverli tutti e tre contemporaneamente, cioè i comandi vengono eseguiti sequenzialmente. Come è facile intuire se devo creare una semplice diagonale (ad es. sul piano X-Y) o un cerchio è necessario muovere due motori contemporaneamente e questo per ora non è possibile. Ho provato il tuo sketch qui sopra aggiungendo altri due motori e finalmente li vedo muovere tutti e tre contemporaneamente. Domanda: come posso far invertire la direzione di un motore, ad esempio, rispetto gli altri due senza utilizzare la libreria stepper? E’ possibile rendere i tre motori indipendenti l’uno dagli altri (in velocità e direzione) muovendoli contemporaneamente? Grazie anticipatamente della risposta e complimenti ancora per l’impegno che ci metti.
    Michele

    1. Ciao Michele,
      se leggi con attenzione il mio sketch dovresti riuscire a modificare da solo lo sketch per ottenere la rotazione inversa.
      Di fatto non si tratta altro che di invertire la sequenza delle fasi da 1,2,3,4 a 4,3,2,1.
      Probabilmente trovi già degli sketch semplici che lo fanno nel blog, a memoria, ricordo di averne scritti tanti sui motori passo-passo.

      Sulla velocità differente il problema è che le pause tra i passi sono gestite, in questo ed altri sketch, con dei delay che come sai fermano l’eseguzione dello sketch e questo causa che diverse velocità risentano tutte di tali pause, potresti cambiare l’eseguzione con dei millis() che lavorano in tutt’altro modo.

      In generale se il tuo obiettivo è una CNC ti consiglio di cercare in internet ed analizzare uno sketch per GCode che di fatto è quello che arduino deve interpretare per spostare gli assi della CNC.

        • Michele il 20 Giugno 2014 alle 21:37
        • Rispondi

        Ciao Mauro,
        il mio problema era che non avevo ben capito che il PWM “accende” la fase e Dir tramite livello logico alto o basso comanda la direzione; ora riguardando meglio i tuoi sketch sono riuscito a far compiere rotazione inverse ai motori. Per quanto riguarda i programmi per Gcode interpretabili da Arduino, mi sai consigliare qualcosa? Ho cercato in rete ma ho trovato solo quelli per le stampanti 3D. Io però avrei bisogno di un software che, partendo da un disegno 3D mi crei un percorso macchina per asportare materiale e non il contrario (come per le stampanti 3D). So che esiste ad esempio Mach3 ma non so se sia compatibile con Arduino. Mi sai consigliare, grazie mille!
        Michele

        1. Ciao Michele,
          mi sembra tu abbia le idee un po’ confuse.
          Una cosa è il programma che partendo dal 3D ti realizza un percorso macchina in GCode e un’altra è l’interpretazione da parte di arduino del GCode.

            • Michele il 21 Giugno 2014 alle 12:03

            Ciao Mauro,
            è vero ho le idee molto confuse, come dicevo all’inizio sono un neofita in questo campo, e su internet c’è molta confusione. Siccome leggevo dai tuoi corsi online, riguardanti arduino e le motorshield, che vorresti anche tu costruire una cnc, ti chiedevo appunto dei consigli su che software utilizzare: quindi per creare un gcode partendo da un 3D cosa mi consigli? e per far in modo che arduino legga tale gcode cosa è necessario fare? Scusa se ti annoio con tutte queste domande, abbi pazienza, grazie.
            Michele

          1. Ciao Michele,
            hai ragione su quanto scritto in merito alle CNC, in origine quando ho iniziato a giocare con arduino avevo questa idea poi ho scoperto tutto quello che si può fare con arduino e la realizzazione di una cnc è passata in secondo o terzo piano.
            Quello che posso dirti è che il GCode devi generarlo con software tipo Mach3 o altri open, al momento non ne conosco da consigliarti, poi interpreti il file con arduino e fai eseguire il percorso macchina ai tuoi motori con uno sketch.

            Al momento non ho più dedicato tempo al gcode ed alla sua interpretazione, penso che sul web ci sia tanto materiale da provare e testare.

    • Gabriele il 15 Giugno 2014 alle 19:33
    • Rispondi

    Salve Mauro,

    ho cominciato ad utilizzare da poco arduino (posseggo arduino uno rev3), ho acquistato anche una shield per comandare due motori passo passo, non so come scegliere il motore giusto, ho smontato diverse stampanti/oggetti per ricavarne dei passo passo per sperimentare sul mio progetto, qualunque sia la dimensione dello stepper il chip L293D diventa molto caldo, e’ possibile che un motorino passo passo em326 o simili assorbano cosi’ tanta corrente da mandare in “fiamme” gli l293d?
    i motori vengono alimentati esternamente a 12v, ho misura la resistenza su ogni fase di 7ohm..

    1. Ciao Gabriele,
      il driver L293D è più indicato per i motori in corrente continua che per i passo passo.
      Io stesso lo utilizzo ma come ripiego se hai già in casa una motor shield, preferisco di granlunga i driver della pololu o easy driver a cui ho dedicato degli articoli.
      In ogni caso tutti i driver scaldano ed è buona cosa mettere un aletta di raffreddamento come fanno, ad esempio, per le stampanti 3D.

  1. […] precedente articolo dedicato alla motor shield FE fornita da robot-domestici.it hai imparato a pilotare un motore […]

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.