From 00929fcde91effbece9068a905e16566f9145be8 Mon Sep 17 00:00:00 2001 From: andySigler Date: Fri, 13 Jul 2018 14:32:40 -0400 Subject: [PATCH 1/9] perf(api): Increase distance travelled down when picking up tip to 15mm The p1000 has bigger tips/nozzle, and it needs to travel downwards by about 12mm to make a seal --- api/opentrons/instruments/pipette.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/opentrons/instruments/pipette.py b/api/opentrons/instruments/pipette.py index 2117d5ac9ce..7c4e4d95189 100755 --- a/api/opentrons/instruments/pipette.py +++ b/api/opentrons/instruments/pipette.py @@ -28,7 +28,7 @@ DEFAULT_ASPIRATE_SPEED = 5 DEFAULT_DISPENSE_SPEED = 10 -DEFAULT_TIP_PRESS_MM = -10 +DEFAULT_TIP_PRESS_MM = -15 DEFAULT_PLUNGE_CURRENT = 0.1 From 06c5c9228ebbae6f46b8cffa6df51afeb70db604 Mon Sep 17 00:00:00 2001 From: andySigler Date: Fri, 20 Jul 2018 16:18:25 -0400 Subject: [PATCH 2/9] moves pick-up-distance to pipette configs --- api/opentrons/__init__.py | 3 ++- api/opentrons/instruments/pipette.py | 16 ++++++------ api/opentrons/instruments/pipette_config.py | 16 ++++++++++++ .../labware/test_pipette_unittest.py | 26 +++++++++++-------- shared-data/robot-data/pipette-config.json | 14 ++++++++++ 5 files changed, 55 insertions(+), 20 deletions(-) diff --git a/api/opentrons/__init__.py b/api/opentrons/__init__.py index 91e1a4a01ae..f9b79c4cdd1 100755 --- a/api/opentrons/__init__.py +++ b/api/opentrons/__init__.py @@ -228,9 +228,10 @@ def _create_pipette_from_config( plunger_current=config.plunger_current, drop_tip_current=config.drop_tip_current, plunger_positions=config.plunger_positions.copy(), + pick_up_current=config.pick_up_current, + pick_up_distance=config.pick_up_distance, fallback_tip_length=config.tip_length) # TODO move to labware - p.set_pick_up_current(config.pick_up_current) return p def _retrieve_version_number(self, mount, expected_model_substring): diff --git a/api/opentrons/instruments/pipette.py b/api/opentrons/instruments/pipette.py index e7f7e3946d8..83ab3af3bd1 100755 --- a/api/opentrons/instruments/pipette.py +++ b/api/opentrons/instruments/pipette.py @@ -28,8 +28,7 @@ DEFAULT_ASPIRATE_SPEED = 5 DEFAULT_DISPENSE_SPEED = 10 -DEFAULT_TIP_PRESS_MM = -15 - +DEFAULT_TIP_PRESS_MM = 10 DEFAULT_PLUNGE_CURRENT = 0.1 SHAKE_OFF_TIPS_SPEED = 25 @@ -124,6 +123,8 @@ def __init__( plunger_current=0.5, drop_tip_current=0.5, plunger_positions=PLUNGER_POSITIONS, + pick_up_current=DEFAULT_PLUNGE_CURRENT, + pick_up_distance=DEFAULT_TIP_PRESS_MM, fallback_tip_length=51.7): # TODO (andy): move to tip-rack self.robot = robot @@ -177,8 +178,8 @@ def __init__( self.max_volume = max_volume self.min_volume = min_volume - self._pick_up_current = None - self.set_pick_up_current(DEFAULT_PLUNGE_CURRENT) + self._pick_up_distance = pick_up_distance + self._pick_up_current = pick_up_current # TODO (andy) these values maybe should persist between sessions, # by saving within `robot_config` @@ -910,7 +911,7 @@ def pick_up_tip(self, location=None, presses=3, increment=1): @commands.publish.both(command=commands.pick_up_tip) def _pick_up_tip( - self, location, presses, plunge_depth, increment): + self, location, presses, increment): self.instrument_actuator.set_active_current(self._plunger_current) self.robot.poses = self.instrument_actuator.move( self.robot.poses, @@ -926,7 +927,7 @@ def _pick_up_tip( self.instrument_mover.push_active_current() self.instrument_mover.set_active_current(self._pick_up_current) self.instrument_mover.set_speed(30) - dist = plunge_depth + (-1 * increment * i) + dist = (-1 * self._pick_up_distance) + (-1 * increment * i) self.move_to( self.current_tip().top(dist), strategy='direct') @@ -941,7 +942,7 @@ def _pick_up_tip( ) self.previous_placeable = None # no longer inside a placeable self.robot.poses = self.instrument_mover.fast_home( - self.robot.poses, abs(plunge_depth)) + self.robot.poses, self._pick_up_distance) return self @@ -949,7 +950,6 @@ def _pick_up_tip( self, location=location, presses=presses, - plunge_depth=DEFAULT_TIP_PRESS_MM, increment=increment) def drop_tip(self, location=None, home_after=True): diff --git a/api/opentrons/instruments/pipette_config.py b/api/opentrons/instruments/pipette_config.py index fd18887a407..7b36fa17e1e 100644 --- a/api/opentrons/instruments/pipette_config.py +++ b/api/opentrons/instruments/pipette_config.py @@ -19,6 +19,7 @@ def pipette_config_path(): [ 'plunger_positions', 'pick_up_current', + 'pick_up_distance', 'aspirate_flow_rate', 'dispense_flow_rate', 'channels', @@ -70,6 +71,7 @@ def _load_config_value(config_dict: dict, key: str): 'dropTip', plunger_pos.get('drop_tip')), }, pick_up_current=_load_config_value(cfg, 'pickUpCurrent'), + pick_up_distance=_load_config_value(cfg, 'pickUpDistance'), aspirate_flow_rate=_load_config_value( cfg, 'aspirateFlowRate'), dispense_flow_rate=_load_config_value( @@ -137,6 +139,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -4.5 }, pick_up_current=0.1, + pick_up_distance=10, aspirate_flow_rate=10 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=10 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -156,6 +159,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -6 }, pick_up_current=0.1, + pick_up_distance=10, aspirate_flow_rate=10 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=10 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -175,6 +179,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -4 }, pick_up_current=0.2, + pick_up_distance=10, aspirate_flow_rate=10 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=10 / DEFAULT_DISPENSE_SECONDS, channels=8, @@ -194,6 +199,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -5.5 }, pick_up_current=0.2, + pick_up_distance=10, aspirate_flow_rate=10 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=10 / DEFAULT_DISPENSE_SECONDS, channels=8, @@ -213,6 +219,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -4.5 }, pick_up_current=0.1, + pick_up_distance=10, aspirate_flow_rate=50 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=50 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -232,6 +239,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -6 }, pick_up_current=0.1, + pick_up_distance=10, aspirate_flow_rate=50 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=50 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -251,6 +259,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -3.5 }, pick_up_current=0.3, + pick_up_distance=10, aspirate_flow_rate=50 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=50 / DEFAULT_DISPENSE_SECONDS, channels=8, @@ -270,6 +279,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -5 }, pick_up_current=0.3, + pick_up_distance=10, aspirate_flow_rate=50 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=50 / DEFAULT_DISPENSE_SECONDS, channels=8, @@ -289,6 +299,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -4 }, pick_up_current=0.1, + pick_up_distance=10, aspirate_flow_rate=300 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=300 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -308,6 +319,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -5.5 }, pick_up_current=0.1, + pick_up_distance=10, aspirate_flow_rate=300 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=300 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -327,6 +339,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -2 }, pick_up_current=0.3, + pick_up_distance=10, aspirate_flow_rate=300 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=300 / DEFAULT_DISPENSE_SECONDS, channels=8, @@ -346,6 +359,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -3.5 }, pick_up_current=0.3, + pick_up_distance=10, aspirate_flow_rate=300 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=300 / DEFAULT_DISPENSE_SECONDS, channels=8, @@ -365,6 +379,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -5 }, pick_up_current=0.1, + pick_up_distance=15, aspirate_flow_rate=1000 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=1000 / DEFAULT_DISPENSE_SECONDS, channels=1, @@ -384,6 +399,7 @@ def _load_config_dict_from_file(pipette_model: str) -> dict: 'drop_tip': -4 }, pick_up_current=0.1, + pick_up_distance=15, aspirate_flow_rate=1000 / DEFAULT_ASPIRATE_SECONDS, dispense_flow_rate=1000 / DEFAULT_DISPENSE_SECONDS, channels=1, diff --git a/api/tests/opentrons/labware/test_pipette_unittest.py b/api/tests/opentrons/labware/test_pipette_unittest.py index 643a6fc6b2c..a1d2f846c4f 100644 --- a/api/tests/opentrons/labware/test_pipette_unittest.py +++ b/api/tests/opentrons/labware/test_pipette_unittest.py @@ -1002,8 +1002,8 @@ def test_tip_tracking_simple(self): self.p200.pick_up_tip() assert self.p200.move_to.mock_calls == \ - self.build_pick_up_tip(self.tiprack1[0]) + \ - self.build_pick_up_tip(self.tiprack1[1]) + self.build_pick_up_tip(self.p200, self.tiprack1[0]) + \ + self.build_pick_up_tip(self.p200, self.tiprack1[1]) def test_simulate_plunger_while_enqueing(self): @@ -1058,9 +1058,9 @@ def test_tip_tracking_chain(self): expected = [] for i in range(0, total_tips_per_plate): - expected.extend(self.build_pick_up_tip(self.tiprack1[i])) + expected.extend(self.build_pick_up_tip(self.p200, self.tiprack1[i])) for i in range(0, total_tips_per_plate): - expected.extend(self.build_pick_up_tip(self.tiprack2[i])) + expected.extend(self.build_pick_up_tip(self.p200, self.tiprack2[i])) self.assertEqual( self.p200.move_to.mock_calls, @@ -1101,9 +1101,11 @@ def test_tip_tracking_chain_multi_channel(self): expected = [] for i in range(0, 12): - expected.extend(self.build_pick_up_tip(self.tiprack1.cols[i])) + expected.extend( + self.build_pick_up_tip(p200_multi, self.tiprack1.cols[i])) for i in range(0, 12): - expected.extend(self.build_pick_up_tip(self.tiprack2.cols[i])) + expected.extend( + self.build_pick_up_tip(p200_multi, self.tiprack2.cols[i])) self.assertEqual( p200_multi.move_to.mock_calls, @@ -1161,14 +1163,16 @@ def test_direct_movement_within_well(self): ] self.assertEqual(self.robot.move_to.mock_calls, expected) - def build_pick_up_tip(self, well): - from opentrons.instruments.pipette import DEFAULT_TIP_PRESS_MM + def build_pick_up_tip(self, pipette, well): return [ mock.call(well.top()), - mock.call(well.top(DEFAULT_TIP_PRESS_MM), strategy='direct'), + mock.call( + well.top(-pipette._pick_up_distance), strategy='direct'), mock.call(well.top(), strategy='direct'), - mock.call(well.top(DEFAULT_TIP_PRESS_MM - 1), strategy='direct'), + mock.call( + well.top(-pipette._pick_up_distance - 1), strategy='direct'), mock.call(well.top(), strategy='direct'), - mock.call(well.top(DEFAULT_TIP_PRESS_MM - 2), strategy='direct'), + mock.call( + well.top(-pipette._pick_up_distance - 2), strategy='direct'), mock.call(well.top(), strategy='direct') ] diff --git a/shared-data/robot-data/pipette-config.json b/shared-data/robot-data/pipette-config.json index 72681ffd35c..3bdeef0805c 100644 --- a/shared-data/robot-data/pipette-config.json +++ b/shared-data/robot-data/pipette-config.json @@ -9,6 +9,7 @@ "dropTip": -4.5 }, "pickUpCurrent": 0.1, + "pickUpDistance": 10, "aspirateFlowRate": 5, "dispenseFlowRate": 10, "channels": 1, @@ -28,6 +29,7 @@ "dropTip": -6 }, "pickUpCurrent": 0.1, + "pickUpDistance": 10, "aspirateFlowRate": 5, "dispenseFlowRate": 10, "channels": 1, @@ -47,6 +49,7 @@ "dropTip": -4 }, "pickUpCurrent": 0.2, + "pickUpDistance": 10, "aspirateFlowRate": 5, "dispenseFlowRate": 10, "channels": 8, @@ -66,6 +69,7 @@ "dropTip": -5.5 }, "pickUpCurrent": 0.2, + "pickUpDistance": 10, "aspirateFlowRate": 5, "dispenseFlowRate": 10, "channels": 8, @@ -85,6 +89,7 @@ "dropTip": -4.5 }, "pickUpCurrent": 0.1, + "pickUpDistance": 10, "aspirateFlowRate": 25, "dispenseFlowRate": 50, "channels": 1, @@ -104,6 +109,7 @@ "dropTip": -6 }, "pickUpCurrent": 0.1, + "pickUpDistance": 10, "aspirateFlowRate": 25, "dispenseFlowRate": 50, "channels": 1, @@ -123,6 +129,7 @@ "dropTip": -3.5 }, "pickUpCurrent": 0.3, + "pickUpDistance": 10, "aspirateFlowRate": 25, "dispenseFlowRate": 50, "channels": 8, @@ -142,6 +149,7 @@ "dropTip": -5 }, "pickUpCurrent": 0.3, + "pickUpDistance": 10, "aspirateFlowRate": 25, "dispenseFlowRate": 50, "channels": 8, @@ -161,6 +169,7 @@ "dropTip": -4 }, "pickUpCurrent": 0.1, + "pickUpDistance": 10, "aspirateFlowRate": 150, "dispenseFlowRate": 300, "channels": 1, @@ -180,6 +189,7 @@ "dropTip": -5.5 }, "pickUpCurrent": 0.1, + "pickUpDistance": 10, "aspirateFlowRate": 150, "dispenseFlowRate": 300, "channels": 1, @@ -199,6 +209,7 @@ "dropTip": -2 }, "pickUpCurrent": 0.3, + "pickUpDistance": 10, "aspirateFlowRate": 150, "dispenseFlowRate": 300, "channels": 8, @@ -218,6 +229,7 @@ "dropTip": -3.5 }, "pickUpCurrent": 0.3, + "pickUpDistance": 10, "aspirateFlowRate": 150, "dispenseFlowRate": 300, "channels": 8, @@ -237,6 +249,7 @@ "dropTip": -5 }, "pickUpCurrent": 0.1, + "pickUpDistance": 15, "aspirateFlowRate": 500, "dispenseFlowRate": 1000, "channels": 1, @@ -256,6 +269,7 @@ "dropTip": -4 }, "pickUpCurrent": 0.1, + "pickUpDistance": 15, "aspirateFlowRate": 500, "dispenseFlowRate": 1000, "channels": 1, From 10cc7e9a3312b1eaea5e86011056009ff1d56e70 Mon Sep 17 00:00:00 2001 From: timo8396 <34746341+timo8396@users.noreply.github.com> Date: Mon, 10 Sep 2018 15:17:13 -0400 Subject: [PATCH 3/9] changes to shake off speed= 50, distance = 2.25 and double shake off motion --- api/opentrons/instruments/pipette.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/opentrons/instruments/pipette.py b/api/opentrons/instruments/pipette.py index 83ab3af3bd1..054b59448f8 100755 --- a/api/opentrons/instruments/pipette.py +++ b/api/opentrons/instruments/pipette.py @@ -31,8 +31,8 @@ DEFAULT_TIP_PRESS_MM = 10 DEFAULT_PLUNGE_CURRENT = 0.1 -SHAKE_OFF_TIPS_SPEED = 25 -SHAKE_OFF_TIPS_DISTANCE = 2 +SHAKE_OFF_TIPS_SPEED = 50 +SHAKE_OFF_TIPS_DISTANCE = 2.25 def _sleep(seconds): @@ -940,6 +940,8 @@ def _pick_up_tip( self._add_tip( length=self._tip_length ) + self._shake_off_tips(location) + self._shake_off_tips(location) self.previous_placeable = None # no longer inside a placeable self.robot.poses = self.instrument_mover.fast_home( self.robot.poses, self._pick_up_distance) @@ -1027,7 +1029,6 @@ def _drop_tip(location, instrument=self): x=pos_drop_tip ) self._shake_off_tips(location) - if home_after: self._home_after_drop_tip() From d906753d2ef82a35116777c0474318e024a65c52 Mon Sep 17 00:00:00 2001 From: andySigler Date: Mon, 10 Sep 2018 15:45:46 -0400 Subject: [PATCH 4/9] include pick-up-distance in pipette-config constructor --- api/opentrons/instruments/pipette_config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/opentrons/instruments/pipette_config.py b/api/opentrons/instruments/pipette_config.py index 839d3f28831..79496208f9d 100644 --- a/api/opentrons/instruments/pipette_config.py +++ b/api/opentrons/instruments/pipette_config.py @@ -77,6 +77,7 @@ def load(pipette_model: str) -> pipette_config: 'drop_tip': plunger_pos.get('dropTip'), }, pick_up_current=cfg.get('pickUpCurrent'), + pick_up_distance=cfg.get('pickUpDistance'), aspirate_flow_rate=cfg.get('aspirateFlowRate'), dispense_flow_rate=cfg.get('dispenseFlowRate'), channels=cfg.get('channels'), From 5259e0c5418dde31251d5170bc8c72c45d0b6fa0 Mon Sep 17 00:00:00 2001 From: carlos-fernandez Date: Mon, 10 Sep 2018 15:51:13 -0400 Subject: [PATCH 5/9] increases drop tip current for p1000s and adjust plunger position drop tip --- shared-data/robot-data/pipette-config.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shared-data/robot-data/pipette-config.json b/shared-data/robot-data/pipette-config.json index e94861f0b06..94fdb20c9d1 100644 --- a/shared-data/robot-data/pipette-config.json +++ b/shared-data/robot-data/pipette-config.json @@ -246,7 +246,7 @@ "top": 19.5, "bottom": 3, "blowOut": 1, - "dropTip": -5 + "dropTip": -2.2 }, "pickUpCurrent": 0.1, "pickUpDistance": 15, @@ -255,7 +255,7 @@ "channels": 1, "modelOffset": [0.0, 0.0, 20.0], "plungerCurrent": 0.5, - "dropTipCurrent": 0.5, + "dropTipCurrent": 0.7, "maxVolume": 1000, "tipLength": 76.7 }, @@ -266,7 +266,7 @@ "top": 19.5, "bottom": 2.5, "blowOut": -0.5, - "dropTip": -4 + "dropTip": -3.7 }, "pickUpCurrent": 0.1, "pickUpDistance": 15, @@ -275,7 +275,7 @@ "channels": 1, "modelOffset": [0.0, 0.0, 20.0], "plungerCurrent": 0.5, - "dropTipCurrent": 0.5, + "dropTipCurrent": 0.7, "maxVolume": 1000, "tipLength": 76.7 } From 3308e45c58c92bec574652ef5b1b301cd64c7aa7 Mon Sep 17 00:00:00 2001 From: andySigler Date: Tue, 9 Oct 2018 11:43:26 -0400 Subject: [PATCH 6/9] only shake for p1000 pick-up-tips --- api/opentrons/legacy_api/instruments/pipette.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/opentrons/legacy_api/instruments/pipette.py b/api/opentrons/legacy_api/instruments/pipette.py index 91db54e888a..130556b27f3 100755 --- a/api/opentrons/legacy_api/instruments/pipette.py +++ b/api/opentrons/legacy_api/instruments/pipette.py @@ -940,8 +940,12 @@ def _pick_up_tip( self._add_tip( length=self._tip_length ) - self._shake_off_tips(location) - self._shake_off_tips(location) + # neighboring tips tend to get stuck in the space between + # the volume chamber and the drop-tip sleeve on p1000. + # This extra shake ensures those tips are removed + if 'p1000_single_v1' in self.name: + self._shake_off_tips(location) + self._shake_off_tips(location) self.previous_placeable = None # no longer inside a placeable self.robot.poses = self.instrument_mover.fast_home( self.robot.poses, self._pick_up_distance) From 4893eeaca427c85c3ca9dc4014570161dacf22c8 Mon Sep 17 00:00:00 2001 From: andySigler Date: Tue, 9 Oct 2018 13:46:40 -0400 Subject: [PATCH 7/9] legacy_api/api inits pipette with pick_up_distance --- api/opentrons/legacy_api/api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/opentrons/legacy_api/api.py b/api/opentrons/legacy_api/api.py index 51fa7d9a45f..a6f8643d1f7 100644 --- a/api/opentrons/legacy_api/api.py +++ b/api/opentrons/legacy_api/api.py @@ -239,6 +239,7 @@ def _create_pipette_from_config( plunger_current=config.plunger_current, drop_tip_current=config.drop_tip_current, plunger_positions=config.plunger_positions.copy(), + pick_up_distance=config.pick_up_distance, fallback_tip_length=config.tip_length) # TODO move to labware p.set_pick_up_current(config.pick_up_current) From af8b820ad3c0ea69bd9f49075838addfa922d7a2 Mon Sep 17 00:00:00 2001 From: andySigler Date: Thu, 11 Oct 2018 16:12:04 -0400 Subject: [PATCH 8/9] removes call to set_pick_up_current in _create_pipette_from_config and instead passes in as kwarg --- api/opentrons/legacy_api/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/opentrons/legacy_api/api.py b/api/opentrons/legacy_api/api.py index a6f8643d1f7..ce0b12223f5 100644 --- a/api/opentrons/legacy_api/api.py +++ b/api/opentrons/legacy_api/api.py @@ -239,10 +239,10 @@ def _create_pipette_from_config( plunger_current=config.plunger_current, drop_tip_current=config.drop_tip_current, plunger_positions=config.plunger_positions.copy(), + pick_up_current=config.pick_up_current, pick_up_distance=config.pick_up_distance, fallback_tip_length=config.tip_length) # TODO move to labware - p.set_pick_up_current(config.pick_up_current) return p def _retrieve_version_number(self, mount, expected_model_substring): From e6931b6be9ca0800e64780c6302116c62cddf0ae Mon Sep 17 00:00:00 2001 From: andySigler Date: Thu, 11 Oct 2018 16:23:48 -0400 Subject: [PATCH 9/9] adds 'quirks' field to pipette-config to enable the extra shake for p1000 --- api/opentrons/legacy_api/api.py | 1 + api/opentrons/legacy_api/instruments/pipette.py | 5 ++++- .../legacy_api/instruments/pipette_config.py | 2 ++ shared-data/robot-data/pipette-config.json | 14 ++++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/api/opentrons/legacy_api/api.py b/api/opentrons/legacy_api/api.py index ce0b12223f5..2e68d2f36ff 100644 --- a/api/opentrons/legacy_api/api.py +++ b/api/opentrons/legacy_api/api.py @@ -241,6 +241,7 @@ def _create_pipette_from_config( plunger_positions=config.plunger_positions.copy(), pick_up_current=config.pick_up_current, pick_up_distance=config.pick_up_distance, + quirks=config.quirks, fallback_tip_length=config.tip_length) # TODO move to labware return p diff --git a/api/opentrons/legacy_api/instruments/pipette.py b/api/opentrons/legacy_api/instruments/pipette.py index 130556b27f3..030df52b4cb 100755 --- a/api/opentrons/legacy_api/instruments/pipette.py +++ b/api/opentrons/legacy_api/instruments/pipette.py @@ -125,6 +125,7 @@ def __init__( plunger_positions=PLUNGER_POSITIONS, pick_up_current=DEFAULT_PLUNGE_CURRENT, pick_up_distance=DEFAULT_TIP_PRESS_MM, + quirks=[], fallback_tip_length=51.7): # TODO (andy): move to tip-rack self.robot = robot @@ -196,6 +197,8 @@ def __init__( self.robot.config.tip_length[self.name] = \ self.robot.config.tip_length.get(self.name, fallback_tip_length) + self.quirks = quirks if isinstance(quirks, list) else [] + def reset(self): """ Resets the state of this pipette, removing associated placeables, @@ -943,7 +946,7 @@ def _pick_up_tip( # neighboring tips tend to get stuck in the space between # the volume chamber and the drop-tip sleeve on p1000. # This extra shake ensures those tips are removed - if 'p1000_single_v1' in self.name: + if 'needs-pickup-shake' in self.quirks: self._shake_off_tips(location) self._shake_off_tips(location) self.previous_placeable = None # no longer inside a placeable diff --git a/api/opentrons/legacy_api/instruments/pipette_config.py b/api/opentrons/legacy_api/instruments/pipette_config.py index e7fb56490f8..ca1b79570a7 100644 --- a/api/opentrons/legacy_api/instruments/pipette_config.py +++ b/api/opentrons/legacy_api/instruments/pipette_config.py @@ -24,6 +24,7 @@ 'drop_tip_current', 'min_volume', 'max_volume', + 'quirks', 'tip_length' # TODO (andy): remove from pipette, move to tip-rack ] ) @@ -88,6 +89,7 @@ def load(pipette_model: str) -> pipette_config: drop_tip_current=cfg.get('dropTipCurrent'), min_volume=cfg.get('minVolume'), max_volume=cfg.get('maxVolume'), + quirks=cfg.get('quirks'), tip_length=cfg.get('tipLength') ) diff --git a/shared-data/robot-data/pipette-config.json b/shared-data/robot-data/pipette-config.json index 5769fb09080..154eadbe9b6 100644 --- a/shared-data/robot-data/pipette-config.json +++ b/shared-data/robot-data/pipette-config.json @@ -18,6 +18,7 @@ "dropTipCurrent": 0.5, "minVolume": 1, "maxVolume": 10, + "quirks": [], "tipLength": 33 }, "p10_single_v1.3": { @@ -39,6 +40,7 @@ "dropTipCurrent": 0.5, "minVolume": 1, "maxVolume": 10, + "quirks": [], "tipLength": 33 }, "p10_multi_v1": { @@ -60,6 +62,7 @@ "dropTipCurrent": 0.5, "minVolume": 1, "maxVolume": 10, + "quirks": [], "tipLength": 33 }, "p10_multi_v1.3": { @@ -81,6 +84,7 @@ "dropTipCurrent": 0.5, "minVolume": 1, "maxVolume": 10, + "quirks": [], "tipLength": 33 }, "p50_single_v1": { @@ -102,6 +106,7 @@ "dropTipCurrent": 0.5, "minVolume": 5, "maxVolume": 50, + "quirks": [], "tipLength": 51.7 }, "p50_single_v1.3": { @@ -123,6 +128,7 @@ "dropTipCurrent": 0.5, "minVolume": 5, "maxVolume": 50, + "quirks": [], "tipLength": 51.7 }, "p50_multi_v1": { @@ -144,6 +150,7 @@ "dropTipCurrent": 0.5, "minVolume": 5, "maxVolume": 50, + "quirks": [], "tipLength": 51.7 }, "p50_multi_v1.3": { @@ -165,6 +172,7 @@ "dropTipCurrent": 0.5, "minVolume": 5, "maxVolume": 50, + "quirks": [], "tipLength": 51.7 }, "p300_single_v1": { @@ -186,6 +194,7 @@ "dropTipCurrent": 0.5, "minVolume": 30, "maxVolume": 300, + "quirks": [], "tipLength": 51.7 }, "p300_single_v1.3": { @@ -207,6 +216,7 @@ "dropTipCurrent": 0.5, "minVolume": 30, "maxVolume": 300, + "quirks": [], "tipLength": 51.7 }, "p300_multi_v1": { @@ -228,6 +238,7 @@ "dropTipCurrent": 0.5, "minVolume": 30, "maxVolume": 300, + "quirks": [], "tipLength": 51.7 }, "p300_multi_v1.3": { @@ -249,6 +260,7 @@ "dropTipCurrent": 0.5, "minVolume": 30, "maxVolume": 300, + "quirks": [], "tipLength": 51.7 }, "p1000_single_v1": { @@ -270,6 +282,7 @@ "dropTipCurrent": 0.5, "minVolume": 100, "maxVolume": 1000, + "quirks": ["needs-pickup-shake"], "tipLength": 76.7 }, "p1000_single_v1.3": { @@ -291,6 +304,7 @@ "dropTipCurrent": 0.7, "minVolume": 100, "maxVolume": 1000, + "quirks": ["needs-pickup-shake"], "tipLength": 76.7 } }