Pages: [1]   Go Down
Author Topic: Control motor cc joystick  (Read 1625 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos a la comunidad.
Comento un poco el proyecto. Estoy queriendo hacer un sistema de pan and tilt  con motores DC.
Logre controlarlos mediante la lectura analógica de los potenciometros de el joystic y enviando los datos a las salidas pwm.
controlo la velocidad máxima también, pero el cuello de botella esta en que necesito una rampa de aceleración y de desaceleracion.

Para que quede mas claro cuando acciono el joystic necesito contar un tiempo de aceleración asta la velocidad marcada por el joystic y al soltar el joystic de la velocidad que estaba desacelere con el mismo tiempo a cero.

dejo el codigo sobre el cual estoy trabajando, cualquier idea sera bienvenida

Quote
//Control de un Joystick velozidad maxima damp
int ejexpin = 4;  // Declara pin4 entrada analogica como ejexpin 
int ejexmpin = 3; // Declara salida pwm 3 como ejempin
int ejexm2pin = 5; // Delara salida pwm 5 como ejempin2
int ejexd;         // delcara ejexd
int vmaxpin = 3; // Declara pin 3 analog como entrada de vmax
int vmax;        // Declara vmax como valor de trabajo velozidad maxima
int i;
void setup(){
  //Serial.begin(9600);
  pinMode(ejexmpin, OUTPUT); // Configura ejempin como salida
  pinMode(ejexm2pin, OUTPUT);// configura ejexmpin como salida
}
void loop(){
  vmax = analogRead(vmaxpin);
  vmax = map(vmax, 0, 1023, 0, 255); //cambia el valor de la lectua analogica de 0 1203 a 0 255
  ejexd = analogRead(ejexpin); // lee el valor analogico de ejexpin y lo traslada a ejexd

  // Control del Eje X
  if (470 > ejexd) {

    ejexd = map(ejexd, 0, 470, vmax, 0); // se cambia el antiguo valor de 255 por el valor de la etiquetqa vmax   
    analogWrite(ejexm2pin,ejexd);
  }

  else {
    analogWrite(ejexm2pin,0);
  }
  if (ejexd > 530) {
   
    ejexd = map(ejexd, 530, 1023, 0, vmax); // se cambia el antiguo valor de 255 por el valor de la etiquetqa vmax
   
    if ( 0 >= i){
    
    for ( i=0; i<=ejexd; i++){ // el valor de i asciende
    
    analogWrite(ejexmpin, i); // se escribe el valor de i en el pin salida pwm
    delay(10);
     }
    }
     
    analogWrite(ejexmpin,ejexd);
  }
  else {
    analogWrite(ejexmpin,0);
    i = 0;
  }
  

}


Esta parte del codigo es solo el control de un motor.
Logged

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 958
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿Emplear una variable en el delay?

delay(variable)

Si la posicion del joystick no corresponde con la del motor la variable es cero, si corresponde entonces toma el valor correcto.

¿es eso?

Supongo que variable tambien la podrias operar de forma matematica para generar funciones logaritmicas por aproximaciones.

Es decir el valor del delay cambiara mediante una tabla o mediante un calculo conforme el numero de la posicion del joystick se aproxime al valor que quieres...

Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo que lo más sencillo es hacer la media de los últimos X valores tomados de la posición del joystick y tomar esa media para la salida pwm. Cuantos más valores X tomes de media la aceleración será más lenta. En el IDE tienes un ejemplo de cómo hacerlo, Ejemplos -> Analog -> Smoothing.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas Gracias por las respuestas.
A ver lo que hago es lo siguiente leo el valor de la entrada analogica, si es mayor o menor a el valor medio inicia el motor en un sentido o en otro.
luego tomo el valor,lo convierto y se envia a la salida pwm.
Lo que no me sale es, antes de enviar el valor final a la salida pwm, generar un delay y en ese tiempo que la salida pwm valla de 0 a el valor leido en la entrada analoga.
Y luego si el joystick regresa a la pocicion de descanso que la velozidad disminulla no de golpe si no con el mismo tiempo de delay
pense hacerlo con un contador como en el ejemplo fade.

el tema es que tengo 2 motores y en la estructura if - else, cuando entra un contador en uno de los movimientos( por ejemplo forward X )
y si en el joystick acciono reverse Y, asta que no termina el contador de forward X no me envia los datos a la salida pwm de Y.

bueno voy a seguir analizando y muchas gracias por las ideas.
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No es necesario que pongas ningún delay. Ese tiempo lo ajustas con el número de muestras sobre las que haces la media.
Por ejemplo toma lecturas del joystick cada 100 ms. Si quieres que el retardo en que el motor alcance la velocidad que le indica el joystick sea de 2 segundos tendrás que hacer constantemente la media de los 20 últimos valores del joystick, ese valor mediado lo mapeas para la salida pwm y ya lo tienes, no hay que hacer nada más.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cheyenne muchas gracias por la respuesta vamos a probar a ver que sale y comento

Logged

Pages: [1]   Go Up
Jump to: