Introduction: Robotic Arm With Conveyor, Able to Assembly Work Pieces Underway

Hello everyone, 
this is a project where I designed and built a work station to a six degree of freedom robotic arm. It is a common example from a production line, that the work piece is travelling on a conveyor belt or palette to the work station, where it stops in a fixed position, and the robot arm takes over the completion of the procedure from there. My main goal was to make experiments, if the robotic arm is enough precise to assembly work pieces during they are moving on a conveyor belt. This "on-the-go" assembly (or other industrial tasks) are not widely used in the industry yet, but they will be in the future. 

How it works? 
There is an incremental encoder on the lower side of the motor of the conveyor, which gives the information to the main processor unit of the robot arm, to be able to calculate the actual speed and displacement of the conveyor.
On the side of the conveyor, there are several inductive proximity sensors, which can detect the aluminium palette, when it pass by them. Using this information, the robotic arm gripper can follow the palette with the same speed, and it is able to do all the assembly work (or whatever task we gave to it). The speed of the conveyor belt is adjustable with two frequency inverters. The palette can be stopped in  several points with pneumatic stopper, and it returns to its original position with the help of a pneumatic way selector.

I did not built all the parts of the conveyor belt, as a base I used parts of an old disassembled conveyor (which was used in a Nokia factory for procure speakers into eg. 3310 mobile phones :) ). The encoder, the palette and other parts I made manually, and of course, the programming, which was the hardest work! :)

You can see here the work station, during doing one simple assembly task with only 30% of the maximum speed.

I am now in the topic of 3D printing, and planning to buy a filament feeder, hot-end and nozzle (parts of a 3D plastic printer) and  put it on the robot gripper head. In this way I can try out to print large objects (in the maximal size of ~ 1,2m * 0,8m). May it would be great to extend this head with a computer fan, so probably the plastic filament will cool down very fast, and just a very few substantiation will be needed under the printed object. 
Of course this will be only an experiment too, because I can use my university's robot only in a limited time :) 

Step 1: The Robot Without Work Station

This is the robotic arm, without any work-stations.

Step 2: Re-assembling the Conveyor Belt From Old Parts

I had the opportunity to use some old parts of 3 conveyor belts, so I disassembled them, cleaned the parts from oil and other contamination, and re-assembled one "new" conveyor with the desired length and other sizes and recouped all missing parts from the other ones.

Step 3: Connecting the Encoder

To be able to determine the speed of the motor (and thus, the speed of the conveyor) I turned an axis extension to the lower side of the motor. Also the axis of the motor was needed to be "thread bored" (sorry because of my English) to be able to furl the extension in the motor's axis. On the other end of the extension came the Megatron (MHL40 8 1000 5 BZ NA) incremental encoder. The main parts of the encoder are: light source (in my case it is a LED), which shines through a disc with holes. On the other side of this disc there is a light sensor which counts the incoming light impulses, and transmit this signal to the main processor of the robot. There is a "first calibration" needed, in order to synchronize the robot coordinate system with the displacement of the conveyor belt, and the taken turns of the encoder during this distance. After this calibration the robot calculates the signals of the encoder to distances in his coordinate system. One of the most difficult and time-consuming task (after re-building of the mechanical part of the conveyor) was to do the correct settings for this synchronizing. It was a need to write a program which handles the frequency inverters to start the conveyor, and open-close the pneumatic stoppers, and of course it was needed to move the robotic arms in the proper and known positions. The main lines of this synchronizing code are available in the manual pdf of the robot (Mitsubishi RV-3SDB). Also the ladder-diagram and full code available here with my settings.

Step 4: The Frequency Inverters

The frequency inverters are needed to be able to control the speed of the motor. The motor operates originally on 50Hz, but it was way too fast to this procedure. Then I set the frequency on 33Hz as a base setting. Through his speed change selector input, there is also a possibility to change the speed from the programming code of the robot. The frequency inverter comes also from second hand, but does his work very good. Also an emergency switch (a big red button) is needed to connect for security reasons.

Step 5: Making the Palette

All the parts of the palette are hand made. :) Only the "work piece" was given. Unfortunately no 3D printing possibility is available here, so the parts had to be "CNC-made" from aluminium, or spindled from plastic. On the upper side of the palette I used ball bearings, to have better rounds on edges and not to get stucked in the way selector. The big alumunium piece is needed because the inductive proximity sensors.

Step 6: Finishing the Conveyor Belt

Then, I added the start point and end point of the conveyor belt. Also the way selector is integrated. It works with pneumatic switches too.

Step 7:

The pneumatic switches are stopping and letting through the palette. In the starting point there is an inductive proximity sensor to be sure that there is a palette, before starting the assembly. Then the switch releases the palette, which goes nearby the second proximity sensor. This gives the signal to the main processor, that the encoder signals are now "live", i.e. the distance is measured from there. Then there is an other stopper and sensor at the end of the line. (There is a possibility to put more palettes on the conveyor at the same time, and thus a security stop is needed before letting the palette in the way selector.)

The "electric part" of the work station is only a pre-version: it has to be built in in an electric cabinet. (only question of money :) )

Step 8: Programming the Robot

The main commands to the assembly code:
- M_Out(n)=1: switch on or off the outputs (e.g. pneumatic switches or motors)
- Wait M_In(n)=1: wait for a rising signal (e.g. the signals of the inductive sensors)
- m1=M_Enc(1): when starting the tracking function, it gives the instantaneous value of the encoder to the m1 integer. 
- Trk On,pfog,m1: switching on the tracking function of the robot. 
- Trk Off: switching off the tracking function, and returning to the "normal" coordinate system of the robot.

The full program code (with Hungarian comments, this is my mother language, but I am living in Germany now :) hopefully Google translator will help you too ;) )

Servo On   'Robot szervo bekapcsolása
Ovrd 70   '70%-os sebesség
Mov phome2   'a darab várakozási pozícióba álljon
'Futószalag összeszerelő ág nullázása (mert a frekvenciaváltó felfutó és lefutó élre is reagál).
M_Out(5)=0   'összeszerelő ág hátramenet nullázása
M_Out(6)=0    'összeszerelő ág előremenet nullázása
M_Out(8)=0    'visszavezető ág előremenet nullázása
M_Out(9)=0     'visszavezető ág hátramenet nullázása
'Vizsgálat kezdés előtt: ha a paletta nincs a kiindulási ponton, oda kell vinni.
If M_In(4)=0 Then GoSub *visszavezet  'ha az első induktív jele 0, akkor nincs ott a paletta
If M_In(4)=1 Then GoTo *indit  'mivel ez rekurzív programrész, ha mar ott a paletta, kilépünk
M_Out(6)=1    'összeszerelő futószalag ág előre megy egy kicsit
M_Out(0)=1    '2. szelep (összeszerelő végpont) behúz
M_Out(2)=1    'váltó külső állásba tesz
M_Out(2)=0   'váltó nyomás visszavesz
Dly 7    'eddigre biztos a végére ér a paletta az összeszerelő ágnak
M_Out(1)=1   'váltó belső állásba tesz
M_Out(1)=0   'leveszi a váltóról a nyomást
M_Out(6)=0   'összeszerelő futószalag ág leállítása
Dly 0.5
M_Out(9)=1   'visszavezető ág futószalag beindul visszafelé
M_Out(5)=1   'összeszerelő ág hátramenetbe kapcsol
Wait M_In(4)=1 'addig vár, amíg az első induktív nem érzékel
M_Out(8)=0   'visszavezető futószalag leáll
Dly 1   'a paletta már a kiindulási pontban van
M_Out(5)=0   'összeszerelő ág hátra leáll
If M_In(4)=1 Then GoTo *indit
M_Out(6)=1  'összeszerelő ág előremenetben indítása
M_Out(4)=1   '1. szelep behúz
M_Out(2)=1   'váltó külső állás
M_Out(2)=0   'váltóról leveszi a nyomást
Wait M_In(6)=1 'indítást érzékelő induktív bejelez
m1=M_Enc(1)  'ekkor felvesszük az enkóder pozícióját (szinkronizálás)
'abban az esetben szükséges csak, ha az indító érzékelő a robot munkaterén kívül van
'PC=TrWcur(1,pjel,m1)   'meg kell várnia a paletta beérkezését a munkatérbe
'If PosCq(PC)<>1 Then GoTo *var  'beért-e a munkatérbe?
'If PC.Y>350 Then GoTo *var  'beért-e a szerelési távolságba? (350mm)
'If PC.Y<0 Then GoTo *var   'probléma esetén már túlment volna 'a szerelési távolságon
Trk On,pjel,m1    'tracking indítása
'pjel: fixen beállítandó érték, a robot koordinátarendszerében az induktív 'bejelzésekor a munkadarab pozíciója
'm1: az enkóder pozíciója, amikor a munkadarab elérte az induktívot
'innentől egy mozgó koordináta rendszerben leszünk, amelynek középpontja a munkadarab
Mov phenger,10   'felvesszük az első darabot
Mvs phenger
Dly 0.25
Hclose 1
Dly 0.25
Mvs phenger, 10
Mov pkp,50
Mvs pkp
Dly 0.25
HOpen 1    'leraktuk a hengert
Dly 0.25
Mov pkp, 50
Mov pdugattyu, 10   'dugattyúért megy
Mvs pdugattyu
Dly 0.25
Hclose 1    'felvettük a dugattyút
Dly 0.25
Mvs pdugattyu, 10
Mov pkp, 50
Mvs pkp
Dly 0.25
HOpen 1    'leraktuk a dugattyút
Dly 0.25
Mov pkp, 50
Mov prugo, 10   'rugóért megy
Mvs prugo
Dly 0.25
Hclose 1    'felvettük a rugót
Dly 0.25
Mvs prugo, 10
Mov pkp, 50
Mvs pkp
Dly 0.25
HOpen 1    'leraktuk a rugót
Dly 0.25
Mov pkp, 50
Trk Off
Wait M_In(7)=1    'addig vár, amíg az harmadik(összeszerelő ág vége) induktív nem érzékel
M_Out(4)=0     '1. szelep kienged
M_Out(0)=1      '2. szelep (összeszerelő végpont) behúz
Wait M_In(7)=0    'addig vár, amíg az harmadik(összeszerelő ág vége) induktív előtt mar nincs ott a darab (tehát kifutott a végpontig)
Dly 1
M_Out(6)=0     'összeszerelő ág futószalag előre leállít
M_Out(1)=1     'váltó belső állás
M_Out(1)=0     'váltó belső állást kell nullázni
M_Out(0)=0     '2. szelep (összeszerelő végpont) kienged
M_Out(5)=1     'összeszerelő futószalag hátra indul
M_Out(9)=1     'visszavezető futószalag előre indul
Wait M_In(6)=1    'addig vár, amíg az visszavezető induktív nem érzékel (de nem történik semmi)
Wait M_In(4)=1    'addig vár, amíg az összeszerelő induktív nem érzékel (vissza nem ért a darab)
M_Out(5)=0     'összeszerelő futószalag hátra leáll
M_Out(9)=0     'visszavezető ág futószalag leáll
Mov phome2
Servo Off
'kimenetek és bemenetek listája
'M_Out(0)=1    '2. szelep (összeszerelő végpont) behúz
'M_Out(0)=0    'végpont szelep kienged
'M_Out(1)=1    'váltó belső állásra vált
'M_Out(1)=0    'váltó belső állás nyomás levesz
'M_Out(2)=1    'váltó külső állásra állít
'M_Out(2)=0    'itt nem kell nyomást levenni
'M_Out(3)=1    '3.szelep (visszavezető ág) behúz
'M_Out(3)=0    '3. szelep kienged
'M_Out(4)=1    '1. szelep behúz
'M_Out(4)=0    '1. szelep kienged
'Futószalag ágak nullázása (mindig kell, mert mindig a korábbi érték ellentétjére indul vagy áll meg).
'M_Out(5)=0    'futószalag leáll nullázással kezdünk
'M_Out(6)=0    'futószalag leáll nullázással kezdünk
'M_Out(8)=0    'másik futószalag előre leáll
'M_Out(9)=0    'másik futószalag előre leáll
'M_Out(5)=1    'összeszerelő ág futószalag hátra indul
'M_Out(5)=0    'összeszerelő ág futószalag leáll
'M_Out(6)=1    ''összeszerelő ág futószalag előre indul
'M_Out(6)=0    ''összeszerelő ág futószalag előre leáll
'M_Out(8)=1    'visszavezető ág futószalag hátra indul
'M_Out(8)=0    ' visszavezető ág futószalag hátra leáll
'M_Out(9)=1    ' visszavezető ág futószalag előre indul
'M_Out(9)=0    ' visszavezető ág futószalag előre leáll
'Wait M_In(4)=1   'addig vár, amíg az első induktív nem érzékel
'Wait M_In(5)=1   'addig vár, amíg az indító induktív nem érzékel
'Wait M_In(6)=1   'addig vár, amíg az visszavezető induktív nem érzékel
'Wait M_In(7)=1   'addig vár, amíg az harmadik(összeszerelő ág vége) induktív nem érzékel

Step 9: Thank You for Reading!

Thank you for reading. I hope you enjoyed the project. In case if you have the great opportunity to work with a similar robotic arm, do not hesitate to contact me for further tips and program codes: uvegtiger [at] gmail [dot] com
UP! Contest

Participated in the
UP! Contest