Control de motores de CC (solucionado)

Bueno, ahora necesito que me echéis una mano a mi :smiley:

Como controlaríais un motor de CC con señal PWM ? y que se pueda invertir? es decir que vaya en sentido horario y antihorario?

hay algo hecho ya como los ESC pero para motores de CC ?

Saludos ¡

Mismamente una ESC, la controlas con la librería servo.h

También puedes recurrir a un motor shield, pero cuidado, mira que el consumo de tu motor puede ser manejado por el motor shield.

La forma más divertida sin duda es montar tu propio puente en H con transistores MOS-FET.

pero con un ESC puedo montar un motor de CC que no sea brudless ? se puede invertir el giro?

el sistema de puente H se puede controlar por PWM ? se puede invertir el giro ?

un saludo

Hola SrDonGato

Tengo hecho un programita para mover un motor de CC con variador de velocidad y cambio de giro que quizás te pueda valer, lo que pasa que no lo he probado todavía.
Si te funciona me lo dices. (y sinó también :wink: )

/*
  Lee el valor de un potencimetro, y segun lo leido genera pulsos PWM para controlar la 
  velocidad de un motor.
  En funcion de la posicion de un conmutador de 3 posiciones mueve el motor en un sentido, en el otro
  o automaticamente cambia de sentido cada cierto tiempo.
  Indica mediante dos Leds el sentido de giro (en modo automatico el led parpadea) 
 
 El circuito(Abataduino), utiliza un Arduino-ATtiny85:
 * D0 a IN2-IN3 de L293D.
 * D1 a IN1-IN4 de L293D.
 * (D2)A1 Interruptor tres posiciones de modo 
 * D3(A3) Led de señalizacion
 * (D4)A2 Potenciometro de velocidad
 * D5(A0) Led se señalizacion
 
 Creado el 2 Jul. 2011
 por Iñigo Zuluaga
 
 Este codigo es de dominio publico.
 
 */

// PINES UTILIZADOS
const int Motor1 = 0;             // Salida analogica que mueve el motor
const int Motor2 = 1;             // Salida analogica que mueve el motor
const int IntModoPin = A1;        // Entrada analogica de seleccion de modo 0v=Adelante, 2,5v=Automatico, 5v=Atras
const int Led1 = 3;               // Salida digital del Led1
const int PotVelPin = A2;         // Entrada analogica a la que esta conectado el potenciometro de velocidad
const int Led2=5;                 // Salida digital del Led2

// CONSTANTES
const int VelMin=80;              // Velocidad minima del motor (valor PWM)
const int VelMax=250;             // Velocidad maxima del motor (valor PWM)
const int ContMaxSentido = 15000; // Valor de tiempo maximo para que cambie de sentido en modo automatico 

//VARIABLES
int Cont=0;                       // Valor del contador de tiempo para cambio de sentido en automatico
boolean Adelante=true;            // Valor de la variable sentido para automatico (True=Adelante, False=Atras)
int PotVelocidad = 0;             // valor leido del potencimetro (0-1023)
int Velocidad = 0;                // valor de salida del PWM (VelMin-VelMax)
int IntModo=0;                    // Valor leido del interruptor (0,~512,1023)
int Modo=0;                       // Valor de la variable de modo (0=Adelante, 1=Automatico, 2=Atras)


void setup() 
{
    pinMode(PotVelPin, INPUT);    // Entrada analgica del Potenciometro de velocidad
    pinMode(IntModoPin,INPUT);    // Entrada analogica del interruptor tres posiciones de modo
    pinMode(Motor1, OUTPUT);      // Salida 1 Digital/PWM de control del motor
    pinMode(Motor2, OUTPUT);      // Salida 2 Digital/PWM de control del motor
    pinMode(Led1,OUTPUT);         // Salida Digital del Led de señalizacion Adelante
    pinMode(Led2,OUTPUT);         // Salida Digital del Led de señalizacion Atras
}


void loop()
{ 
  IntModo=analogRead(IntModoPin);         // leemos el interruptor de modo de funcionamiento (0-1023)
  Modo = map(IntModo, 0, 1023, 0, 2);     // Lo mapeamos a valores del motor.(0,1,2)
  
  PotVelocidad = analogRead(PotVelPin);   // Leemos el valor del potenciometro (0-1023)            
  Velocidad = map(PotVelocidad, 0, 1023, VelMin, VelMax); // Lo mapeamos a valores del motor (VelMin-VelMax)
    
  if (Modo==0)  //Adelante
  {
    Adelante=true;
  }
  else if (Modo==2) // Atras
  {  
    Adelante=false;
  }
  else  // 1=Modo automatico
  {
    digitalWrite (Led1,LOW);     //Apaga los leds para que parpadee el led activo
    digitalWrite (Led2,LOW);
    Cont=Cont+1;
    if (Cont> ContMaxSentido)    //Si ha llegado al final del conteo
    {
      Cont=0;                    // Pone el contador a 0
      Adelante=-Adelante;        // y cambia de sentido
    }
    delay(200);                  //Espera para mantener el led apagado
  }

  MoverMotor(Adelante,Velocidad); //manda mover el motor y encender el led activo
  delay(200);                     // Esperamos un poco antes de la siguiente pasada 
}

//____________________________________________
// Mueve el motor en el sentido y velocidad indicados
void MoverMotor(boolean Sentido,int Velocidad)
{
  if (Sentido) //mover hacia adelante
  {
    digitalWrite (Motor1, LOW);
    analogWrite  (Motor2, Velocidad);
    digitalWrite (Led1,HIGH);
    digitalWrite (Led2,LOW);
  }
  else        //mover hacia atras
  {
    analogWrite (Motor1, Velocidad);
    digitalWrite (Motor2, LOW);
    digitalWrite (Led1,LOW);
    digitalWrite (Led2,HIGH);
  }
}

Notas:

Adjunto te paso el circuito para que veas el montaje en formato pdf (solo se ve si estás logeado)
Aunque esté para un ATtiny, vale para ATMega (Arduino)
Utiliza un potenciómetro con interruptor incorporado para el encendido y velocidad
Un interruptor de 3 posiciones (con resistencias añadidas) para el sentido: Adelante, Atrás y en el centro cambio automático de marcha al cabo de un tiempo.
La carátula es porque todo el circuito está dentro de una fuente de alimentación ATX, y los mandos en la tapa de la misma.
Algunos componentes se sueldan directamente sobre el potenciómetro o sobre el conmutador.
En el circuito se controlan dos motores que se mueven sincronizadamente (cada uno utiliza un puente H del L293D)

Saludos

Imprimir Abataduino_04impr.pdf (328 KB)

1 Like

pero con un ESC puedo montar un motor de CC que no sea brudless ? se puede invertir el giro?

Hay ESC's para motores brushless y para motores DC, solo tienes que elegir la apropiada. Si son para coche tienen marcha adelante y marcha atrás, al manejarse igual que un servo solo tienes que hacer una conversión de velocidad a grados: a 90º parado, de 90º a 180 un sentido y de 0 a 90º el otro sentido.

el sistema de puente H se puede controlar por PWM ? se puede invertir el giro ?

El sistema de puente H es precisamente para controlar la velocidad por PWM y el sentido de giro. Para que un motor gire en un solo sentido solo necesitas un transistor y un diodo rectificador.

Mira el esquema que te pasa Inizul, el chip L293D es sencillo de utilizar.

segun el datashhet hacen falta 4 diodos para poner el motor que pueda girar en ambos sentidos. , Inizul, tal como lo tienes montado son necesarios ?¿ o los que tienes montados solo giran en un sentido ?

saludos

Hola SrDonGato.

La diferencia del L293 y del L293D es que este último tiene integrados los diodos de "clamping" en el chip. Estos diodos sólo sirven de protección.
La forma de hacer girar un motor en un sentido o en otro con control de velocidad es:
Conectamos los dos pines de control de un par puente H del L293 con dos pines del Arduino
Giro a la derecha: pin IN1 de L293D : inyectamos una señal PWM en el pin de Arduino (analowwrite)
pin IN2 a masa : ponemos la salida en digital LOW (digitalwrite LOW)
Giro a la izquierda: pin IN1 a masa : ponemos la salida en digital LOW (digitalwrite LOW)
pin IN2 L293D señal PWM: : inyectamos una señal PWM en el pin de Arduino (analowwrite)

El esquema que te he mostrado está previsto para giro en dos sentidos, aunque ya te he dicho que no lo he probado, porque está hecho para ATtiny (y hasta el lunes no los recibo).

NOTA: lo que necesitas para mover tu motor es (dentro del programa que te he mostrado) la funcion : MoverMotor(boolean Sentido,int Velocidad) y modificar los pines utilizados.

Saludos

He ido esta tarde a por los integrados, me llegarán mañana. este finde de viaje, la semana que viene les meto caña :slight_smile:

Esto con un coche radio-control dándole "vidilla"

Un saludo y gracias ¡

necesito ayuda, he programado el sentido de giro de un motor con puente H, pero una vez que le doy la orden de girar por 1 seg, el motor no para de girar, nose que he hecho mal, si me podeis hechar una mano os agradeceria mucho, este es el programa que he hecho:

int estado;
int vel = 255;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

pinMode(9, OUTPUT);
pinMode(10, OUTPUT);

}

void loop() {
// put your main code here, to run repeatedly:
if(Serial.available()>0){

estado = Serial.read();
}
if(estado=='1'){
analogWrite(9, vel);
delay (1000);
}
else{
analogWrite(9, 0);

}
if(estado=='3'){ // izquierda

analogWrite(10, vel);
delay (100o);
}

else{
analogWrite(10, 0);

}
}

Hola.
Creo que tu problema es que se mantiene el estado previo en cada loop, por lo que se mantiene el giro.
Prueba a poner al inicio del loop:

void loop() {
estado='0';

De todas formas, si no se soluciona con esto es preferible que abras nuevo tema, pues este está marcado ya como solucionado.
Saludos.

Porque re-abren un tema cerrado con una nueva consulta?
Maic1020 crea un nuevo hilo. Si el post tiene 120 dias sin cambios no debes responderlo.