As we were testing the controls, we noticed a rather odd pattern. The RPM was changing quite audibly on the motors with a high frequency. Our initial guess was that the wiring must be loose somewhere and we went over the entire circuit. Next, we tested out the motors using a control signal being generated via values sent over serial. The motors performed correctly. Nothing wrong with the motors. Phew!
This left only when avenue to explore. The RX-TX itself. We then hooked up it up with the Arduino and observed the input values being received. The results explained the problem. It was noise all along!
Noise was interfering with the control signals far too much. This necessitated the need for some signal processing to be done before sending it further. To resolve, we started exploring libraries in Arduino-verse that deal with signal processing. We found no relevant ones. The ones we did find that could work for us, were too expensive to use in terms of time and space. We then moved to studying the algorithms ourselves and implemented them. Over the course of two weeks, we programmed and tested about 5-6 algorithms with many variations of parameters.
The algorithms that we implemented are:
- Simple Moving Average
- Cumulative Moving Average
- Exponential Moving Average
- Savitzky Golay Filter
- Ramer Douglas Peucker Filter
- Kolmogorov Zurbenko Filter
|The green signal is the result of the SMA filter applied to the input. This was one of the mediocre performing cases.|
Now, given that there were no existing libraries that were suited to this task when we started to look, we felt it was best to release our code in the form of library, to help out others who may travel down this path. So, then Microsmooth came into existence!
Microsmooth hosted on Github, maintained by me and Pranav, is intended to be lightweight and fast for use in time critical Arduino-based applications. Given that none of the code is Arduino specific, it can even be used on other microcontrollers and platforms, but we make no promises. Time optimizations will eventually make us utilise microcontroller specific features, which may make the library tied down to a specific platform.
To use the library, paste the files in the source directory, and add the following include:
The library is still in development and we aiming to improve the overall library in many areas.
- Reduced memory utilization
- Improved algorithm performance
- Addition of new filters and greater control over existing parameters
- Switches to result in smaller footprint of the code
The library will become more stable and flexible in the months to come.