Hola soy un joven algo nuevo en este mundo del Arduino y la programación seré algo breve en lo que necesito realizar: tengo un sensor Flexiforce A201 y estoy tratando de hacer un código de calibración en donde me muestre en el monitor serie los kg/lb del sensor que por ejemplo a la hora de aplicar una masa de 500lb me muestre ese rango y también la fuerza aplicada pero entonces solo cuando yo aplique dicha masa en el sensor se represente en el monitor serie y no me salga una serie de números solo cuando un objeto se encuentre realizando una fuerza al sensor.
el sensor tiene un máximo rango que es de 1000lb = 4,448 N ese máximo rango quiero aplicarlo en el sensor que llegue a ese limite
Hola Jhonny, según entiendo quieres ver resultados solo cuando hay fuerza aplicada. Es meramente un problema de programación, parte escribiendo tu código, y publícalo aquí según las reglas del foro, luego recibirás ayuda de seguro. Un diagrama esquemático de tu circuito también será de ayuda. Saludos,
Moderador:
Por favor, lee las Normas del foro y edita tu título reemplazándolo por algo que sea acorde con tu consulta. 5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYDUA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!
Ejemplo de un buen título:
float cf = 19.5; // factor de calibración
int ffs1 = A0; // sensor flexiforce esta conectado al pin analógico A0 del Arduino uno
int ffsdata = 0;
float vout;
void setup ()
{
Serial . begin (9600);
pinMode(ffsl, INPUT);
}
void loop()
{
ffsdata = analogRead(ffs1);
vout = (ffsdata * 5.0)/1023.0;
vout = (vout * cf);
Serial. print("flexi force sensor:");
Serial. println (vout,3);
delay(100);
}
este es el código de calibración que tengo en el muestra la fuerza que uno aplica al sensor y como se ve en la imagen en el monitor serie me va mostrando los valores, pero como tal quiero que me muestre ese valor en KG/LB y también la fuerza (N) aplicada, en lo posible cuando aplique la fuerza me indique que se esta presionando el sensor y me muestre los KG/LB, la fuerza (N) y el voltaje
pero tuve complicaciones con ese circuito y no pude obtener valores como corresponde nose si a la hora del montaje me quedo algo mal y otra cosa que quiero es que en la grafica que se muestra de Resistencia fuerza es inversamente proporcional no se que debo hacer para que la grafica me cambie a directamente proporcional.
Edita el titulo por favor!! 2da advertencia que te hago.
Ahora miro el datasheet y te respondo.
A ver como se comporta este código.
float cf = 19.5; // factor de calibración
int ffs1 = A0; // sensor flexiforce esta conectado al pin analógico A0 del Arduino uno
unsigned int ffsdata;
float vout;
#define NEWTON 4.4482 //1 libra = 4.4482 N
void setup ()
{
Serial . begin (9600);
pinMode(ffsl, INPUT);
}
void loop()
{
ffsdata = analogRead(ffs1);
vout = (ffsdata * 5.0)/1023.0;
vout = (vout * cf);
if (abs(vout-0.5) <= 0.2) { // si estamos dentro de un rango de 0.2 de los 0.5V entros presento.
Serial.print("V volts Libras Newton");
Serial.print(vout,3);
float libras = vout*cteLibras;
Serial.print(libras);
float newton = libras*NEWTON;
Serial.println(newton);
}
delay(100);
}
NOTA: no entiendo en donde obtiens los kg/lbs que mencionas.
si entiendo pero lo ideal de esto hacer el circuito y poder obtener los valores que yo desee como había dicho anteriormente es decir que cuando aplique una masa de cualquier valor me arroje ese valor y así mismo la fuerza aplicada.
tengo otro código pero este lo encontré en Google lo probé pero hace falta lo que pido
int fsrPin = 0;
int fsrReading;
int fsrVoltage;
unsigned long fsrResistance;
unsigned long fsrConductance;
long fsrForce;
void setup(void){
Serial.begin(9600);
}
void loop(void){
fsrReading = analogRead(fsrPin);
Serial.print("Analog reading = ");
Serial.println (fsrReading);
//
fsrVoltage = map(fsrReading,0,1023,0,5000);
Serial.print("Voltage reading in mV = ");
Serial.println(fsrVoltage);
if (fsrVoltage == 0 ) {
Serial.println("No pressure");
} else{
//
//
fsrResistance = 5000 - fsrVoltage;
fsrResistance *= 10000;
fsrResistance /= fsrVoltage;
Serial.print("FSR resistance in ohms = ");
Serial.println(fsrResistance);
fsrConductance = 1000000;
fsrConductance /= fsrResistance;
Serial.print("Conductance in microMhos: ");
Serial.println(fsrConductance);
//
if(fsrConductance <= 1000){
fsrForce = fsrConductance / 80;
Serial.print("Force in Newtons: ");
Serial.println(fsrForce);
}else {
fsrForce = fsrConductance - 1000;
fsrForce /=30;
Serial.print ("Force in Newtons: ");
Serial.println(fsrForce);
}
}
Serial.println("---------------------");
delay(1000);
}
en este codigo me muestra lectura de voltaje en mV, cuando el sensor no esta precionado, resistencia del FSR en ohms, conductancia en MicroMhos, y la fuerza Newtons. este codigo es sacado de un foro que publicaron del SENSOR FLEXIFORCE A301 entonces nose si este codigo lo pudiera adaptar a mi sensor el A201 y obtener adicinal los kg/lb ya que en el codigo le falta esos detalles.
tengo otro codigo que tambien busque pero esta en matlab y lo tengo todo completo pero me aparece unos errores ya te regalo en link para que lo veas
matlab arduino este es enlace donde copila el código en matlab y muestra como se comporta tal cual como se ilustra quiero representar en cuanto al circuito para el sensor estoy buscando el mejor circuito para lo que estoy necesitando que me arroje los valores mas altos en este caso según el manual del fabricante son 1000lb.
Pero no querias que te mostrara datos solo cuando colocabas el peso de 500Lbs? Por eso te puse esa condición abs(vout-0.5) porque toda pesa que este en ese orden con un error menor igual a 0.2 hará que se impriman datos cada 100 mseg
No surbyte cuando coloque cualquier peso me aroje el peso exacto que tiene la masa.
Por ejemplo si ubique en el sensor una masa de 100lb me marca el sensor las 100lb si ubique una masa de 1kg me tiene que arrojar el sensor ese valor y asi independietemente del peso aplicado, bueno en este caso como dice el fabricante su maxima capacidad es de 1000lb = 453kg similar a una bascula que me muestra las libras y el kilogramo que se esta aplicando, esto es lo que quiero por un lado y además de eso que me muestra la cantidad de fuerza (NEWTONS) aplicada.
Con el código que te pasó @Surbyte, haces UN cálculo para pasar de lb a kg y fin del asunto.
Está bien que seas novato con el arduino pero hacer esa conversión es algo trivial.
De la forma en que está conectado el circuito, la resistencia R_s del sensor está dada por:
R_s = R_0*(1023- ADC)/ADC
En donde ADC es la lectura análoga que va de 0 a 1023, y R_0 es la resistencia en serie, en este caso 10k. Puedes verificar lo anterior estudiando lo que es un divisor de voltaje.
Luego la fuerza F será:
F=k/R_s = k*ADC/(1023-ADC)/R_0
En donde k esta una constante que debe ser encontrada por una calibración (Tarea).
Usando el código de Surbyte:
#define NEWTON 4.4482 //1 libra = 4.4482 N
#define ffs1 A0 // sensor flexiforce esta conectado al pin analógico A0 del Arduino uno
#define R0 10000.0 //resistencia en serie, medir con multímetro y colocar aquí valor exacto
#define k 1.0 //factor de calibración, medir, 1.0 no es el valor real.
unsigned int ffsdata;
void setup ()
{
Serial.begin (9600);
}
void loop()
{
ffsdata = analogRead(ffs1);
float F= k*ffsdata/(1023-ffsdata)/R0;
Serial.print(F);
}
Con este código vas a poder efectuar la calibración. Lo que quieres hacer, de leer el sensor solo cuando cambia, es más complejo, en principio creo que debes calcular un promedio rodante, y si el valor cambia más de cierto porcentaje del promedio, entonces mostrar la medición. Saludos.
Mostrar las lecturas del sensor cuando cambian es fácil pero el problema es si no se mantienen estables, por eso @JBBOP habla de un promedio.
Tomas N muestras y las promedias. Ese valor se mantendrá mas o menos constante. Estableces un UMBRAL de cambio digamos si se modifica 1.0 libra x decir algo o 0.5 libras entonces muestras valores.
Para estos casos me gustan los promedios móviles. Aquel que toma muchas muestras pero solo quita lal mas vieja y agrega la nueva sosteniendo el promedio sin tanto gasto en tiempo. De ese modo si tienes N muestras y N es 20 por ejemplo, no tardo el delay() asignado x muestra sino que con cada ciclo tendré un promedio. Es un detalle pero mejora todo el código.
Uso el promedio movil de Luis Llamas, tiene una librería que se encuentra en el Administrador de Programas del IDE.
Asi que imagina que lo haces y que tienes en un momento dentro del loop el promedio actualizado.
Luego usas eso que ya te habia puesto.
El cambio de peso no es tan simple ahora que lo pienso.
Cuando cambies de masa antes debes retirar el elemento a medir, y la indicación caerá a 0 y luego colocarás otra masa y subirá al valor que corresponda.
Entonces cómo pretendes detectar eso?
@Surbyte si compañero como indicas al final del texto o comentario se retira la masa que este y vuelve a 0 cuando ubique la otra masa me muestra el peso de esa masa y asi con cualquier otra masa solo hasta las 1000lb.
Bien, entonces el cambio es solamente de lograr que la masa sea mayor que un minimo y que este estable. Eso facilmente si consigue con promedio como te hemos dicho ademas de descartar un valor minimo digamos descartable.
Entiendes como sería?