Mario A
Controllo DC motor con L293 e regolazione velocità potenziometro
Tutorials -
Domenica 19 Febbraio 2012 10:12
Scritto da Mario A

Questo articolo illustra come controllare un motore DC con Arduino e un integrato L293 o compatibile, permettendo il controllo bidirezionale con un selettore e la variazione della velocità con un potenziometro.
Lo stato della direzione è visualizzato da due led accesi a seconda della direzione di marcia.
Si raccomanda un'alimentazione esterna da almeno 9 volt, infatti l'alimentazione della parte potenza dell'intergrato è Vin di Arduino.
Un'avvertenza da tener conto, è di non cambiare la direzione del motore quando la velocità non è a zero, potrebbe causare problemi all'integrato di potenza se non protetto da diodi.
Lo sketch allegato è solo un esempio, non avendo controlli di nessun genere per quanto riguarda l'ottimizzazione del moto, serve come base di partenza per uno sviluppo più opportuno all'uso di un motore DC, per esempio nel modellismo ferroviario (fermodellismo).
Allegato lo schema di collegamento da Arduino alla breadboard.
Il potenziometro è da 10kOhm e presenta un buon compromesso nella salita della velocità del motore.

Il motore deve sopportare la tensione che gli viene applicata, onde evitare possibili problemi di arrostimento, oppure motori con tensioni superiori possono creare surriscaldamenti all'integrato di controllo della potenza.

Controllare anche se l'integrato ha già i diodi di protezione incorporati come l'integrato con la sigla L293D, altrimenti sono da aggiungere come riferimento vedere lo schema nel datasheet.

Per non avere dubbi sulle tensioni dei motori che l'integrato supporta riferirsi al datasheet:

http://www.ece.utexas.edu/~valvano/Datasheets/L293d.pdf

Assembly List

Label

Part Type

Properties

Arduino1

Arduino

processor ATmega; variant Arduino UNO

IC1

H-Bridge

L293D o SN754410 package THT; output current 1.1A; max voltage 36V

LED1

Red LED - 3mm

package 3 mm [THT]; leg yes; colore Red (633nm)

LED2

Green LED - 3mm

package 3 mm [THT]; leg yes; colore Green (570nm)

M1

DC Motor


R1

Rotary Potentiometer (Small)

size Rotary - 9mm; track Linear; tipo Rotary Shaft Potentiometer; maximum resistance 10kΩ

R2

10 kΩ Resistor

package THT; tolerance ±5%; bands 4; resistenza 10kΩ; pin spacing 400 mil

R3

10 kΩ Resistor

package THT; tolerance ±5%; bands 4; resistenza 10kΩ; pin spacing 400 mil

R4

220 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 220Ω; pin spacing 400 mil

R5

220 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 220Ω; pin spacing 400 mil

S1

Toggle Switch

package THT; switching circuit SPDT

 

 

// Uso L293 con potenziometro e cambio moto avanti-retro 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 selettore
int buttonState2 = 0;         
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);     

}
void loop()
{
  buttonState1 = digitalRead(buttonPin1);               // Rileva stato selettore
  buttonState2 = digitalRead(buttonPin2);
  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 selettore
  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 {
    // accendo LED indietro:    
    // spengo LED avanti:    
    // cambio direzione motore
    digitalWrite(ledPin1, LOW); 
    digitalWrite(ledPin2, HIGH);  
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,HIGH);

  }
}

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi