ELECT 28: Balança basada amb Arduino
Per fer la balança:
Description: This is a force sensitive resistor with a round, 0.5" diameter, sensing area. This FSR will vary its resistance depending on how much pressure is being applied to the sensing area. The harder the force, the lower the resistance. When no pressure is being applied to the FSR its resistance will be larger than 1MΩ. This FSR can sense applied force anywhere in the range of 100g-10kg. These sensors are simple to set up and great for sensing pressure, but they aren't incredibly accurate. Use them to sense if it's being squeezed, but you may not want to use it as a scale.
Diu que no són molt precisos, i que no s'haurien d'utilitzar per fer una balança...
Llegeixo en la FSR Integration Notes (pdf):
- The FSR sensor is not a strain gauge, load cell or pressure transducer. While it can be used for dynamic
measurement, only qualitative results are generally obtainable. Force accuracy ranges from approximately ± 5% to ± 25% depending on the consistency of the measurement and actuation system, the repeatability tolerance held in manufacturing, and the use of part calibration. Accuracy should not be confused with resolution. The force resolution of FSR devices is better than ± 0.5% of full use force.
- For FSR Pressure or Force Switches, use the simple interfaces detailed on pages 16 and 17. (És el que jo necessito)
- Force Sensitivity Range < 100 g to > 10 kg, dependent on mechanics
- Break Force (Turn-on Force) 20 g to 100 g (0.7 oz to 3.5 oz). Dependent on mechanics and FSR build. És la força que he de fer per començar a mesurar.
La interfície elèctrica més senzilla és fer un divisor de tensió (pàg 18).
For a simple force-to-voltage conversion, the FSR device is tied to a measuring resistor in a voltage divider
configuration. The output is described by the equation:
VOUT = (V+) / [1 + RFSR/RM].
In the shown configuration, the output voltage increases with increasing force. If RFSR and RM are
swapped, the output swing will decrease with increasing force. These two output forms are mirror images
about the line VOUT = (V+) / 2.
The measuring resistor, RM, is chosen to maximize the desired force sensitivity range and to limit current.
The current through the FSR should be limited to less than 1 mA/square cm of applied force. Suggested op-
amps for single sided supply designs are LM358 and LM324. FET input devices such as LF355 and TL082
are also good. The low bias currents of these op-amps reduce the error due to the source impedance of the
voltage divider.
A family of FORCE vs. VOUT curves is shown on the graph above for a standard FSR in a voltage divider
configuration with various RM resistors. A (V+) of +5V was used for these examples.
Però té una resposta millor fer un FSR Current-to-Voltage Converter (pàg 23)
In this circuit, the FSR device is the input of
a current-to-voltage converter. The output
of this amplifier is described by the
equation:
VOUT = VREF • [-RG/RFSR].
With a positive reference voltage, the output
of the op-amp must be able to swing below
ground, from 0V to –VREF, therefore dual
sided supplies are necessary. A negative
reference voltage will yield a positive output
swing, from 0V to +VREF.
VOUT = (-RG • VREF) /RFSR.
Ara bé, el desavantatge és que es necessita un Vcc dual (+-5V). Per tant, d'entrada ho descarto i em quedaré amb la configuració més simple.
Contingut
Desenvolupament
proves amb el Arduino Mega
De moment no faig proves amb el paperduino perquè el cable FTDI que tinc només em proporciona 3,3V, i he d'aconseguir el cable que m'alimenti 5V a l'arduino. Per tant, les següents proves són amb el Arduino Mega.
De moment només faig servir un sensor dels 4 que utilitzaré. La idea de fer servir 4 sensors amb una geometria equidistant és que se suposa que si faig la mitja dels 4 sensors obtindré un valor més fiable. També es farà una mitja en el temps, fent la mitja de 8 valors successiu. Recordem que l'ús de 4 sensors fa que la pressió que nota cada sensor és la cuarta part.
El FSR forma un divisor de tensió amb una resistència de 4,7Kohm. Aquesta resistència en la imatge es veu que és una resistència variable, doncs és la millor manera de fer proves per veure quan el sensor és més sensible. Al final concloc que una resistència de 4,7Kohm és un bon valor.
Fent proves amb DEFAULT i INTERNAL, queda clar que he d'utilitzar EXTERNAL (AREF). El procediment és mirar, pel rang de pesos que vull utiilitzar, quina és la sortida de tensió de Vout. Veig que com a molt obtindré 0,4V. Per tant, he d'aconseguir aplicar aquesta tensió a AREF, i això s'aconsegueix mitjançant un divisió de tensió tal com s'explica en la imatge i com s'explica a http://arduino.cc/en/Reference/AnalogReference?from=Reference.AREF. Si llegim bé veiem que s'ha de posar una resistència de 5Kohm (potser un valor més petit?) al pin AREF. Aquest PIN internament té una resistència de 32Kohm.
La qüestió és aconseguir uns valors de resistència que facin que el rang de l'entrada analògica, en el rang de pesos que vull considerar, s'acosti a 0-1023. És a dir, aconsegueixo la màxima precisió.
Quan tingui fet tot el muntatge amb els 4 sensors hauré de mirar, a partir de pesos coneguts, quin factor de conversió he d'aplicar, tenint en consideració un possible offset, i suposant una resposta lineal com es mostra en la gràfica d'instruccions del FSR. (Veure Fitxer:Fsrguide.pdf)
És el script balanca.pde
proves amb el paperduino
Si fico
sensorPin[0] = 2;
vol dir que amb el arduino és el ANALOG2.
Compte! perquè en el disseny original del paperduino VCC i AREF estan connectats. Si vull utilitzar AREF, com és el cas, l'hauré de desconnectar del senyal de VCC.
Proves amb un LED RGB
El GND és el que té la pota més llarga
------- Verd (G) --------- Vermell (R) ------------ GND (ànode comú) ------- Blau (B)
Utilitzo els pins digitals: 51 (R), 52 (G) i 53 (B).
/*
* LilyPad tutorial: color (RGB LEDs)
*
* Uses a LilyPad RGB LED module to play with
* dynamic colored light. See this web color chart
* for the (Red,Green,Blue) values of different colors:
* http://www.visibone.com/colorlab/
*/
int redPin = 51; //11; // R petal on RGB LED module connected to digital pin 11
int greenPin = 52; //9; // G petal on RGB LED module connected to digital pin 9
int bluePin = 53; //10; // B petal on RGB LED module connected to digital pin 10
void setup()
{
pinMode(redPin, OUTPUT); // sets the redPin to be an output
pinMode(greenPin, OUTPUT); // sets the greenPin to be an output
pinMode(bluePin, OUTPUT); // sets the bluePin to be an output
}
void loop() // run over and over again
{
// Basic colors:
color(255, 0, 0); // turn the RGB LED red
delay(1000); // delay for 1 second
color(0,255, 0); // turn the RGB LED green
delay(1000); // delay for 1 second
color(0, 0, 255); // turn the RGB LED blue
delay(1000); // delay for 1 second
// Example blended colors:
color(255,255,0); // turn the RGB LED yellow
delay(1000); // delay for 1 second
color(255,255,255); // turn the RGB LED white
delay(1000); // delay for 1 second
color(128,0,255); // turn the RGB LED purple -> no funciona utilitzant els pins digitals!
delay(1000); // delay for 1 second
color(50,50,50); // llum blanca poc clara -> no funciona utilitzant els pins digitals!
delay(1000); // delay for 1 second
color(0,0,0); // turn the RGB LED off
delay(1000); // delay for 1 second
}
void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function
{
analogWrite(redPin, red);
analogWrite(bluePin, blue);
analogWrite(greenPin, green);
}
Ara bé, utilitzant els pins digitals no puc ficar informació entre 0 i 255 pins (sí que puc, però el pin només agafarà els valors HIGH i LOW). Per tant, si vull fer coses com
color(128,0,255); color(50,50,50); // llum blanca poc clara -> no funciona utilitzant els pins digitals!
he d'utilitzar els pins analògics i utilitzar PWM per aplicar la tensió correcta (pins 9, 10 i 11)
int redPin = 9; // R petal on RGB LED module connected to digital pin 11
int greenPin = 10; // G petal on RGB LED module connected to digital pin 9
int bluePin = 11; // B petal on RGB LED module connected to digital pin 10
void setup()
{
pinMode(redPin, OUTPUT); // sets the redPin to be an output
pinMode(greenPin, OUTPUT); // sets the greenPin to be an output
pinMode(bluePin, OUTPUT); // sets the bluePin to be an output
}
void loop() // run over and over again
{
/*
// Basic colors:
color(255, 0, 0); // turn the RGB LED red
delay(1000); // delay for 1 second
color(0,255, 0); // turn the RGB LED green
delay(1000); // delay for 1 second
color(0, 0, 255); // turn the RGB LED blue
delay(1000); // delay for 1 second
// Example blended colors:
color(255,255,0); // turn the RGB LED yellow
delay(1000); // delay for 1 second
color(255,255,255); // turn the RGB LED white
delay(1000); // delay for 1 second
color(128,0,255); // turn the RGB LED purple -> no funciona utilitzant els pins digitals!
delay(1000); // delay for 1 second
color(20,20,20); // llum blanca poc clara -> no funciona utilitzant els pins digitals!
delay(1000); // delay for 1 second
color(0,0,0); // turn the RGB LED off
delay(1000); // delay for 1 second
*/
for (int i=0; i<=255; i=i+5){
color(i,i,i); // canviem el color blanc gradualment
delay(50); // delay for 1 second
}
for (int i=255; i>=0; i=i-5){
color(i,i,i); // canviem el color blanc gradualment
delay(50); // delay for 1 second
}
}
void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
creat per Joan Quintana Compte, abril 2010