From 2b12cc34583efe524453a9ab8338b3bfdd1d3e45 Mon Sep 17 00:00:00 2001 From: jens Date: Tue, 22 Feb 2022 17:51:49 +0100 Subject: [PATCH] =?UTF-8?q?Rheodyne=20Ventil=20eingef=C3=BCft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RheodyneVentil/RheodyneVentil.ino | 231 ++++++++++++++++++++++++++++++ gui/LabRobot22.py | 4 +- gui/rheodyne.py | 216 ++++++++++++++++++++++++++++ 3 files changed, 449 insertions(+), 2 deletions(-) create mode 100644 RheodyneVentil/RheodyneVentil.ino create mode 100644 gui/rheodyne.py diff --git a/RheodyneVentil/RheodyneVentil.ino b/RheodyneVentil/RheodyneVentil.ino new file mode 100644 index 0000000..afe6b58 --- /dev/null +++ b/RheodyneVentil/RheodyneVentil.ino @@ -0,0 +1,231 @@ +int stepCounter; +int steps = 10000; +int delayit = 200; +int stepload = 3800; +int pinEnable = 8; +int pinStep = 2; +int pinDir = 5; +int state = 0; // ventil=0 laden == 1; +int CoolEn = 3; +int spindir = 13; +int strechts = 10; +int command = 0; + + +int pinStepY = 3; // SpritzenMotor +int pinDirY = 6; +int delayit2 =200; +int volume = 0; + +int pinStepZ = 4; // Pumpenmotor +int pinDirZ = 7; +int delayitZ =2000; + +void setup() +{ + pinMode(A3,OUTPUT); // LED On = inject + pinMode(spindir,INPUT); // Schalter Ventil + + Serial.begin(115200); + pinMode(strechts,INPUT); // Home = inject + + pinMode(pinEnable, OUTPUT); // Enable + pinMode(pinStep, OUTPUT); // Step + pinMode(pinDir, OUTPUT); // Richtung + digitalWrite(pinEnable,LOW); + ventil(); + + // Spritzen Motor + pinMode(pinStepY, OUTPUT); // Step + pinMode(pinDirY, OUTPUT); // Richtung + pinMode(9,INPUT); + spmotor_home(); + + pinMode(pinStepZ, OUTPUT); // Step + pinMode(pinDirZ, OUTPUT); // Richtung +} + + +void loop() +{ + while (Serial.available()>0){ + //Serial.println("1)laden 2)ventil 3)sp_home 4)sp_leer 5)vol? 6)doit"); + Serial.println(volume); + command = Serial.parseInt(); + if (Serial.read() == '\r') { + //Serial.println(command); + switch (command) { + case 1 : laden(); + break; + case 2 : ventil(); + break; + case 3 : spmotor_home(); + break; + case 4 : spmotor_leer(); + break; + case 5 : Serial.println(volume); + break; + case 6 : do_it(); + break; + case 7 : pumpe(); + break; + default: + if (command < 0){ + command =command*-1; + spmotor_zurueck(command); + //Serial.println(command); + } else { + spmotor_vor(command); + //Serial.println(command); + } + } + + } + } + if (digitalRead(spindir) == LOW) { + Serial.println("Low"); + delay(100); + if (state == 1){ + ventil(); + } else { + laden(); + } + } + +} +int pumpe() { +digitalWrite(pinDirZ,HIGH); // im Uhrzeigersinn + for(int d=0;d<50000;d++) + { + digitalWrite(pinStepZ,HIGH); + delayMicroseconds(delayitZ); + digitalWrite(pinStepZ,LOW); + delayMicroseconds(delayitZ); + } + +} +//////////// Programmierte Injektion +int do_it(){ + int anz = 10; + unsigned long det1 = 40;//40; + unsigned long det2 = 30;//30; + int q; + unsigned long det; + laden(); + delay(500); + spmotor_vor(60); + delay(1000); + for (q=1;q<=anz;q++){ + ventil(); + infoline(q,anz); + det = det1*1000; + delay(det); + laden(); + delay(500); + spmotor_vor(30); + det = det2*1000; + delay(det); + //Serial.println(q); + } + Serial.println("Finished !"); +} +int infoline(int i,int q){ + Serial.print("Volume "); + Serial.print(volume); + Serial.print(" Inject "); + Serial.print(i); + Serial.print("/"); + Serial.println(q); + +} +//////////// Spritzenmotorint +int spmotor_home(){ + volume = 360; + Serial.println(volume); + digitalWrite(pinDirY,HIGH); // im Uhrzeigersinn + while( digitalRead(9)== LOW) + { + digitalWrite(pinStepY,HIGH); + delayMicroseconds(delayit2); + digitalWrite(pinStepY,LOW); + delayMicroseconds(delayit2); + } +} +int spmotor_leer(){ + spmotor_vor(volume); +} + +int spmotor_zurueck(int x){ + int q =0; + int p = 0; + for (q=0;q<=x;q++){ + if (digitalRead(9) == LOW){ + digitalWrite(pinDirY,HIGH); // im Uhrzeigersinn + for(p = 0; p < 500; p++) + { + digitalWrite(pinStepY,HIGH); + delayMicroseconds(delayit2); + digitalWrite(pinStepY,LOW); + delayMicroseconds(delayit2); + } + volume++; + Serial.println(volume); + } + } +} + +int spmotor_vor(int x){ + int q; + int p; + digitalWrite(pinDirY,LOW); // im Uhrzeigersinn + //if (volume > 0){ + for (q=0;q<=x;q++){ + for(p = 0; p < 500; p++) + { + digitalWrite(pinStepY,HIGH); + delayMicroseconds(delayit2); + digitalWrite(pinStepY,LOW); + delayMicroseconds(delayit2); + } + volume--; + //Serial.println(volume); + if (volume <= 0){ + break; + } + } + //} +} +//////////// Ventil +int laden(){ + if (state == 0 ) { + state = 1; + digitalWrite(A3,LOW); + digitalWrite(pinDir,HIGH); // im Uhrzeigersinn + for(stepCounter = 0; stepCounter < stepload; stepCounter++) + { + digitalWrite(pinStep,HIGH); + delayMicroseconds(delayit); + digitalWrite(pinStep,LOW); + delayMicroseconds(delayit); + } + } +} + +int ventil(){ + state = 0; + digitalWrite(A3,HIGH); + digitalWrite(pinDir,LOW); // im Uhrzeigersinn + for(stepCounter = 0; stepCounter < steps; stepCounter++) + { + if (!checkErechts()){ + digitalWrite(pinStep,HIGH); + delayMicroseconds(delayit); + digitalWrite(pinStep,LOW); + delayMicroseconds(delayit); + } + } +} + +int checkErechts(){ + return digitalRead(strechts); +} diff --git a/gui/LabRobot22.py b/gui/LabRobot22.py index de13ba2..f52bfcb 100644 --- a/gui/LabRobot22.py +++ b/gui/LabRobot22.py @@ -342,7 +342,7 @@ b7.configure(command=getPos) def do_gcode(): s = e1.get() s = s + '\n' - print(s) + #print(s) serialObj.write(s.encode('utf-8')) b5.configure(command=do_gcode) @@ -427,7 +427,7 @@ def loadSerie(): p = startVessel.get() q = lastVessel.get() + 1 for i in range(p,q): - print(i) + #print(i) reakt.akt = i aktvess.set(reakt.akt) upTip() diff --git a/gui/rheodyne.py b/gui/rheodyne.py new file mode 100644 index 0000000..bdf3e4f --- /dev/null +++ b/gui/rheodyne.py @@ -0,0 +1,216 @@ +import tkinter as tk +import tkinter.ttk as ttk +from cv2 import ellipse2Poly +import serial.tools.list_ports +import time + +from soupsieve import match + +help = """Programm zur Steuerung der Spritzenpumpe / Rheodyne Ventil Kombination + - Volume wird in eignen Einheiten angeben und muss für die jeweilige Spritze + bestimmt werden. + - load brint das Ventil in die Load Position + - ventil injiziert in den Reaktionslauf + - volume fragt nach der aktuellen Postion der Spritze + - Spritze Home zieht die Spritze auf + - Spritze leer entleert die Spritze """ +command = [] + +ports = serial.tools.list_ports.comports() +serialObj = serial.Serial() + +def serial_ports(): + return serial.tools.list_ports.comports() + +def on_select(event=None): + serialObj.port = cb.get().split(' ')[0] + serialObj.baudrate = 115200 + serialObj.open() + +root = tk.Tk() +#configue root +root.title("Jfs Besta") +root.geometry('800x500+300+300') +root.columnconfigure(0,weight=1) +root.rowconfigure(1,weight=1) +port = tk.IntVar() + +cb =ttk.Combobox(root,values=serial_ports()) +cb.grid(row=0,column=0,stick="nwe") +cb.bind('<>',on_select) + +scb =tk.Scrollbar(root) +scb.grid(row=1,column=1,sticky='ns') +txt = tk.Text(root) +txt.grid(row=1,column=0,sticky='ewns') +scb.config(command=txt.yview) +txt.config(yscrollcommand=scb.set) +txt.tag_configure('small',font=('Verdana',8),foreground='black') + +portlbl = ttk.Label(root,textvariable=port,background='grey',font='none 24 bold') +portlbl.config(anchor=tk.CENTER) +portlbl.grid(row=0,column=2,sticky='nsew') + +left = ttk.LabelFrame(root,text='Commands') +left.grid(row=1,column=2,sticky='ne') + +down = ttk.LabelFrame(root,text='Automatik') +down.grid(row=2,column=0,sticky='nw') + + + +class Callback: + def __init__(self,func,*args,**kwargs): + self.func=func + self.args=args + self.kwargs=kwargs + def __call__(self): + self.func(*self.args,**self.kwargs) + +def default_callback(i): + cmd = str(i)+'\r\n' + command.append(cmd.encode('utf-8')) + +def do_cmd(i): + cmd = str(i)+'\r\n' + command.append(cmd.encode('utf-8')) + +cc = 0 +max = 10 +run = False +startTime = 0 + +injvol = tk.IntVar() +injvol.set(30) +inj = tk.IntVar() +inj.set(10) +loadtime = tk.IntVar() +loadtime.set(10) +proctime = tk.IntVar() +proctime.set(30) +jfstime = 0 +cas = 0 # 0-idle 1-next Injection +dela = 2 +stat = tk.StringVar() +aktvol = tk.IntVar() + +ttk.Button(left,text='load',command=Callback(default_callback,1)).grid(row=0,column=0) +ttk.Button(left,text='ventil',command=Callback(default_callback,2)).grid(row=1,column=0) +ttk.Button(left,text='volume',command=Callback(default_callback,5)).grid(row=2,column=0) +ttk.Button(left,text='Spritze Home',command=Callback(default_callback,3)).grid(row=3,column=0) +ttk.Button(left,text='Spritze leer',command=Callback(default_callback,4)).grid(row=4,column=0) +ttk.Label(down,text=' Injections: ').grid(row=0,column=0) +ttk.Entry(down,textvariable=inj,width=4).grid(row=0,column=1) +ttk.Label(down,text=' Inj Vol ').grid(row=0,column=2) +ttk.Entry(down,textvariable=injvol,width=4).grid(row=0,column=3) +ttk.Label(down,text=' Loadtime ').grid(row=0,column=4) +ttk.Entry(down,textvariable=loadtime,width=4).grid(row=0,column=5) +ttk.Label(down,text=' Processtime ').grid(row=0,column=6) +ttk.Entry(down,textvariable=proctime,width=4).grid(row=0,column=7) +autom = tk.Button(down,text=' Do the job') +autom.grid(row=0,column=8,sticky='ne') +ttk.Label(down,text=' Status ').grid(row=0,column=9) +ttk.Label(down,textvariable=stat).grid(row=0,column=10) +ttk.Label(down,text=' Volume left ').grid(row=0,column=11) +ttk.Label(down,textvariable=aktvol).grid(row=0,column=12) + +def do_count(): + global cc, max, startTime, cas, dela, jfstime, run + elapsed = time.time()-startTime + if elapsed > 1: + #print(cas) + startTime = time.time() + if cas == 0: + stat.set('idle.... ') + pass + elif cas == 1: + stat.set('Aktual.. '+str(inj.get())) + if inj.get() == 0: + run = False + stat.set('Finished') + cas = 0 + else: + inj.set(inj.get()-1) + do_cmd(1) + jfstime=loadtime.get() + if injvol.get() >= aktvol.get(): + stat.set('Error No Vol') + run = False + cas = 0 + else: + do_cmd(injvol.get()) + cas = 2 + elif cas == 2: + stat.set('Load..'+str(jfstime)) + if jfstime == 0: + do_cmd(2) + jfstime = proctime.get() + cas = 3 + else : + jfstime -= 1 + elif cas == 3: + stat.set('Process..'+str(jfstime)) + if jfstime == 0: + do_cmd(1) + jfstime = dela + cas = 4 + else: + jfstime -= 1 + elif cas == 4: + stat.set('Delay..'+str(jfstime)) + if jfstime == 0: + cas = 1 + else: + jfstime -= 1 + + + + + + + +def doItNow(): + global run + if run : + do_count() + root.after(100,doItNow) + +def do_tasks(): + global run, startTime, cas + if run : + run = False + autom.configure(text='stopped') + else : + run = True + startTime = time.time() + cas = 1 + autom.configure(text='working') + doItNow() + + +autom.configure(command=do_tasks) + +txt.insert('0.1',help) + +weiter = True +def checkSerialPort(): + global weiter + if serialObj.isOpen() and serialObj.in_waiting: + inp = serialObj.readline().decode('utf') + txt.insert('0.1',inp) + aktvol.set(int(inp)) + weiter = True + if (len(command) > 0) & (weiter==True) : + if serialObj.isOpen() : + x = command.pop(0) + txt.insert('0.1',x,'small') + serialObj.write(x) + weiter=False + else : + txt.insert('0.1','Kein Port geöffnet !!!\n') + x = command.clear() + +while True: + root.update() + checkSerialPort() + \ No newline at end of file