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); }