Progetto Stampa 3D

Stampa 3D o additive manufacturing è il processo di creazione tridimensionale di oggetti solidi da un file digitale. Robot industriali possono essere usati come stampanti a 3 assi o 5 assi con RoboDK. Il seguente video mostra una panoramica di come impostare la stampa 3D con RoboDK: guarda.

Stampa 3D con robot è possibile in una delle seguenti condizioni:

Convertendo direttamente un programma G-code (file NC) in programmi robot con RoboDK, come mostrato con il progetto fresatura. Il rapporto di materiale (parametro E) è preso in considerazione per ogni movimento e può essere integrato nel programma generato come un Evento Programma. Il G-code è un tipo di file NC supportato da RoboDK ed è anche un formato supportato da molte stampanti 3D. La maggiorparte dei software di slicing possono generare il G-code dato un file STL.

Seleziona UtilitàProgetto di stampa 3D per aprire le impostazioni di stampa 3D. Queste impostazioni sono le stesse del progetto fresatura, l'unica differenza è che l'input percorso è preselezionato in oggetto stampa 3D. Seleziona Seleziona oggetto per selezionare l'oggetto sullo schermo e automaticamente ottenere il percorso. Seleziona opzioni stampa 3D per aprire Slic3r.

Robot Machining - Figura 31

Robot Machining - Figura 32

Di default, RoboDK traduce i valori E come chiamate programma ad un programma chiamato Extruder passando anche il valore E come parametro. Seleziona Eventi Programma per modificare questo comportamento.

Robot Machining - Figura 33

Il valore di estrusione (E) rappresenta quanto materiale deve essere estruso prima di ogni movimento. Questo valore può essere utilizzato per gestire il feed dell'estrusore dal robot tenendo in considerazione la velocità e la distanza tra i punti.

In alternativa, è possibile calcolare il feed utilizzando un post processore e generare codice appropriato. La prossima sezione fornisce un esempio.


Post Processori per stampanti 3D

Questa sezione mostra come modificare un post processore robot per calcolare il feed dell'estrusore prima di eseguire ogni movimento. In alternativa, questi calcoli possono essere fatti dal controllore robot.

Il primo step è quelli di intercettare le chiamate all'estrusore e leggerne i valori dalla sezione RunCode del post processore:

def RunCode(self, code, is_function_call = False):

    if is_function_call:

        if code.startswith("Extruder("):

            # Intercept the extruder command.

            # if the program call is Extruder(123.56)

            # we extract the number as a string

            # and convert it to a number

            self.NEW_E_LENGTH = float(code[9:-1])

            # Skip the program call generation

            return

        else:

            self.addline(code + "()")

    else:

# Output program code

        self.addline(code)

Il valore di estrusione è salvato nella variabile NEW_E_LENGTH. Poi, dobbiamo definire una nuova procedura che genera un appropriato comando in accordo alla distanza tra i movimenti, la velocità robot e l'accelerazione robot. Ciò assume che il feed dell'estrusore è gestito da un output analogico dal controllore robot (output analogico numero 5 in questo esempio)

def new_move(self, pose1, pose2):

    if pose1 isNone:

        return

    def Calculate_Time(Dist, Vmax, Amax):

        '''Calculate the time to move Dist with Amax acceleration and Vmax speed'''

        tacc = Vmax/Amax;

        Xacc = 0.5*Amax*tacc*tacc;

        if Dist <=2*Xacc:

            # Vmax is not reached

            tacc = sqrt(Dist/Amax)

            Ttot = tacc*2

        else:

            # Vmax is reached

            Xvmax = Dist -2*Xacc

            Tvmax = Xvmax/Vmax

            Ttot = 2*tacc + Tvmax

        return Ttot

    add_material = self.NEW_E_LENGTH - self.LAST_E_LENGTH

    self.LAST_E_LENGTH = self.NEW_E_LENGTH

    if add_material >0:

        distance_mm = norm(subs3(pose1.Pos(), pose2.Pos()))

        # calculate movement time in seconds

        time_s = Calculate_Time(distance_mm, self.SPEED_MMS, self.ACCEL_MMSS)

        # add material

        self.setDO(5, (add_material/time_s))

    else:

        # DO not add material

        self.setDO(5,0)

Infine, dobbiamo avviare il comando new_move con ogni nuova istruzione di movimento. Possiamo aggiungere questa chiamata all'inzio di ogni comando MoveL:

def MoveL(self, pose, joints, conf_RLF=None):

    """Add a linear movement"""

    self.new_move(self.LAST_POSE, pose) # used for 3D printing