Variar sentido de giro de motor DC y contador de 3 digitos

Hola a todos, soy algo nuevo con arduino y tengo que realizar un trabajo que consiste en controlar el sentido de giro de un motor dc mediante el pulso de un botón, ademas lleva 3 display de 7 segmentos para medir la resolución de pwm. Son dos partes, la primera consiste en un puente H con dos reles y la segunda parte con ld293d.
Tengo un código para la segunda parte, pero para el ejercicio, al pulsar un botón de cambio de giro, el motor solo puede cambiar de dirección cuando éste esta apagado y no lo hace.

Código:
const int controlPin1 = 12;
const int controlPin2 = 11;
const int enablePin = 9;
const int directionSwitchPin = A1;
const int onOffSwitchStateSwitchPin = A2;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;

//const int motorPin = 11;
//int switchState = 0;
//encendido_apagado = 0;

void setup(){
//pinMode(motorPin, OUTPUT);
//pinMode(switchPin, INPUT);
pinMode(directionSwitchPin, INPUT);
pinMode(onOffSwitchStateSwitchPin, INPUT);
pinMode(controlPin1, OUTPUT);
pinMode(controlPin2, OUTPUT);
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, LOW);
}

void loop(){
onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin);
delay(1);
directionSwitchState = digitalRead(directionSwitchPin);
motorSpeed = analogRead(potPin)/4;

if (onOffSwitchState != previousOnOffSwitchState){
if (onOffSwitchState == HIGH){
motorEnabled = !motorEnabled;
}
}

if (directionSwitchState != previousDirectionSwitchState) {
if (directionSwitchState == HIGH){
motorDirection = !motorDirection;
}
}

if (motorDirection == 1) {
digitalWrite(controlPin1, HIGH);
digitalWrite(controlPin2, LOW);
}
else {
digitalWrite(controlPin1,LOW);
digitalWrite(controlPin2,HIGH);
}

if (motorEnabled == 1){
analogWrite(enablePin,motorSpeed);
}
else {
analogWrite(enablePin, 0);
}

previousDirectionSwitchState = directionSwitchState;
previousOnOffSwitchState = onOffSwitchState;

}

Si alguien puede ayudarme con la resolucion de pwm o indicador de rpm del motor, y con el sentido de giro para ambas partes les agradeceria
Adjunto las imagenes comprimidas de como son los circuitos
 

Adjuntos

  • Demos.zip
    1.2 MB · Visitas: 4
Hola por lo que veo en tu esquemático llevado al protoboard es lo siguiente, me corriges si estoy equivocado. "Conectas un potenciómetro y un interruptor. El potenciómetro se usa para controlar la velocidad del motor y un pequeño interruptor controlará la dirección hace girar el motor ya sea para un sentido ( horario o antihorario)".

El H-Puente L293D realmente hace todo el trabajo pesado en este circuito, accionar el motor bastante fácil. En el otro lado del circuito que estamos utilizando dos componentes (un potenciómetro y un interruptor) para crear una interfaz de usuario simple.

Vamos a escribir el código: Cuando empezamos en el entorno IDE de Arduino vemos algo como esto:
Código:
void setup () {
  // poner su código de configuración aquí, para ejecutar una vez:
}

void loop () {
  // ponga su código principal aquí, para ejecutar repetidamente:  
}

Así que primero vamos a crear las variables para el interruptor y el potenciómetro:

Código:
int switchPinFwd = 2; // entrada del interruptor cuando está en la posición de Delantero
int potentiometerIn; // variable para contener la entrada del potenciómetro


void setup () {
  // poner su código de configuración aquí, para ejecutar una vez:

}

void loop () {
  // ponga su código principal aquí, para ejecutar repetidamente:

}

Puesto que no estamos utilizando una resistencia de pull-up externa con el interruptor, tendremos que establecer el interior de pull-up a través de código:
Código:
int switchPinFwd = 2; // entrada del interruptor cuando está en la posición de Delantero
int potentiometerIn; // variable para contener la entrada del potenciómetro

void setup () {
  // poner su código de configuración aquí, para ejecutar una vez:
  pinMode (switchPinFwd, INPUT_PULLUP);

}

void loop () {
  // ponga su código principal aquí, para ejecutar repetidamente:

}

Ahora que las entradas digitales se determinaron, escribimos un poco de código en la función de bucle para leer el potenciómetro y almacenarlo en la variable que hemos creado antes. Esto permitirá al programa actualizar la posición actual del potenciómetro constantemente.

Código:
int switchPinFwd = 2; // entrada del interruptor cuando está en la posición de Delantero
int potentiometerIn; // variable para contener la entrada del potenciómetro

void setup () {
  // poner su código de configuración aquí, para ejecutar una vez:
  pinMode (switchPinFwd, INPUT_PULLUP);
}

void loop () {
  // ponga su código principal aquí, para ejecutar repetidamente:
  potentiometerIn = analogRead (A0);
}

La variable potentiometerIn almacenará el valor leído del potenciómetro , esta variable va a variar de 0 a 1023 y será la base del control de velocidad.

Continuando donde definimos las entradas, ahora vamos a hacer uso de ellas. En primer lugar, vamos a averiguar si el motor va en sentido horario o antihorario mediante la lectura de la posición del interruptor. El interruptor lee ALTA cuando está en la posición de uno lógico. Desde el cambio sólo tiene una otra posición podemos suponer con seguridad que cuando el pasador muestra BAJA estará en la posición cero logico. Vamos a hacer esto con una sentencia if:

Código:
int switchPinFwd = 2; //entrada del interruptor cuando está en la posición de Delantero
int potentiometerIn;      //variable para contener la entrada del potenciómetro


void setup() {
  // Poner su código de configuración aquí, para ejecutar una vez:

  pinMode(switchPinFwd, INPUT_PULLUP);
}

void loop() {
  // Ponga su código principal aquí, para ejecutar repetidamente:

  potentiometerIn = analogRead(A0);

  if(digitalRead(switchPinFwd) == HIGH) //comprobar para ver si el pin es alta o baja

  {
    //If the pin is HIGH, it must be set to forward 
  }
  else
  {
    //De lo contrario, el interruptor debe estar en reversa 

  }
}

La Declaración IF va a tomar una decisión en base a los parámetros entre paréntesis. En este caso vamos a mirar el interruptor y tomar una decisión basados en la posición del interruptor y determinar el giro del motor. Así que el interruptor dará la orden de dirección del motor que se ejecutará mediante el código (que no hemos escrito) para que el motor gire hacia delante o en sentido contrario.
 
Última edición:
Es más, si puedes personalizar los displays (es decir, hacer los segmentos de manera discreta, y además si sólo vas a contar hasta 255 (o hasta 399)), puedes hacer los 3 displays (prescindiendo del segmento F en las centenas) usando 20 leds discretos (en YouTube hay gente que hace sus propios displays muy buenos), uniendo 5 grupos de 4 segmentos con electrodo común, y charliplexando en ratio 1/5 cada grupo de 4 segmentos, usando tan solo 5 líneas de tu Arduino para el display (5*4=20 leds). Si el pwm va de 0 a 999 (o a FFF), se puede hacer con sólo 5 grupos de 5 leds, es decir, 6 líneas.

Y utilizando GuGaplexing (con la ayuda de 6 transistores comunes) puedes controlar los 3 displays con sólo 4 líneas (esto ya para nota).

http://m.eet.com/media/1133107/14653-figure_4.pdf
 
Última edición:
Mecatrodatos gracias por contestar y si tienes toda la razón, pero el requisito principal es que el interruptor debe dar la orden del sentido de giro solo cuando el motor esté apagado, por ende quiero saber si se podría modificar en el codigo que tengo.

Por otro lado, Savad y Palurdo, igualmente gracias, pero me corrijo y es que los display deben mostrar la resolución de pwm, la frecuencia creo que es, y debo realizarlo como esta en el esquema
 
Hola a todos, alguien tiene idea para detener o cambiar el sentido de giro de motor de unos 7a 9Amperios, cuando demande mas corriente, como los de portones electricos. Se que lo hacen con resistencias shunts que mandan dicha señal a un micro. alguna forma mas sencilla? creen que con un mosfet y relays pueda hacerlo o que mas faltaria si se puediera?
 

pandacba

Rocker Bear
Tipo de motor de continua(hay muchos) tensión de trabajo.
Cuando demande más corriente te referis a cuando encuentre un obstaculo en el camino?
 

pandacba

Rocker Bear
Es bastante sencillo simplemente sensar la corriente mientras esta en trabajo normal
Podes utilizar un INA219, e incluso ya viene el módulo listo para utiizar
1545254432940.png
Hay varios modelos de sensores TI bajo la nomenclatura INA hay uno que te será el más apropiado, entra a la página de Texas para hacer la búsqueda paramétrica y seguro que ya hay un modulo listo para utilizar
 
Muchas Gracias Pandacba..

Revise el INA226-Q1 que es el que muestras en la imagen, entre y vi que los modulos tieneOver-Current Alert, como comentas son de uso Automotriz para motores, supongo que para los motores elevadores de vidrios etc..

Voy a buscar que encuentro del INA226-Q1.
 

pandacba

Rocker Bear
Entra en la página de texas hay una gran variedad y estan todas las hojas de datos e incluso AN(Aplication Notes)
También tenes este otro
1545255535066.png
 
Arriba