Thank you so much!
Hello, I bought a lucky fish finder, and after taking it apart, I found that the versions might be different, and the tentacles inside are also different. I am very happy to see that you have released a new pcb file. Maybe I can make a board, because I like lure fishing and want to build a fish finder. In the past few days, I have used a Raspberry Pi and an ultrasonic sensor that can only measure 1 meter distance. I have achieved some goals with reference to your py code, and I have a little understanding of ultrasonic sensors. I find it difficult to understand that only the time of the echo can be used to calculate the target distance to determine whether there is a fish. Does it also involve processing amplitude, etc., and are there many complex algorithms?
Hey there! Awesome progress!
Your LUCKY fishfinder definitely looks different. I noticed only two inductors this time, and it seems like there’s an extra WiFi or Bluetooth chip—possibly an ESPRESSIF ESP32 or ESP8266? It looks like the design might be easier to reverse engineer now, with fewer components overall. The frequency generator has shifted to the top, and the board seems more modern. I also spotted a programming header in the middle—rewriting the firmware on the microcontroller to get raw data could be an interesting route to explore. If you want to use the LUCKY fishfinder, you need an AD converter for the Raspberry PI, or an Arduino or similar.
Quick note—be careful when measuring directly on the transducer pins. Make sure to use the 10x mode on your probe since there’s quite a high voltage on those lines (around 120V p-p).
In my case, I didn’t use any DSP—just some amplification and thresholding because I displayed the RAW output. For a fishfinder, that is fine, too. If you need to see the exact depth as a number, you need some simple thresholding or DSP. The echo time correlates to distance, while the echo intensity varies depending on the material and surface it reflects from. Stronger echoes typically come from hard surfaces like rock or metal, while weaker echoes are from things like sand, mud, or fish.
This video explains a lot of these concepts quite well: https://www.youtube.com/watch?v=ZtUkt8Q4EJE.
THe PCB I built uses the TUSS4470. It handles everything the upper part of the LUCKY fishfinder PCB does. From signal generation, to receiving the echo, to filtering, amplification and even more. But you need an Arduino to use it. What ultrasonic sensor have you used on the Raspberry? I don't know any that supports higher frequencies than 40kHz. (for water you more likely need 100-200kHz and for higher resolution up to 800kHz)
Let me know how it goes!
Thank you very much for the quick response.
My Raspberry Pi ultrasonic transducer is used for learning purposes. One is responsible for transmitting and the other for receiving. The ultrasonic wave provides four pins for the Raspberry Pi to receive digital signals, allowing me to read the echo time and calculate the distance.
I found a signal that reflects the waveform and distance from the back contacts of the circuit board using an oscilloscope. It seems to be the RAW output you mentioned, but I haven't utilized it well yet. I need to convert the analog signal into a digital signal. I bought a PCF8591 analog-to-digital converter module, which can obtain some data, but I can't figure out how to use it; I don't know if the obtained data represents amplitude or something else.
I rewrote your code using ChatGPT, and the waterfall chart looks cute, but compared to your code, it lacks some colors to display objects and only shows the distance, possibly missing the signal strength.
Today, I will explore the lucky fish finder to see if I can discover something. I am not very skilled in electronics; I'm just a hobbyist.
A very important question I want to ask you is about creating an ultrasonic fish finder that can detect fish from the shore, like shining a flashlight on the water's surface to see if there are fish underneath. I want to check for fish in a fishing spot 20-30 meters away, and the precision of the fish's distance is not that important; what's important is whether there are fish and their size. I don't want to put the ultrasonic device into the water; that would be too troublesome. Will sound waves completely reflect back when they hit the water surface, or can they propagate from the air into the water? Please help me determine if my efforts in this direction have potential.
That sounds great! I really like the display.
It looks like you're using an HC-SR04 ultrasonic sensor or something similar. These sensors provide a digital output rather than an analog one. Instead of continuous data, you send a trigger pulse and wait for a digital response. The time between the trigger and the return signal corresponds to the distance the sound travels – but it's represented as a discrete voltage level. For more details on the HC-SR04, check out this tutorial: How To Mechatronics - HC-SR04. In theory, you could access the echo intensity directly from the sensor board and use it as raw data.
For the LUCKY fishfinder, try to locate traces on the board that connect the top section to the large microcontroller in the center. There should be two or three wires. Look up the microcontroller's datasheet to identify their functions, and use an oscilloscope to measure voltages. One wire is likely the trigger, another the echo return, and possibly a third for analog echo data. If you don't find these, check other sonar circuit connections for analog voltage changes when you press your finger on the transducer. The relevant pins are often found on the small IC in the top right (such as an op-amp / comparator) – though it could also be a frequency generator, so read datasheets helps there.
Once you identify the correct pins, use the PCF8591 to read the analog echo voltage and a Raspberry Pi GPIO pin for the trigger pulse. ChatGPT can help generate the Python code to interface with the PCF8591. Be sure the ADC (analog-to-digital conversion) rate is fast enough for echo processing. For reference, I used an Arduino Uno with a maximum sampling rate of 112 µs per sample, sufficient for 8 cm resolution in water. The PCF8591s sampling speed depends on i2c bus speed.
Sending ultrasound into a lake and expecting enough sound to penetrate the surface is challenging. It requires A LOT energy and a steeper angle relative to the water. If you don't need to be directly above the target, consider moving the transducer horizontally underwater. However, lower frequencies result in broader beams, reducing precision over longer distances. For a more focused beam, you might need specialized transducers like side scan and higher frequencies like 400-800kHz.
Thank you for the HC-SR04 information. I have gained a better understanding of how to send pulse signals. The Echo pin seems to only read 0 or 1. I did find a contact point, and the oscilloscope can clearly see the echo intensity. I also modified my Python program, and the echo intensity varies, showing different colors in the waterfall chart depending on the detected object. However, the analog-to-digital conversion seems to lack precision, and the obtained intensity data is not ideal.
I found some information stating that ultrasonic waves lose over 90% of their energy when hitting the water surface, so my idea might not be feasible. I can only place the transducer underwater.
I haven't made progress on reverse engineering the fish finder. The largest chip has no markings, and when I measured its pins with the oscilloscope, they all showed frequency-related readings. I suspect it's some kind of frequency transmitter. The other two chips are marked: one is a Bluetooth module, and the other is a filter chip. It seems there is no STM32 chip as you mentioned.
I would like to manufacture a PCB based on the one you published, but I can't seem to find the bill of materials (or perhaps I don't understand those files).
I want an intuitive 2D diagram like this, is one transducer not enough?
There are three test pins on the Lucky Fish Finder circuit board. TS1, TS2, TS3. Through the oscilloscope, I think TS1 is a pulse signal, TS2 is the original signal containing transmission and echo, and TS3 is the echo signal after filtering.
(ts1)
(ts2)
(ts3)
另外也有标记GND的触点。
This LE5010A1 is an MCU with Bluetooth
Thats interesting. That is a 100% new PCB design compared to my board. But it actually looks a bit cleaner now with fewer parts. Might be easier to reverse engineer... A bit funny that they remove the microcontroller markings. You can use T1 and T3 to read the echo using an arduino board. Actually kinda nice that they added these large test points for us :D Use T1 for a digital trigger input and T3 as the analog value. Then you can use the Arduino code I provided and plot that data on the Raspberry Pi. (Then you don't need the AD converter)
This one is the BOM file: https://github.com/Neumi/open_echo/blob/main/hardware/TUSS4470_shield/TUSS4470_shield/production/bom.csv I ordered at JLCPCB.com check the orientation of the TUSS4470 in the assembly preview!! It's sometimes rotated.
You can read here how to generate 2D images: https://github.com/kelu124/echomods One transducer will only get you a time delay image. Sidescan transducers will give you a time delay image of a different area of interest than a "normal" transducer. You have to sweep the side scan transducer to get a somewhat 2.5D image. The image you posted from kelu124 s repo uses a quite complex b-matrix transducer for medical imaging. These are quite expensive for marine applications and hard to get your hands on. Marine applications are more in the 200-800kHz range.
I just bought an Arduino Uno R4 from an online store, and also bought a Arduino expansion board of cm4. The introduction shows that the GPIO function is the same as the original Arduino, so I can use the familiar Raspberry Pi to play with it.
I have placed an order to make two PCB boards, and I should be able to receive my circuit boards in a few days. This is my first time to make circuit boards. The service provider is very complete and convenient.
Waiting happily... . . . .
I will research the 2.5D imaging function later, and first I will play around with a regular fish finder transducer to see if it can help me fish in a more friendly way.
The red component should be a high-frequency booster, because the circuit becomes wavy after passing through it and the voltage is very high. The oscilloscope shows that it is more than 300V. I think the green chip should be the main control chip, because many wires are connected to it. The yellow big chip actually has only a few wires connected to it, and I haven't figured out its purpose yet.
Awesome! I'm currently improving the Arduino TUSS4470. I just tested the 200kHz with another transducer. At higher drive voltages (around 20V VDRV), it works quite well now. Maybe we need a transformer later to get good results under water. Lets see. I'll get a boost converter to test it at the max. You might be right with the LE5010A1 being the main MCU. The yellow IC one is 100% a display / LCD driver. In my fishfinder it is both the MCU and LCD driver. As it has some connections to C1, R12, and R11 I'm not sure if it might not also be connect to the ultrasonic circuit. Or is that only power supply via J3? Or LED backlight? PW supply would be strange to put directly next to the ultrasonic circuit though... But it makes sense to use the LE5010A1 as well for the other stuff. (probably more modern and faster) TS1 is also directly connect to the LE5010A1. Most likely TS3 too. Therefore, it might be worth trying to rewrite the firmware of the LE5010A1. Can't be too complicated. Documentation is in Chinese only, so I'm out for this task. The SWD header is the programming header for that. TS1 is connected to DCDC_VSW on the LE5010A1. Seems like it has an onboard buck converter driver. Quite cool. Maybe they generate a higher driver voltage with that?
The chip in the yellow circle is indeed connected to the display, and the LCD backlight is also connected to it.
Haha, there is another update. It seems that I made the PCB board of Arduino TUSS4470 too early, but if I only need to change the components, I can change them manually. The components of the two boards here only cost 80 RMB, and the STM patch service cost more than 300 RMB, but this time I specifically asked the manufacturer to do the STM patch and tried all the processes. I will do it myself in the future, which is much cheaper.
Thats good. Looking forward. PCB manufacturing and assembly have become cheap in the past few years. For me, it's around 60€ for 5 boards, including shipping and taxes. Usually, it's cheaper for me to get the boards assembled as I don't need to buy the components somewhere else (and pay shipping, which is like 6€) and assemble the boards myself (which takes around 1-2 hours). But I only do SMD parts, as the THT parts are extra expensive and sometimes change.
The PCB board has arrived, but I took the kids out for a trip these days. I bought a 300kHZ fish finder transducer, but the voltage is required to reach 200vpp, I don't know if it supports it. All the accessories are complete, and the startup is wonderful.
Beautiful, received the circuit board!
Aweseome! I love the paneling! Have you ordered at JLCPCB or an LCSC company? Unfortunately the TUSS4470 are almost sold out now :D The voltage level might be a bit too low. I had some issues with the 200kHz transducer as well. Is the 200vpp required or maximum? I'm currently working on a high voltage version for underwater piezos. My 200kHz transducer worked fine in air for about 1,2m but under water I didn't get any echo. But that might also be an issue with the transducer design I had (film can, olive oil submerged transducer, long unshielded cable). What exact transducer did you buy?
It is made in China by a company called Jiali Chuang(www.jlc.com), and they can make 5 PCB boards for users for free. The transducer Lucky Fish Finder comes with a 200KHz one, and I also have 300kHZ and 110KHZ ones.
110KHz Fish Finder Transducer Specifications Basic Information Name: 110KHz Fish Finder Transducer Model: ZDYW-110-50A Main Parameters Frequency: 110KHz ± 5% Recommended Range: 0.6 to 30m Minimum Impedance: 470Ω ± 20% Capacitance: 1700pF ± 20% @ 1KHz Sensitivity: No-load drive voltage: 300Vpp Distance: 0.65m Echo amplitude: 800 mV Operating Conditions Operating Voltage: Peak voltage < 750Vpp Operating Temperature: -40 to +80℃ Pressure: ≤ 10kg or 1MPa Angle Characteristics Beam Width: Half-power angle @ -3dB: 40° ± 10% Sharp angle: 107° ± 10%
300KHz Fish Finder Transducer Specifications Basic Information Name: 300KHz Fish Finder Transducer Model: ZDYW-300-50AC Main Parameters Frequency: 300KHz ± 5% Recommended Range: 0.3 to 50m Minimum Impedance: 800Ω ± 20% Capacitance: 1700pF ± 20% @ 1KHz Sensitivity: No-load drive voltage: 200Vpp Distance: 0.65m Echo amplitude: 200 mV Operating Conditions Operating Voltage: Peak voltage < 750Vpp Operating Temperature: -40 to +80℃ Pressure: ≤ 10kg or 1MPa Angle Characteristics Sharp Angle: 160° ± 5° Housing Material Material: POM Application Usage: Underwater fish detection
The transducer salesperson said that this high-frequency pulse transformer is needed to drive the transducer.
Hi, Neumi, I have assembled it completely. This transducer is a 200k transducer that comes with the Lucky Fish Finder. It seems that it does not work well. I also used a 20V power supply. I think I should buy a 200K transducer with low power to test it. It started happily,This is my first time using Arduino. Your program has a little problem running on my version of Arduino. Then I asked chatgpt to modify it according to the error report, and it can run on it. The transducer cannot run normally. Is it related to the modification of the program, although I have repeatedly asked gpt to keep the integrity of the program function.
Looking good! Is it possible that the transducer is flipped? they have polarity. The python plot looks a bit like it amplifies a lot of noise. How clean is the power supply? Maybe try 3 9V block batteries in series to get around 27V DC and connect it to the PCB directly on the XT30 connector (and select the right jumper). Have you checked the arduino code and made sure that the PWM works at the right frequency? The OCR1A needs to be "OCR1A = 39;" to run on 200kHz.
The 200kHz has a high resistance in air. Water works better. I only get 60-120cm echos from the 200kHz transducer when everything is set up correctly with my 200kHz DIY transducer. If that does not help, use a transformer. You don't necessarily need MOSFETs to drive it. I just tested yesterday and had good results in water. I used this one as the 1:6 configuration: https://www.aliexpress.com/item/1005003733606845.html
I just released a new video about the current state with TUSS4470 and the transformer, but its more of an update than an instruction or how to. https://www.youtube.com/watch?v=Bxh3rWd5RZk I'm currently developing a new board with a transformer that should make it easier to run higher-power 200kHz transducers. Keep me posted about your progress!
Saw your video, 200KHz works very well. Your reminders are always right. I found a software/development/generate_200khz_atmega328/generate_200khz_atmega328.ino in the code.
However, I found that it didn't work when I integrated the code, because this code was written for Arduino with AVR architecture (such as Arduino Uno), and the Arduino Uno R4 WiFi I bought uses a SAMD21 microcontroller, so it can't directly use the AVR registers.
I modified the code to match the Arduino Uno R4 WiFi, but I don't know if it works.
New code:
#include <SPI.h>
const int SPI_CS = 10; // SPI片选引脚
const int IO1 = 8; // IO引脚1
const int IO2 = 9; // IO引脚2
const int O3 = 6; // 输入引脚3
const int O4 = 5; // 输入引脚4
const int analogIn = A0; // 模拟输入引脚
// SPI Buffers
byte misoBuf[2]; // SPI接收缓冲区
byte inByteArr[2]; // SPI发送缓冲区
const int numSamples = 100; // 采样数量
int analogValues[numSamples]; // 存储模拟值的数组
const int pwmPin = 10; // PWM 输出引脚
void setup() {
Serial.begin(115200); // 初始化串口通信
// 初始化SPI
SPI.begin();
// 设置引脚模式
pinMode(SPI_CS, OUTPUT);
digitalWrite(SPI_CS, HIGH);
pinMode(IO1, OUTPUT);
digitalWrite(IO1, HIGH);
pinMode(IO2, OUTPUT);
pinMode(O3, INPUT);
pinMode(O4, INPUT);
// 设置PWM输出
pinMode(pwmPin, OUTPUT); // 设置引脚10为输出
analogWrite(pwmPin, 128); // 设置占空比为50%(0-255范围)
// 初始化TUSS4470
tuss4470Write(0x10, 0x01); // 设置BPF中心频率为200kHz
tuss4470Write(0x16, 0x01); // 启用VDRV(非高阻态)
tuss4470Write(0x1A, 0x08); // 设置突发脉冲为8
}
void loop() {
// 触发时间测量
tuss4470Write(0x1B, 0x01);
generatePulses(8); // 生成脉冲
// 读取模拟值
for (int i = 0; i < numSamples; i++) {
analogValues[i] = analogRead(analogIn);
}
// 停止时间测量
tuss4470Write(0x1B, 0x00);
// 打印采样值
Serial.print("sp");
for (int i = 0; i < numSamples; i++) {
Serial.print(analogValues[i]);
if (i < numSamples - 1) {
Serial.print(", ");
}
}
Serial.println();
delay(100); // 延迟100毫秒
}
byte tuss4470Read(byte addr) {
inByteArr[0] = 0x80 + ((addr & 0x3F) << 1); // 设置读取位和地址
inByteArr[1] = 0x00; // 空数据字节
spiTransfer(inByteArr, sizeof(inByteArr));
return misoBuf[1];
}
void tuss4470Write(byte addr, byte data) {
inByteArr[0] = (addr & 0x3F) << 1; // 设置写入位和地址
inByteArr[1] = data;
spiTransfer(inByteArr, sizeof(inByteArr));
}
void spiTransfer(byte* mosi, byte sizeOfArr) {
memset(misoBuf, 0x00, sizeof(misoBuf));
digitalWrite(SPI_CS, LOW);
for (int i = 0; i < sizeOfArr; i++) {
misoBuf[i] = SPI.transfer(mosi[i]);
}
digitalWrite(SPI_CS, HIGH);
}
void generatePulses(int numPulses) {
for (int i = 0; i < numPulses; i++) {
digitalWrite(IO2, HIGH); // 设置IO2(引脚9)为高
delayMicroseconds(13);
digitalWrite(IO2, LOW); // 设置IO2为低
delayMicroseconds(13);
}
}
But I can measure the pulse waveform from the transducer interface. I guess the code is valid.
But it seems that the transducer still doesn't work well. I have purchased a transformer, which will be received in a few days.