This project has a specific target of providing a low-cost, open source technological kit to allow scientists, academics, hackers, makers or OSHW fans to hack their way to ultrasound imaging - below 500$ - at home, with no specific equipment required. For complementary sources of information, you can visit:
- the github repo, for the source files, raw data and raw experiment logs;
- the online manual/book for a easily readable and searchable archive of the whole work;
- the hackaday page, where I tried to blog day-to-day experiments in a casual format;
- an article summarizing the experiment on the Journal of Open Hardware - DOI:10.5334/joh.2;
- the slack channel if you want to discuss;
- the Tindie store for the analog processing unit and the pulser or the motherboard.
- Disclaimer #0: This is not a medical ultrasound scanner! It's a development kit that can be used for pedagogical and academic purposes - possible immediate use as a non-destructive testing (NDT) tool, for example in metallurgical crack analysis. As in all electronics, be careful.
- Disclaimer #1: though an engineer, this project is the first of its sort, I never did something related. It's all but a finalized product.
- Disclaimer #2: Ultrasound raises questions. In case you build a scanner, use caution and good sense!
- Disclaimer #3: This project is not part of echopen.
Creating modules to facilitate ultrasound hacking : the principles of the echOmods is to enable a full chain of ultrasound image processing and hardware control.
We have chosen to use a module approach to make sure that each key component inside ultrasound image processing can easily be replaced and compared with another module, while providing logical logic blocks and corresponding interfaces for these modules to communicate. There's a module for high-voltage pulsing, one for the transducer, one for the analog processing, one for data acquisiton, ... and many more!
The modules sit on a breadboard, and communicate through the tracks laying below. The configuration represented below show the Basic dev kit.
and used in a wider context:
Using a simpler linux-enabled controler (the all-powerful Pi in its RPi 0 or Pi W) for the dev kit. Cost of materials aims at being as low as possible, below the 500$.
- Simply the servo and transducer module (cletus) -- get for 80$ (Where? Recycling a transducer from ebay, servo from anywhere (Amazon?))
- The Pi Heart of the echOmods (tomtom) -- get for 10$ (Where? Get the Pi W from plenty of sources)
- Using a dual ADC raspberry pHAT for 20Msps+ acquisition (elmo) -- get for 75$ (Where? OSHPark, MacroFab, Tindie)
- Goblin: a TGC-Envelop-ADC module (goblin) -- get for 149$ (Where? Custom made, get the Gerbers, or buy it preassembled on Tindie, or contact @kelu124)
- Tobo: the HV-pulser (tobo) -- get for 120$ (Where? Custom made, get the Gerbers, buy it preassembled on tindie or contact @kelu124)
Total cost of the set: 434$
uC pings emulator and streams feedback
- This is the module which emulates the signal coming from the analog processing chain. (silent) -- get for 35$ (Where? Get from Adafruit)
- The acquisition heart of the echOmods (croaker) -- get for 35$ (Where? Get Feather from Amz or Adafruit. OLED at Amz)
- Mogaba, the power supply (mogaba) -- get for 5$ (Where? Anywhere, or eg Amazon?)
- The motherboard of the echomods (doj) -- get for 5$ (Where? Anywhere for stripboard. Or PCB from OSHPark if you can order by 3. Or straight from Tindie.)
- Goblin: a TGC-Envelop-ADC module (goblin) -- get for 149$ (Where? Custom made, get the Gerbers, or buy it preassembled on Tindie, or contact @kelu124)
Total cost of the set: 229$
The default setting for the sets
- Simply the servo and transducer module (cletus) -- get for 80$ (Where? Recycling a transducer from ebay, servo from anywhere (Amazon?))
- The acquisition heart of the echOmods (croaker) -- get for 35$ (Where? Get Feather from Amz or Adafruit. OLED at Amz)
- Mogaba, the power supply (mogaba) -- get for 5$ (Where? Anywhere, or eg Amazon?)
- Goblin: a TGC-Envelop-ADC module (goblin) -- get for 149$ (Where? Custom made, get the Gerbers, or buy it preassembled on Tindie, or contact @kelu124)
- Tobo: the HV-pulser (tobo) -- get for 120$ (Where? Custom made, get the Gerbers, buy it preassembled on tindie or contact @kelu124)
Total cost of the set: 389$
Some stuff, unexpensive to buy, to build a ultrasound testing kit, totalling less than 500$.
- Retrohacking the ATL Access 3 probe (retroATL3) -- get for 75$ (Where? Recycling a probe from ebay)
- This is the module to get high-speed (40Msps) signal acquisition. (toadkiller) -- get for 79$ (Where? A bundle at 169$ from Groupgets or as a standalone at 79$ )
- Mogaba, the power supply (mogaba) -- get for 5$ (Where? Anywhere, or eg Amazon?)
- Goblin: a TGC-Envelop-ADC module (goblin) -- get for 149$ (Where? Custom made, get the Gerbers, or buy it preassembled on Tindie, or contact @kelu124)
- Tobo: the HV-pulser (tobo) -- get for 120$ (Where? Custom made, get the Gerbers, buy it preassembled on tindie or contact @kelu124)
- The motherboard of the echomods (doj) -- get for 5$ (Where? Anywhere for stripboard. Or PCB from OSHPark if you can order by 3. Or straight from Tindie.)
- One-eye, the controler (oneeye) -- get for 10$ (Where? from Adafruit)
Total cost of the set: 443$
[](@description Short description of the organization of modules)
To produce an image, the modules have to create a high voltage pulse, which excites a transducer. Echoes coming from the body are amplified using a TGC + LNA, which cleans the analog signal, which itself gets digitalized.
The diagram is represented below:
ThumbnailImage | Name | In | Out |
---|---|---|---|
wirephantom: Just a phantom for calibrated signals |
|
|
|
elmo: The aim of this module is to achieve 20Msps, at 9bits or more. |
|
|
|
doj: Getting a motherboard: that's fitting all the modules in an easy way, with an easy access to all tracks. See this for the Kicad files. | |||
matty: The aim is to summarize all modules in a all-inclusive board. Fast ADC, good load of memory, good SNR.. the not-so-DIY module, as it comes already assembled with nothing to do =) | |||
retroATL3: The aim of this echOmod is to get the mechanical movement of the piezos. Salvaged from a former ATL3. |
|
|
|
goblin: The aim of this echOmod is to get the signal coming back from a transducer, and to deliver the signal, analogically processed, with all steps accessible to hackers. |
|
|
|
lite.tbo: The aim of this echOmod is to get the HV Pulse done. |
|
|
|
silent: The aim of this echOmod is to simulate a raw signal that would come from the piezo and analog chain. |
|
|
- 2016-08-09: Goblin tests: Testing the goblin board with the silent emulator. (20160809a)
- 2016-08-14: RPi: Testing the acquisition with the BeagleBone DAQ. (20160814a)
- 2016-08-22: BBB+Probe: Images acquired from a BeagleBone black with a probe (20160822a)
- 2016-12-17: Croaker: Testing the acquisition with the croaker module. (20161217a)
- 2017-06-11: Croaker: Testing the acquisition with the croaker module. (20170611a)
- 2017-07-13: Elmo: Testing the new DAQ with two ADCs. (20170713a)
- 2017-07-15: RetroATL3 acquisition: Getting an image from the retroATL3 probe. (20170715a)
- 2017-09-30: Alt.tbo: Testing new pulser again 1/4 (20170930a)
- 2017-10-01: Alt.tbo: Testing new pulser again 2/4 (20171001a)
- 2017-10-01: Alt.tbo: Testing new pulser again 3/4 (20171001b)
- 2017-11-11: Alt.tbo: Testing new pulser again 4/4 (20171111a)
- 2017-11-12: Probe: Testing new probe with new pulser (20171112a)
- 2017-11-24: Impedance matching: Doing some tests for impedance matching. (20171124a)
- 2018-01-03: Felix experiment: Testing Felix setup with previous Bomanz module. (20180103a)
- 2018-01-15: Matty: Receiving the first matty. (20180115a)
- 2018-02-16: Alt.tbo and Elmo: Testing alt.tbo and elmo new boards. (20180216a)
- 2018-02-17: Alt.tbo and Elmo: Testing alt.tbo and elmo new boards for pulser issues (there is not positive and negative pulse, only goes in direction). (20180217a)
- 2018-02-24: Matty speed tests: Testing matty s acquisition at different speed, 12Msps to 24Msps. (20180224a)
- 2018-02-24: Matty Gain: Testing matty's fixed gain settings. (20180224b)
- 2018-02-25: Matty and RetroATL3: Acquisition of a probe image with matty. (20180225a)
- 2018-03-10: Matty DAQ: testing the programmation of matty DAC control for the TGC. (20180310a)
- 2018-04-03: Voltage checks: Testing matty at different voltages. (20180403a)
- 2018-04-03: Matty TGC test: Testing matty 's TGC, including playing with the gain DAC and pulse control. (20180403b)
- 2018-04-03: Tomas first acq: Tomas, a user, is getting a first image from a NDT setup with a block of steel. (20180403t)
- 2018-04-15: Test of new batch 1/2: Testing the goblin board with silent, then test of the new lite.tbo pulser with a piezo. (20180415a)
- 2018-04-15: Test of new batch 2/2: Testing the lite.tbo, goblin and elmo boards done at the fab - on a doj v2 motherboard. (20180415r)
- 2018-04-17: echomods vs MATTY: Comparing the performances of the modules vs the FPGA board Matty (20180417a)
- 2018-04-30: JSON and Servo: Better file management and servo control using Matty. (20180430a)
- 2018-05-06: SPI timing on Raspberry: Checking SPI bottlenecks on Matty (20180506a)
- 2018-05-11: Enveloppe detection: Checking different ways to rebuild enveloppe (20180511a)
- 2018-05-16: Matty file format: Testing to format the data for experiments to be easily reproduced (20180516a)
Note that the 'BONUS!' represents something that could be done, and does not count as a strict TODO.
Name of module | ToDo | Done | Progress |
---|---|---|---|
wirephantom |
|
|
50% |
elmo |
|
|
85% |
doj |
|
100% | |
matty |
|
|
33% |
retroATL3 |
|
|
77% |
goblin |
|
|
92% |
lite.tbo |
|
|
50% |
silent |
|
100% |
Here's a couple of things we're working on, for which you could help as well.
- Boosting the 6Msps croaker acquisition (see Wayne?) to the full 6Msps
- None (in wirephantom)
- See the next steps (in matty)
- Having it work with a retroATL3 (in matty)
- Test Goblin v2 (in goblin)
- Review a bipolar design (originally alt.tbo -- but double the components and hence the price) (in lite.tbo)
- add Visa, possibly Pouya and Thomas as contributors
- map interested (green)
- Add a documentation server
- Display IP on the OLED.
- Need to have a look at this RPI GPIO DMA - https://github.com/hzeller/rpi-gpio-dma-demo
- Include some cletus remarks (sourcing) on gitbook
- add some ideas for the pulser to the alt.pulser board
- remove gitbook MD files from the log
- link to files in the log (python)
- Main readme as TPL
- test some compressed sensing using golay codes on a single element piezo
- senjak 15:07 In Which a PDF is a Git Repository Containing its own Latex Source and a Copy of Itself -- https://github.com/ESultanik/PDFGitPolyglot/blob/master/make_polyglot.sh
- 20171111a and 20171112b Readmes
- impedance matching -- see more -- Butterworth-Van-Dyke or here. Tuning Filter.
- list other initiatives
- classifier articles with link Article: =)
- a page sumarizing the experiments (as in the Experiments page in the gitbook)
- Brainstorm for @senjak information design:
- un0rick site to have plenty of stuff
- Publish first drafts on un0rick GH / GH-pages / gitbook
- create v2 release once gob.v2 and corrected/working alt.tbo v2 are ready.
- use General Design Procedure for Free and Open-Source Hardware for Scientific Equipment as a reference
- compare old pulser (pulser) and new acs for matty readme
- for matty Rip this intro?
- clean all repos for a v2 release of modules
- decrypt the connector =)
- Script to check IMGs URL matches path
- reorganise Loved Nasa: add to un0rick
- change path of images when they have changed
- Create detailed pages for the community in the gitbook
- Create detailed pages for each probe I've played with in the gitbook
- add dp location
- listing experiments of others
- before reclean full repo, create release "Full Dev Resources" and get corresponding version (v1.9 + hash)!
- : Add Full GitBook PDF to it before
- Sort the list of experiments, shortnames in SUMMARY
- Community: list the contributors in a page + add the experiment. Individual page to point to experiment.
- Page on documentation
- Edit history page to add Matty.
- Rewrite the Chapters Readme -> "This chapter is dedicated to the brain_dumps "
- Do a Doj (LOW PRIORITY)
- Redo a usable alt.tbo (LOW PRIORITY)
- Clean Modules list (keep lite.tbo, goblin, cletus, doj, elmo, matty) + add "CNprobe"
- Make 7 clean QuickStarts for remaining modules // copy them on Tindie.
- Get "ShortNames" in JSON
- Put alt.tbo, tobo, loftus, tomtom, croaker, retroATL3 and wirephantom in retired modules + add "PU3090" phantoms in retired
- Remove sets in doc
- Remake homepage in autodoc
- Clean obsolete versions in repos
- contact the author !
- Resume work on article - Draft is here
- contact the guys from https://www.iith.ac.in/~raji/Cpapers/LPFB.pdf (check their prices)
- add Anna and Matthew to users list
ThumbnailImage | Name | In | Out |
---|---|---|---|
sleepy: The aim of this echOmod is to encase the whole modules object in a neat case, making it transportable. |
|
|
|
tobo: The aim of this echOmod is to get the HV Pulse done. |
|
|
|
alt.tbo: The aim of this echOmod is to get the HV Pulse done. |
|
|
|
cletus: The aim of this module is to interface the transducer and the servo, aka the physical parts, to the analog part of the modules chain. More to come with the Loftus head. |
|
|
|
tomtom: The aim of this echOmod is to digitalize the signal, and to control the pulser, servo, ... |
|
|
|
oneeye: The module aims at making a microcontroler, for the moment the ArduinoTrinketPro , usable with the motherboard and the set of modules. |
|
|
|
croaker: The aim of this echOmod is to receive the signal and process it, then stream it over wifi. |
|
|
|
toadkiller: The aim of this echOmod is to simulate the enveloppe (or maybe soon the raw signal) that would come from the piezo and analog chain. |
|
|
|
retro10PV: The aim of this echOmod is to get the mechanical movement of the piezos. Salvaged from a former ATL10PV. |
|
|
|
loftus: The aim of this module is to recycle a previous head |
|
|
|
mogaba: The aim of this echOmod is to get 3.3V and 5V done. |
|
|
Name | Title | Amplitude | Raspberry GPIO |
---|---|---|---|
ITF-1_GND |
Ground | [0V] | |
ITF-2_VDD_5V |
5V alimentation | [5V, 5V] | |
ITF-3_ENV |
Enveloppe of the signal | [0V, 2.5V] | |
ITF-4_RawSig |
Amplified filtered signal | [0V, 2.5V] | |
ITF-5_RENV |
Raw signal envelope | [VREF, 2.5V] | |
ITF-6_P6 |
_ OLED SDA_ | [0V, 3V] | GPIO 02 |
ITF-7_GAIN |
Amplifier gain control | [0V, 1V] | |
ITF-8_P8 |
-Pi OLED SCL | [0V, 3V] | GPIO03 |
ITF-9_Pon |
Pulse on | [0V, 5V] | Jumper to connect to GPIO 23 |
ITF-10_Poff |
Pulse off | [0V, 5V] | Jumper to connect to GPIO 24 |
ITF-11_OffSig |
Signal offset by Vref/2 | [0V, 3.3V] | |
ITF-12_RPIn |
Pi ADC DAQ | [0V, 3.3V] | GPIO 05 |
ITF-13_P13 |
Unused | ||
ITF-14_PWM |
Servo PWM | [0V, 3.3V] | GPIO 06 |
ITF-15_GPIO21 |
GPIO21 connection | GPIO 21 | |
ITF-16_POn3 |
Pulse On 3V | [0V, 3.3V] | GPIO 23 |
ITF-17_POff3 |
Pulse Off 3V | [0V, 3.3V] | GPIO 24 |
ITF-18_Raw |
Raw signal fro transducer | [-5V, 5V] | |
ITF-19_3.3V |
3.3V alimentation | [3.3V, 3.3V] |
-> Core
#define ADC_CLK 4
#define RPIn 5
#define PWM 6
#define Puls_ON 23
#define Puls_OFF 24
#define TRACKER 21
-> Optional
#define oled_sda 2
#define oled_sdc 3
//ADC 1
#define BIT0_PIN 16
#define BIT1_PIN 17
#define BIT2_PIN 18
#define BIT3_PIN 19
#define BIT4_PIN 20
#define BIT5_PIN 22
#define BIT6_PIN 25
#define BIT7_PIN 26
#define BIT8_PIN 27
//ADC 2 (leaves SPI0 free)
#define BIT0_PIN 7
#define BIT1_PIN 8
#define BIT2_PIN 9
#define BIT3_PIN 10
#define BIT4_PIN 11
#define BIT5_PIN 12
#define BIT6_PIN 13
#define BIT7_PIN 14
#define BIT8_PIN 15
The echOmods project and its prototypes are open hardware, and working with open-hardware components.
Licensed under TAPR Open Hardware License (www.tapr.org/OHL)
Copyright Kelu124 (kelu124@gmail.com) 2015-2018
The following work is base on a previous TAPR project, Murgen - and respects its TAPR license.
Copyright Kelu124 (kelu124@gmail.com) 2015-2018
This project is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE.
[](@autogenerated - invisible comment)