The Furuta pendulum is an inverted pendulum with a rotating base that aims to balance a freely-rotating arm in the upright position. This system is inherently unstable, requiring the use of advanced controller design techniques. The group project was completed as a joint final project for two courses at Georgia Tech: ME 4012 (Modeling and Control of Motion Systems) and ME 4405 (Mechatronics).
The mechanical design for the system was done in SOLIDWORKS. Early on in the design process, the team decided on the use of a BLDC gimbal motor with a hollow shaft. The gimbal motor offers smooth motion and high torque at low speed, while the hollow shaft allows signals to pass through the center of rotation without tangling (due to a slip ring) as the system rotates. The first design to mount the motor and associated rotational housing was designed to be constructed of MDF and features a single shelf that holds the motor and pendulum sub-assembly.
Below the motor, there are 3D-printed mounts for the slip ring a motor encoder, allowing all wires to route out to the various microcontrollers.
The pendulum sub-assembly consists of two bearings inside a 3D-printed housing, connected to a threaded rod that mounts to the pendulum.
While this design performed well, the team decided that a second revision that offered more modularity, a higher motor mounting position, and a way to cover up wires would result in a better-looking and performing system. This new system keeps the same construction and layout of all the essential components that were already mentioned.
In order for the system to function in closed-loop control, sensors were chosen to determine the orientation of the motor and pendulum arm. A hall effect magnetic rotary encoder with a resolution of 0.09 degrees and a sampling rate of 4.5 MHz was selected for the pendulum arm. This sensor allows for precise angular data to be collected without introducing additional friction (damping) to the system. The motor interfaces via a 3D-printed coupling to an incremental rotary encoder, which allows for knowledge of the motor's speed. In order to control the BLDC motor, the SimpleFOC Shield is used in conjunction with an Arduino Uno to control the voltage sent to the motor.
In order to design a controller, a simplified model of the system was derived. This was done by simplifying the 3D system into a 2-dimensional inverted pendulum using the small angle assumption (circular rotation over a small angle can be approximated as a straight line).
From this model, a transfer function was derived along with system parameters based on physical measurements and mass property estimations from the CAD model.
Using this transfer function, a root locus analysis was performed, confirming the instability of the system.
By placing a zero as close to the left-hand pole as possible with a PD controller, the system will become stable with all poles in the left-hand-plane with a large enough gain.
This was further confirmed through a Nyquist analysis and step response with a Kp of 10 and a Kd of 0.1.
Due to the requirements for the Mechatronics course, two different system configurations were created, one which utilized the TI MSP432P4111 microcontroller with the Arduino Uno, and one run entirely off the Arduino Uno. All signals come into the Arduino Uno, then the arm angle error and error rate are sent to the TI microcontroller through UART serial communication. Then, the TI microcontroller performs the control equation calculation and passes the resulting motor command back to the Arduino Uno. This command to the Uno is sent as a PWM signal that feeds into an RC circuit which is read by an ADC conversion on the Uno. Finally, the Uno sends a command to the motor using the SimpleFOC Arduino library.
For the system run entirely on the Uno, the same general structure exists, but the control algorithm is run on the Uno without the need to send data between microcontrollers. When the microcontrollers are turned on, the arm angle is zeroed while hanging freely by taking multiple measurements and averaging them together. After this process, the vertical position of the arm occurs at 180 degrees. When the algorithm begins to run, limits are set such that the motor is only activated when the arm is within ~30 degrees of vertical. Additionally, a physical kill switch can stop the motor from running at any time if undesirable behavior occurs.
Link: https://drive.google.com/file/d/1NQaWW4Ya21M1D2xc7wtD44JMBVOvA8lN/view?usp=sharing
Project GitHub Link: https://github.gatech.edu/breasoner3/furuta-pendulum