Pipettin' GRBL¶
Sitio en construcción!
Pipetting robotware for laboratory protocol automation.
Repositorio del proyecto:
- V1.0 (público): https://github.com/naikymen/pipettin-grbl-alpha
- Devel repo (private): https://github.com/naikymen/pipettin-grbl-devel
Antecedentes:
- Opentrons OT-2.
- Hamilton liquid handling robots.
- farm.bot Open-Source CNC Farming.
- Alexander Klenov's McQ:
- DerAndere's Pipetbot-A8 (gitlab repo here).
- Nuestro CNC: proyectos/diy/cnc
- FrescoM: https://github.com/frescolabs/FrescoM
- Cellerator:
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¶
Ver repo.
Demo (viejo):
Video: https://www.youtube.com/watch?v=WrDb-vIC0Ww
Conceptual¶
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
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
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.
- grbl-link: https://pypi.org/project/grbl-link/
- gerbil (quizas no ande con 1.1h): https://github.com/michaelfranzl/gerbil
- Script de GRBL: https://github.com/gnea/grbl/blob/master/doc/script/simple_stream.py
- https://github.com/gnea/grbl/wiki/Grbl-v1.1-Interface
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).
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:
- GRBL probe:
- Sensor de fuerza:
- Electrónico https://articulo.mercadolibre.com.ar/MLA-754936346-sensor-de-fuerza-de-05-de-diametro-_JM
- Mecánico con un end-stop.
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
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:
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¶
...