Skip to content

Pipettin' GRBL

Sitio en construcción!

Pipetting robotware for laboratory protocol automation.

Repositorio del proyecto:

Antecedentes:

Este proyecto recicló el "dremel" CNC, para automatizar protocolos de laboratorio.

El cerebro es un Raspberry Pi 4, que controlará al GRBL 1.1h de un Arduino Uno con CNC Shield 3.0.

En un principio pensé en usar un servo para accionar la pipeta o una jeringa, pero el servo que tengo es bastante malo (y los buenos son caros). La solución fue la pipeta-stepper.

Hardware

Overview

img_7441.png

Ver repo.

Demo (viejo):

Video: https://www.youtube.com/watch?v=WrDb-vIC0Ww

Conceptual

20210601-071626.png

Eyección de tips

Mecanismos para Tool-change

Con eso nos vendria re bien una mano :)

Por ahora solo tenemos una herramienta, pero en el roadmap la version 2.0 del robot puede cambiar de herramienta (i.e. usar otras pipetas, etc.).

ProperPrinting

https://www.thingiverse.com/thing:3948924

20200923-072651.png

Jubilee

https://github.com/machineagency/jubilee/wiki

E3D

https://hackaday.com/2019/10/04/e3d-tool-changer-partially-reviewed/

FarmBot

https://genesis.farm.bot/docs/utm

Electronica

Interacción RPi-Arduino

Este circuito usamos para que el RPi pueda resetear al Arduino/GRBL.

Además se muestran las conexiones del RPi al stepper driver de la pipeta, que es independiente de GRBL, y se controla con la libreria pigpio.

Ver: https://www.circuit-diagram.org/editor/c/a87956cfae944411bb0baafdb4f1fc90

pipetting_grbl_gpio_arduino.png

GCODE Sender

El plan es hacer un "standard pipetting language" a partir de la UI.

Las funciones de python deberian parsear ese lenguaje con un switch case y usar las funciones constructoras de GCODE que correspondan a cada comando de ese lenguaje.

Python

Formas de mandar GCODE a GRBL desde Python.

Adaptado a Python 3.8 usando el paquete pyserial.

#!/usr/bin/python3

import serial as serial
import time

# Open grbl serial port
s = serial.Serial('/dev/tty.usbmodem1811', 115200)

# Open g-code file
f = open('grbl.gcode', 'r')

# Wake up grbl
s.write("\r\n\r\n")
time.sleep(2)   # Wait for grbl to initialize 
s.flushInput()  # Flush startup text in serial input

# Stream g-code to grbl
for line in f:
    l = line.strip()  # Strip all EOL characters for consistency
    print('Sending: ' + l)
    s.write(l + '\n')  # Send g-code block to grbl
    grbl_out = s.readline()  # Wait for grbl response with carriage return
    print(' : ' + grbl_out.strip())

# Wait here until grbl is finished to close serial port and file.
input("  Press <Enter> to exit and disable grbl.")

# Close file and serial port
f.close()
s.close()

El GRBL se reinicia cara vez que Python se conecta

Ver: https://github.com/gnea/grbl/issues/160

Problema: si quiero generar y enviar codigo de forma dinamica, es decir generar GCODE on the go, necesito mantener abierto el serial o bien abrir y cerrar cada vez. Decidi que por ahora es mas facil abrirlo y cerrarlo que mantenerlo abierto.

Solucion: poner un capacitor de 10 uF entre reset y ground (reset es el emergency stop en el CNC shield 3.0).

20200705-112212.png

Tambien intente poner serial.drt = None como sugieren por ahi, pero no me ayudo.

Calibración del espacio de trabajo

UGS

Reemplazado por la función "go to" en la GUI

Quizas con un joystick, usando UGS: https://github.com/winder/Universal-G-Code-Sender/wiki/Raspberry-Pi

Habilitar X11 forwarding y conectarse usando ssh -X.

cd
mkdir ugs
cd ugs
wget https://ugs.jfrog.io/ugs/UGS/nightly/ugs-platform-app-2.0-SNAPSHOT-pi.tar.gz
tar -xvf ugs-platform-app-2.0-SNAPSHOT-pi.tar.gz
./ugsplatform-pi/bin/ugsplatform

XY

Opciones:

  • Una hoja de papel con donde tienen que ir las platforms, que se genere desde la GUI.
  • El robot podría usar un marcador para dibujar en la mesa los lugares donde espera las platforms.
  • Y/o sockets impresos en 3D para apoyar cada platform.

Z

Opciones:

Probing

Comando 38.X: http://linuxcnc.org/docs/html/gcode/g-code.html#gcode:g38

  • ...

Propuesta "end-stop" reverso

Reemplazado por el "tip probe"

Un "end-stop" reverso, para saber cuando la pipeta está haciendo fuerza contra el piso.

Ver: https://www.youtube.com/watch?v=9yjT9ZjxFFE&feature=youtu.be

20200923-072748.png

P

Work in progress

Balanza analítica.

Los volúmenes menores a 20 uL son difíciles de pipetear con los tips de p200.

Lo más probable es que sea por capilaridad.

Este es el mejor resultado hasta ahora, en un protocolo de pipeteo seriado:

pruebas_serie_bxplt.png

pruebas_serie_bxplt_rel.png

Se ve el error sitemático de +0.5 uL en los primeros 3 puntos, y el error sistemático de -1 uL en el último punto (cuando el volumen que queda en el tip es mínimo).

Joystick

No estaria mal poder programar protocolos con un joystick.

GRBL Jog: https://github.com/gnea/grbl/wiki/Grbl-v1.1-Jogging

grbl-gamepad

Ver tambien

https://www.hackster.io/devicehive/cnc-controller-in-python-e6e020

Casos de uso

...