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 !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/tutorial-motore-dc-controllato-da-interruttori-e-potenziometro.html

Lascia un commento

Your email address will not be published.

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