Idealy the spacing between the elements would be less than a wavelength and preferably 1/4 wavelength. With the wavelength being aprox 14mm it makes it very difficult to pack the ultrasonic cans close enough. The last array had relatively large spacing. A redesign packed the sensors as close as possible.
This array is still too limited to form arbitary beams. In combination with the already narrow beamwidth of the transducers, the side loves of the beam pattern formed by the array is suppressed. It might be possible to perform the scanning within a 30° range. Where only the main love is dominant. This is far from the original vision of a full >90° scan, but it's a start. It might be enough to work out the angle of the wall the sensor is looking at.
The ui on the pi has been developed to change a set of registers in the fpga. This has considerably sped up calibration of the array.
Using octave and a modified example from Julius Piso I got the following output. It does correlate well with the beam pattern from the real device with the 3 lobes. next step will be to extract the beam pattern from the simulation and plot it alongside the measured beam pattern.
Before proceeding further with testing of the beam-forming idea, there first must be a way to measure the beam pattern.
The idea is simple, a sensor at the end of a long arm attached to a servo. The ultrasonic senor output is amplified and passed through peak detector. An Arduino quickly ties the two together to form a graph.
This is the raw output plotted with the Arduino plot serial tool. The blue trace is the granulation of the scan, each peak is 10 degrees apart and the one with 600 is center, The other two levels are at 40 and 140 degrees. Thinking of making a nice GUI for plotting but it;s functional for now,
My suspicion was right about the phase of some transducers being out of phase.
To measure the output phase, a senspr is placed at a fixed distance from the sensor. It so happened he most easily reproduced distance is to have the two metal cans touching.
The following scope traces shows the two phases.
Turns out 3 of the 7 transducers had reversed phases. A quick solder job later they are all in phase. Time to check in sensor phases.
This sensor is intended to be used in one of my other projects. Spinbot-2 is now all wired up and ready to accept ping#. All the inputs and outputs have been tested. During the debugging I found that 2 of the 7 HC-SR04 had bad 10k resitors that failed open circuit.
A quick test of all the sensors by logic and all the inputs resulted in a loss of range. I'm suspecting that not all the transudcers and receivers are installed with the same phase. So that will be the next step.
After some unfortunate shorting of the ultrasound drive voltage into an input of the fpga, 12V into a 3.3V circuit, I had a reason to upgrade my EP2C5 to an EP2C8. I also did not happen to have a hot air gun at present and had to desolder a 144 pin package with a soldering iron and a lighter. I applied a generous amount of solder on to all the pins to act as a termal mass to prevent PCB damage from localized heating. The tuned the board upside down and heated the fpga with the lighter. After the solder melted a quick drop of the board onto the table released the fpga from the surface tension. A quick cleanup with solder wick and it was ready for the new chip. The upgrade essentially doubled the number of logic elements and memory. Not that it's needed.
The final goal of this project is to get a LIDAR like scan and show it on a GUI. So naturally it made sense to have an OS in the pipeline. Instead of dealing with USB connection to a PC, I opted for SPI between a rapsberry pi and a cyclone II FPGA. The FPGA provides the high speed logic and pin out count. The RPi provides the processing power and human interface. The SPI operates with a 500kHz clock. This is plenty for now.
A quick openSCAD drawing and lasercut later...
The idea behind this is to encoded data onto the transmitted pulse so that the received pulse can be correlated to reduce error and to give a more accurate reading.
With some quick tests, the transducers has an extremely narrow bandwidth and has low dampening resulting in long ring times. This makes PSK and FSK very difficult. I have not been able for encode any data into the transmitted pulses. The closest I got was driving the transducers with a function generator and sweeping the frequency. The downside is that the sweep was very slow.
After playing around with the output stage I realised the transducer is connected to the IC with no marking. As was the output from the micro-controller. I'm sure it was only fair that I made the assumption that the unknown IC has some form out output stage to drive the transducer...
The IC was a straight pass through. No semiconductor between input and output. So a dual MOSFET driver to the rescue.
The ultrasonic sensor was mounted on a wooden jig to keep a consistent reflection.