diff --git a/gui/config.ini b/gui/config.ini index 59f8eac..da59585 100644 --- a/gui/config.ini +++ b/gui/config.ini @@ -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 + diff --git a/gui/labrobot.py b/gui/labrobot.py index cc9991b..d3999a1 100644 --- a/gui/labrobot.py +++ b/gui/labrobot.py @@ -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 diff --git a/otto/otto.ino b/gui/otto/otto.ino similarity index 92% rename from otto/otto.ino rename to gui/otto/otto.ino index c168860..0cbf178 100644 --- a/otto/otto.ino +++ b/gui/otto/otto.ino @@ -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 @@ -151,7 +152,7 @@ int changeDirection = 1; // ***** Variables for Serial Communication with Computer ***** -const byte numChars = 32; +const byte numChars = 32; char receivedChars[numChars]; char tempChars[numChars]; // temporary array for use when parsing @@ -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 @@ -442,9 +533,14 @@ void parseData() { // split the data into its parts Serial.println(" Z off limits "); locZ_in_steps = locZ_max; } -#endif +#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,99 +687,30 @@ 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, "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(""); + 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){ + 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); - Serial.println(""); + doHomeZ(); + doHomeY(); + doHomeX(); + doHomeP(); + Serial.println(""); } //########Grab Tip######### @@ -721,4 +747,5 @@ void coordinateMove(){ } Serial.println(""); } + } diff --git a/gui/ser_one.py b/gui/ser_one.py index 6b4b9dd..2487baa 100644 --- a/gui/ser_one.py +++ b/gui/ser_one.py @@ -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() @@ -168,7 +193,14 @@ def conf_write(): config.set('chemblock','chemvol',str(chemVol.get())) config.set('chemblock','chemz',str(chemZ.get())) config.set('chemblock','deltaz',str(deltaz.get())) - config.set('chemblock','tauch',str(tauch.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) @@ -304,57 +375,77 @@ def do_gcode(): s = e1.get() s = s + '\n' print(s) - serialObj.write(s.encode('utf-8')) + serialObj.write(s.encode('utf-8')) 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(): upTip() serialObj.write(pip.get_tip(lpb.next()).encode('utf-8')) akttip.set(lpb.akt) - downTip() - + 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()) - pip.setXY(chem.getXY()) - serialObj.write(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')) upTip() - - - + pip.setXY(chem.getXY()) + command.append(pip.sendXY().encode('utf-8')) + pip.setZ(chem.load(1)) + 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) + +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: