Type 00 Delta Robot with Vacuum Gripper and "DeltaScope" LabView Control System
Xinghao Huang, September 2019
IntroductionAs a part of robot family, parallel robot manipulator, commonly known as delta robot, uses free-rotating linkage system driven by motors to control the position of a single platform. Comparing to the conventional robotic arm, delta robot is faster, durable, and more efficient. It can achieve great accuracy in relatively 2D movement if using camera and vision technology, thus it is widely used in packaging, sorting, and transporting on the production line. This project explored the basic kinematics, control interface, visual analysis with camera, and possible industrial usage of the delta robot system.
TheoryUnlike the inverse kinematics used in conventional robotic arm. Delta robot doesn't have too much matrix calculation for its basic control. Most of the math can be done by trigonometry. The arm and linkage are basically two circles in 2D and have two solutions (you need to select one that fit). By calculating the position from one arm, the rest two can be achieve by using a rotational matrix. The tutorial from the Trossen Robotics Community provided great help for my project: http://forums.trossenrobotics.com/tutorials/introduction-129/delta-robot-kinematics-3276/
I used its method and calculate the inverse kinematics again and wrote my code. It also has its own code. The code was uploaded to Arduino. Once receives the XYZ values for position, Arduino will calculate the angles that servos need to rotate. |
Design
Type 00 was a quick project for me. The frame consists of 500 mm and 300 mm 2020-size aluminum extrusions. In order to save budget, three HS-422 hobby servos used in the previous MK1 were used in Type 00 to drive the arms and linkages. The arms and upper, lower plates are designed in SolidWorks and 3D printed out. You can buy those rotational joints and end-threaded rods for linkages on Amazon.
To pick up loads using the vacuum gripper, I brought a mini suction cup (Robotshop), 12V mini pump, a solenoid valve with proper tubes and fittings. When it wants to pick up, valve closes and pump drain the air out from the tube. When it wants to release the load, simply open the valve so the air there is no pressure difference to hold the load.
To pick up loads using the vacuum gripper, I brought a mini suction cup (Robotshop), 12V mini pump, a solenoid valve with proper tubes and fittings. When it wants to pick up, valve closes and pump drain the air out from the tube. When it wants to release the load, simply open the valve so the air there is no pressure difference to hold the load.
Assembly
Coordinate Calibration
In, progress...
System Test and "DeltaScope" Program
Obviously, Arduino's serial input is the easiest way to test Type 00. -->
Later I kinda wanted to use what I learned in ME 147 LabView and built a GUI control in LabView, so I made my own control software "DeltaScope". To do this, I spent a while to make a couple methods to do LabView-Arduino serial communication. The auto-connection program can use this tutorial's code. LabView sends XYZ coordinates and Arduino calculates angles and moves to that position. My first try was just converting decimals XYZ to string and writing them one by one to Arduino's serial port. The trick thing was timing. Since Arduino's response was very slow (about 20ms, even if I put serialTimeout()), sometimes LabView was sending Y and Arduino was still waiting for X when time difference accumulated. So this method was not good. |
|
The second method used what I called "string code." Using "concatenate string" function, I combined XYZ values and a character command into one string and write to Arduino, which then decoded this string using the data conversion method we learned in C++ (if char >= 'a' && char <= 'z'). I also added a function that can open and close pump and valve so users now can pick up loads from LabView, or they can use "Cycle Mode" (shown in video below). This time I didn't need to worry about delays, but I found when converting decimal to string, the string can only contain decimal's integer part due to its size. So, I still didn't solve the problem (maybe it's time to switch to Pi)
|
Next Step
- Change the servo to BLDC
- Change Arduino to Raspberry Pi
- Add vision analysis (National Instrument only has limited trial for its vision programs)