hola gente. mucho tiempo sin publicar nuevos proyectos.
hoy les paso unos videos de dos prototipos que hice para un forcefeedback. esto seria aplicar fuerzas a un volante de pc para juegos. mediante la obtencion de datos con xsim....
el codigo es muyyyy simple queda mucho por mejorar... seguro aqui podran darme buenos consejos... al igual que en la electronica para disminuir ruido de motor y pwm.
bueno estos son los dos prototipos.
prototype1
prototype2
videos
en este video tengo algunas mejoras en configuracion del xsim. hay mejores respuesta a efectos.
les comento la mecanica
el prototipo 1. basicamente es una gran reduccion de una vieja maquina, a la cual al eje conducido lo transmito mediante una barilla al volante pero esta esta segmentada. entre segmentos utilizo un trozo de manguera ajustada a modo de embrague. el problema de este es el gran ruido de la reduccion metalica (sumado al motor) y la flexibilidad de la manquera, esto ultimo le quita velocidad de respuesta.....
el prototipo 2 esta armado con un rodillo de impresora de matriz...y a ambos lados de el tenemos dos ejes pasa hojas de otra impresoras. estos estan mediante reducciones movidas por un motor. la ventaja de este sistema es la proteccion al motor de contra giros... es decir si el motor gira a un lado y el volante a otro.. el rodillo patina (a modo de embrague) pero se sigue sintiendo la friccion o empuje de los ejes hacia el lado del motor.
otra ventaja es la rigidez del eje del volante, no es un volante blando como normalmente lo son. esto se asemeja mas a uno de verdad....
queda mucho por depurar todavia.... faltan respuestas.. falta perfeccionar el codigo ..... bueno pero estoy super conforme por ahora....
espero sus criticas...y sus recomendaciones... como por ejemplo para disminuir el ruido del motor...
P/D: el puente H que utilizo es el de 10A H-Bridge Motor Controller - Introduction | PyroElectro - News, Projects & Tutorials
el codigo
int motor = 3;
int motor2 = 5;
int giroi;
int girod;
int Gforce = 0;
int Gforce1 = 0;
int Gforce10 = 0;
int Gforce100 = 0;
char kind_of_data;
void setup() {
Serial.begin(9600);
}
void loop() {
while(Serial.available() > 0) {
kind_of_data = Serial.read(); //para USO X~a01~ Y~a02~
if(kind_of_data == 'X') {
Read_Pos(kind_of_data);
}
if(kind_of_data == 'S') {
Read_Pos(kind_of_data);
}
}
}
void Read_Pos(char motor_ffb){
delay(2);
int Gforce100 = Serial.read()- '0';
delay(2);
int Gforce10 = Serial.read()- '0';
delay(2);
int Gforce1 = Serial.read()- '0';
//if (Gforce1 < 0) { Gforce = Gforce10 + 10*Gforce100; }
// if (Gforce1 < 0 && Gforce10 < 0) { Gforce = Gforce100; }
// if (Gforce100 < 0) { Gforce = 127; }
// if (Gforce1 >=0 && Gforce10 >= 0 && Gforce100 >= 0) { Gforce = 100 * Gforce100 + 10 * Gforce10 + Gforce1; }
Gforce = 100 * Gforce100 + 10 * Gforce10 + Gforce1;
if (motor_ffb == 'X') {
//Gforce = constrain ( Gforce, -255 , 255);
if (Gforce < -100) {
giroi = Gforce ;
giroi = map(Gforce ,-255 ,-100 , 100, 200);
giroi = constrain (giroi, 100 , 200);
analogWrite(motor2,0);
analogWrite(motor,giroi);
delay(10);
}
if(Gforce > 100){
girod = Gforce;
girod = map (Gforce , 100, 255, 100 , 200 );
girod = constrain (girod, 100 , 200);
analogWrite(motor,0);
analogWrite(motor2,girod );
delay(10);
}
if (Gforce >= -80 && Gforce <= 80){
analogWrite(motor,0);
analogWrite(motor2,0);
delay (10);
}
}
if (motor_ffb == 'S') { //para el stop
analogWrite(motor,0);
analogWrite(motor2,0);
}
}