6 wire force transducer

Hi all,

I am an absolute beginner (or not even that) to the arduino system and would like to ask you for the feasability of a little idea.
I would like to connect a 6 wire force transducer (http://www.hbm.com/fileadmin/mediapool/hbmdoc/technical/a3592.pdf) to an arduino. If this was possible I would be very glad for any ideas on how to start that project. As I said, I don't have any idea about the arduino systems yet, but if hooking the force transducer to the arduino is possible I'll begin to look further into it. I just don't want it to be a total shot in the dark.

Best regards

Patrick

I suggest you use an instrumentation amplifier such as INA122. Figure 5 in the datasheet at http://www.ti.com/lit/ds/sbos069/sbos069.pdf gives the general arrangement. However, I suggest you power the force sensor from +3.3V instead of using the current source shown. Also connect +3.3V to the Aref pin and make an analogReference(EXTERNAL) call in setup.

Thanks for the reply! So it seems like it is possible. The only limit seems to be my knowledge on microcontrollers and electro engineering.
Unfortunately I don't understand what the job of the instrumentation amplifier is here.
The datasheet of the force transducer says that 6 wires are needed, looking at fig. 5 in the INA122's datasheet I only see 4 wires coming from that bridge, how to handle the 6?
Also the INA122 seems not be available in Germany, maybe there is an alternative?
Another question would be how I would ensure 5V excitation voltage for the force transducer.

zanchin:
Thanks for the reply! So it seems like it is possible. The only limit seems to be my knowledge on microcontrollers and electro engineering.
Unfortunately I don't understand what the job of the instrumentation amplifier is here.

Its job is to amplify the small differential signal generated by the force transducer to deliver a larger single-ended signal to the Arduino analog input pin.

zanchin:
The datasheet of the force transducer says that 6 wires are needed, looking at fig. 5 in the INA122's datasheet I only see 4 wires coming from that bridge, how to handle the 6?

The datasheet also mentions the 4-wire configuration. Just connect gray and black to +3.3V, and connect blue and green to ground.

zanchin:
Also the INA122 seems not be available in Germany, maybe there is an alternative?

Try de.farnell.com, they can supply it.

zanchin:
Another question would be how I would ensure 5V excitation voltage for the force transducer.

I am suggesting that you use 3.3V for the excitation voltage. You could use the Arduino 5V pin instead, however if you are powering the Arduino from USB than there will be a lot of noise on that pin, which will interfere with the measurement. The transducer is just a bridge of 4 resistors, so it will work OK with a lower excitation voltage.

OK, I'll just buy the stuff and see where I'll get =)
There are several INA122 versions, P, PA, U and so on. Which of these do I have to choose?

And is there something else I should get (to save on the shipping costs)?

zanchin:
There are several INA122 versions, P, PA, U and so on. Which of these do I have to choose?

The P versions of the INA122 are in dual-in-line packages, so good for prototyping and for assembling on perfboard or stripboard. The U versions are in surface-mount packages.

The -A versions have relaxed tolerances, so they will give less accurate measurements.

You will also see another instrumentation amplifier - the INA125 - used in similar circuits, for example http://cerulean.dk/words/wp-content/single-supply-bridge-amplifier.gif. However, that one does not have rail-to-rail output, so it is more difficult to use.

zanchin:
And is there something else I should get (to save on the shipping costs)?

That depends on what you want to do with the data that you measure. If you want to display it, you could consider getting an LCD display. 16 x 2 (characters x rows) is commonly used. If you want to control equipment, you might need SSRs or mosfets.

The two extra wires (+ and - sense) are for connecting to a special type of power supply that senses the voltage, at the transducer, and adjusts the power supply output to maintain the correct excitation voltage at the transducer. This is like a Kelvin connection. It compensates for cable resistance in long cables. They don't need to be connected for the transducer to work.

edit Are you going to measure tension and compression loads? If so you will need level shifting as well as amplification. Do you want to electrically balance the bridge or take care if imbalance in software?

Google for TM7709 this is a ready to go 24 bit amplifier for load cells that connect to any Arduino based.
Uses three pins 11,12 and 13 on the Arduino
Cost are 6 $ or so on ebay.
The two extra wires on the laod cell are compensation wires.
I use this TM7709 for load cell measurement too where I measure spring rate forces.
here is some code too
http://forum.arduino.cc/index.php?topic=178902.0

Thanks for the answers.

The TM7709 sound interesting of course but unfortunately I really don't find a way to buy it in Germany.
I'll look some more tomorrow.

Ebay delivers worldwide Germany included :slight_smile:

Unfortunaly not even on ebay world wide.... I'll get one of the INAs now and if there is a chance a TM, too.

Removed provided link as you are right on Ebay all tm7709 are sold out. :frowning:

The only datasheet I can find on the TM7709 is in Chinese. From what I can tell, it is a 24-bit ADC. I guess that it is equivalent to e.g. a 14-bit ADC preceded by an amplifier with a gain of 1024.

Searching Farnell for 24-bit ADCs, I found this one http://uk.farnell.com/texas-instruments/ads1231id/adc-24bit-spi-10-80sps-16soic/dp/1882261 which is specifically designed for use with bridge sensors. It combines an instrumentation amplifier and a 24-bit DAC. It even supports a 6-wire connection - see fig. 15 and fig. 23 on the datasheet http://www.farnell.com/datasheets/1558340.pdf. Zanchin, you should be able to get it from farnell.de. It comes in a SOIC-16 package, so to use it you'll need a DIP adapter board such as http://uk.farnell.com/jsp/search/productdetail.jsp?SKU=2302057&MER=bn-me-pd-r3-cust-all-2302057 (less expensive ones available on eBay) unless you will be making a PCB.

I bought an INA122P on ebay yesterday, so I'll try it first. Unfortunately the parts are not so cheap including shipping...

So, hi again, the INA122P finally arrived - the hong kong post was overloaded...
If some help could be provided again I would be very happy. I am looking at figure 5 in http://www.ti.com/lit/ds/sbos069/sbos069.pdf like dc42 suggested.
So I have some questions about how to connect it (sorry for me being such a newbie):
1,8: What is the RG?
2,3: Connect there to the load cell.
4,5: Connect these to Arduino GND?
6: What is V0?
7: Arduino 5V, but what is the REF200-thing?

Regards

zanchin:
1,8: What is the RG? Rg sets the gain. Unfortunately, the sensitivity value on the datasheet makes no sense. It is given as 2mV/V, which is not a measure of sensitivity - it should be given in mV/VN. If the 2mV/V refers to the output at the full rated force, then you will need a gain of about 500. Page 7 of the INA122 datasheet gives the gain formula, and the table in Fig 1 gives the values of Rg you need for various gain values.

2,3: Connect there to the load cell. Yes.
4,5: Connect these to Arduino GND? Yes.
6: What is V0? That is the output, which you connect to an analog input pin of the Arduino.
7: Arduino 5V, but what is the REF200-thing? Ignore it, connect the two positive excitation load cell wires (blue and green) to +3.3V or +5V instead (see my earlier replies for why 3.3V might be a good idea).

Thanks for the reply. Then I believe if I connect everything like this it should be OK:

The four resitors shall symbolise the load cell.

I only have two 220Ohm resistors at hand though, so I'll try it with those two first (500 Gain = 402 Ohm).

The next step will be a writing the code.

Unfortunately I just noticed that the load cell is a four wire type after all: http://www.atp-messtechnik.de/media/products/K-25-N2XX-G21_D_Datenblatt.pdf. But I guess this changes nothing as the current configuration is actually for a four wire load cell, right?

I would make a couple of changes:

  1. Connect the AREF pin to +3.3V. But then you must call analogReference(EXTERNAL) in setup(), before your first call to analogRead.

  2. Connect a 0.1uF ceramic capacitor across the V+ and V- pins of the INA122.

Also, check whether the LCD has a built-in series resistor for the backlight, or needs an external one.

OK, thanks for the review. Could you please outline what the capacitor is for?

This could be the code:

//###### display ######
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


//##### load cell #####
// analog readings must be entered
float loadA = 1; // kg
int analogvalA = 200; // analog reading for load A

float loadB = 2.5; // kg 
int analogvalB = 600; // analog reading for load B

float analogValueAverage = 0;

// reading frequency and duration
long time = 0; //ms
int timeBetweenReadings = 200; //ms


void setup() {
  analogReference(EXTERNAL);
  
  //###### display ######
  // 16x2 display
  lcd.begin(16, 2);
  // message in (0,0)
  lcd.print("current load:");
  
  //###### load cell ######
  // initialise serial monitor
  Serial.begin(9600);  
}


void loop() {
  //###### load cell ######
  //read from analog port
  int analogValue = analogRead(0);

  // printing
  if(millis() > time + timeBetweenReadings){
    float load = analogToLoad(analogValue);

    Serial.print("analogValue: ");Serial.println(analogValue);
    Serial.print("             load: ");Serial.println(load,5);
    time = millis();
    
    //###### display ######
    // print load to lcd
    lcd.setCursor(0, 1);
    lcd.print("kg");
    lcd.setCursor(3, 1);
    lcd.print(load);
  }
}

float analogToLoad(float analogval){
  // calculate load as a float
  float load = mapfloat(analogval, analogvalA, analogvalB, loadA, loadB);
  return load;
}

float mapfloat(float x, float in_min, float in_max, float out_min, float out_max){
  // calculate load by linear interpolation
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

The capacitor is a decoupling capacitor, to ensure the amplifier remains stable. It is shown in Fig 1 on the datasheet.

Instead of:

  if(millis() > time + timeBetweenReadings){

use:

  if(millis() - time >= timeBetweenReadings){

because it handles the case of the value returned by millis wrapping round. Also change the type of 'time' to 'unsigned long', and the type of 'timeBetweenReadings' to 'unsigned int' or 'unsigned long' (also declare it 'const' if you are not planning to change it within the program).

You have declared analogValueAverage, but not used it.