un0rick - open source ultrasound
Non destructive testing and imaging ultrasound have been around since the '50s. Many ultrasound open-source projects are emerging, mostly focusing on image processing - while hardware has been left behind. Several teams have produced succesful designs to be used on commercial US scanners, but they are not cheap, and are difficult to access.
I couldn't find designs to play with, that would be affordable or open, so I decided to make one for makers, researchers and hackers.
the board
Overview
This is a simple single-channel ultrasound board. Block diagram below:
Step-by-step
- Program the fpga using a open-source toolchain
- Control the board fully through SPI, be it through USB, a Raspberry Pi, or even an arduino.
- Set up the acquisition sequence through SPI (for example using this python lib for Raspberry Pi)
- Get the data back again through SPI, and process it.
I recommend using RPi, particularly W for the wireless aspects, which then becomes the board server. There's a dedicated 20x2 header. Prepared are image for the RPi W, a python lib as well.
Examples
- With a Raspberry pi
The board was connected to a single element piezo, in water, with a reflector a few centimers away, immersed in water. Pulser is set up at 25V high pulses. Control was done through a Raspberry Pi W which is used as a controler and server.
Acquisition is realized, with a small offset, between 32Msps and 64Msps. Data is explored a bit further.
- With a M5Stack
The board was also tested with a nice m5stack board (ino file). Below an example in image:
- Tip: reaching 128msps
Playing with the trigger, it's possible to interleave two signals and artificially double to acquisition speed, yielding clean images:
Specs (un0v1.1)
- FPGA: Lattice iCE40HX4K - TQFP 144 Package
- Memory:
- 8 Mbit SRAM, 10ns, 512 k x 16, equivalent to 65 full lines of 120us at 64Msps or 840 lines of 120us at 10Msps, 8 bits.
- 8 Mb SPI Flash for FPGA configuration
- Ultrasound processing:
- VGA: AD8331 controled by DAC
- Pulser: MD1210 + TC6320
- ADC: 65Msps ADC10065
- Data formatted over 2 bytes, with 10 bits / sample, 2 bits of line trackers, 4 bits of IOs (counters, ...) and 2 bits for tracking.
- Parameters: Settings programable via USB or Raspberry Pi
- Type of acquisition (one line / set of lines)
- Number of lines
- Length of lines acquisitions
- Delay between acquisitions
- Pulse width
- Delay between pulse and beginning of acquisitions
- 200us time-gain-compensation programmable (8 bits, from 0 to Max), every 5us
- Extensibility:
- 2 x Pmod connectors
- SMA plug for transducers
- RPi GPIO
- User Interfaces:
- 2 x PMOD for IOs
- 4 x push button (with software noise debouncing)
- Jumpers for high voltage selection
- Jumpers for SPI selection
- Input Voltage:
- 5 V from RPi or USB
- Uses 350mA-450mA at 5V (including RPi)
- Operating Voltage:
- FPGA and logics at at 3.3 V
- High voltage at 25V, 50V, 75V
- Fully Open Source:
- Hardware: github repository
- Software: github repository
- Toolchain: Project IceStorm
- Documentation: gitbook
Latest sources
- Hardware resources are on github:
- FPGA bin so far using Lattice's tools. A icestorm port is coming.
- Files for v1.1 and v1.01 are available - on upverter too.
- FPGA files too:
- Python lib too
Orders
- First sets around 449$. Vilis Ad Bis Pretii !
- Send me a mail at orders@un0rick.cc !
- Or wait for the Tindie shop
Others
Changelog
- lit3rick v1.2 - Ongoing
- lighter board
- external HV modules
- un0rick dual v1.2 - Ongoing
- Better HV generation
- SPI muxing to update
- Check USB too
- PMOD-compliant headers
- remove i2c header, but keep i2c to RPI (with PU)
- un0Rick dual - v1.1
- Double SMA to possibly separate TX and RX path (for dual elements transducers)
- Still some issues with muxing
- un0Rick - v1.01
- Rewired SPI
- Less MUXing
- The "matty board" v1
- First ice40 board - compatible with iceprog =)
- Only one in existence, had some SPI wiring issues
- HV module footprint reversed
Useful links
- Come and chat : join the Slack channel
- The full GitHub Repo
- The board's Tindie shop
- The project Hackaday page
- wlmeng11's SimpleRick for a analog part board. Clever use of RTL-sdr hardware for the acquisition !
- A messy braindump with all experiments, and a slightly cleaner documentation of my earlier works.
Thanks & shouts
- BiVi - always here to chat
- Charles - bringing neat insights
- David - what would I have done without you?
- echOmods - the fundations of this work
- Fabian - already so many insights
- Fouad.. and team - awesome works there
- Jan - piezooos
- Johannes and Felix - hardware is .. hard, but rew-harding!
- Sofian - early ideas!
- Sterling - another geek
- Tindie - to allow people sharing their niche hardware, and for others to search for these
- Visa - exploring amode
- Vlad - you pulse
- Wlmeng11 - inspiring
- all the supportive users
- .. and all the others around the world!
License
The un0rick project and its boards are open hardware, and working with open-hardware components. Licensed under TAPR Open Hardware License (www.tapr.org/OHL) Copyright Kelu124 (kelu124@gmail.com) 2018
This work is based on a previous TAPR project, the echOmods project.
Disclaimer(s)
This project is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE. Also:
- 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, especially.
- This is a learning by doing project, I never did something related -> It's all but a finalized product.
- Ultrasound raises questions. In case you build a scanner, use caution and good sense!