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