En este ejemplo se controla la velocidad de giro de un motor mediante PWM.
Hemos usado un ventilador como los que se emplean en las torres de PC.
Como el motor utilizado es de 12v y Arduino suministra como máximo 5v y 40mA, se emplea una fuente externa y un transistor Darlington TIP120 para alimentar el motor.
El TIP 120 soporta tensiones de hasta 60v y corrientes de 5A, es decir que con la fuente adecuada podríamos controlar motores de una potencia elevada. Hay que unir las masas de la fuente y de la placa Arduino para que el circuito funcione.
El código del ejemplo hace que el motor arranque desde cero hasta la máxima tensión (12v), detiene el motor, espera 5 segundos y vuelta a empezar.
He añadido un led en paralelo con el motor para hacer más visual el resultado.
int pwm;
void setup()
{
pinMode(11, OUTPUT);
Serial.begin(9600);
}
void loop()
{
for (pwm=0; pwm<256; pwm++)
{
analogWrite(11, pwm);
Serial.println(pwm);
delay(100);
}
analogWrite(11, 0);
delay(5000);
}
Mismo circuito anterior, pero ahora el control de velocidad es manual mediante el empleo de un potenciómetro en A0.
La lectura del potenciómetro entrega un valor entre 0 y 1023, como la salida analógica oscila entre 0 y 255, dividimos entre 4 la lectura del potenciómetro, así evitamos sobrepasar el valor máximo para AnalogWrite.
int potenciometro = A0;
int lectura = 0;
int pwm = 0;
void setup()
{
pinMode(11, OUTPUT);
Serial.begin(9600);
}
void loop()
{
lectura = analogRead(potenciometro);
Serial.println(lectura);
pwm = lectura/4;
Serial.println(pwm);
analogWrite(11, pwm);
delay(100);
}
En este ejemplo se controla la velocidad de un motor mediante PWM.
La velocidad del motor depende de la distancia en tramos de 5 cm.
A menos de 5 cm el motor se para, entre 5 y 20 cm incrementa la velocidad y a 20 o más gira a la máxima velocidad.
#define echoPin 6
#define trigPin 7
float maximumRange = 20;
float minimumRange = 5;
long duration, distance;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(10, OUTPUT);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration/58.2;
Serial.println(distance);
if (distance < minimumRange){
analogWrite(10,0);
}
else {
if (distance >= minimumRange && distance < 10){
analogWrite(10,64);
}
else {
if (distance >= 10 && distance < 15){
analogWrite(10,128);
}
else {
if (distance >= 15 && distance < maximumRange){
analogWrite(10,192);
}
else {
if (distance >= maximumRange){
analogWrite(10,255);
}
}
}
}
}
}
En los ejemplos anteriores hemos visto como controlar la velocidad de giro de un motor de corriente continua.
Para controlar el sentido de giro necesitamos invertir el sentido de la corriente que circula por la bobina del motor, para ello nos ayudaremos del circuito integrado L293D.
El CI L293D permite controlar el giro y la velocidad de dos motores de cc o un solo motor paso a paso.
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int potPin = 0;
void setup()
{
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
}
void loop()
{
int speed = analogRead(potPin) / 4;
boolean reverse = digitalRead(switchPin);
setMotor(speed, reverse);
}
void setMotor(int speed, boolean reverse)
{
analogWrite(enablePin, speed);
digitalWrite(in1Pin, ! reverse);
digitalWrite(in2Pin, reverse);
}