示例#1
0
def dobot():
    port = list_ports.comports()[0].device
    device = Dobot(port=port, verbose=True)

    (x, y, z, r, j1, j2, j3, j4) = device.pose()
    y += 50
    device.move_to(x, y, z, r, wait=False)
    x -= 15
    device.move_to(x, y, z, r, wait=False)
    x += 30
    y += 20
    device.move_to(x, y, z, r, wait=False)
    x += 30
    y -= 20
    device.move_to(x, y, z, r, wait=False)
    x -= 15
    device.move_to(x, y, z, r, wait=False)
    y -= 50
    device.move_to(x, y, z, r, wait=False)
    x -= 30
    device.move_to(x, y, z, r, wait=False)

    device.move_to(
        x, y, z, r,
        wait=True)  # we wait until this movement is done before continuing

    device.close()
示例#2
0
class CustomDobot:
    def __init__(self, port):
        self.device = Dobot(port=port, verbose=True)
        self.home_x = 200
        self.home_y = 0
        self.home_z = 135

    def speed(self, speed: float):
        self.device.speed(speed)

    def set_home(self, x: float, y: float, z: float):
        self.home_x = x
        self.home_y = y
        self.home_z = z

    def relocate(self):
        self.device.home()
        self._move_home()

    def move_and_suck(self, from_x: float, from_y: float, from_z: float,
                      to_x: float, to_y: float, to_z: float):

        self._move_home()

        (now_x, now_y, now_z, now_r, now_j1, now_j2, now_j3,
         now_j4) = self.device.pose()
        # move to object location
        self.device.move_to(from_x, from_y, now_z)
        self.device.move_to(from_x, from_y, from_z)

        # suck object
        self.device.suck(True)

        # move to target location
        self.device.move_to(now_x, now_y, self.home_z)
        self.device.move_to(to_x, to_y, self.home_z)
        self.device.move_to(to_x, to_y, to_z)

        self.device.suck(False)

    def move_to(self, x=None, y=None, z=None):
        if x is None:
            x = self.pose()[0]
        if y is None:
            y = self.pose()[1]
        if z is None:
            z = self.pose()[2]

        self.device.move_to(x, y, z)
        self.show_position()

    def _move_home(self):
        (now_x, now_y, now_z, now_r, now_j1, now_j2, now_j3,
         now_j4) = self.device.pose()
        self.device.move_to(now_x, now_y, self.home_z)
        self.device.move_to(self.home_x, self.home_y, self.home_z)

    def suck(self, suck):
        self.suck(suck)

    def pose(self):
        return self.device.pose()

    def show_position(self):
        (x, y, z, r, j1, j2, j3, j4) = self.device.pose()
        print()
        print(TerminalColor.Green + "CUSTOM_DOBOT at position:")
        print(TerminalColor.Green + 'x:{', x, '}\ny:{', y, '}\nz:{', z, '}')
        print(TerminalColor.ResetAll)

    def close(self):
        self.device.close()
示例#3
0
文件: test1.py 项目: sdgray/doboot
from serial.tools import list_ports

from pydobot import Dobot

port0 = list_ports.comports()[0].device

device = Dobot(port=port0, verbose=True)

while 1 < 2:
    (x, y, z, r, j1, j2, j3, j4) = device.pose()

    print(f'x:{x} y:{y} z:{z} j1:{j1} j2:{j2} j3:{j3} j4:{j4}')

    #device.speed(100, 100)
    #device.move_to(x + 20, y+20, z+20, r-20, wait=False)
    #device.suck(True)
    #device.move_to(x, y, z, r, wait=False)  # we wait until this movement is done before continuing
    #device.suck(False)

device.close()
示例#4
0
        #Sending the streams to the cloud
        responses = session_client.streaming_detect_intent(requests)

        for response in responses:
            print('Intermediate transcript: "{}".'.format(
                response.recognition_result.transcript))
            # Prints out live speech to text

        if response.query_result.query_text is not '':
            #If not silent, run below

            if response.query_result.fulfillment_messages[0].text.text[
                    0] == 'STOP':
                # Use 'Close the connection' Intent to end the program
                dobot.close()
                print('Connection Closed. Goodbye!')

                break

            elif not response.query_result.parameters:
                # If no parameter is returned like for "Hello, how are you?"
                print(response.query_result)

            else:
                if len(
                        response.query_result.parameters.get_or_create_list(
                            'number-integer').values) != 3:

                    # If the number of parameters returned is less than 3
                    print(
示例#5
0
# Copyright (c) 2020 Sagar Gubbi. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from pydobot import Dobot

d = Dobot(port='/dev/ttyUSB0', verbose=False)

d.wait_for_cmd(d.home())

d.close()


示例#6
0
class DobotPlating():
    def __init__(self, dobotPort='/dev/ttyUSB0'):
        available_ports = glob('/dev/tty*USB*')  # mask for OSX Dobot port
        if len(available_ports) == 0:
            print('no port /dev/tty*USB* found for Dobot Magician')
            exit(1)

        #self.DobotPort = 'COM4'
        self.DobotPort = dobotPort;

        self.ecRelay = Relay(18);#bcm pin for physical pin 12
        self.pdRelay = Relay(24);#bcm for physical 18
        self.rhRelay = Relay(23);#bcm for physical 16
        self.gripper = ServoGripper(2);
        self.dvc = DigitalVoltControl();

        self.lastCmd = [0,0,0,0]; #x, y, z, r

        print("Setting Port to " + self.DobotPort);
        self.device = Dobot(port=self.DobotPort)
        time.sleep(1)
        if self.device is not None:
            print("Opened connection")

        self.device.speed(60)

        self.z_up = 100
        self.z_down = -70
        #self.RH_Voltage = 2.5;
        #self.PD_Voltage = 1.9;
        #self.EC_Voltage = 4.8;
        
        self.home_xyzr = [215, 0, self.z_up, 0];                    
        global global_status
        global_status = "Rh Electroplating";
    
    def calibrate(self):
        self.device.goHome();

    def isMoveFinished(self):
        euDist = math.pow(self.lastCmd[0] - self.device.x,2) + math.pow(self.lastCmd[1] - self.device.y, 2) + math.pow(self.lastCmd[2] - self.device.z, 2) + math.pow(self.lastCmd[3] - self.device.r, 2);
        euDist = math.sqrt(euDist);
        if(euDist < 2):
            return True;
        else:
            #print("still moving ..");
            return False;
        
    def move_home(self):
        self.move_xy(self.home_xyzr[0], self.home_xyzr[1], self.home_xyzr[2], self.home_xyzr[3], 0.3);

    def move_xy(self, x, y, z, r, duration = 1):
        self.lastCmd = [x, y, z, r];
        self.device.go(x, y, z, r);  #MOVJ
#        time.sleep(duration);
#            print("in is move finished..");
        print("xyzr position: " + str(self.device.x) + ", " + str(self.device.y) + ", " + str(self.device.z) + ", " + str(self.device.r));
   
    def move_xy_linear(self, x, y, z, r, duration = 1):
        self.lastCmd = [x, y, z, r];
        self.device.goMovL(x, y, z, r);  #MOVJ
#        time.sleep(duration);
#            print("in is move finished..");
        print("xyzr position: " + str(self.device.x) + ", " + str(self.device.y) + ", " + str(self.device.z) + ", " + str(self.device.r));
        
    def shake(self, x, y, z, r, shakeDuration, dispStr):
        global global_status;
        t_end = time.time() + shakeDuration;
        tdiff = t_end - time.time();
        while tdiff > 0:
            if(dispStr is not None):
                global_status = dispStr + str(int(tdiff)) + "s"
            self.move_xy(x, y, z + 10, r, 0.1);
            self.move_xy(x, y, z - 10, r, 0.1);
            tdiff = t_end - time.time();
        
    def up_down_beaker(self,id):

        print ("Doing beaker %d now" % (id));
        self.move_xy(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3], 0.3);
        self.move_xy(Beakers[id][0], Beakers[id][1], (self.z_up + self.z_down)/2.0 , Beakers[id][3], 0.3); #adding a mid point so that the Joint motion isn't touching th edges of the beakers
        self.move_xy(Beakers[id][0], Beakers[id][1], self.z_down, Beakers[id][3], 0.3);
        dispStr = "Step " + str(id) + ": ";
        while(not self.isMoveFinished()):
            time.sleep(0.01);

        if(id == 1):
            self.ecRelay.on();
            dispStr = dispStr + "EC "
        elif(id == 8):
            self.pdRelay.on();
            dispStr = dispStr + "Pd Solution "
        elif(id == 11):
            self.rhRelay.on();
            dispStr = dispStr + "Rh Solution "
            
        if(id == 1 or id == 8 or id == 11):
            if(id == 11):
                self.shake(Beakers[id][0], Beakers[id][1], self.z_down - 20, Beakers[id][3], Beakers[id][4], dispStr); #x, y, z and shake_duration
            else:
                self.shake(Beakers[id][0], Beakers[id][1], self.z_down, Beakers[id][3], Beakers[id][4], dispStr); #x, y, z and shake_duration
        else:    
            self.shake(Beakers[id][0], Beakers[id][1], self.z_down, Beakers[id][3], Beakers[id][4], None); #x, y, z and shake_duration
        
        self.ecRelay.off();
        self.pdRelay.off();
        self.rhRelay.off();
        #move up
        
        #shake to drop the excess drops
        #go half way to adjust for MOVJ
        self.move_xy(Beakers[id][0], Beakers[id][1], (self.z_up + self.z_down)/2.0 , Beakers[id][3], 0.3); #adding a mid point so that the Joint motion isn't touching th edges of the beakers
        #self.move_xy(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3]);

        self.shake(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3], 2, None);
        
        self.move_xy(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3]);
        
        while(not self.isMoveFinished()):
            time.sleep(0.01);
     
    def startProcess(self, EC_Voltage, PD_Voltage, RH_Voltage):
        global process_running
        process_running = True;
        global global_status
        global_status = "Step 1: EC"
        #1
        if(EC_Voltage == 5.6):
            self.dvc.setMaxVoltage();
        else:
            self.dvc.setVoltage(EC_Voltage);
        self.up_down_beaker(1);
        
        #2
        global_status = "Step 2: Dragout"
        self.up_down_beaker(2);
        
        #3
        global_status = "Step 3: Water"
        self.up_down_beaker(3);

        #4
        global_status = "Step 4: Activation"
        self.up_down_beaker(4);
        
        #5
        global_status = "Step 5: Water"
        self.up_down_beaker(5);

        #6
        global_status = "Step 6: Water"
        self.up_down_beaker(6);
        
        #7
        global_status = "Step 7: Water"
        self.up_down_beaker(7);

        #8
        #global_status = "Step 8: Pd Solution"
        #self.dvc.setVoltage(PD_Voltage);
        #self.up_down_beaker(8);
        
        #9
        #global_status = "Step 9: Pd Dragout"
        #self.up_down_beaker(9);
        
        #10
        #global_status = "Step 10: Water"
        #self.up_down_beaker(10);
        
        #11
        global_status = "Step 11: Rh Solution"
        self.dvc.setVoltage(RH_Voltage);
        self.up_down_beaker(11);
        
        #12
        global_status = "Step 12: Rh Dragout"
        self.up_down_beaker(12);
        
        #13 #repeat of beaker 10
        global_status = "Step 13: Water"
        self.up_down_beaker(10);

        #Home
        self.move_home()
        global_status = "Done.."
        process_running = False;
        print("\n DONE \n");
   
    def __del__(self):
        self.device.close();        
        del self.gripper;
        del self.dvc;
        del self.ecRelay;
        del self.pdRelay;
        del self.rhRelay;
        print("Exiting Cleanly..");
示例#7
0
from serial.tools import list_ports

from pydobot import Dobot

port0 = list_ports.comports()[0].device
port1 = list_ports.comports()[1].device
device0 = Dobot(port=port0, verbose=True)


(x, y, z, r, j1, j2, j3, j4) = device0.pose()

print(f'x:{x} y:{y} z:{z} j1:{j1} j2:{j2} j3:{j3} j4:{j4}')

device1 = Dobot(port=port1, verbose=True)

(x, y, z, r, j1, j2, j3, j4) = device1.pose()

print(f'x:{x} y:{y} z:{z} j1:{j1} j2:{j2} j3:{j3} j4:{j4}')

device0.home(True)


device0.close()
device1.close()
示例#8
0
class RobotOperator:
    def __init__(self):
        self.rob = None
        self.marble_z = -63.7
        self.move_z = 18.0
        self.marble_point = [
            {"x":135.9, "y": 229.1},
            {"x": 273.0, "y": 107.8},
            {"x": 264.7, "y": -135.5},
            {"x": 102.0, "y": -253.0},

        ]
        self.home = {"x": 228.1, "y": -3.5, "z": 86.5}
        self.gaze_point = {"x": 295.5, "y":13.9, "z":120.3}
        self.op_interval = 0.5

    def connect(self):
        port = list_ports.comports()[0].device
        self.rob = Dobot(port=port, verbose=True)
        self.set_speed(False)
        time.sleep(1.0)
        self.go_home(self.op_interval)

    def get_pose(self):
        pose = self.rob.get_pose()
        print "pose {}".format(pose)

    def set_speed(self, bFast):
        if bFast:
            self.speed = 800
            self.acceleration = 1200
            self.rob.speed(self.speed, self.acceleration)
        else:
            self.speed = 300
            self.acceleration = 300
            self.rob.speed(self.speed, self.acceleration)

    def go_interval(self, interval):
        if interval is 0.0:
            return
        elif interval < 0.0:
            return
        elif interval > 1.5:
            time.sleep(1.5)
        else:
            time.sleep(interval)

    def go_home(self, interval=None):
        print "[RO]:go home"
        self.set_speed(False)
        self.x=self.home["x"]
        self.y=self.home["y"]
        self.z=self.home["z"]
        self.rob.jump_to(self.x, self.y, self.z, wait=True)
        if interval is None:
            time.sleep(self.op_interval)
        else:
            self.go_interval(interval)

    def go_top(self, index, z_move, interval=None, bWait=False):
        # print "[RO]:go top. {} {}".format(z_move, interval)
        self.x=self.marble_point[index]["x"]
        self.y=self.marble_point[index]["y"]
        self.z=self.marble_z + z_move
        self.rob.move_to(self.x, self.y, self.z, wait=bWait)
        if interval is None:
            time.sleep(self.op_interval)
        else:
            self.go_interval(interval)

    def go_marble_point(self, index, interval=None):
        # print "[RO]go marble point"
        self.x=self.marble_point[index]["x"]
        self.y=self.marble_point[index]["y"]
        self.z=self.marble_z
        self.rob.move_to(self.x, self.y, self.z)
        if interval is None:
            return
        else:
            self.go_interval(interval)

    def gaze(self, interval=0.5):
        print "[RO]gaze {}".format(interval)
        self.set_speed(False)
        self.x = self.gaze_point["x"]
        self.y = self.gaze_point["y"]
        self.z = self.gaze_point["z"]
        self.rob.move_to(self.x, self.y, self.z)
        if interval is not None:
            self.go_interval(interval)

    def marble(self, index, interval):
        # print '[RO]:marble loop'
        # set
        self.set_speed(True)
        self.go_top(index, self.move_z,
                    interval=interval, bWait=False)
        # down
        self.go_marble_point(index, interval)

    def disconnect(self):
        self.rob.close()
示例#9
0
class DobotPlating():
    def __init__(self, dobotPort='/dev/ttyUSB0'):
        available_ports = glob('/dev/tty*USB*')  # mask for OSX Dobot port
        if len(available_ports) == 0:
            print('no port /dev/tty*USB* found for Dobot Magician')
            exit(1)
        else:
            dobotPort = available_ports[0]

        #self.DobotPort = 'COM4'
        self.DobotPort = dobotPort

        self.ecRelay = Relay(18)
        #bcm pin for physical pin 12
        self.pdRelay = Relay(24)
        #bcm for physical 18
        self.rhRelay = Relay(23)
        #bcm for physical 16
        self.gripper = ServoGripper(2)
        self.dvc = DigitalVoltControl()

        self.RH_Duration = 60
        self.PD_DURATION = 60

        self.lastCmd = [0, 0, 0, 0]
        #x, y, z, r

        print("Setting Port to " + self.DobotPort)
        self.device = Dobot(port=self.DobotPort)
        time.sleep(1)
        if self.device is not None:
            print("Opened connection")

        self.device.speed()

        self.z_up = 100
        self.z_down = -70
        #self.RH_Voltage = 2.5;
        #self.PD_Voltage = 1.9;
        #self.EC_Voltage = 4.8;

        self.home_xyzr = [215, 0, self.z_up, 0]
        global global_status
        global_status = "Rh Electroplating"

    def calibrate(self):
        global global_status
        response = self.device.setHomeParams(self.home_xyzr[0],
                                             self.home_xyzr[1],
                                             self.home_xyzr[2],
                                             self.home_xyzr[3])
        #if(response):
        #           global_status = "Error..";

        response = self.device.goHome()


#        if(response):
#            global_status = "Error..";

    def isMoveFinished(self):
        global global_step_indicator
        global_step_indicator = "isMoveFinished"

        euDist = math.pow(self.lastCmd[0] - self.device.x, 2) + math.pow(
            self.lastCmd[1] - self.device.y, 2) + math.pow(
                self.lastCmd[2] - self.device.z, 2) + math.pow(
                    self.lastCmd[3] - self.device.r, 2)
        euDist = math.sqrt(euDist)
        if (euDist < 10):
            return True
        else:
            #print("still moving ..");
            return False

    def move_home(self):
        global global_step_indicator
        global_step_indicator = "move_home"
        self.move_xy(self.home_xyzr[0], self.home_xyzr[1], self.home_xyzr[2],
                     self.home_xyzr[3], 0.3)

    def move_xy(self, x, y, z, r, duration=1):
        global global_step_indicator
        global_step_indicator = "move_xy"
        self.lastCmd = [x, y, z, r]
        response = self.device.go(x, y, z, r)
        #MOVJ
        #        if(response):
        #            global global_status
        #            global_status = "Error..";

        #        time.sleep(duration);
        #            print("in is move finished..");
        print("xyzr position: " + str(self.device.x) + ", " +
              str(self.device.y) + ", " + str(self.device.z) + ", " +
              str(self.device.r))

    def move_xy_linear(self, x, y, z, r, duration=1):
        self.lastCmd = [x, y, z, r]
        response = self.device.goMovL(x, y, z, r)
        #MOVJ
        #        if(response):
        #            global global_status
        #            global_status = "Error..";
        #        time.sleep(duration);
        #            print("in is move finished..");
        print("xyzr position: " + str(self.device.x) + ", " +
              str(self.device.y) + ", " + str(self.device.z) + ", " +
              str(self.device.r))

    def shake(self,
              x,
              y,
              z,
              r,
              shakeDuration,
              dispStr,
              dontShake=False,
              doInOut=False):
        global global_step_indicator
        global_step_indicator = "shake "
        global global_status
        t_end = time.time() + shakeDuration
        tdiff = t_end - time.time()
        while tdiff > 0:
            if (dispStr is not None):
                global_status = dispStr + " " + str(int(tdiff)) + "s"
            if (not dontShake):
                self.move_xy(x, y, z + 10, r, 0.1)
                self.move_xy(x, y, z - 10, r, 0.1)
            tdiff = t_end - time.time()

    def shakeHalfUp(self,
                    x,
                    y,
                    z,
                    r,
                    shakeDuration,
                    dispStr,
                    dontShake=False,
                    doInOut=False):
        global global_step_indicator
        global_step_indicator = "shake "
        global global_status
        t_end = time.time() + shakeDuration
        tdiff = t_end - time.time()
        while tdiff > 0:
            if (dispStr is not None):
                global_status = dispStr + " " + str(int(tdiff)) + "s"
            if (not dontShake):
                self.move_xy(x, y, (self.z_up + self.z_down) / 2.0, r, 0.1)
                self.move_xy(x, y, z - 10, r, 0.1)
            tdiff = t_end - time.time()

    def up_down_beaker(self, id, dispStr=None):

        print("Doing beaker %d now" % (id))
        self.move_xy(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3],
                     0.3)
        self.move_xy(Beakers[id][0], Beakers[id][1],
                     (self.z_up + self.z_down) / 2.0, Beakers[id][3], 0.3)
        #adding a mid point so that the Joint motion isn't touching th edges of the beakers
        self.move_xy(Beakers[id][0], Beakers[id][1], self.z_down,
                     Beakers[id][3], 0.3)
        #dispStr = "Step " + str(id) + ": ";

        t_end = time.time() + 25
        while (not self.isMoveFinished()):
            time.sleep(0.01)
            if (time.time() > t_end):
                global global_step_indicator
                global_step_indicator = "timing error.."
                break

        global global_step_indicator
        global_step_indicator = "up_down_beaker " + str(id)

        if (id == 1):
            self.ecRelay.on()
        #    dispStr = dispStr + "EC "
        elif (id == 8):
            self.pdRelay.on()
        #    dispStr = dispStr + "Pd Solution "
        elif (id == 11):
            self.rhRelay.on()
        #    dispStr = dispStr + "Rh Solution "

        if (id == 1 or id == 8 or id == 11):
            if (id == 11):
                self.shake(Beakers[id][0], Beakers[id][1], self.z_down - 10,
                           Beakers[id][3], self.RH_Duration, dispStr)
                #x, y, z and shake_duration
            elif (id == 1):  #dont' shake
                self.shake(Beakers[id][0], Beakers[id][1], self.z_down,
                           Beakers[id][3], Beakers[id][4], dispStr, True)
                #x, y, z and shake_duration
            else:  #this means id is 8 i.e. Pd
                self.shake(Beakers[id][0], Beakers[id][1], self.z_down,
                           Beakers[id][3], self.PD_Duration, dispStr)
                #x, y, z and shake_duration
        else:
            self.shakeHalfUp(Beakers[id][0], Beakers[id][1], self.z_down,
                             Beakers[id][3], Beakers[id][4], None)
            #x, y, z and shake_duration

        global global_step_indicator
        global_step_indicator = "bottom_shake_finished"

        self.ecRelay.off()
        self.pdRelay.off()
        self.rhRelay.off()
        #move up

        #shake to drop the excess drops
        #go half way to adjust for MOVJ
        self.move_xy(Beakers[id][0], Beakers[id][1],
                     (self.z_up + self.z_down) / 2.0, Beakers[id][3], 0.3)
        #adding a mid point so that the Joint motion isn't touching th edges of the beakers
        #self.move_xy(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3]);

        self.shake(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3],
                   2, None)

        self.move_xy(Beakers[id][0], Beakers[id][1], self.z_up, Beakers[id][3])

        global_step_indicator = "excess_shake_finished"

        t_end = time.time() + 25
        while (not self.isMoveFinished()):
            time.sleep(0.01)
            if (time.time() > t_end):
                global global_step_indicator
                global_step_indicator = "timing error.."
                break

        global_step_indicator = "excess_shake_move_finished"

    def startProcess(self, EC_Voltage, PD_Voltage, RH_Voltage, processType,
                     pdTimeToDo, rhTimeToDo):
        global process_running
        process_running = True
        global global_status

        self.RH_Duration = rhTimeToDo
        #if(processType == PROCESS_RH_20):
        #    self.RH_Duration = 20;
        self.PD_Duration = pdTimeToDo

        global_status = "Step 1: EC"
        #1
        if (EC_Voltage == 5.6):
            self.dvc.setMaxVoltage()
        else:
            self.dvc.setVoltage(EC_Voltage)
        self.up_down_beaker(1, global_status)

        #2
        global_status = "Step 2: Dragout"
        self.up_down_beaker(2)

        #3
        global_status = "Step 3: Water"
        self.up_down_beaker(3)

        #4
        global_status = "Step 4: Activation"
        self.up_down_beaker(4)

        #5
        global_status = "Step 5: Water"
        self.up_down_beaker(5)

        #6
        global_status = "Step 6: Water"
        self.up_down_beaker(6)

        #7
        global_status = "Step 7: Water"
        self.up_down_beaker(7)

        #8
        if (processType == PROCESS_RH_PD):
            global_status = "Step 8: Pd Solution"
            self.dvc.setVoltage(PD_Voltage)
            self.up_down_beaker(8, global_status)

            #9
            global_status = "Step 9: Pd Dragout"
            self.up_down_beaker(9)

            #10
            global_status = "Step 10: Water"
            self.up_down_beaker(10)

        #11
        if (processType == PROCESS_RH_PD):
            global_status = "Step 11: Rh Solution"
        else:
            global_status = "Step 8: Rh Solution"
        self.dvc.setVoltage(RH_Voltage)
        self.up_down_beaker(11, global_status)

        #12
        if (processType == PROCESS_RH_PD):
            global_status = "Step 12: Rh Dragout"
        else:
            global_status = "Step 9: Rh Dragout"
        self.up_down_beaker(12)

        #13 #repeat of beaker 10
        if (processType == PROCESS_RH_PD):
            global_status = "Step 13: Water"
        else:
            global_status = "Step 10: Water"
        self.up_down_beaker(10)

        #Home
        self.move_home()
        global_status = "Done.."
        process_running = False
        print("\n DONE \n")

    def __del__(self):
        self.device.close()
        del self.gripper
        del self.dvc
        del self.ecRelay
        del self.pdRelay
        del self.rhRelay
        print("Exiting Cleanly..")