hola gente aquí nuevamente.
con algunos pequeños avances. pero mas que nada otro video con otro mecanismo. mas casero
consta de un motor de vibra de joystick con engranajes y potenciometros de 2.5 k
el puente h es el mismo mencionado anteriormente de pyro.
el codigo es el mismo con algunos ajustes en variables
/*
ejemplo mover motor a direcciones dependiendo valores comparados de dos potenciometros.
uno de posicion actual y otro de posicion futura
*/
int pinSensor = A0; // Entrada para el potenciómetro.posicion actual del motor. en este ejemplo moveria el pot manualmente emulando el moviento del motor, indicado por los leds.
int pinSensor2 = A1; //potenciometro de posicion requerida o futura
int pinLed2= 10; // pin de direccion derecha, señal para el encendido del motor por el puente h en direccion a la derecha
int pinLed = 9; //pin de izquierda. idem anterior a la izquierda.
int valorSensor = 0; // variable para el valor del sensor.
int posact = 0; //creo que es necesario que la variable empiece de cero.
int valorSensor2 = 0; //variable para el potenciometro 2
int sigpos = 0; // abreviatura de siguiente posición, valor que seria enviado por serial.
int difvalors =0; //diferencia entre sigpos y valor sensor
int pwm = 3 ;//variable constante de pwm
int pwm2 = 60; // para el freno. utilizando la direccion contraria con un delay
int delay1 = 200;// delay para el freno
int error = 10 ;// error para zona muerta
void setup() {
// Declaramos el pin del Led como salida:
pinMode(pinLed, OUTPUT);
pinMode(pinLed2, OUTPUT);
Serial.begin(9600);
pwm = constrain (pwm, 50 , 250);//valores min y max de pwm.
}
void loop() {
valorSensor2 = analogRead (pinSensor2)/2;//lee los datos del potenciometro 2 de posicion requerida
int sigpos = valorSensor2 ;
valorSensor = analogRead(pinSensor)/2; //valorsensor igual al valor del potenciometro de posicion actual
difvalors = abs (sigpos - valorSensor); //valor absoluto de la diferencia
Serial.print ("act");
Serial.println ( valorSensor); // para chequear en que posición esta el potenciometro del motor.
//delay(1); //le doy delay para que se pueda leer los datos impresos. de lo contrario pasan demaciado rapido
Serial.print (" sig");
Serial.println(valorSensor2); //para chequear la posicion requerida del pote2
//delay(1);
//en este caso si el valor siguiente es menor al del potenciometro, , seria el atraso del motor.
if (sigpos < valorSensor && difvalors > error ) {
//digitalWrite (pinLed, HIGH);
analogWrite (pinLed, pwm * difvalors); //pwm dependiendo la distancia para la velocidad.
digitalWrite (pinLed2,LOW);
delay(1);
switch (difvalors) {
case 9: // en casos que los valores sean menores a 10 intentare frenar el motor direccioandolo al lado contrario
analogWrite (pinLed2, pwm2); //pwm2 minima velocidad para frenar
digitalWrite (pinLed,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 8:
analogWrite (pinLed2, pwm2); //pwm
digitalWrite (pinLed,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 7:
analogWrite (pinLed2, pwm2); //pwm
digitalWrite (pinLed,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 6:
analogWrite (pinLed2, pwm2); //pwm
digitalWrite (pinLed,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 5:
analogWrite (pinLed2, pwm2); //pwm
digitalWrite (pinLed,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
}
}
// en este caso si el valor siguiente es superior al del potenciometro, , seria el avance del motor.
else if (sigpos > valorSensor && difvalors > error) {
//digitalWrite (pinLed2, HIGH);
analogWrite (pinLed2, pwm * difvalors); //pwm
digitalWrite (pinLed,LOW);
delay(1);
switch (difvalors) {
case 9:
analogWrite (pinLed, pwm2); //pwm
digitalWrite (pinLed2,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 8:
analogWrite (pinLed, pwm2); //pwm
digitalWrite (pinLed2,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 7:
analogWrite (pinLed, pwm2); //pwm
digitalWrite (pinLed2,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 6:
analogWrite (pinLed, pwm2); //pwm
digitalWrite (pinLed2,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
case 5:
analogWrite (pinLed, pwm2); //pwm
digitalWrite (pinLed2,LOW);
delay(delay1);
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1);
break;
}
}
//en este caso al ser iguales los valores se apagaria el motor.
else if (sigpos == valorSensor || difvalors < error ) {
digitalWrite (pinLed2, LOW);
digitalWrite (pinLed, LOW);
delay(1); }
}
el video: notaran por momentos alguna lentitud. es el motor que le falta fuerza. es pequeño. pero los movimientos los probé bastante y es preciso. siempre analizando el serial y comparando las ubicaciones de ambos potenciometros. tanto el de posicion de motor como el de posicion deseada.
bueno espero les guste es un ejemplo de un trabajo de un novato
-------modificado 15/12/12
gente aqui les dejo otro video pero con un motor de stereo de 12v. mas potente que el anterior
en el video se puede ver el puente h que uso.
el codigo es el mismo pero con algunas modificaciones en valores. intentando encontrar el punto justo.
basicamente: cambios de valores en las variables:
pwm = 3
pwm2 = 60
delay1 = difvalors
tambien quite el mapeo siguiente
pwm = constrain (pwm, 50 , 100);//valores min y max de pwm.
espero les guste. este mecanismo se mueve mucho mas rapido y es bastante presiso. siempre teniendo en cuenta que el grado de error es 10.