Custom Linear Actuator (XY Table)

There was a point in time when I wanted to build an XY table with 3D printed components, wood, and hardware only. I wanted to utilize some cheap steppers found on Amazon. This XY table was going to be used for the ACAPP Project, a machine used for createting simple printed circuit boards. The design has flaws, but some of the parts work very well on their own! With some work, the whole system might work, but that's a project I have to save for the summer.

I started by designing a gear that would fit over the output shaft of the stepper. I found a model of the 28BYJ-48 5V stepper on Thingiverse from user "siderits." I took some measurements on the physical motor, and double checked the dimensions. From that point, I designed a gear or "pinion," and made a simple rack just to test the fit. I had to use an Exact-O to cut away some of the inner hole of the pinion once it was printed, so it would fit well on the motor shaft.

Once I verified the basic principle was going to work, I designed the rest of the axis, or the linear actuator. Now my Printrbot Simple only has a print volume of 4"x4"x4", which can be a large constraint for projects like this. I've experimented a lot with dovetails, and have not found one that has worked perfectly, but I've found some that work good enough for my application. The complete axis can be seen below.

Some images of the designed linear actuator

The axis is designed in 6 parts (4 unique parts) and designed such that it can be printed with no support, or any other assistive measures. These parts were printed, and worked very well. I had taken a soldering iron at a low temperature to "smooth" out the dovetail joints. With a little pressure and patience, they go together well. The ends of the axis are made to have small limit switches tied to them for end stops. I wrote a basic assembly program to control the stepper back and forth on the axis.

I wrote the code for an end of life processor that I can't seem to let go of, the Parallax SX28. I've got a whole bunch of them, and have a sentimental attachment to the processor (The first microprocessor that I've ever used)

;-------------------------- DEVICE DIRECTIVES --------------------------

        DEVICE        SX28,OSC1MHZ,TURBO

IFDEF    __SASM  ;SASM Directives
        DEVICE        STACKX,OPTIONX
        IRC_CAL        IRC_SLOW
        
ELSE        ;Parallax Assember Directives
        DEVICE        STACKX_OPTIONX
ENDIF

        RESET        Initialize

;------------------------------ VARIABLES ------------------------------
            
        Count1    EQU    $08
        Count2    EQU    $09
        Count3    EQU    $0A

;---------------------------- DEBUG SETTINGS ---------------------------

        FREQ     20000
    
        WATCH    Count1,16,UDEC

;------------------------ INITIALIZATION ROUTINE -----------------------

Initialize
        ;Configure port settings
        

        mov    W,#$1E            ;Allow Pull-Up Resistor configuration
        mov    M,W                
        mov    !ra,#%0000        ;Set entire 4-bit port A to have pull-up resistors

        mov    W,#$1F            ;Allow Direction configuration
        mov    M,W                
        mov    !ra,#%1111        ;Set port A bits 0-3 to input direction

        mov    rb, #%00000000        ;Port a output zero
        mov    !rb,#%00000000        ;Port a.bit7 output dir.

;---------------------------- MAIN PROGRAM -----------------------------

Main

    
        mov    RB, #%00110011
        call delay
    
        mov    RB, #%00100001
        call delay
    
        mov    RB, #%01101001
        call delay
    
        mov    RB, #%01001000
        call delay

        mov    RB, #%11001100
        call delay
    
        mov    RB, #%10000100
        call delay
    
        mov    RB, #%10010110
        call delay
    
        mov    RB, #%00010010
        call delay

        csne    RA, #$0E
        jmp    NotMain
            
            
        jmp    Main            ;goto main

NotMain
    
        mov    RB, #%00010010
        call delay
    
        mov    RB, #%10010110
        call delay
    
        mov    RB, #%10000100
        call delay
    
        mov    RB, #%11001100
        call delay

        mov    RB, #%01001000
        call delay
    
        mov    RB, #%01101001
        call delay
    
        mov    RB, #%00100001
        call delay
    
        mov    RB, #%00110011
        call delay
        
        
        csne    RA, #$0D
        jmp    Main
                
        jmp    NotMain            ;goto main
                

Delay        clr    Count1          ;Initialize Count1, Count2                                    

Loop        djnz    Count1,loop        ;Decrement until all are zero                                    
        ret                ;then return          
     

Next I designed the rest of the table. Once again, I designed it such that it could be printed off flat with no supports.

A picture of the entire system model

After printing off all of the parts, cutting some wood, and picking up some hardware, here is my finished product.

A picture of the finished machine

The suspended axis is designed such that a different carrier can be put onto the motor so different tools can be used on the table. The issue was my 3D printed linear bearing design. It did not slide smooth enough, and prevented the lower axis from moving properly. This could be fixed by using a standard linear bearing and rod. Overall this project was a fun experience to try and see how effectively I could design for 3D printing, and working on a whole system. Leave a comment below if you have any questions, or would like some models!