Controllo di un motore DC con L293D ed Arduino

 



Controllo velocità e rotazione di un motore DC con L293D ed Arduino

Qui andremo ad interfacciare un motore DC con Arduino UNO e controllarne la sua velocità. Questo viene fatto da PWM (Pulse Width Modulation). Questa funzione è abilitata per ottenere una tensione variabile a tensione costante.
Il metodo di PWM è spiegato qui; considera un circuito semplice come mostrato in figura.

Se il pulsante viene premuto, il motore inizierà a ruotare al 100% della sua velocità e sarà in movimento fino a quando non si rilascia il pulsante. La pressione del pulsante è continua ed è rappresentata nel primo esempio in figura sopra. Se, per un caso, si tiene premuto il pulsante per 8 ms (millisecondi) e aperto per 2 ms su un ciclo di 10 ms, in questo caso il motore non avrà una tensione totale della batteria di 9V poiché il pulsante viene premuto solo per 8 ms, quindi la tensione del terminale RMS tra il motore sarà intorno ai 7V. A causa di questa tensione RMS ridotta, il motore ruota ma a velocità ridotta. Ora l’accensione media su un periodo di 10 ms = tempo di attivazione ON / (tempo di attivazione ON + tempo di spegnimento), questo è chiamato ciclo di lavoro ed è dell’80% (8 / (8 + 2)).

Negli altri casi il pulsante viene premuto anche meno tempo rispetto al primo caso. Per questo motivo, la tensione del terminale RMS ai terminali del motore si riduce ulteriormente. A causa di questa tensione ridotta, la velocità del motore diminuisce ulteriormente. Questa diminuzione della velocità con il ciclo di lavoro continua fino ad un punto in cui la tensione del terminale del motore non sarà sufficiente per farlo girare.

Quindi con questo possiamo concludere che il PWM può essere usato per variare la velocità del motore.

Prima di andare oltre, dobbiamo discutere di H-BRIDGE, ovvero di ponte ad H. Ora questo circuito ha principalmente due funzioni, in primo luogo è quello di  pilotare un motore a corrente continua da segnali di controllo a bassa potenza  e l’altro è quello di  cambiare il senso di rotazione del motore a corrente continua.

Sappiamo tutti che per un motore a corrente continua, per cambiare il senso di rotazione, è necessario modificare le polarità della tensione di alimentazione. Quindi per cambiare le polarità usiamo il ponte ad H. Ora nella figura sopra abbiamo quattro interruttori. Come mostrato, il motore per ruotare, S1 e S4 sono chiusi facendolo ruotare in senso orario. Ora se gli interruttori S1 e S4 sono aperti, S2 e S3 sono chiusi, la corrente attraverso il motore fluisce nel senso inverso, come mostrato nella figura sopra, nel terzo esempio. Questa direzione del flusso di corrente è opposta al secondo esempio e quindi vediamo un potenziale opposto al terminale del motore rispetto al primo, quindi il motore ruota in senso antiorario. Ecco come funziona H-BRIDGE.

L293D è un IC H-BRIDGE progettato per pilotare motori DC a bassa potenza ed è mostrato in figura. Questo IC è costituito da due h-bridge e quindi può pilotare due motori DC. Quindi questo IC può essere utilizzato per guidare i motori del robot dai segnali del microcontrollore.

Nella figura sottostante, possiamo notare la configurazione dei pin del circuito integrato L293D:


Possiamo passare dunque, al nostro circuito di prova.

COME FARE?
– Collegare il pin 3 di Arduino al pin 1 del circuito integrato L293D.
– Collegare il pin 4 di Arduino al pin 7 del circuito integrato L293D.
– Collegare il pin 7 di Arduino al pin 2 del circuito integrato L293D.
– Collegare il pin GND di Arduino ai pin 4, 5, 12 e 13 del circuito integrato L293D.
– Collegare il pin 5V di Arduino al pin 16 del circuito integrato L293D.
– Collegare il pin 2 di Arduino ad un polo del Pulsante, mentre l’altro polo dello stesso, lo collegheremo al GND di Arduino, come in figura.
– Collegare il pin 5V ed il GND di Arduino agli estremi del Potenziometro, come in figura.
– Collegare il pin A1 di Arduino al pin centrale del Potenziometro, come in figura.
– Collegare i pin 3 e 6 del circuito integrato L293D ai poli del motore CC.
– Collegare il polo + (positivo) della batteria 9V al pin 8 del circuito integrato L293D.
– Collegare il polo – (negativo) della batteria 9V al GND di Arduino.

In questo esempio, controlleremo la velocità e la direzione di rotazione del motore in corrente continua utilizzando Arduino Uno.
Qui, un potenziometro viene utilizzato come mezzo per il controllo della velocità ed un pulsante viene utilizzato per cambiare la direzione del motore.

L’onda PWM generata su Arduino UNO viene utilizzata per fornire una tensione variabile al motore tramite L293D. In Arduino, la funzione analogWrite viene utilizzata per generare un’onda PWM.

Inserire il codice su Arduino tramite il software IDE. Se non lo avete scaricato seguite questa guida su come installare il software di Arduino.
/* 

    Visita ArduinoFacile su: 
    https://arduinofacile.altervista.org 
    
    La Pagina Facebook di ArduinoFacile su: 
    https://www.facebook.com/ArduinoFacile/
   
   Arduino blink facciamo lampeggiare un led
*/

const int POT_input = A1;   /* assign ADC Channel */
bool d1 = HIGH;
bool d2 = LOW;

void setup() {
  pinMode(4, OUTPUT);  /* Motor control pin 1 */
  pinMode(7, OUTPUT);  /* Motor control pin 2 */
  pinMode(3, OUTPUT);  /* PWM pin for Speed Control */
  pinMode(2, INPUT_PULLUP);  /* Interrupt pin for direction control */
  attachInterrupt(digitalPinToInterrupt(2), motor, FALLING);	/* Interrupt on falling edge on pin 2 */
}

void loop() {
  int pwm_adc;
  pwm_adc = analogRead(POT_input); /* Input from Potentiometer for speed control */
  digitalWrite(4,d1);
  digitalWrite(7,d2);
  analogWrite(3, pwm_adc / 4);    
}

void motor(){
  d1 = !d1;
  d2 = !d2;
  _delay_ms(200);
}

Funzioni utilizzate

1. digitalPinToInterrupt(pin)

  • Questa funzione viene utilizzata per dichiarare il pin digitale come pin di interrupt.
  • Esempio, digitalPinToInterrupt(2) viene utilizzato per dichiarare il pin digitale 2 come pin di interrupt.
  • Sulla scheda UNO, solo i pin 2 e 3 possono essere configurati come pin di interrupt. Pertanto, l’argomento di questa funzione può essere solo il pin 2 o il pin 3.

 

2. attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

  • Questa funzione viene utilizzata per configurare la modalità dell’evento di interrupt e dichiara l’ISR per quell’interruzione. L’evento di interrupt e ISR è per il pin di interrupt dichiarato dalla funzione digitalPinToInterrupt(pin).
  • ISR in questa funzione è il nome dell’ISR che verrà utilizzato per questo interrupt.
  • mode definisce quando verrà attivato l’interrupt. Sono disponibili quattro modalità tra cui scegliere:
    – LOW: attiva l’interrupt ogni volta che il pin è basso.
    – CHANGE: attiva l’interrupt ogni volta che il pin cambia valore.
    – RISING: s’innesca quando il pin passa da basso ad alto.
    – FALLING: s’innesca quando il pin passa da alto a basso.
  • Esempio, attachInterrupt(digitalPinToInterrupt(2), motor, FALLING) configura il pin digitale 2 come pin di interrupt con ISR denominato motor e che genera interrupt per ogni evento del pin 2 quando passa da alto a basso.

 

3. analogWrite(pin,value)

  • Questa funzione viene utilizzata per generare PWM su pin digitali PWM (pin 3,5,6,9,10,11 per Arduino UNO).
  • il valore può essere qualsiasi numero compreso tra 0 e 255.
    0 è 0% duty cylce (ciclo di lavoro) e 255 è 100% duty cylce.