Rheodyne Ventil eingefüft
This commit is contained in:
parent
d0ec6fe202
commit
2b12cc3458
231
RheodyneVentil/RheodyneVentil.ino
Normal file
231
RheodyneVentil/RheodyneVentil.ino
Normal file
@ -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);
|
||||||
|
}
|
||||||
@ -342,7 +342,7 @@ b7.configure(command=getPos)
|
|||||||
def do_gcode():
|
def do_gcode():
|
||||||
s = e1.get()
|
s = e1.get()
|
||||||
s = s + '\n'
|
s = s + '\n'
|
||||||
print(s)
|
#print(s)
|
||||||
serialObj.write(s.encode('utf-8'))
|
serialObj.write(s.encode('utf-8'))
|
||||||
b5.configure(command=do_gcode)
|
b5.configure(command=do_gcode)
|
||||||
|
|
||||||
@ -427,7 +427,7 @@ def loadSerie():
|
|||||||
p = startVessel.get()
|
p = startVessel.get()
|
||||||
q = lastVessel.get() + 1
|
q = lastVessel.get() + 1
|
||||||
for i in range(p,q):
|
for i in range(p,q):
|
||||||
print(i)
|
#print(i)
|
||||||
reakt.akt = i
|
reakt.akt = i
|
||||||
aktvess.set(reakt.akt)
|
aktvess.set(reakt.akt)
|
||||||
upTip()
|
upTip()
|
||||||
|
|||||||
216
gui/rheodyne.py
Normal file
216
gui/rheodyne.py
Normal file
@ -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('<<ComboboxSelected>>',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()
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user