Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Arduino: Motor DC con potenciómetro y conmutadores

El circuito (realizado con Fritzing):

/*
 * Este programa mueve un motor de corriente continua usando un H-Bridge.
 * Con dos pulsadores se controla encendido/apagado y sentido de giro.
 * Con un potenciometro se controla la velocidad de giro.
 *
 * 2014 - Guimi (http://guimi.net)
 */

// VARIABLES
//----------
const byte pin1Motor1=5; // Variable que indica el pin 1 del motor 1
const byte pin2Motor1=9; // Variable que indica el pin 2 del motor 1
const byte pinVelocidadMotor1=10; // Variable que indica el pin de la señal de velocidad del motor 1
const byte pinSwitchEncendido=11; // Variable que indica el pin del boton de encendido/apagado
const byte pinSwitchSentido=12; // Variable que indica el pin del boton de sentido de giro
const byte pinLed=13; //Variable que indica el pin del LED
const byte pinPotenciometro=A0; // Variable que indica el pin del potenciometro

byte valorSwitchEncendido=0; // Variable para leer el switch
byte valorSwitchSentido=0; // Variable para leer el switch
byte valorSwitchEncendidoAnterior=0; // Como entre bucles el periodo es muy corto, cada pulsacin podra leerse muchas veces...
byte valorSwitchSentidoAnterior=0; // ...por ello guardamos un estado anterior
int valorPotenciometro=0; // Variable para guardar el valor del potenciometro [0-1023]

byte estaEncendido=0; // Variable para guardar el estado encendido/apagado
byte sentidoGiro=0; // Variable para guardar el sentido de giro
byte motorVelocidad=0; // Variable para guardar la velocidad segn el potenciometro


// FUNCION SETUP
//--------------
void setup(){
  // Definimos cada pin como entrada o salida
  pinMode(pin1Motor1,OUTPUT);
  pinMode(pin2Motor1,OUTPUT);
  pinMode(pinVelocidadMotor1,OUTPUT);
  pinMode(pinSwitchEncendido,INPUT);
  pinMode(pinSwitchSentido,INPUT);
  pinMode(pinLed,OUTPUT);

  // Paramos el motor 1
  digitalWrite(pinVelocidadMotor1, 0);

  // Indicamos con el LED si estaEncendido
  digitalWrite(pinLed, estaEncendido);
    
  // Preparamos la comunicacion mediante el puerto serie
  //Serial.begin(9600);
}


// FUNCION LOOP
//-------------
void loop(){
  // Leemos el switch de encendido/apagado
  valorSwitchEncendido=digitalRead(pinSwitchEncendido);
  delay(1);

  // Leemos el switch de sentido de giro
  valorSwitchSentido=digitalRead(pinSwitchSentido);
  delay(1);

  // Leemos el valor del potenciometro [0-1023]
  valorPotenciometro=analogRead(pinPotenciometro);
  motorVelocidad = valorPotenciometro/4;
  
  // Si se pulsa el boton de encendido/apagado se cambia el estado
  if ((valorSwitchEncendido == HIGH) && (valorSwitchEncendidoAnterior == LOW)) {
    estaEncendido = !estaEncendido;

     // Indicamos con el LED si estaEncendido
    digitalWrite(pinLed, estaEncendido);
  }
  // Obligamos a pasar por una fase LOW antes de volver a leer un HIGH
  // para no leer una sola pulsacion varias veces
  valorSwitchEncendidoAnterior = valorSwitchEncendido;
  
  // Si se pulsa el boton de sentido de giro se cambia el sentido
  if ((valorSwitchSentido == HIGH) && (valorSwitchSentidoAnterior == LOW)) {
    // Para evitar dañar el motor, solo permitimos cambiar el sentido de giro con el motor parado
    if (!estaEncendido) sentidoGiro = !sentidoGiro;
  }
  // Obligamos a pasar por una fase LOW antes de volver a leer un HIGH
  // para no leer una sola pulsacion varias veces
  valorSwitchSentidoAnterior = valorSwitchSentido;
  
  /*
  // Mostramos informacion por el puerto serie
  //Serial.print(valorSwitchEncendido);
  //Serial.print(" - ");
  //Serial.print(valorSwitchEncendidoAnterior);
  //Serial.print(" - ");
  Serial.print(estaEncendido);
  Serial.print(" | ");
  //Serial.print(valorSwitchSentido);
  //Serial.print(" , ");
  //Serial.print(valorSwitchSentidoAnterior);
  //Serial.print(" , ");
  Serial.print(sentidoGiro);
  Serial.print(" | ");
  Serial.print(valorPotenciometro);
  Serial.print(" | ");
  Serial.println();
  */
  
  if (sentidoGiro == 1) {
    digitalWrite(pin1Motor1, LOW);
    digitalWrite(pin2Motor1, HIGH);
  } else {
    digitalWrite(pin1Motor1, HIGH);
    digitalWrite(pin2Motor1, LOW);
  }
    
  if (estaEncendido == 1) {
    analogWrite(pinVelocidadMotor1, motorVelocidad);
  } else {
    analogWrite(pinVelocidadMotor1, 0);
  }
  
  // Esperamos un tiempo de reaccion para los componentes
  //delay(5);
}