Since you don't need a lot of current, (0.5V/10Ω = 50 mA), I would say using a fairly chunky op-amp as a transimpedance amplifier would do the job.
The output will be: \$V_{out} = I_{load} * R_{feedback} + V_{inPositive}\$
The first schematic has the advantage that the output has no offset. However, you need a negative voltage rail.
The second version does not require a negative voltage rail, but the output has a additional 0.5V offset.
In both circuits, the op-amp needs to be able to source the current that flows through the biosensor. With a 10Ω nominal sensor, and 0.5V, this is 50 mA, which is pretty significant, so you will need a pretty chunky op-amp. However, you would likely wind up needing a similar device for the current-source and instrumentation amp design, so there is no real advantage there.
Lastly, assuming your sensor does not go to 0Ω, it would probably be a good idea to do some offset subtraction and scaling of the output of the transimpedance amp so you're using your full ADC range.
If you can get me some more information on your system, I can probably help with that.
Edit: Phil Frost asked a question the the comments to the OP that brought up the question of whether the 50 mA current through the sensor is actually needed for it to operate correctly, or whether it was just so the circuit would produce an easy-to-measure voltage drop.
If it's just make the circuit generate a voltage drop that's easy to measure, there are other circuit topologies that would be easier to implement, with a smaller load current.
Further Edit:
Actually the sensor/chemistry reaction doesn't need a certain voltage
across it. I'm not sure if it was good choise or not but I picked up
0.5 V just to have a reasonable voltage drop.
In that case, I would drop the excitation voltage to ~0.1V. This would give you a load current of ~10 mA, which is well within the range of most op-amps, while not being so small that noise becomes a significant consideration.
Furthermore, I would probably use the second topology from above, as with that layout the precision reference voltage does not need to be able to supply a significant ammount of current, which means you could use a more common voltage reference, and a voltage divider to generate your 0.1V reference.
To maintain a decent amount of gain, you will need to increase the feedback resistor.
Lastly, I would add some capacitance across the feedback resistor, to prevent the possibility of the system oscillating. Since this is a bio-feedback thing, you're not going to have much in the way of high-frequency signals in the source, so we can roll-off the system at a few hundred Hz to a few Khz without too much issue.
We then get something like:
You will likely need to adjust the values to work (I just pulled the value of the feedback capacitor out of my posterior, for example), but it should be a good start.
Edit:
I found the cause of the spikes.
The BMI055 chip is internally flawed, I am sure of it now.
If you read out the FIFO in Bypass mode (that means only one frame is kept) then you have to expect data errors.
If you read it faster than the sampling rate you receive 10% 0x8000 (smallest possible number) in the mix. Not zero, not the last value .. a MAXIMUM value!
If you read the data a bit slower than the sampling rate, you receive valid data with 1-8 spikes per second.
This happens if you use the FIFO register in 6 or 8 byte burst mode.
Now I got curious, I read the 0x02 register in 6 byte burst and this gives the same data (x,y,z) and I changed absolutely nothing else.
The spikes are reliable gone.
previous text:
It seems that the gyroscope itself is flawed and it is not just that one.
I first expected an error in I2C communication, turned down the speed and exchanged the voltage shifting circuit without any change in results.
Now as I identified the problem to come from random high spikes I could also find many other people with similar issues or reports.
Surprising fact is that there are rarely any answers.
My first test was a moving exponential average filter, but as I expected that ruins many subsequent readings and only dampens the spikes.
The best solution I can think about is to use two gyroscopes, that is what I will do longterm.
They will likely both have spikes and by comparing both frames with each other it should be possible to get a very good result and no spikes.
The simple solution is to filter spikes based on a hardcoded max-change value.
I first considered capturing data at twice the current rate and then always lagging behind one frame.
That way I would know the 'future' and the past, if the 'current' data is way off from future and past it is a spike (or someone hit a hammer on the sensor).
But for gyros with high degree/s resolution and pratical use outside of 2000deg/sec the filtering can be easier.
I played around and was shaking the gyro heavily, the raw values rarely exceeded +10k and no matter what I did they did not have any such sudden changes, even during a drop on the table.
I use this now:
if (abs(old-current)>0x3000) use_value();
So if the result is off by more than 12,000 raw values in comparison to the previous value than the previous value will stay in the variable. Otherwise the variable is updated with the new value.
Now I have a quite low drift which even works for many minutes.
Sidenotes about the used gyro:
a) The BMI055 gyroscope is specified to return ZERO if you sample it too fast, in reality it returns random values.
b) The BMI055 gyroscope crashes the I2C bus if you send a soft_reset to it (the onchip ACC doesn't do that)
c) Sudden spikes are not described in the datasheets of the gyros and still many people notice them. That's quite strange.
I would appreciate a better answer, maybe I am wrong.
However, the spike filtration made my program work quite reliable compared to the unusable results earlier.
Best Answer
Your "MMA8452" may be out of spec or faulty.
What to expect buying cheap electronic components from eBay