Tutorial: motore DC controllato da interruttori e potenziometro

Qualche settimana fa un appassionato makers e lettore del blog mi ha chiesto un consiglio per realizzare il suo progetto, Giovanni vuole realizzare qualcosa di simile al motore passo-passo pilotato da interruttori ma con un motore DC ( corrente continua ).

motore cc ed SN754410NE

Per il suo progetto mi ha inviato ahce alcuni schemi e sketch realizzati da lui o reperiti on-line ma con ancora qualche difficoltà a ottenere il desiderato.

Ho deciso di sperimentare personalmente le difficoltà incontrate e di scrivere un tutorial per quanti come lui sentono l’esigenza di realizzare un progetto simile.

Il materiale

Come spesso faccio ecco la lista del materiale che ti occorre:

  • n. 1 arduino 2009/uno/mega
  • n. 1 motore in DC o CC ( corrente continua )
  • n.1 pacco batterie da 9v o singola pila da 9v
  • n.1 integrato SN754410NE
  • n.1 potenziomentro da 10KΩ
  • n.2 pulsanti na (normalmente aperti)
  • n. 2 resistenze da 330Ω
  • n. 1 breadboard
  • un po’ di cavetti per breadboard

Lo schema

ecco come collegare il tutto:

schema dei collegamenti

Lo sketch

/*
 * Motori in CC pilotati da pulsanti
 *
 * Autore: Mauro Alfieri
 * Tw:     @mauroalfieri
 *
 * Web: https://www.mauroalfieri.it
 */

const int buttonOrario = 4;
const int buttonAntior = 5;
const int potPin = A5;
const int in1Pin = 6;
const int in2Pin = 7;
const int motorPin = 3;

int potVal = 0;
int bora = LOW;
int bant = LOW;

void setup()
{
  pinMode(buttonOrario, INPUT);
  pinMode(buttonAntior, INPUT);
  pinMode(potPin, INPUT);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(motorPin, OUTPUT);

  digitalWrite(in1Pin,bora);
  digitalWrite(in2Pin,bant);
  analogWrite(motorPin, 0);
}

void loop()
{
  bora = digitalRead( buttonOrario);
  bant = digitalRead( buttonAntior);
  potVal = map(analogRead(potPin), 0, 1023, 0, 255);

  analogWrite(motorPin, potVal);

  if (bora == HIGH && bant == HIGH)
  {
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,LOW);
  }

  digitalWrite(in1Pin,bora);
  digitalWrite(in2Pin,bant);
}

avrai notato da subito che è molto ristretto, ho accorpato alcune funzioni descritte di seguito:

linee 10-15: definisci le variabili relative ai pin di collegamento tra Arduino e lo schema, in particolare i pin buttonOrario e buttonAntior a cui sono connessi i pulsanti o interruttori che definiscono il senso di rotazione e la variabile potPin connessa al pin A5 di Arduino da cui leggi il valore del potenziometro;

linee 17-19: definisci le variabili necessarie al funzionamento dello sketch, variabili in cui memorizzerai i valori letti dal potenziometro e dai pulsanti;

linee 23-28: inizializza la modalità in cui i pin devono essere utilizzati, noti che ho rispettato l’ordine delle righe 10-15 per mantenere coerente il codice, per ciascun pin la funzione pinMode() definisce se si tratta di un pi usato come INPUT o OUTPUT;

linee 30-32: imposta l’inizializzazione del circuito in modo che il motore alla partenza sia fermo, entrambi i segnali inviati all’SN754410NE a LOW e il valore del PWM a 0;

linee 37-38: leggi i valori dei pulsanti, sono connessi a porte digitali per cui il loro valore è normalmente LOW, alla pressione del pulsante passa a HIGH;

linea 39: qui ho accorpato, meglio dire annidato,  2 funzioni la prima, più interna è analogRead() che legge il valore presente sul pin A5 a cui è collegato il potenziometro, per cui legge il valore inviato dal potenziometro. Tale valore oscilla tra 0 e 1023 essendo il convertitore analogico digitale di arduino un 10bit ma il valore in PWM che puoi inviare all’SN754410NE è in scala 0-255 per cui devi adattare l’input all’aoutput, per farlo puoi usare la funzione map() che accetta in input il valore da adattare, il range di input ed il range di output atteso ed ecco che in questo caso diventa map(analogRead(pinPot, 0, 1023, 0, 255);

linea 41: invia la pin PWM il valore letto sul potenziometro ed adattato dalla llinea 39;

linea 43: è un controllo per evitare di fondere il divert SN754410NE, in pratica se premi contemporaneamente i due pulsanti invii un segnale HIGH ad entrambi i pin potenzialmente dannosi per l’SN754410NE, per evitare questa condizione verifica che il valore dei due pulsanti sia a HIGH ed esegue le righe successive;

linee 45-46: imposta a LOW entrambi i pin, questo si traduce in un fermo del motore in quanto l’SH754410NE non riceve segnali sui pin di input e di conseguenza non  invia segnali sui pin di output, al motore;

linee 49-50: queste due linee lavorano una al contrario dell’altra per indicare al motore di ruotare in senso orario o antiorario, il primo avviene portando il pin IN1 a HIGH ed il pin IN 2 a LOW. La seconda condizione si verifica invertendo questi valori avrai quindi che premendo il pulsante connesso al pin buttonOrario il motore girerà in un verso e premendo il pulsante connesso al pin buttonAntior il motore girerà nel verso contrario.

Dovresti aver chiaro come funziona questo sketch, ma se hai dubbi commenta l’articolo ed io proverò a darti le risposte che desideri.

intanto puoi guardare il video demo:

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/tutorial-motore-dc-controllato-da-interruttori-e-potenziometro.html

72 commenti

Vai al modulo dei commenti

  1. L’uso dei motori DC apre molti scenari interessanti. Seguo interessato!

    1. Ciao Alessandro,
      mi fa piacere .. hai già letto gli articoli sui motori DC pilotati dalla motor shield fe?

      Mauro

    • gianni il 27 Agosto 2012 alle 16:17
    • Rispondi

    Ciao Mauro
    Interessante la tua soluzione
    Io avevo provveduto con questo codice:
    // Uso L293 con potenziometro e cambio moto avanti-retro con due int. na ok

    // setta pin
    const int buttonPin1 = 2; // selettore
    const int buttonPin2 = 4; // selettore
    const int ledPin1 = 8; // LED controllo
    const int ledPin2 = 9; // LED controllo
    const int potPin = A1; // input potenziometro
    const int in1Pin = 5; // L293 pin 2
    const int in2Pin = 6; // L293 pin 7
    const int motorPin = 3; //L293 pin 1 pwm

    int buttonState1 = 0; // variabile per leggere stato degli interruttori
    int buttonState2 = 0;
    int potVal = 0;
    int mapedPotVal = 0;

    void setup()
    {
    // inizializzo il tutto
    pinMode(potPin, INPUT);
    pinMode(motorPin, OUTPUT);
    pinMode(in1Pin, OUTPUT);
    pinMode(in2Pin, OUTPUT);
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(buttonPin1, INPUT);
    pinMode(buttonPin2, INPUT);

    }
    void loop()
    {
    buttonState1 = digitalRead(buttonPin1); // Rileva stato sw1
    buttonState2 = digitalRead(buttonPin2); // Rileva stato sw2
    potVal = analogRead(potPin); // Rileva valore potenziometro
    mapedPotVal = map(potVal, 0, 1023, 0, 255); // Scala il risultato della lettura
    analogWrite(motorPin, mapedPotVal); // Output del valore rimappato all’integrato

    [b]// leggo stato sw1
    if (buttonState1 == HIGH) {
    // accendo LED avanti:
    // spengo LED indietro:
    // cambio direzione motore
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(in1Pin,HIGH);
    digitalWrite(in2Pin,LOW);
    }

    else if (buttonState2 == HIGH) {
    // accendo LED avanti:
    // spengo LED indietro:
    // cambio direzione motore
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,HIGH);
    }
    else {
    mapedPotVal = 0; // forzo a zero
    analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
    }[/b]
    }

    Tutto funziona; tuttavia non avevo pensato alla possibilità che vengano premuti contemporaneamente i due pulsanti come hai fatto tu molto più saggiamente!
    Adesso ho installato due fine corsa (micro a contatto) per evitare di danneggiare il motore alla fine delle due corse. Come devo implementare il sw per gestire i due F.C ?
    Devo dichiararli come due interruttori aggiuntivi e leggere lo stato (se sono High, forzare il motore a zero ?
    Dovrebbe essere cosi a rigor di logica ma non sono sicuro.
    Tutto sommato qualcosa (anche se con mille dubbi) stò imparando anche grazie a Te!
    Ciao
    Gianni

    1. Ciao Gianni,
      mi sembra tu vada alla grande, continua a sperimentare e leggere articoli, potrai imparare sempre cose nuove, io pubblico tutto quello che imparo anche dai vostri sketch.

      Per i tuoi finecorsa collegali come i pulsati 1 e 2 a due pin digitali e leggi il loro valore con la funzione digitalRead(pin) se HIGH imposi a LOW i pin di comando e a 0 il PWM, ricordati ce questa condizione è permanente fio alla pressione di un pulsante che inverta la corsa, non subordinare a nessun IF il controllo dei finecorsa.

      Mauro

    • gianni il 28 Agosto 2012 alle 07:59
    • Rispondi

    Scusa Mauro ma la tua frase “ricordati che questa condizione è permanente fio alla pressione di un pulsante che inverta la corsa, non subordinare a nessun IF il controllo dei finecorsa.” non credo di capirla molto…
    Come posso testare senza if ? Non vorrei fare danni…….
    che istruzioni mi consigli di usare quindi?
    Grazie per l’interessamento.

    1. Ciao Gianni,
      forse è un po’ criptica.
      Non intendevo elimina gli IF per testare i pulsani o i finecorsa, solo non annidare l’IF di test del finecorsa in quello di test di un pulsate, es.:

      IF ( test pulsante avanti)
      IF ( test finecorsa 1)

      O viceversa xchè otterresti che se il pulsante non è in cinduzione il finecorsa è ignorato o viceversa.

      Spero di essere stato più chiaro.

      Mauro

    • Gianni il 28 Agosto 2012 alle 11:05
    • Rispondi

    Tu sei chiaro
    sono io che ho ancora molti dubbi !
    Mi permetto di farti vedere il codice che ho implementato per i fine corsa (non l’ ho provato perchè non vorrei combinare qualche guaio)

    Se e quando hai tempo proveresti a controllare se ti quadra?
    Ho introdotto anche il controllo dei due pulsanti se premuti contemporaneamente.
    Grazie ancora

    // Uso L293 con potenziometro e cambio moto avanti-retro ok

    // setta pin
    const int buttonPin1 = 2; // pulsante 1
    const int buttonPin2 = 4; // pulsante 2
    const int buttonPin3 = x; // finecorsa 1 (X sarà sotituito dal numero di un pin digitale libero)
    const int buttonPin4 = y; // finecorsa 2 (y sarà sotituito dal numero di un pin digitale libero)
    const int ledPin1 = 8; // LED controllo
    const int ledPin2 = 9; // LED controllo
    const int potPin = A1; // input potenziometro
    const int in1Pin = 5; // L293 pin 2
    const int in2Pin = 6; // L293 pin 7
    const int motorPin = 3; //L293 pin 1 pwm

    int buttonState1 = 0; // variabile per leggere stato pulsante 1
    int buttonState2 = 0; // variabile per leggere stato pulsante 2
    int buttonState3 = 0; // variabile per leggere stato finecorsa 1
    int buttonState4 = 0; // variabile per leggere stato finecorsa 2
    int potVal = 0;
    int mapedPotVal = 0;

    void setup()
    {
    // initializzo
    pinMode(potPin, INPUT);
    pinMode(motorPin, OUTPUT);
    pinMode(in1Pin, OUTPUT);
    pinMode(in2Pin, OUTPUT);
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(buttonPin1, INPUT);
    pinMode(buttonPin2, INPUT);
    pinMode(buttonPin3, INPUT);
    pinMode(buttonPin4, INPUT);
    }
    void loop()
    {
    buttonState1 = digitalRead(buttonPin1); // Rileva stato pulsante 1
    buttonState2 = digitalRead(buttonPin2); // Rileva stato pulsante 2
    buttonState3 = digitalRead(buttonPin3); // Rileva stato finecorsa 1
    buttonState4 = digitalRead(buttonPin4); // Rileva stato finecorsa 2
    potVal = analogRead(potPin); // Rileva valore potenziometro
    mapedPotVal = map(potVal, 0, 1023, 0, 255); // Scala il risultato della lettura
    analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato

    // leggo stato pulsante 1
    if (buttonState1 == HIGH) {
    // accendo LED avanti:
    // spengo LED indietro:
    // cambio direzione motore
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(in1Pin,HIGH);
    digitalWrite(in2Pin,LOW);
    }
    // leggo stato pulsante 2
    else if (buttonState2 == HIGH) {
    // accendo LED avanti:
    // spengo LED indietro:
    // cambio direzione motore
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,HIGH);
    }
    else {
    mapedPotVal = 0;
    analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
    }
    // leggo stato finecorsa 1
    if (buttonState3 == HIGH) {
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,LOW);
    mapedPotVal = 0;
    analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
    }
    // leggo stato finecorsa 2
    if (buttonState4 == HIGH) {
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,LOW);
    mapedPotVal = 0;
    analogWrite(motorPin, mapedPotVal);
    }

    if (buttonState1 == HIGH) && (buttonState2 == HIGH) { // controllo che i due pulsanti non siano premuti contemporaneamente
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,LOW);
    }

    1. Ciao Gianni,
      il codice che mi hai inviato non sembra avere errori.
      Se posso darti un suggerimento non chiamare tutti i bottoni: buttonPinX dove X è 1,2,3 o 4 ma usa dei nomi parlanti tipo:
      buttonOrario
      buttonAntiorario
      buttonFineCorsaA
      buttonFineCorsaB

      Il codice diventa più leggibile anche se un domani vorrai fare delle migliorie.
      Potrei apportare altre correzioni, ma sarebbero solo stilistiche e per nulla cambierebbero il senso del tuo codice.

      Provalo senza problemi e fammi sapere se fa quello che vuoi, ad occhio sembra di si.

      Mauro

    • Marco il 7 Settembre 2012 alle 09:41
    • Rispondi

    Ottimo tutorial grazie! =)
    Non sarebbe meglio mettere dei diodi di protezione?

    Ciao

    1. Ottima idea, io nel tutorial non li ho segnati ma in un progetto completo è bene che vi siano 🙂

      Mauro

    • Gianni il 8 Settembre 2012 alle 14:37
    • Rispondi

    Se non ricordo male i diodi di protezione sono già integrati nel chip almeno per :

    L293D(DNE) 600mA output current per canale, integra diodi di protezione
    SN754410NE 1000mA output current per canale, integra diodi di protezione

    Occorrono invece sicuramente per il L293B ( 1000mA output current per canale senza diodi di protezione)

    Ora, aggiungere altri diodi ulteriori non farebbe sicuramente male basta tener presente le cadute di tensione introdotte.
    Almeno questo è quanto ricordo.

    Ciao

    1. Ciao Gianni,
      ricordavo anche io questa differenza, quando ho risposto ho cercato un datasheet in internet non trovando quello della versione NE, con questo integrato non avesti bisogno dei diodi di protezione esterni.

      Mauro

        • Alessandro Pani il 16 Marzo 2017 alle 17:31
        • Rispondi

        Grazie per il commento illuminante, ho provato a fare uno sketch simile con un L293B, credo di aver fatto prendere un paio di ottime scottate al mio arduino.
        Aggiungendo i diodi posso comunque usare l’L293B per provare a replicare questo sketch?
        Come avrete capito, posso definirmi senza dubbio un principiante, consapevole di aver bruciato un po troppe tappe… prometto di studiare di più in futuro.
        Grazie!
        P.s. ehm i diodi come vanno messi?

        1. Ciao Alessandro,
          segui un articolo in cui il controllo del motore è fatto con un L293B come il tuo, lo schema sarà adeguato, quello in quest’articolo è tutt’altro integrato.

            • Alessandro Pani il 20 Marzo 2017 alle 14:52

            Ok grazie mille!
            Complimenti per il blog

    • Abramo il 13 Febbraio 2013 alle 22:53
    • Rispondi

    ciao scusami se la domanda è un po stupida:
    al rigo 39 hai scritto: potVal = map(analogRead(potPin), 0, 1023, 0, 255);

    è la stessa cosa scrivere: potVal =( analogRead(potPin) * 255)/1023;

    1. Ciao Abramo,
      si è simile, la funzione map() esegue la rimappatura tra i primi due valori ed i secondi due rispetto al valore contenuto nel primo parametro.
      In questo caso non c’è molta differenza, in altri sketch è meglio utilizzare la funzione map() perché ha ad esempio il controllo dei valori min e max in modo da non inviare segnali errati ai pin.

      Mauro

    • Matteo il 8 Marzo 2013 alle 19:50
    • Rispondi

    Salve,
    per il motore non sarebbe meglio un’alimentazione esterna?

    1. Ciao Matteo,
      giusta osservazione, il chip utilizzato serve proprio a questo, nell’esempio è stato usata l’alimentazione Arduino solo per dimostrare che il circuito funziona.

      Mauro

    • Roberto il 1 Aprile 2013 alle 22:14
    • Rispondi

    ciao Mauro,

    vorrei fare la stessa cosa ma con la motor shield FE, premo un pulsante NA e il motore DC gira in un verso, premo un altro pulsante NA e gira nel verso opposto..la velocità vorrei regolarla con un potenziometro. Ma questo dove lo collego? dove trovo lo sketch?

    1. Ciao Roberto,
      Hai cercato nel blog?
      Mi sembra di aver scritto alcuni tutorial sui motori cc sia con pulsanti sia con potenziometri.

      Se non li trovi, provo a cercarteli.
      Intanto il potenziometro lo colleghi ad un pin analogico e i pulsanti puoi scegliere se collegarli ai pin analogici o digitali con delle resistenze di pull-down da 330ohm.

      Mauro

    • Davide il 23 Agosto 2013 alle 17:23
    • Rispondi

    Buonasera Mauro. Per quanto riguarda i motorini in continua io ho provato a collegarne 3 alla scheda arduino uno (senza codice) senza resistenze e nulla. Ho alimentato la scheda con un trasformatore impostato su 7.5 V e ho notato che la scheda ha iniziato a scaldarsi (i motori andavano tutti senza problemi). Essendo ancora poco abile nell’utilizzo di Arduino mi chiedevo come procedere per quanto riguarda il pilotaggio dei tre motori tramite la scheda arduino, in quanto il mio progetto prevede un comando a distanza tramite un telecomando e un ricevitore pir, come quello citato nel suo articolo https://www.mauroalfieri.it/informatica/tutorial-arduino-ir-con-tsop1738.html . In definitiva, come posso evitare che la scheda si scaldi (ho letto qualcosa per quanto riguarda l’utilizzo dei transistor, ma provando ad usare 1 transistor e 1 motore la scheda si è scaldata moltlissimo e il motore non andava). La ringrazio anticipatamente 🙂

    1. Ciao Davide,
      per usare i motori CC con Arduino puoi usare una Motor Shield, sul blog ne ho recensite alcune con caratteristiche differenti, scegli quella più adatta ai tuoi motori.

      Mauro

        • Davide il 26 Agosto 2013 alle 17:51
        • Rispondi

        Grazie mille 🙂

  2. Buongiorno Mauro

    Inizio con il porgerti i miei complimenti per il tuo Blog in perfetto stile open source dove, si rischia anche di ingrassare per le tue ottime ricette.

    Sei riuscito a farmi prendere arduino a 50 anni suonati per via della mia passione per il telescopio e ho usato questo tuo tutorial per crerare un movimento del fuocheggiatore del mio OTA ma, volevo arricchirlo di gadget e dedicarlo Open Source alle community di appassionati come me di esplorazione del Cielo

    La mia idea era di usare due motori DC o Passo Passo unipolari nello stesso circuito

    Uno per regolare il fuocheggiatore del Telescopio e uno per quello del Telescopio di Guida, regolazione separata della velocità per i due motori e un display per visualizzare quando si usa il motore per la Camera di ripresa o quello della Autoguida per seguire l’oggetto da fotografare

    Se per te va bene possiamo unire le forze con impegno da parte mia di approvvigionarti del materiale che serve per il mio progetto e che sicuramente ho già in casa

    Si potrebbe poi pensare di integrarlo con il SW Ascom http://ascom-standards.org/ coinvolgendo la loro Community open source

    Che ne pensi Mauro ?

    Roberto

    1. Ciao Roberto,
      il tuo è un progetto molto interessante anche se io non conosco i telescopi.
      Se ti occorrono dei consigli su difficoltà che incontri nella scrittura del software io sono disponibile a darteli.

      Non riesco in questo momento a impegnarmi in un altro progetto in quanto tra i miei progetti personali ed i progetti arduino su commissione
      mi resta poco tempo che dedico al mio lavoro di tutti i giorni 🙂

      Mauro

  3. Volentieri Mauro se per te non è un problema visto che per me risulta difficile appunto il SW, Grazie mille sei gentilissimo 🙂 intanto ti metto questi link cosi magari ti rendi conto della questione

    http://astrojolo.blogspot.it/2013/02/ascom-telescope-focuser-with-arduino.html

    https://github.com/ejholmes/Arduino-Focuser/blob/master/README.md

    La mia idea è quella di integrare al tuo tutorial con il motore passo passo una shield motore DFrobot 1A e un joystick DFRobot che mi permette un avanzamento veloce con i pulsanti e adjust fine del fuocheggiatore e con un display 16×2 che indica numericamente di quanto si è spostato il fuocheggiatore per poterla segnare e ricordare 🙂

    Ti inserisco un video per conoscenza di un sistema che costa circa 800 € compreso motore 🙂

    http://www.youtube.com/watch?v=ALtk2yZUZJk

    Grazie ancora Mauro

    1. Ciao Roberto,
      la mia proposta é di aiutarti ma il codice lo devi scrivere tu, se nella realizzazione trovi qualche difficoltà di sintassi io ti posso suggerire cosa fare.

      Cosa differente é un progetto su commissione in cui io mi informo su tutto il metodo di funzionamento e definisco lo schema dello sketch, le funzioni e ti invio sketch e documentazione.

      Mauro

    • marco il 18 Febbraio 2014 alle 11:37
    • Rispondi

    ciao Mauro
    per prima cosa grazie, sto imparando molto grazie a te.
    Ho provato a replicare lo schema che hai proposto ma c’è qlc che non va…
    Sto usando questo motore http://www.pololu.com/product/1107/specs (mi serve per uno slider motorizzato), alimento a 12v, il motore funziona se lo attacco direttamente alla batteria, lo sketch è caricato e corretto, i collegamenti pure… ma non funziona…
    Ho provato anche con un’altro motore di una vecchia stampante ma niente…
    Integrato bruciato o motore non adatto?
    Grazie per la disponibilità
    M.

    1. Ciao Marco,
      un’analisi a distanza è difficile, posso solo ipotizzare che tu abbia qualche problema al driver di controllo da quello che mi descrivi.
      Potresti provare con un tester a verificare che i pin arduino erogino i valori desiderati e che collegando il driver questo si pomporti in modo corretto.

      Mauro

    • giulio il 3 Marzo 2014 alle 20:11
    • Rispondi

    Buongiorno,
    questo sito è veramente utilissimo per uno che come me sta iniziando ad usare arduino.
    Vorrei chiedere un aiuto. Voglio inserire un pulsante che mi permetta di bypassare il potenziometro in modo tale che, regolato il potenziometro sulla velocità minima del motore, premendo questo pulsante normalmente aperto assieme ad un pulsante di direzione, il motore va al massimo della sua velocità.
    Vi ringrazio per l’aiuto,
    Giulio

    1. Ciao Giulio,
      ciò che vuoi realizzare non è complesso, ti suggerisco di comprendere bene come funzionano i pulsanti e ragionare sulla logica di ciò che vuoi realizzare.
      Studiando queste due componenti ti sarà facile realizzare quello che desideri.

    • Stephane il 12 Giugno 2014 alle 17:54
    • Rispondi

    Slut et merci pour ce beau travail
    j’aimerai savoir s’il est possible de commander un ou plusieurs moteurs sans utiliser la carte Arduino car pour mon projet je veux réaliser une carte de commande pour un petit drone a quatre moteurs. je pense a utiliser un microcontrôleur mais je coince sur l’ensemble et la façon de commander mes moteurs. toute aide sera la bienvenue. merci

    1. Bonjour Stephane,
      Je n’ai aucune expérience sur les drones.
      Je sais seulement comment carte ardupilot des drones et est basé sur Arduino.

  4. Ciao Mauro!
    Grazie per la risposta. La cosa che ti chiedo é la seguente:
    Se volessi aggiungere un’alimentazione esterna per il motore quali sono i contatti nei quali dovrei collegarla? Hai uno schema dove io possa vedere dove collego nel circuito la batteria? Non vorrei fare errori e bruciare l’arduino!
    Grazie! Ciao!

    Marco Rigamonti

    1. Ciao Marco,
      il chip che ho usato in questo tutorial ha un ingresso a parte per l’alimentazione esterna che io non ho mai usato perchè sono solo articoli dimostrativi con piccoli motori.
      Puoi consultare il datasheet, che trovi on-line, per verificare quali siano e quali tensioni puoi applicargli.

    • Alessio il 5 Ottobre 2015 alle 11:28
    • Rispondi

    Ciao complimenti per i tuoi tutorial sono davvero bellissimi! Io ho provato a rifare il tuo circuito utilizzano il chip L293D invece dell’SN754410NE e quando vado a premere un bottone sento un tic all’interno del motore però non si muove niente. Quale potrebbe essere il problema? Il motorino è uno di queli di un alzacristalli a 12V però alla breadboard gli passo 9 volt da un trasformatore e se gli passo la corrente in diretta il motorino gira però se passo dal circuito con i pulsanti non gira. Fammi sapere grazie mille

    1. Ciao Alessio,
      potrebbero essere molteplici le cause.
      Inizia a verificare l’assorbimento del motore, che dubito sia di soli 2A, questo impedirebbe al motore di muoversi con tale driver; successivamente ricontrolla lo schema, quello presente in questo articolo funziona per l’SN754410NE e non per l’L293D.

    • Francesco il 3 Novembre 2015 alle 11:46
    • Rispondi

    Salve Mauro, da pochi mesi che combatto con Arduino, e le prime infarinature le ho avute da te. Sto mettendo assieme degli sketch, per far camminare una macchinina fuori uso. Ho creato un radiocomando formato da 2 joystick ed un trasmettitore a 433 Mhz. La macchinina è costituita dal suo motorino dc 12v collegato al modulo L298n (utilizzo solo due fili) ed un Micro Servo 9G ed ovviamente un arduino Nano. Posso dire che il tutto funziona, non perfettamente, ma funziona. Il problema che ti pongo è il seguente. Il motorino DC funziona ad una sola velocità (al max 255) e con valori differenti invece no. Io presumo di aver combinato un pasticcio nel listato, che non so come inviarti, Se vuoi aiutarmi mi spieghi comefare grazie Francesco

      • Francesco il 3 Novembre 2015 alle 21:20
      • Rispondi

      spero di fare bene a mandare il listato in questo modo e non occupare spazio…

      [[ codice rimosso in automatico ]]

      1. Ciao Francesco,
        non è consentita la pubblicazione di sketch nei commenti, come hai letto nelle 2 semplici regole in fondo ad ogni articolo che leggi.

    1. Ciao Francesco,
      purtroppo non sono in grado di correggere listati senza testarli e per questo motivo evito di farlo.
      Posso suggerirti di procedere per passi semplici:
      – controlla che il motore possa funzionare con il collegamneto che hai fatto ed un PWM generato da un ciclo, puoi usare anche lo scketch fade degli esempi arduino
      – verifica cosa accade nel codice, magari le informazioni che ricevi dal telecomando, e quindi passi al motore.

        • Francesco il 4 Novembre 2015 alle 19:32
        • Rispondi

        immaginavo, ma ho visto altri listati sopra e mi sono azzardato. nella compilazione del listato, ho proceduto un pezzettino la volta e mi spiego, ho provato il motorino, con un ciclo for facendolo andare dalla minima alla max velocità e funziona, avanti e indietro e va tranquillamente, al ricevitore arrivano i dati da 0 a 255 e viceversa, ma il motorino va solo alla max velocità. Io presumo che l’errore sia in una impostazione del listato stesso, ma dato che non puoi aiutarmi ti ringrazio comunque. Saluti

        1. Ciao Francesco,
          non ho mai scritto di non poterti aiutare, ma che non correggo il tuo sketch per ragioni di tempo e test necessari.
          Stabilito che il motore funziona e che i dati arrivano dal ricevitore in modo corretto potresti farti scrivere sul monitor seriale il valore che passi al motore prima effettuare l’assegnazione con la analogWrite().

    • Luigi il 15 Febbraio 2016 alle 17:31
    • Rispondi

    Ciao Mauro.. Usi un motore da 9v?

    1. Ciao Luigi,
      quello dell’articolo è un motore di recupero che dovrebbe funzionare a 3v.

        • Luigi il 17 Febbraio 2016 alle 08:07
        • Rispondi

        Benissimo, ora avrei una domanda:
        Ho un motore dc controllato da due pulsanti, il motore va in senso orario e si ferma dopo un tot di secondi, la stessa cosa per il senso antiorario. Il motore quando gira in senso orario tira una cordicella attesandola, dopo che il motore si spegne vorrei che si bloccasse in qualche modo per far si che rimanga ben tesa.
        Cosa posso usare? Stavo pensando a un finecorsa di tipo encoder e un motoriduttore al posto del motore dc..

        1. Ciao Luigi,
          io scegliere un motoriduttore, tuttavia anche la soluzione con encoder potrebbe essere valida anche se più complessa.

            • Luigi il 18 Febbraio 2016 alle 02:05

            Grazie dei preziosi consigli.. appena finisco il mio progetto lo pubblico qui se ti fa piacere.

          1. Ciao Luigi,
            sempre disponibile alla pubblicazione di progetti di appassionati come te 🙂

    • antonio il 31 Ottobre 2016 alle 17:02
    • Rispondi

    Ciao per curiosità mi stò avvicinando all’arduino e mi piace l’idea di pilotare dei motori.

    La mia domanda forse è un pò fuori tema ma ho difficoltà non tanto sulla parte elettronica ma sulla parte meccanica, ovvero come faccio ad agganciare un motore anche piccolo come quello in foto ad esempio ad un asse ? Sapete se ci sono delle componentistiche meccaniche standard che possono aiutare a completare poi i propri progetti ?

    1. Ciao Antonio,
      per ogni motore esiste un ingranaggio/sistema di fissaggio di ingranaggi all’albero.

  5. ciao,ti ringrazio per gli innumerevli tutorial….
    io non avendo l’integrato ,ho provato ad usare la schedina L298N usando le uscite per l’integrato (pin 6 7) collegandoli all’ingresso in1 ed in2 ,fatalità in una bread board avevo gia montato dei led e li ho colllegati agli stessi pin per il controllo della schedina L298N
    alla pressione del pulsante 1,il motore gira orario,lo rilascio,si ferma,permo l’altro pulsante,e gira nel verso opposto,ma non riesco a variare i giri tramite potenziometro,hai qualche idea ??
    ho provato a cambiare ,uno ad uno,i vari pin analogici ma nulla,il motore gira sempre alla stessa velocità…a manetta…..
    ciao e grazie mille

    1. Ciao Teocreo,
      se vuoi controllare la velocità del motore devi agire sul PWM e non su in1 ed in2

    • Mattia il 15 Marzo 2017 alle 08:23
    • Rispondi

    Ciao Mauro, mi servirebbe poter comandare un motore in entrambi i sensi ma con un pulsante solo..come posso fare? grazie in anticipo

    1. Ciao Mattia,
      penso si aver scritto tanti articoli sui motori che puoi prendere ad esempio.
      In generale compreso come funziona un motore e come interagisce con il pulsante non dovresti aver difficoltà a modificare lo sketch come vuoi.

        • Mattia il 15 Marzo 2017 alle 18:03
        • Rispondi

        Si ho guardato già tutti i tuoi progetti!
        Ma nello sketch non riesco a far capire ad arduino che ogni volta che premo il pulsante deve invertire il senso di marcia

        1. Ciao Mattia,
          tu hai compreso come farlo?
          Quando è chiaro a te potrai scriverlo con un semplice if.

            • Mattia il 17 Marzo 2017 alle 08:18

            avevo pensato di risolverlo con un ciclo, cosicché alla seconda premuta del pulsante mi farebbe l’inversione, per poi azzerare e ricominciare. Altri non mi viene in mente ahahah 🙁

          1. Ciao Mattia,
            io non ho capito come vuoi ferlo, ma se è chiaro a te scrivilo e fallo eseguire ad arduino.

    • giovanni greco il 19 Aprile 2017 alle 19:31
    • Rispondi

    Buongiorno Mauro
    spero tutto bene!
    Tempo fa mi avevi aiutato a comporre un ide per un motore dc comandato da due interruttori che comandano sia il moto avanti ed indietro del motore sia contemporaneamente il play di due file audio installati su una memoria di una scheda audio lpm che ora si è rotta e purtroppo è fuori produzione. Dato che deve sentirsi l’audio devo trovare una soluzione :
    – possiedo un paio di schede sd che potrei usare
    -oppure una scheda audio SCHEDA VOCALE ISD1820 MODULO VOCE SUONO MUSICA SENSORE MICROFONO REC PER ARDUINO
    Sarei più propenso ad utilizzare una scheda sd con sopra due file audio ma non saprei proprio come adottare il mio programmino (anzi il nostro ..visto che lo abbiamo fatto assieme…)
    Per l’altra scheda che ho mi sembra di capire che con essa è gestibile un solo file….ma non sono sicuro.

    Mi permetto di mandarti il programma che era perfettamente funzionate con la vecchia scheda ….ormai ko ed insostituibile
    Ti ringrazio molto se troverai il tempo per suggerire una soluzione al mio problema.
    Troverò il modo per sdebitarmi…
    Grazie

    eccolo:

    [[ codice rimosso in automatico ]]

    1. Ciao Giovanni,
      premetto che purtroppo non ricordo cosa avessimo realizzato, ma non è un problema.
      Ti ricordo che non è consentito, come hai letto in ogni articolo, incollare codice nei commenti e quest’ultimo viene rimosso in automatico.

      Infine ho acquistato, ma ancora non provato, un modulo play mp3 collegabile e programmabile da Arduino o Genuino che spero di recensire presto e che potresti utilizzare adattandone il codice.

    • giovanni il 20 Aprile 2017 alle 14:10
    • Rispondi

    Scusami sono rimasto fermo ai tempi nei quali pubblicavamo il codice nei commenti…….perdonami

    1. Nessun problema Giovanni.

    • Verdini GIanmarco il 11 Luglio 2017 alle 14:33
    • Rispondi

    ciao, ho montato il tutto ma mi manca un alimentatore da 9V da collegare ad arduino, se volessi collegare delle batterie direttamente alla breadboard come potrei fare?

    1. Ciao Gianmarco,
      che tipo di batterie possiedi?

    • giovanni greco il 14 Marzo 2019 alle 21:25
    • Rispondi

    Ciao Mauro
    ho una scheda che permette con due interruttori na di cambiare direzione ad un piccolo motore dc per cambiare (velocità con un potenziometro) e direzione in un senso o nell’altro alla pressione dei due pulsanti.
    Sono quelle sche che vendono già assemblate ! e me ne hanno regalate tre. Naturalmente vorrei usarle ma vorrei implementare sempre alla presione dei due pulsanti due suoni diversi memorizzati su una scheda estrna che ho già. Volevo chiederti, dato che la scheda è gia assemblata posso collegare in parallelo gli attuali na anche ad arduino per implementare altre funzioni alla pressione dei tasi. Non sono sicuro , temo possano nascere problemi duplicando le attuali connessioni della scheda per portarle ad arduino…e sviluppare altre funzioni!

    mi dici cosa ne pensi? è fattibile secondo te senza farmi problemi?

    Grazie del tuo aiuto!

    1. Ciao Giovanni,
      non conoscendo le schede evito di azzardare risposte, se sei sicuro dei collegamenti puoi fare un test.

    • Gianni il 15 Marzo 2019 alle 21:32
    • Rispondi

    Ciao Mauro , scusami certo non ti avevo mandato nessuna indicazione….pardon.
    In realtà non ho molti dati
    queste le note
    Caratteristiche:
    Regolatore di velocità reversibile per motore DC 6V 12V 24V.
    Controlla la direzione in avanti o indietro.
    Controllare il motore con l’interruttore a pulsante.
    Buona fattura e prestazioni stabili.

    specifiche tecniche:
    Tensione di lavoro: DC 6V ~ 30V
    Tensione di uscita: Caricare lineare
    Corrente massima: 10A
    CW / CCW: Supporto
    Gamma di velocità: 0% ~ 100%
    Frequenza: 15kHz
    Principio di velocità: Regolamento attuale
    Dimensione: 74 (L) x 47 (L) x 28 (H) mm / 2,91 x 1,85 x 1,10 pollici

    [[ link rimosso da regolamento ]]

    Non mi sembra il massimo tuttavia funziona egregiamente e a caval donato…..
    vorrei tuttavia prendere i segnali dai due int. na e in parallelo controllarli anche da arduino per implementare un suono quando premuti aggiungere altre funzioni sempre con arduino inserire due finecorsa, e altro!
    Ma non so se a livello di segnale è possibile (almento intercettare i due pulsanti e/o aggiungere (se possibile) due finecorsa. Ma non sono certo sia possibile.
    Scusami è solo per questo che ti avevo chiesto un consiglio vista la tua esperienza e disponibilità! Secondo te è una prova da intraprendere oppure è meglio lasciar perdere e lasciare la scheda cosi come è ?
    Grazie e a presto!
    Gianni

    1. Ciao Gianni,
      in primo luogo ti chiedo di rispettare il regolamento che trovi sul blog ed il cui link è presente all’inizio della sezione commenti.
      In merito alla scheda è davvero misera spiegazione quella che ti hanno fornito e non resta che sperimentare, magari controlla con un tester i livelli di segnale sugli int per essere certo che non arrivi ad arduino una tensione superiore a quella che può supportare.

    • giovanni il 18 Marzo 2019 alle 17:18
    • Rispondi

    Grazie molte! scusami per il link l’ho indicato senza pensarci!
    Il segnale lo controllo con il tester, grazie! il livello per non fare danni ad arduino deve essere inferiore ad un voltaggio di 5 volt ?
    Grazie ancora e scusami!

    1. Ciao Gianni,
      si sull’Arduino Uno è 5v il livello massimo sui pin I/O

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.