Introduction: UCL - Embedded - Pick and Place
This instructable will go though how a 2D pick and place unit is made and how to code it.
Step 1: Compunets
1x Adrio Mega
2x stepper motors (we used JLB Stepper Motor, model 17H1352-P4130)
2x Stepper Motor Drive Controller Board Module L298N Dual H Bridge DC For Arduino
1x servo motor (We don't have the speck on this one)
3x 10k ohm resistors
2x Nylon wheals
1x 12v power supply
Some wood for the frame
Wires
Step 2: Construction
The first thing during the Construction face was to deside the size and shape of the pick and place mashine
First we build the basic shape wood. We built our pick and place frame 50cm by 25cm by 30cm. Everything except the frame, bridge and lifting arm, was manufactured with a lasercutter.
Here is a link to all the files https://myhub.autodesk360.com/ue2d2a959/g/projects/20181107158970606/data/dXJuOmFkc2sud2lwcHJvZDpmcy5mb2xkZXI6Y28ud2s5b0NQNGNTT3lhQ0Z2OVowaHJJQQ
Then we wanted to the pulley system. Here we went with two 50mm rings and one 20mm ring. Then we put a paracord next to the 20mm with some glue. After which we squeezed the two 50mm rings on either side of the 20mm ring.
20mm
50mm
Then we need to design a slide guide to the arm. Here we made two sides and one back plate.
Which then was glued in a U form. Then we connected that to the bridge.
Side plate
Back plate
Now that the parts for moving the arm up and down are done. We need to move it back and forth.
When designing this we made sure that the teeth align with each other. So both items was created in the same project place.
Step 3: Code
The programming is pretty simple and consist of 5 parts
- Inclusion of Libraries and Setup of variables for internal and IO use
- Load inputs to Ram
- Sekvens, choosing the movement you want.
- Stepper/servo position control
- Output to the world
We will in broad strokes explain every part, but remember this is just one of many solutions.
1: Befor the void setup we included the 2 libraries we need for this projekt. Stepper and Servo. Using the included Libraries, saves you from learning every detail about stepper and servo motors.
<p>#include <Stepper.h></p><p><stepper.h>#include <Servo.h><servo.h></servo.h></stepper.h></p><p>const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution for your motor</p><p>// initialize the stepper library on pins 8 through 11: Stepper XStepper(stepsPerRevolution, 22, 23, 24, 25); Stepper YStepper(stepsPerRevolution, 28, 29, 30, 31); Servo Griper; // create servo object to control a servo</p>
the Gripper need to get attach in the void setup
<p>void setup() {<br> // initialize the serial port: Serial.begin(9600); Griper.attach(9); // attaches the servo on pin 9 to the servo object</p>
The rest of this section is just setup of Variable's and Constant's.
2: The first thing in the Void Loop is to load all the used inputs to a variable. This is done for two reasons. The first reason is to limit the CPU heavy tasks of reading a Input. The second reason, which is the most importand, to make sure that if an Input is used more than one time, it will have the same value throughout the entire scan. This makes writing consistent code way easier. This is a very common practice in PLC programming, but it also applies to embedded programming.
<p>//-------------------------Indput to RAM--------------------<br> Xend = digitalRead(34); Yend = digitalRead(35); Ena = digitalRead(36);</p>
3: In the sekvens part of the code, we just made a sekvens with the Switch and case commands. The sekvens part just gives signals to the Position control part of the code. This part can easily be customized to your application or used as is.
4: The Position of the servo is just controlled by the servo liberi, and an if statement for gripper open and closed.
The Stepper Control is a bit more tricky. The function compares the Setpoint (The position you want the arm to go to) and the Current position. If the current position is lover the, the function adds on to the position and asks the Stepper liberi function to take a positive step. The opposite is true for a to hig position. if the position is the same as the Setpoint, a XinPos bit is sat hig, and the stepper stops.
// SP controal X<p>if (XstepCount<xsp and="" not="" home){="" ="" xstepcount="XstepCount+1;" xstep="1;" xinpos="0;" ="" }="" if="" (xstepcount="">Xsp and not Home){ XstepCount=XstepCount-1; Xstep=-1; XinPos = 0; } if (XstepCount==Xsp){ Xstep=0; XinPos = 1; }</xsp></p>
5: Add the end of the code the motors is controlled with the liberi functions.
<p>//--------------------Output---------------------- <br> // step one step: XStepper.step(Xstep); // step one step: YStepper.step(Ystep);</p><p> Griper.write(GripSp);</p>
Attachments
Step 4: Made By
casp6099 - Casper Hartung Christensen
rasm616d - Rasmus Hansen