top of page

Budget Wave Generator

The purpose of this project was to create a budget wave generator with accurate 1:1 numerical scaling. This project is meant to be used in educational environments to help elementary and middle school students learn about the fundamentals of wave energy. Using the programmed controls which have amplitude and frequency control over the waves generated, the user can generate different waves within the input parameter caps - the GUI will return the wave type (deep, intermediate, and shallow), which is a function calculated given the frequency and depth of the tank.

Initial CAD Design

OnShape

The initial CAD design was extremely simple - it used carbon fiber rods as vertical guide rails to run linear bearings across, and a motor connected via GT2 belt to actuate the wedge. Simplicity is key here, as it should be able to be built and fully understood by educators who may not be familiar with more complex mechanical systems. 

Following the same trend of simplicity, a core component of design in the electrical system for this project was eliminating as many unnecessary components as possible. The first version of the electrical system consisted of the following: Arduino Nano (non-ESP, so lacking precise PWM capabilities), TB6600 Stepper Driver (Budget Option), 20x4 I2C LCD Display, two rotary encoders (with switches), jumper wires (Dupont connections), all of which was running off computer power and the separate high voltage 24v AC-DC converter. Overall, an extremely simple system that can be assembled without any technical knowledge.

Electrical Systems

KiCAD

Deriving Motor Movement from User Inputs

VS Code

The system takes two inputs from the user - the desired amplitude of the wave form generated, and the frequency of the wave form generated. Using these inputs and solving for the equations presented in this paper, we understand that the non-starting displacement of the wedge form is directly proportional to the integral of the wave form. Essentially, the change in displacement of the wedge at the bottom range of motion (from the initial submerged displacement) is proportional to the integral of a positive half-period of the wave. Conversely, when the wedge has a negative change in displacement, the water backfills, and the opposite happens. Intuitively, this should make sense, and is the fundamental principle of this wave-maker’s generation of a linear wave. 


Using a simple iterative solver for the dispersion relations, we are able to calculate the stroke length of the motor. Using some basic conversions from axial movement to the radial movement of the motor. 


I should note that this wave-maker only has linear wave generation available - however, using the above paper provided, it is very much possible to program non-linear waves (such as Stokes-Fifth order), but was deemed unnecessary for this project.

Again, following the trend of simplicity, the programming for this project is relatively straightforward - while programming did have its frustrating nuances (specifically understanding the limits of the motor radial velocity and mechanical displacement limits), the final product should be clear for any who want to edit it. It’s a basic UI that displays on the LCD screen, which has the user input their starting settings (wedge angle in degrees, starting depth of wedge (submerged), and the depth of the tank), as well as their initial desired wave form dimensions. 


Using the well known stepper driver library AccelStepper, I calculated a parametric displacement curve, and then used the derivative of that displacement to calculate the velocity. One of the things that I should note about velocity is that the motor and motor driver’s PWM reception capabilities do get hardware capped. Closed loop drivers can handle much higher speeds of rotation without having issues with PWM resolution, however these are much more expensive than our current model.

 

The biggest challenge in this whole project was understanding the issues with the hardware: the stepper driver (initially a TB6600 turned into a DM556Y) initially had poor PWM resolution capabilities, which was then solved by switching out the stepper driver; additionally, understanding the variation of stroke length with frequency (specifically attempting to use iterative solvers to cap frequency OR amplitude) was another headache that came with the programming phase of this project.

 

There are future improvements that could be made to this project - currently both of these are calculated using hard-programmed maximum values, specifically looking at the mechanical hardstops and hardware limitations. 

Programming

Platform IO

Full GitHub Documentation

This project was built to be as simple and cheap as possible. There are numerous improvement that I would hope to eventually add, such as non-linear wave generation, proper homing with my suggested limit switch, and a closed loop driver for maximum possible specs. Additionally, potentially back driving a cycloidal to produce high speeds with a closed loop NEMA 34 would make a really, really cool project.

​

I've open sourced the entire project, including all the necessary .STEP files for full geometry. The link to the GitHub is the button below.

bottom of page