Motor shield per robot

Tra gli ultimi acquisti fatti mi ha incuriosito una Motor shield prodotta in Italia non da Arduino ma con alcune caratteristiche davvero interessanti per essere utilizzata su un robot:

Motor shield

La Motor shield della microbot distribuita da robot-domestici.it ha:

  • integrato L298 prodotto dalla STMicroelectronics;
  • due pin digitali ( D7 e D8 ) disponibili per comandi esterni;
  • due pin analogici ( A2 e A3 ) disponibili per input esterni;
  • controllo della corrente assorbita da ogni singolo motore;
  • freno motore;
  • integrato TCN75A che comunica con Arduino mediante I2C la temperatura della shield;

Effettivamente non sono poche le cose che la Motor shield può fare per il tuo robot, in questo primo test ti concentrerai sulla parte di controllo dei due canali, il freno motore e il controllo della corrente assorbita, in un prossimo test proverai il sensore di temperatura e gli input / output su pin esterni.

specifiche tecniche della Motor shield

La Motor shield presenta le seguenti specifiche tecniche:

Motor shield specifiche

sono prese direttamente dalla documentazione fornita dal Produttore.

La documentazione tecnica della Motor shield contiene anche altre informazioni molto interessanti, i pin di controlla tra Arduino e la shield per controllare i motori:

Motor shield pin controllo

ed anche uno schema dei segnali che devi inviare alla motor shield per controllare i due canali ( A e B ):

Motor shield segnali

tutte queste informazioni sono molto utili quando dovrai realizzare il tuo sketch per un robot.

Come riporta anche la documentazione ufficiale lo schema in Tab.2 della motor shield riporta solo i segnali da inviare ai pin del canale A, tali segnali sono identici anche per il canale B, ti basta sostituire i pin a cui invii tali segnali.

Controllo assorbimento dei motori

Il controllo di quanto assorbe un motore in un robot o in un progetto complesso può indicarti un’informazione fondamentale sia per evitare di:

  • bruciare il motore;
  • fondere il chip L298 di controllo della motor shield;
  • capire se un motore sta andando in stallo, ossia è bloccato meccanicamente;
queste informazioni puoi ricavarle attraverso i pin analogici della motor shield connessa ad arduino A0 ed A1 rispettivamente per il canale A e B.
Come sai i pin analogici di arduino sono collegati ad un ADC ( convertitore analogico digitale a 10bit ) per cui una tensione di 5v sul pin A0 produce un segnale digitale di 1023 ed è il valore massimo di tensione che puoi inviare ad un pin di questo tipo.
La motor shield è dotata di un convertitore I2V in cui la corrente misurata su un canale viene trasformata in una tensione con rapporto 2.4 ossia con 1A di assorbimento del motore il valore di tensione sul pin A0 o A1 è 2,4v.
Avrai calcolato da solo che essendo il drver L298 in grado di erogare 2A di corrente massima potrai avere sul pin A0 o A1 un valore massimo di 4,6v.
Se vuoi calcolare che valore leggi sul pin A0 puoi usare la proporzione:
    1023 : 5v = X : 2,4v => X= (2,4 x 1023) / 5 => X = 491
Calcolare la corrente assorbita è quindi un gioco di formule in cui se leggi 12 come valore sul convertitore analogico digitale puoi stabilire che l’assorbimento del motore è:
    491 : 1000mA = 12 : I   =>    I = ( 12 x 1000 ) / 491  => 24,43 mA
ho eseguito i calcoli in milliampere ( 1A = 1000mA ) in quanto le correnti di esempio sono molto contenute.

Configurare la Motor shield

La motor shield ha alcuni jumper che puoi utilizzare per configurarla al meglio, puoi ad esempio escludere il controllo della corrente assorbita dai motori se non reputi utile al progetto tale controllo, spostando i jumper:

Motor shield jumper

oppure puoi configurare da dove prendere alimentazione per i motori, se usare l’alimentazione proveniente dal Vin di Arduino o alimentare i motori con l’alimentazione esterna prevista sulla motor shield:

Motor shield jumper

ti consiglio di usare sempre questa per non compromettere Arduino, inoltre la tensione supportata dalla motor shield per alimentare i motori è di 46v di picco e Arduino non potrebbe mai permetterti di utilizzare tali tensioni senza danneggiarsi.

Lo sketch di test della Motor shield

lo sketch di esempio che ho utilizzato è molto semplice, conta che per scriverlo ho impiegato 6min circa 🙂 non perché sia veloce a scriverlo ma perché dopo la lettura della documentazione tecnica è stato davvero semplice:

/**********************************************************
 * Motor Shield Robot
 *
 * Data creazione  15 marzo 2013
 * Ultima modifica 15 marzo 2013
 *
 * autore: Mauro Alfieri
 * web:    mauroalfieri.it
 * tw:     @mauroalfieri
 *
/**********************************************************/

#define inputA1  9
#define inputA2 10
#define enableA  3

#define inputB1  2
#define inputB2  6
#define enableB  5

#define ampereA A0
#define ampereB A1

#define buttonA  4
#define buttonB  7
#define buttonC  8
#define buttonD 11

int velocitaA  = 0;
int velocitaB  = 0;

void setup() {
  Serial.begin( 9600 );

  pinMode( inputA1,OUTPUT );
  pinMode( inputA2,OUTPUT );
  pinMode( enableA,OUTPUT );

  pinMode( inputB1,OUTPUT );
  pinMode( inputB2,OUTPUT );
  pinMode( enableB,OUTPUT );  

  pinMode( ampereA,INPUT );
  pinMode( ampereB,INPUT );

  Serial.println( "----- Avvio -----");
}

void loop() {
  int pressedA = digitalRead( buttonA );
  int pressedB = digitalRead( buttonB );
  int pressedC = digitalRead( buttonC );
  int pressedD = digitalRead( buttonD );

  digitalWrite( inputA1,pressedA );
  digitalWrite( inputA2,pressedB );
  digitalWrite( inputB1,pressedC );
  digitalWrite( inputB2,pressedD );

  analogWrite( enableA,255 );
  analogWrite( enableB,255 );

  Serial.print( "C Motor A: " );
  Serial.print( analogRead( ampereA ) );
  Serial.print( "C Motor B: " );
  Serial.print( analogRead( ampereB ) );
  Serial.print( "\n" );

  delay( 500 );
}

per eseguire i test ho utilizzato 4 pulsanti rispettivamente collegati ai pin di arduino 4,7,8,11 ognuno dei pulsanti mi serve a comandare uno dei canali di input della motor shield, come vedi nello sketch.

Alle linee 50-53: leggi il valore proveniente dai 4 pin digitali;

linee 55-58: imposti il valore digitale di OUTPUT della motor shield con il valore appena letto dagli INPUT digitali;

linee 60-61: imposta a 255 il valore analogico di OUTPUT per i due canali, in pratica mandi al massimo entrambi i motori;

linee 63-67: leggi i valori di A0 ed A1, su cui ricevi l’informazione di corrente assorbita e scrivili sul monitor seriale.

Si tratta di uno sketch di esempio di cui ho realizzato anche un video:

in cui vedi anche i valori di corrente letti sul monitor seriale durante il test.

Buon divertimento.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/motor-shield-per-robot.html

28 comments

Skip to comment form

    • luca on 17 marzo 2013 at 21:14
    • Reply

    ciao sono nuovo di qui…
    sarebbe grandioso includere i motoriduttori nel progetto dolly cam con arduino : )
    luca

    1. Ciao Luca,
      è il nuovo progetto a cui sto lavorando si chiamerà Dolly Slider.
      Se leggi un po di articoli sul Dolly capirai di cosa parlo.

      Mauro

    • Luca on 18 marzo 2013 at 08:20
    • Reply

    Ciao Mauro

    Si l’ho visto ed é grandioso! io Intendevo una variante con il motoruduttore al posto del passo passo 🙂
    Ciao
    Luca

    1. Ciao Luca,
      come ti dicevo, se leggi il testo dell’articolo, è la variante a cui sto lavorando 🙂

      Mauro

    • Luca on 3 giugno 2013 at 14:26
    • Reply

    Ciao Mauro

    Ottima guida!!
    Però avrei bisogno di un ulteriore chiarimnto.. Se dovessi controllare anche il motore 3 e il motore 4 quali altri pin dovrei inizializzare?

    1. Ciao Luca,
      la motor shield presentata controlla soli 2 motori, se vuoi controllarne un 3° ed un 4° dovrai acquistarne 2 e collegarle in modo che non vadano in conflitto di pin.

      Mauro

        • Massimo on 2 agosto 2013 at 10:14
        • Reply

        Puoi chiarire questo fatto di collegare due motor shield senza mandare in conflitto i pin?
        Dove deduco i pin occupati normalmente e come controllare ciò?

        Ciao

        1. Ciao Massimo,
          puoi dedurre i pin utilizzati dai datasheet di ciascuna scheda, sono informazioni che il produttore della shield rilascia solitamente.

          Mauro

    • Luca on 3 giugno 2013 at 15:34
    • Reply

    Scusa l’ho notato dopo che usavi la versione per controllare 2 motori.. Comunque non è che sapresti su quella da 4 quali pin sono interessati?

    1. Ciao Luca,
      esiste una versione a 4 motori?
      girami il link e vedo se c’è adeguata documentazione.

      Mauro

    • Pasquale on 22 ottobre 2013 at 09:59
    • Reply

    Salve , sono nuovo nel campo di arduino e della robotica vorrei chiederti un consiglio ho acquistato una dual dc motor shield con i cingoli della tamiya e la gearbox per il controllo dei due motori indipendenti ho collegato il tutto ma quando alzo il modellino i cingoli girano ma quando lo metto a terra i gingoli non girano più alla shield ho collegato un alimentazione esterna da 9v e i motorini assorbono 2a e vanno a 4,6v vorrei un aiuto grazie
    cordiali saluti

    1. Ciao Pasquale,
      il tuo sembra un problema di peso/potenza potrebbe dipendere dal modellino troppo pesante o dalla potenza dei motori.
      I motori assorbono 2Ampere ma il tuo controllo è in grado di erogare tale potenza?

      Mauro

        • Pasquale on 22 ottobre 2013 at 11:53
        • Reply

        Grazie Mauro per avermi risposto, per il modellino ho usato il compensato per gli aereo modelli il controllo dei motori è questo : http://www.robotstore.it/open2b/var/catalog/images/430/0-ed11e760-800.jpg i motori usati sono :http://www.superdroidrobots.com/pictures/Tamiya/FA-130.jpg e la gearbox è : http://www.tamiyausa.com/images/product/430/70097/header_70097.jpg dalla descrizione che hai dato dell’ integrato L298 eroga 2A , ho collegato i motori a M1- M1+ ed M2- M2+ inoltre ho messo il jumper su pwr ed in che prende corrente da un alimentazione esterna di 9v ora mi chiedo, se è la potenza o l assetto degli ingranagi della gearbox con una configurazione di rpm elevata e quindi il cingolo non riesce a muoversi quando é a terra.

        Grazie.

        1. Ciao Pasquale,
          il dubbio che hai puoi verificarlo velocemnete diminuendo o aumentando il PWM che hai impartito ai motori.

          Mauro

            • Pasquale on 23 ottobre 2013 at 11:47

            Grazie Mauro , ho risolto il problema , praticamente il motore aveva poca torsione e non riusciva a regere il peso, spero che potresti darmi anche un altro consiglio , sul controllo ho applicato 2 motori e un alimentazione 9v ma collegando tutti i due motori il motore A funziona ma il motore B non funziona ma quando stacco il motore A funziona il B credo che sia un problema di alimentazione insufficiente , vorrei un tuo parere .

            Grazie.

          1. Ciao Pasquale,
            è un comportamento anomalo, come hai collegato i motori?
            I driver motori hanno di solito 2 canali: uno per il motore a dx ed uno a sx

            Mauro

    • Pasquale on 23 ottobre 2013 at 15:34
    • Reply

    Salve Mauro
    si ho collegato i due motori sui canali uno per il motore a dx cioè (M1- cioè gnd) (M1+ cioè vcc) e l altro per il motore a sx cioè M2- e M2+ , ma quello di dx funziona ma l’altro no .
    l’alimentazione esterna è una duracel da 9v forse è un po scarica per questo il motore di sx nn riesce a partire.

    Grazie

    1. Ciao Pasquale,
      accade la stessa cosa anche se invertì i motori?
      É sempre lo stesso che non funziona?

      Mauro

    • Giuseppe Falagario on 12 maggio 2014 at 16:24
    • Reply

    Carissimo Mauro, ti ringrazio anticipa mente, per tutte le tue spiegazioni molto utili.
    Vorrei chiederti se e possibile collegare due potenziometri a questo a questo progetto “motor shield per robot”,
    in modo da ridurre o aumentare la velocità dei motori, oppure se e possibile al posto dei pulsanti inserire un piccolo mouse, come quelli che vende futura elettronica.
    Se fosse possibile avere un piccolo esempio. Sono un principiante alle prime armi, e mi sto avvicinando adesso a questo affascinante mondo.
    Ti ringrazio infinitamente.
    Beppe Falagario.

    1. Ciao Giuseppe,
      nel blog trovi tantissimi articoli dedicati ai motori ed al controllo tramite potenziometri, pulsanti, nunchuck ecc… ti consiglio la lettura di ciascun articolo, sopratutto se sei alle prime prove e sono certo che in breve sarai capace di realizzare tutto quello che ti occorre.

    • andrea on 12 settembre 2016 at 15:23
    • Reply

    Buon pomeriggio
    seguo da moltissimo il tuo blog tanto che ho anche riprodotto alcuni progetti ..
    ho letto nei commenti che ci sono altri lettori che come me aspettano il dolly slider video (ad oggi ho costruito il famosissimo dolly photo)
    e ne sono veramente fiero.

    vorrei chiederti 2 info ,
    la prima e se ci sarà mai il progetto dolly slider con motoriduttore!! lo attendiamo tutti con ansia 🙂
    la seconda e se (il progetto Motor shield per robot )lo posso utilizzare con una scheda adafruit motorshild..
    non penso che basti incollare lo sketch —
    se non sabglio andrà convertito giusto ?
    purtroppo non riesco a capire quali righe di codica dovrei cambiare,
    se la cosa non è complicata (e non ti porta via tanto tempo, mi aiuteresti ) ? ti ringrazio in ogni caso ..
    e he vorrei costruire un sali e scendi (con un moto riduttore solo ) per la cucina.

    1. Ciao Andrea,
      si prima o poi uscirà un kit dolly video con motoriduttore, sto studiando da alcuni anni questa materia e penso di aver trovato una buona combinazione con una collaborazione nata qualche mese fa con tre aziende della mia zona, ti farò sapere presto.

      Per la motorshield adafruit sicuramente dovrai eseguire delle modifiche, tuttavia io non ne possiedo una e quindi non l’ho mai testata per realizzare uno sketch con essa. Penso che una volta compreso il principio base del funzionamento di questa scheda sarai facilmente in grado di adattare lo sketch alle tue esigenze.

    • Paolo Goldoni on 16 gennaio 2017 at 10:11
    • Reply

    Buongiorno!
    Seguo da tanto il tuo blog!
    In questo periodo, per un progetto universitario, sto eseguendo un controllo di due motori DC. Per fare questo mi tornerebbero utili molte caratteristiche di questa Motor Shield.
    Posso chiederti dove trovarla?
    Ti ringrazio
    Paolo

    1. Ciao Paolo,
      se quelle riportate nell’articolo non ti bastano puoi verificare quelle pubblicate sul sito robotics-3d.com da cui l’ho acquistata.

    • Bruno on 6 novembre 2017 at 22:01
    • Reply

    Ciao Mauro, grazie del tuo articolo, molto utile e preciso.

    Ho un problema con il secondo canale. In pratica il motore collegato al canale 2 è più lento, e fa anche un rumore diverso, più acuto.

    Ho collegato una batteria esterna da 12 e 7ah.

    Ovviamente ho provato ad invertire i motori.
    Grazie

    1. Ciao Bruno,
      invertendo i motori, come hai scritto, hai rilavato che il secondo canale è sempre in sofferenza ?
      Se la shield è quella mostrata i questo articolo potrebbe essere difettosa e puoi chiedere una verifica al rivenditore.
      Se è differente devi consultare la documentazione del produttore per verificare se gli schemi del primo e del secondo canale siano identici dal punto di vista delle componenti esterne al driver.

      1. Ho invertito i motori ed il canale è sempre in sofferenza.
        La shield è identica a quella nell’articolo, quella della microbot. Purtroppo credo sia difettosa

        Grazie comunque

        1. Si bruno,
          immagino sia un difetto della shield, io ne ho acquistate diverse ma non hanno evidenziato mai problemi di questo tipo.

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.