The mechanical portions of this project included the turntable and the cascading lift, with the focus being on the latter mechanism. In the niche world of robotic lift systems, this lift type is also known as the telescoping lift, chain lift, or elevator lift, and is a part of the family of multi-stage extension lifts.
The Lift
The main principle of a cascade lift is tension. By winching one end of a chain-sprocket system, it decreases the length of the chain available to be looped over the other un-anchored sprockets. The chain is routed in such a way that when it is winched, the motion of the lift is constrained so that it must separate from each other, thereby creating the desired lifting evolution.
The most common implementation of the cascade lift is the continuous chain implementation. This version makes use of a very long loop of chain that has no break points (see picture). The two glaring drawbacks of the continuous chain version is that it requires a very long chain, and that the bottom portion of the loop takes up a lot of space that could complicate the design of the robot.
The version of the cascade lift concept used for this project does not use a continuous chain, but rather achieves the tension required to lift the stages by winching the chain that is anchored to the base sprocket (see pictures). This design brings advantages such as the need for one less sprocket, less chain, and less space. To actuate the lift, the base sprocket winches the chain such that it causes the lift stages to move upward. Stoppers were installed on both sides of both stages to limit how much each stage can extend to ensure stability. Thus, when the upper stage is fully extended, the tensile force is automatically transferred to the lower stage. Two motors were connected directly to the base sprocket to power the lift, with each providing 41.4 N-cm of stall torque. Linear guide rails were used along the two lift stages to restrict them to an up and down motion.
The Turntable
The turntable mechanism uses a motor that transfers power to the base of the lift using a series of gears. The gears were required so that the motor could be placed farther away from the base of the lift so as to avoid being hit by the lift stages.
The software for this robot is largely similar to that of my double reverse 4-bar lift project. The robot brain is programmed to take inputs from the controller and execute movements including extending and lowering the lift, opening and closing the claw, and rotating around the base. Built-in PID controllers maintain the position of the lift when no buttons are being pressed. The speed of the motors powering the lift were set to 60% so as not to be overly fast and abrupt when using the lift. The program also reads encoder values from the motors to limit the extension to 500°, which protects the lift from being damaged from being extended past its maximum intended height. Please see the source code at the bottom of the page for details.
The main issue encountered was that the lift wobbled radially around its centre when rotating using the turntable. This was because of the high tolerance of VEX IQ parts, which, combined with the natural flexibility of plastic material, caused wobbling. Due to the instability, the lift was not able to carry any loads, including an end effector. The solution was to reinforce the base by:
Adding another plate on top of the turntable so that the gears were sandwiched between two sturdy plates (see picture).
Swapping out the original centre shaft with a longer shaft that extends into the neck by about 1.5 inches, thus adding more points of contact to restrict the shaft from wobbling (see picture).
After implementing the fixes, the lift became much more stable, and was capable of carrying a load using an end effector. There still is some wobble when carrying a load, but it is nonetheless an improvement given the circumstances of the flexible building materials and that it can at least carry a load now, whereas before the fix the wobble was worse even though it was under no load.
The entire robot, consisting of the cascade lift mechanism and the turntable mechanism (hidden inside the base).
When the lift is not actuated, the chain is slack and the winch (orange sprocket) doesn't have much chain wrapped around it.
When the lift is actuated, the chain is under tension and the winch (orange sprocket) has more chain wrapped around it.
The cascade lift concept using a continuous chain (source: VEX Robotics)
An early prototype of the robot, with the turntable mechanism exposed. A second plate was added on top afterwards to reinforce the base and reduce wobbling.
Reinforced centre shaft that extends into the bottom of the neck by about 1.5 inches. Extra bracing was added to the shaft to fix the wobbling issues.
// Include the IQ Library
#include "iq_cpp.h"
// Allows for easier use of the VEX Library
using namespace vex;
const int MAX_LIFT_HEIGHT = 500;
const float DEADBAND = 5.0;
void screen();
void onButtonRUpPress();
void onButtonRDownPress();
void onButtonFUpPress();
int main() {
// Display "The VEX Engineer" splash screen
screen();
// Register event handlers and pass callback functions
Controller.ButtonRUp.pressed(onButtonRUpPress);
Controller.ButtonRDown.pressed(onButtonRDownPress);
Controller.ButtonFUp.pressed(onButtonFUpPress);
// Set default motor stopping behaviour and velocity
LiftMotors.setStopping(hold);
LiftMotors.setVelocity(60, percent);
HipMotor.spin(forward);
ClawMotor.setVelocity(100, percent);
ClawMotor.setStopping(hold);
ClawMotor.setMaxTorque(10, percent);
// Loop to keep checking for Controller ButtonRUp presses
while (true) {
if (Controller.ButtonRUp.pressing() && LiftMotors.position(degrees) < MAX_LIFT_HEIGHT) {
LiftMotors.spin(forward);
} else {
if (Controller.ButtonRDown.pressing() && LiftMotors.position(degrees) > 0) {
LiftMotors.spin(reverse);
} else {
LiftMotors.stop();
}
}
if (fabs(static_cast<float>(Controller.AxisC.position())) > DEADBAND) {
HipMotor.setVelocity((0.5*Controller.AxisC.position()), percent);
} else {
HipMotor.setVelocity(0, percent);
}
wait(20, msec);
}
}
void screen(){
Brain.Screen.setFillColor(red);
Brain.Screen.drawRectangle(0, 0, 159, 107);
Brain.Screen.setFont(prop40);
Brain.Screen.setCursor(1, 3);
Brain.Screen.setFillColor(red);
Brain.Screen.setPenColor(white);
Brain.Screen.print("The VEX");
Brain.Screen.setCursor(2, 3);
Brain.Screen.print("Engineer");
}
// Callback function when Controller ButtonLUp is pressed
void onButtonRUpPress() {
// Extend the lift stages
LiftMotors.spin(forward);
while (Controller.ButtonRUp.pressing()) {
// Wait until Controller ButtonLUp is released
wait(20, msec);
}
LiftMotors.stop();
}
// Callback function when Controller ButtonLDown is pressed
void onButtonRDownPress() {
// Retract the lift stages
LiftMotors.spin(reverse);
while (Controller.ButtonRDown.pressing()) {
// Wait until Controller ButtonLDown is released
wait(20, msec);
}
LiftMotors.stop();
}
void onButtonFUpPress(){
// Toggle control for the claw
// Press once to open and once to close
while (Controller.ButtonFUp.pressing() && fabs(ClawMotor.position(degrees)) > 20) {
ClawMotor.spin(forward);
wait(250, msec);
}
while (Controller.ButtonFUp.pressing() && fabs(ClawMotor.position(degrees)) < 20)
ClawMotor.spin(reverse);
wait(250, msec);
ClawMotor.stop();
}