Chemblock läuft

This commit is contained in:
jens 2021-12-10 23:19:44 +01:00
parent 7a67aec8e3
commit c7cf5d2f0d
4 changed files with 259 additions and 126 deletions

View File

@ -16,7 +16,16 @@ tiphub = 16.5
chemx = 200.0
chemy = 50.0
chemvol = 60.0
chemz = 50.0
chemz = 70.0
deltaz = 0.5
tauch = 0.0
[reacblock]
rxoffset = 225.0
ryoffset = 150.0
rrows = 4
rcols = 6
rxspace = 20.0
ryspace = 19.0
rzlevel = 70.0

View File

@ -112,6 +112,12 @@ class LabPipBlock():
def say_ok(self):
print('ok')
class LabReactBlock(LabPipBlock):
def __init__(self, xoffset, yoffset, z, rows, cols, deltax, deltay):
super().__init__(xoffset, yoffset, z, rows, cols, deltax, deltay)
class ChemLoc():
""" Chemikalien Lokation zloc location of surface
vol of chemical

View File

@ -72,6 +72,7 @@
#define P_STEP_PIN 26 // E0_STEP_PIN
#define P_DIR_PIN 28 // E0_DIR_PIN
#define P_CS_PIN 42 // E0_CS_PIN
#define P_LIMIT 19 // Z_MAX_PIN
#endif
@ -177,7 +178,7 @@ boolean homeP;
int x_steps_mm = 80;
int y_steps_mm = 80;
int z_steps_mm = 80;
int p_steps_mm = 157.5;
double p_steps_mm = 5040;
// variables to hold location data
@ -189,12 +190,13 @@ double locP_in_mm;
int locX_in_steps;
int locY_in_steps;
int locZ_in_steps;
int locP_in_steps;
double locP_in_steps;
#ifdef jfs
int locX_max = 27000;
int locY_max = -31200;
int locZ_max = 4400;
int locZ_max = 6560;
double locP_max = 201600;
#endif
// variables to hold LED data
@ -207,7 +209,7 @@ void setup() {
#ifdef otto
SPI.begin();
#endif
Serial.begin(9600);
Serial.begin(115000);
while(!Serial);
#ifdef otto
@ -259,6 +261,9 @@ void setup() {
#endif
//***** Setting up Switches, Sensors, and Buttons *****
#ifdef jfs
pinMode(P_LIMIT, INPUT);
#endif
pinMode(X_LIMIT, INPUT);
pinMode(Y_LIMIT, INPUT);
pinMode(Z_LIMIT, INPUT);
@ -330,7 +335,6 @@ void loop() {
strcpy(tempChars, receivedChars);
// this temporary copy is necessary to protect the original data
// because strtok() used in parseData() replaces the commas with \0
Serial.println(tempChars);
parseData();
coordinateMove();
newData = false;
@ -371,6 +375,93 @@ void recvWithStartEndMarkers() {
}
//============
void doHomeX(){
stepperX.setMaxSpeed(5000);
stepperX.setAcceleration(2000);
int initial_homing = stepperX.currentPosition();
homeX = false;
while (homeX == false){
initial_homing--;
stepperX.moveTo(initial_homing);
stepperX.run();
if (digitalRead(X_LIMIT) != 1) {
delay(1);
if (digitalRead(X_LIMIT) !=1){
homeX = true;
}
}
}
stepperX.setMaxSpeed(10000);
stepperX.setAcceleration(5000);
stepperX.setCurrentPosition(0);
Serial.println("X Homed");
}
void doHomeY(){
int initial_homing = stepperY.currentPosition();
//Homing Y at min
stepperY.setMaxSpeed(5000);
stepperY.setAcceleration(2000);
initial_homing = stepperY.currentPosition();
homeY = false;
while (homeY == false){
initial_homing++;
stepperY.moveTo(initial_homing);
stepperY.run();
if (digitalRead(Y_LIMIT) != 1) {
delay(1);
if (digitalRead(Y_LIMIT) !=1){
homeY = true;
}
}
}
stepperY.setMaxSpeed(10000);
stepperY.setAcceleration(5000);
stepperY.setCurrentPosition(0);
Serial.println("Y Homed");
}
void doHomeZ(){
stepperZ.setMaxSpeed(5000);
stepperZ.setAcceleration(2000);
int initial_homing = stepperZ.currentPosition();
homeZ = false;
while (homeZ == false){
initial_homing--;
stepperZ.moveTo(initial_homing);
stepperZ.run();
if (digitalRead(Z_LIMIT) != 1) {
delay(1);
if (digitalRead(Z_LIMIT) !=1){
homeZ = true;
}
}
}
stepperZ.setMaxSpeed(10000);
stepperZ.setAcceleration(5000);
stepperZ.setCurrentPosition(0);
Serial.println("Z Homed");
}
void doHomeP(){
stepperP.setMaxSpeed(5000);
stepperP.setAcceleration(2000);
int initial_homing = stepperP.currentPosition();
homeP = false;
while (homeP == false){
initial_homing--;
stepperP.moveTo(initial_homing);
stepperP.run();
if (digitalRead(P_LIMIT) != 1) {
delay(1);
if (digitalRead(P_LIMIT) !=1){
homeP = true;
}
}
}
stepperP.setCurrentPosition(0);
Serial.println("P Homed");
}
void parseData() { // split the data into its parts
@ -444,7 +535,12 @@ void parseData() { // split the data into its parts
}
#endif
locP_in_steps = locP_in_mm * p_steps_mm;
#ifdef jfs
if (locP_in_steps > locP_max) {
Serial.println(" P off limits ");
locP_in_steps = locP_max;
}
#endif
}
//============
@ -457,7 +553,6 @@ void coordinateMove(){
stepperZ.setMaxSpeed(2000);
stepperZ.setAcceleration(1000);
if (strcmp(mode, "G1") == 0){
stepperX.moveTo(locX_in_steps);
stepperY.moveTo(locY_in_steps);
stepperZ.moveTo(locZ_in_steps);
@ -469,7 +564,7 @@ void coordinateMove(){
stepperY.setAcceleration(4000);
stepperZ.setMaxSpeed(10000);
stepperZ.setAcceleration(6000);
stepperP.setMaxSpeed(12000);
stepperP.setMaxSpeed(10000);
stepperP.setAcceleration(6000);
while(stepperX.targetPosition() != stepperX.currentPosition() or stepperY.targetPosition() != stepperY.currentPosition() or stepperZ.targetPosition() != stepperZ.currentPosition() or stepperP.targetPosition() != stepperP.currentPosition()){
@ -592,98 +687,29 @@ void coordinateMove(){
Serial.println( stepperY.currentPosition());
Serial.print("Z Position ");
Serial.println( stepperZ.currentPosition());
Serial.print("P Position ");
Serial.println( stepperP.currentPosition());
}
else if (strcmp(mode, "JP") == 0){
doHomeP();
}
else if (strcmp(mode, "JX") == 0){
doHomeX();
}
else if (strcmp(mode, "JY") == 0){
doHomeY();
}
else if (strcmp(mode, "JZ") == 0){
//Homing Z at min
stepperZ.setMaxSpeed(5000);
stepperZ.setAcceleration(2000);
int initial_homing = stepperZ.currentPosition();
homeZ = false;
while (homeZ == false){
initial_homing--;
stepperZ.moveTo(initial_homing);
stepperZ.run();
if (digitalRead(Z_LIMIT) != 1) {
delay(1);
if (digitalRead(Z_LIMIT) !=1){
homeZ = true;
}
}
}
stepperZ.setMaxSpeed(10000);
stepperZ.setAcceleration(5000);
stepperZ.setCurrentPosition(0);
stepperP.setCurrentPosition(0);
Serial.println("<Z Homed>");
doHomeZ();
}
//***** G28 - Homing Cycle *****
// For this code to work as written the limit switches must be located at
// X - Mininum
// Y - Minimun
// Z - Minimun
else if (strcmp(mode, "G28") == 0){
//Homing X at min
stepperX.setMaxSpeed(5000);
stepperX.setAcceleration(2000);
int initial_homing = stepperX.currentPosition();
homeX = false;
while (homeX == false){
initial_homing--;
stepperX.moveTo(initial_homing);
stepperX.run();
if (digitalRead(X_LIMIT) != 1) {
delay(1);
if (digitalRead(X_LIMIT) !=1){
homeX = true;
}
}
}
stepperX.setMaxSpeed(10000);
stepperX.setAcceleration(5000);
stepperX.setCurrentPosition(0);
//Homing Y at min
stepperY.setMaxSpeed(5000);
stepperY.setAcceleration(2000);
initial_homing = stepperY.currentPosition();
homeY = false;
while (homeY == false){
initial_homing++;
stepperY.moveTo(initial_homing);
stepperY.run();
if (digitalRead(Y_LIMIT) != 1) {
delay(1);
if (digitalRead(Y_LIMIT) !=1){
homeY = true;
}
}
}
stepperY.setMaxSpeed(10000);
stepperY.setAcceleration(5000);
stepperY.setCurrentPosition(0);
//Homing Z at min
stepperZ.setMaxSpeed(5000);
stepperZ.setAcceleration(2000);
initial_homing = stepperZ.currentPosition();
homeZ = false;
while (homeZ == false){
initial_homing--;
stepperZ.moveTo(initial_homing);
stepperZ.run();
if (digitalRead(Z_LIMIT) != 1) {
delay(1);
if (digitalRead(Z_LIMIT) !=1){
homeZ = true;
}
}
}
stepperZ.setMaxSpeed(10000);
stepperZ.setAcceleration(5000);
stepperZ.setCurrentPosition(0);
stepperP.setCurrentPosition(0);
else if (strcmp(mode, "G28") == 0){
doHomeZ();
doHomeY();
doHomeX();
doHomeP();
Serial.println("<OK Homed>");
}
@ -721,4 +747,5 @@ void coordinateMove(){
}
Serial.println("<ok>");
}
}

View File

@ -6,8 +6,10 @@ import tkinter.ttk as ttk
from configparser import ConfigParser
import os
import labrobot as lrb
import threading
# commands
command = []
# serial ports
ports = serial.tools.list_ports.comports()
serialObj = serial.Serial()
@ -17,7 +19,7 @@ def serial_ports():
def on_select(event=None):
serialObj.port = cb.get().split(' ')[0]
serialObj.baudrate = 115200
serialObj.baudrate = 115000
serialObj.open()
@ -101,32 +103,48 @@ b12 = ttk.Button(downrightframe,text='Dispense')
b12.grid(row=1,column=2,sticky='ne')
b14 = ttk.Button(downrightframe,text='Take Chem')
b14.grid(row=2,column=0,sticky='ne')
b15 = ttk.Button(downrightframe,text='Next Vessel')
b15.grid(row=2,column=1,sticky='ne')
b16 = ttk.Button(downrightframe,text='Load Next')
b16.grid(row=2,column=2,sticky='ne')
###################### Parts
## init Labrobot
## Top Block
xoffset = tk.DoubleVar()
yoffset = tk.DoubleVar()
rows = tk.IntVar()
cols = tk.IntVar()
xspace = tk.DoubleVar()
yspace = tk.DoubleVar()
tipvol = tk.IntVar()
zlevel = tk.DoubleVar()
akttip = tk.IntVar()
## Tip
tipvol = tk.IntVar()
tipup = tk.DoubleVar()
tiphub = tk.DoubleVar()
tipspeed = tk.IntVar()
akttip = tk.IntVar()
## Chemicals
chemX = tk.DoubleVar()
chemY = tk.DoubleVar()
chemVol = tk.DoubleVar()
chemZ = tk.DoubleVar()
deltaz = tk.DoubleVar()
tauch = tk.DoubleVar()
## ReactionSpace
rxoffset = tk.DoubleVar()
ryoffset = tk.DoubleVar()
rrows = tk.IntVar()
rcols = tk.IntVar()
rxspace = tk.DoubleVar()
ryspace = tk.DoubleVar()
rtipvol = tk.IntVar()
rzlevel = tk.DoubleVar()
rakt = tk.IntVar()
def conf_read():
config = ConfigParser()
@ -148,6 +166,13 @@ def conf_read():
chemZ.set(float(config.get('chemblock','chemz',fallback=0)))
deltaz.set(float(config.get('chemblock','deltaz',fallback=0)))
tauch.set(float(config.get('chemblock','tauch',fallback=0)))
rxoffset.set(float(config.get('reacblock','rxoffset',fallback=0)))
ryoffset.set(float(config.get('reacblock','ryoffset',fallback=0)))
rrows.set(int(config.get('reacblock','rrows',fallback=0)))
rcols.set(int(config.get('reacblock','rcols',fallback=0)))
rxspace.set(float(config.get('reacblock','rxspace',fallback=0)))
ryspace.set(float(config.get('reacblock','ryspace',fallback=0)))
rzlevel.set(float(config.get('reacblock','rzlevel',fallback=0)))
def conf_write():
config = ConfigParser()
@ -169,6 +194,13 @@ def conf_write():
config.set('chemblock','chemz',str(chemZ.get()))
config.set('chemblock','deltaz',str(deltaz.get()))
config.set('chemblock','tauch',str(tauch.get()))
config.set('reacblock','rxoffset',str(rxoffset.get()))
config.set('reacblock','ryoffset',str(ryoffset.get()))
config.set('reacblock','rrows',str(rrows.get()))
config.set('reacblock','rcols',str(rcols.get()))
config.set('reacblock','rxspace',str(rxspace.get()))
config.set('reacblock','ryspace',str(ryspace.get()))
config.set('reacblock','rzlevel',str(rzlevel.get()))
with open(os.path.join(os.path.dirname(__file__), "config.ini"),'w') as f:
config.write(f)
conf_read()
@ -176,6 +208,7 @@ conf_read()
lpb = lrb.LabPipBlock(xoffset.get(),yoffset.get(),zlevel.get(),rows.get(),cols.get(),xspace.get(),yspace.get())
pip = lrb.LabPip(vol=tipvol.get(),top=tipup.get(),hub=tiphub.get(),fe=tipspeed.get())
chem = lrb.ChemLoc(chemX.get(),chemY.get(),chemZ.get(),chemVol.get(),deltaz.get(),tauch.get())
react = lrb.LabReactBlock(rxoffset.get(),ryoffset.get(),rzlevel.get(),rrows.get(),rcols.get(),rxspace.get(),ryspace.get())
partframe = ttk.Frame(notebook)
#partframe.rowconfigure(0,weight=1)
@ -245,6 +278,34 @@ ce4.grid(column=1,row=3,sticky='e')
cl5 = ttk.Label(chemframe,text='DeltaZ/ml').grid(column=0,row=4,padx=5)
ce5 = ttk.Entry(chemframe,textvariable=deltaz)
ce5.grid(column=1,row=4,sticky='e')
reactframe =ttk.LabelFrame(partframe,text='Reaction Vessels')
reactframe.grid(column=2,row=0,sticky='wns',padx=5,pady=5)
rl1 = ttk.Label(reactframe,text='X offset').grid(column=0,row=0,padx=5)
re1 = ttk.Entry(reactframe,textvariable=rxoffset)
re1.grid(column=1,row=0,sticky='e')
rl2 = ttk.Label(reactframe,text='rows').grid(column=0,row=2,padx=5)
re2 = ttk.Entry(reactframe,textvariable=rrows)
re2.grid(column=1,row=2,sticky='e')
rl3 = ttk.Label(reactframe,text='columns').grid(column=0,row=3,padx=5)
re3 = ttk.Entry(reactframe,textvariable=rcols)
re3.grid(column=1,row=3,sticky='e')
rl4 = ttk.Label(reactframe,text='x space').grid(column=0,row=4,padx=5)
re4 = ttk.Entry(reactframe,textvariable=rxspace)
re4.grid(column=1,row=4,sticky='e')
rl5 = ttk.Label(reactframe,text='y space').grid(column=0,row=5,padx=5)
re5 = ttk.Entry(reactframe,textvariable=ryspace)
re5.grid(column=1,row=5,sticky='e')
rl6 = ttk.Label(reactframe,text='Y offset').grid(column=0,row=1,padx=5)
re6 = ttk.Entry(reactframe,textvariable=ryoffset)
re6.grid(column=1,row=1,sticky='e')
rl7 = ttk.Label(reactframe,text='Z level').grid(column=0,row=6,padx=5)
re7 = ttk.Entry(reactframe,textvariable=rzlevel)
re7.grid(column=1,row=6,sticky='e')
ttk.Separator(reactframe, orient=tk.HORIZONTAL).grid(row=80,sticky='ew')
rl8 = ttk.Label(reactframe,text='Akt Vessel').grid(column=0,row=81,padx=5)
re8 = ttk.Entry(reactframe,textvariable=rakt)
re8.grid(column=1,row=81,sticky='e')
### commands and bindings
pb2.config(command=conf_write)
@ -273,6 +334,16 @@ def set_tipblock():
chem.zloc = float(chemZ.get())
chem.deltaz = float(deltaz.get())
chem.tauch = float(tauch.get())
global react
react.xoffset = float(rxoffset.get())
react.yoffset = float(ryoffset.get())
react.rows = int(rrows.get())
react.columns = int(rcols.get())
react.deltax = float(rxspace.get())
react.deltay = float(ryspace.get())
react.z = float(rzlevel.get())
react.akt = int(rakt.get())
pb1.config(command=set_tipblock)
@ -308,11 +379,11 @@ def do_gcode():
b5.configure(command=do_gcode)
def upTip():
serialObj.write(pip.up().encode('utf-8'))
command.append(pip.up().encode('utf-8'))
b9.configure(command=upTip)
def downTip():
serialObj.write(pip.down().encode('utf-8'))
command.append(pip.down().encode('utf-8'))
b10.configure(command=downTip)
def nextTip():
@ -320,41 +391,61 @@ def nextTip():
serialObj.write(pip.get_tip(lpb.next()).encode('utf-8'))
akttip.set(lpb.akt)
downTip()
b8.configure(command=nextTip)
def load():
serialObj.write(pip.go_top().encode('utf-8'))
serialObj.write(pip.go_down().encode('utf-8'))
serialObj.write(pip.go_top().encode('utf-8'))
command.append(pip.go_top().encode('utf-8'))
command.append(pip.go_down().encode('utf-8'))
command.append(pip.go_top().encode('utf-8'))
b13.config(command=load)
def dispense():
serialObj.write(pip.go_down().encode('utf-8'))
command.append(pip.go_down().encode('utf-8'))
b12.config(command=dispense)
def top():
serialObj.write(pip.go_top().encode('utf-8'))
command.append(pip.go_top().encode('utf-8'))
b11.config(command=top)
def takeChem():
print(chem.getXY())
upTip()
pip.setXY(chem.getXY())
serialObj.write(pip.sendXY().encode('utf-8'))
command.append(pip.sendXY().encode('utf-8'))
pip.setZ(chem.load(1))
serialObj.write(pip.down().encode('utf-8'))
serialObj.write(pip.go_top().encode('utf-8'))
command.append(pip.down().encode('utf-8'))
load()
command.append(pip.up().encode('utf-8'))
b14.config(command=takeChem)
def nextVessel():
upTip()
command.append(pip.get_tip(react.next()).encode('utf-8'))
rakt.set(react.akt)
downTip()
b15.config(command=nextVessel)
def loadNext():
upTip()
takeChem()
nextVessel()
dispense()
upTip()
b16.config(command=loadNext)
b14.config(command=takeChem)
weiter = True
def checkSerialPort():
global weiter
if serialObj.isOpen() and serialObj.in_waiting:
recentPacket = serialObj.readline()
recentPacketString = recentPacket.decode('utf')
txt.insert('0.1',recentPacketString,'small')
weiter = True
if (len(command) > 0) & (weiter==True) :
x = command.pop(0)
txt.insert('0.1',x,'small')
serialObj.write(x)
weiter=False
while True: