Body-ultrasound Sonography With Arduino
My hobby and passion is to realize physics projects. One of my last work is about ultrasonic sonography. As always I tried to make it as simple as possible with parts you can get on ebay or aliexpress. So let’s take a look how far I can go with my simple items…
I was inspired by this a bit more complicated and more expensive project:
Here are the parts you’ll need for my project:
the main parts:
- a gauge to measure the thickness of paint for 40 USD: ebay paint thickness gauge GM100
- or just the 5 MHz transducer for 33 USD: ebay 5 MHz transducer
- an arduino Due for 12 USD: ebay arduino due
- a 320×480 pixel display for 11 USD: 320×480 arduino display
- two 9V/1A power supplies for the symmetric +9/GND/-9V supply
- ultrasound-gel for sonography: 10 USD ultrasound gel
for the transmitter:
- a step-up-converter for the needed 100V for 5 USD: 100V boost converter
- a common step-up-converter supplying 12-15V for the 100V-boost-converter for 2 USD: XL6009 boost-converter
- a LM7805 voltage regulator
- monoflop-IC 74121
- mosfet-driver ICL7667
- IRL620 mosfet: IRL620
- capacitors with 1nF (1x), 50pF (1x), 0.1µF (1x electrolytic), 47µF (1x electrolytic), 20 µF (1 x electrolytic for 200V), 100 nF (2x MKP for 200V: 100nF20µF
- resistors with 3kOhm (0.25W), 10kOhm (0.25W) and 50Ohm (1W)
- 10 kOhm potentiometer
- 2 pcs. C5-sockets: 7 USD C5 socket
for the receiver:
- 3 pcs. AD811 operational amplifie: ebay AD811
- 1 pcs. LM7171 operational amplifie: ebay LM7171
- 5 x 1 nF capacitor, 8 x 100nF capacitor
- 4 x 10 kOhm potentiometer
- 1 x 100 kOhm potentiometer
- 0.25W resistors with 68 Ohm, 330 Ohm (2 pcs.), 820 Ohm, 470 Ohm, 1.5 kOhm, 1 kOhm, 100 Ohm
- 1N4148 diodes (2 pcs.)
- 3.3V zener diode (1 pcs.)
Step 1: My Transmitter- and Receiver-circuits
Sonography is a very important way in medicine to look inside the body. The principle is simple: A transmitter sends ultra-sonic-pulses. They spread out in the body, are being reflected by inner organs or bones and come back to the receiver.
In my case I use the gauge GM100 for measuring the thickness of paint layers. Though not really intended for looking inside the body i am able to see my bones.
The GM100-transmitter works with a frequency of 5 MHz. Therefore you have to create very short pulses with a length of 100-200 nanoseconds. The 7412-monoflop is able to create such short pulses. These short pulses go to the ICL7667-mosfet-driver, which drives the gate of an IRL620 (attention: the mosfet must be able to handle voltages up to 200V!).
If the gate is switched on, the 100V-100nF-capacitor discharges and a negative pulse of -100V is applied to the transmitter-piezo.
The ultrasonic-echoes, received from the GM100-head are going to a 3-stage amplifier with the fast OPA AD820. After the third step you’ll need a precision-rectifier. For this purpose I use an LM7171 operational amplifier.
Pay attention: I got the best results, when I shorten the input of the precision-rectifier with a dupont-wire-loop (? in the circuit). I don’t really understand why but you’ll have to check it if you try to reconstruct my ultrasonic-scanner.
Step 2: The Arduino-software
The reflected pulses have to be stored and displayed by a microcontroller. The microcontroller must be fast. Therefore I choose an arduino due. I’ve tried two different types of fast analog-read-codes (look at the attachments). One is faster (about 0.4 µs per conversion) but I got 2-3 times the same value when reading in the analog input. The other one is a bit slower (1 µs per conversion), but hasn’t the disadvantage of the repeated-values. I’ve chosen the first one…
There are two switches on the receiver-board. With those sitches you can stop the measurement and choose two different time-bases. One for measure-times between 0 and 120 µs and the other between 0 and 240 µs. I realized this by reading out 300 values or 600 values. For 600 values it takes twice the time, but then I take just every second analog-in-value.
The incoming echoes are being read with one of the analog-input-ports of the arduino. The zener-diode should protect the port for too high voltages because the arduino due can only read voltages up to 3.3V.
Each analog-input-value is then transformed into an value between 0 and 255. With this value a further grey-coloured-rectancle will be drawn on the display. White means high signal/echo, dark-grey or black means low signal/echo.
Here are the lines in the code for drawing the rectangles with 24 pixel width and 1 pixel height
for(i = 0; i < 300; i++)
values[i] = map(values[i], 0, 4095, 0, 255);
myGLCD.setColor(values[i], values[i], values[i]);
myGLCD.fillRect(j * 24, 15 + i, j * 24 + 23, 15 + i);
Read more: Body-ultrasound Sonography With Arduino