Plataforma de automação laboratorial para robôs Flex/OT-2. Escreva protocolos Protocol API v2, manipulação de líquidos, módulos de hardware (heater-shaker, thermocycler), gestão de labware, para workflows de pipetagem automatizados.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill opentrons-integration --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Opentrons Integration?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/artubss-opentrons-integration)More formats (shields.io, HTML) on the badges page.
---
name: opentrons-integration
description: "Plataforma de automação laboratorial para robôs Flex/OT-2. Escreva protocolos Protocol API v2, manipulação de líquidos, módulos de hardware (heater-shaker, thermocycler), gestão de labware, para workflows de pipetagem automatizados."
---
# Integração Opentrons
## Visão Geral
Opentrons é uma plataforma de automação laboratorial baseada em Python para robôs Flex e OT-2. Escreva protocolos Protocol API v2 para manipulação de líquidos, controle de módulos de hardware (temperatura, magnético, heater-shaker, thermocycler), gestão de labware, para workflows de pipetagem automatizados.
## Quando Usar Esta Skill
Esta skill deve ser usada quando:
- Escrevendo protocolos Protocol API v2 da Opentrons em Python
- Automatizando workflows de manipulação de líquidos em robôs Flex ou OT-2
- Controlando módulos de hardware (temperatura, magnético, heater-shaker, thermocycler)
- Configurando layouts de labware e deck
- Implementando operações complexas de pipetagem (diluições seriadas, replicação de placas, setup de PCR)
- Gerenciando uso de tips e otimizando eficiência de protocolos
- Trabalhando com pipetas multicanal para operações em placas de 96 poços
- Simulando e testando protocolos antes da execução no robô
## Capacidades Principais
### 1. Estrutura de Protocolo e Metadados
Todo protocolo Opentrons segue uma estrutura padrão:
```python
from opentrons import protocol_api
# Metadados
metadata = {
'protocolName': 'My Protocol',
'author': 'Name <email@example.com>',
'description': 'Protocol description',
'apiLevel': '2.19' # Use latest available API version
}
# Requisitos (opcional)
requirements = {
'robotType': 'Flex', # or 'OT-2'
'apiLevel': '2.19'
}
# Função de execução
def run(protocol: protocol_api.ProtocolContext):
# Protocol commands go here
pass
```
**Elementos principais:**
- Importe `protocol_api` de `opentrons`
- Defina dicionário `metadata` com protocolName, author, description, apiLevel
- Dicionário `requirements` opcional para tipo de robô e versão da API
- Implemente função `run()` recebendo `ProtocolContext` como parâmetro
- Toda lógica do protocolo vai dentro da função `run()`
### 2. Carregando Hardware
**Carregando Instrumentos (Pipetas):**
```python
def run(protocol: protocol_api.ProtocolContext):
# Carregue pipeta no mount específico
left_pipette = protocol.load_instrument(
'p1000_single_flex', # Nome do instrumento
'left', # Mount: 'left' ou 'right'
tip_racks=[tip_rack] # Lista de objetos labware tip rack
)
```
Nomes de pipeta comuns:
- Flex: `p50_single_flex`, `p1000_single_flex`, `p50_multi_flex`, `p1000_multi_flex`
- OT-2: `p20_single_gen2`, `p300_single_gen2`, `p1000_single_gen2`, `p20_multi_gen2`, `p300_multi_gen2`
**Carregando Labware:**
```python
# Carregue labware diretamente no deck
plate = protocol.load_labware(
'corning_96_wellplate_360ul_flat', # Nome API do labware
'D1', # Slot do deck (Flex: A1-D3, OT-2: 1-11)
label='Sample Plate' # Label opcional para exibição
)
# Carregue tip rack
tip_rack = protocol.load_labware('opentrons_flex_96_tiprack_1000ul', 'C1')
# Carregue labware em adaptador
adapter = protocol.load_adapter('opentrons_flex_96_tiprack_adapter', 'B1')
tips = adapter.load_labware('opentrons_flex_96_tiprack_200ul')
```
**Carregando Módulos:**
```python
# Módulo de temperatura
temp_module = protocol.load_module('temperature module gen2', 'D3')
temp_plate = temp_module.load_labware('corning_96_wellplate_360ul_flat')
# Módulo magnético
mag_module = protocol.load_module('magnetic module gen2', 'C2')
mag_plate = mag_module.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
# Módulo heater-shaker
hs_module = protocol.load_module('heaterShakerModuleV1', 'D1')
hs_plate = hs_module.load_labware('corning_96_wellplate_360ul_flat')
# Módulo thermocycler (ocupa slots específicos automaticamente)
tc_module = protocol.load_module('thermocyclerModuleV2')
tc_plate = tc_module.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
```
### 3. Operações de Manipulação de Líquidos
**Operações Básicas:**
```python
# Pegue um tip
pipette.pick_up_tip()
# Aspire (puxe líquido)
pipette.aspirate(
volume=100, # Volume em µL
location=source['A1'] # Poço ou objeto location
)
# Dispense (libere líquido)
pipette.dispense(
volume=100,
location=dest['B1']
)
# Solte o tip
pipette.drop_tip()
# Retorne o tip ao rack
pipette.return_tip()
```
**Operações Complexas:**
```python
# Transfer (combina pick_up, aspirate, dispense, drop_tip)
pipette.transfer(
volume=100,
source=source_plate['A1'],
dest=dest_plate['B1'],
new_tip='always' # 'always', 'once', ou 'never'
)
# Distribute (uma fonte para múltiplos destinos)
pipette.distribute(
volume=50,
source=reservoir['A1'],
dest=[plate['A1'], plate['A2'], plate['A3']],
new_tip='once'
)
# Consolidate (múltiplas fontes para um destino)
pipette.consolidate(
volume=50,
source=[plate['A1'], plate['A2'], plate['A3']],
dest=reservoir['A1'],
new_tip='once'
)
```
**Técnicas Avançadas:**
```python
# Mix (aspire e dispense no mesmo local)
pipette.mix(
repetitions=3,
volume=50,
location=plate['A1']
)
# Air gap (previne gotejamento)
pipette.aspirate(100, source['A1'])
pipette.air_gap(20) # 20µL air gap
pipette.dispense(120, dest['A1'])
# Blow out (expele líquido restante)
pipette.blow_out(location=dest['A1'].top())
# Touch tip (remove gotículas na parte externa do tip)
pipette.touch_tip(location=plate['A1'])
```
**Controle de Taxa de Fluxo:**
```python
# Configure taxas de fluxo (µL/s)
pipette.flow_rate.aspirate = 150
pipette.flow_rate.dispense = 300
pipette.flow_rate.blow_out = 400
```
### 4. Acessando Poços e Localizações
**Métodos de Acesso a Poços:**
```python
# Por nome
well_a1 = plate['A1']
# Por índice
first_well = plate.wells()[0]
# Todos os poços
all_wells = plate.wells() # Retorna lista
# Por linhas
rows = plate.rows() # Retorna lista de listas
row_a = plate.rows()[0] # Todos os poços da linha A
# Por colunas
columns = plate.columns() # Retorna lista de listas
column_1 = plate.columns()[0] # Todos os poços da coluna 1
# Poços por nome (dicionário)
wells_dict = plate.wells_by_name() # {'A1': Well, 'A2': Well, ...}
```
**Métodos de Localização:**
```python
# Topo do poço (padrão: 1mm abaixo do topo)
pipette.aspirate(100, well.top())
pipette.aspirate(100, well.top(z=5)) # 5mm acima do topo
# Fundo do poço (padrão: 1mm acima do fundo)
pipette.aspirate(100, well.bottom())
pipette.aspirate(100, well.bottom(z=2)) # 2mm acima do fundo
# Centro do poço
pipette.aspirate(100, well.center())
```
### 5. Controle de Módulos de Hardware
**Módulo de Temperatura:**
```python
# Configure temperatura
temp_module.set_temperature(celsius=4)
# Aguarde a temperatura
temp_module.await_temperature(celsius=4)
# Desative
temp_module.deactivate()
# Verifique status
current_temp = temp_module.temperature # Temperatura atual
target_temp = temp_module.target # Temperatura alvo
```
**Módulo Magnético:**
```python
# Engaje (levante os ímãs)
mag_module.engage(height_from_base=10) # mm da base do labware
# Desengaje (abaixe os ímãs)
mag_module.disengage()
# Verifique status
is_engaged = mag_module.status # 'engaged' ou 'disengaged'
```
**Módulo Heater-Shaker:**
```python
# Configure temperatura
hs_module.set_target_temperature(celsius=37)
# Aguarde a temperatura
hs_module.wait_for_temperature()
# Configure velocidade de agitação
hs_module.set_and_wait_for_shake_speed(rpm=500)
# Feche a trava do labware
hs_module.close_labware_latch()
# Abra a trava do labware
hs_module.open_labware_latch()
# Desative o aquecedor
hs_module.deactivate_heater()
# Desative o agitador
hs_module.deactivate_shaker()
```
**Módulo Thermocycler:**
```python
# Abra a tampa
tc_module.open_lid()
# Feche a tampa
tc_module.close_lid()
# Configure temperatura da tampa
tc_module.set_lid_temperature(celsius=105)
# Configure temperatura do bloco
tc_module.set_block_temperature(
temperature=95,
hold_time_seconds=30,
hold_time_minutes=0.5,
block_max_volume=50 # µL por poço
)
# Execute perfil (PCR cycling)
profile = [
{'temperature': 95, 'hold_time_seconds': 30},
{'temperature': 57, 'hold_time_seconds': 30},
{'temperature': 72, 'hold_time_seconds': 60}
]
tc_module.execute_profile(
steps=profile,
repetitions=30,
block_max_volume=50
)
# Desative
tc_module.deactivate_lid()
tc_module.deactivate_block()
```
**Leitor de Placa de Absorbância:**
```python
# Inicialize e leia
result = plate_reader.read(wavelengths=[450, 650])
# Acesse as leituras
absorbance_data = result # Dicionário com chaves de comprimento de onda
```
### 6. Rastreamento de Líquidos e Etiquetagem
**Defina Líquidos:**
```python
# Defina tipos de líquido
water = protocol.define_liquid(
name='Water',
description='Ultrapure water',
display_color='#0000FF' # Código de cor hexadecimal
)
sample = protocol.define_liquid(
name='Sample',
description='Cell lysate sample',
display_color='#FF0000'
)
```
**Carregue Líquidos em Poços:**
```python
# Carregue líquido em poços específicos
reservoir['A1'].load_liquid(liquid=water, volume=50000) # µL
plate['A1'].load_liquid(liquid=sample, volume=100)
# Marque poços como vazios
plate['B1'].load_empty()
```
### 7. Controle de Protocolo e Utilitários
**Controle de Execução:**
```python
# Pause o protocolo
protocol.pause(msg='Replace tip box and resume')
# Atraso
protocol.delay(seconds=60)
protocol.delay(minutes=5)
# Comentário (aparece nos logs)
protocol.comment('Starting serial dilution')
# Retorne o robô à posição de repouso
protocol.home()
```
**Lógica Condicional:**
```python
# Verifique se está simulando
if protocol.is_simulating():
protocol.comment('Running in simulation mode')
else:
protocol.comment('Running on actual robot')
```
**Rail Lights (apenas Flex):**
```python
# Ligue as luzes
protocol.set_rail_lights(on=True)
# Desligue as luzes
protocol.set_rail_lights(on=False)
```
### 8. Pipetagem Multicanal e 8-Canais
Ao usar pipetas multicanal:
```python
# Carregue pipeta 8-canais
multi_pipette = protocol.load_instrument(
'p300_multi_gen2',
'left',
tip_racks=[tips]
)
# Acesse a coluna inteira com referência de um único poço
multi_pipette.transfer(
volume=100,
source=source_plate['A1'], # Acessa coluna inteira 1
dest=dest_plate['A1'] # Dispensa para coluna inteira 1
)
# Use rows() para operações linha a linha
for row in plate.rows():
multi_pipette.transfer(100, reservoir['A1'], row[0])
```
### 9. Padrões Comuns de Protocolo
**Diluição Seriada:**
```python
def run(protocol: protocol_api.ProtocolContext):
# Carregue labware
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1')
reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2')
plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D3')
# Carregue pipeta
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# Adicione diluente para todos os poços exceto o primeiro
p300.transfer(100, reservoir['A1'], plate.rows()[0][1:])
# Diluição seriada através da linha
p300.transfer(
100,
plate.rows()[0][:11], # Fonte: poços 0-10
plate.rows()[0][1:], # Destino: poços 1-11
mix_after=(3, 50), # Mix 3x com 50µL após dispensar
new_tip='always'
)
```
**Replicação de Placa:**
```python
def run(protocol: protocol_api.ProtocolContext):
# Carregue labware
tips = protocol.load_labware('opentrons_flex_96_tiprack_1000ul', 'C1')
source = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D1')
dest = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D2')
# Carregue pipeta
p1000 = protocol.load_instrument('p1000_single_flex', 'left', tip_racks=[tips])
# Transfira de todos os poços em source para dest
p1000.transfer(
100,
source.wells(),
dest.wells(),
new_tip='always'
)
```
**Setup de PCR:**
```python
def run(protocol: protocol_api.ProtocolContext):
# Carregue thermocycler
tc_mod = protocol.load_module('thermocyclerModuleV2')
tc_plate = tc_mod.load_labware('nest_96_wellplate_100ul_pcr_full_skirt')
# Carregue tips e reagentes
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'C1')
reagents = protocol.load_labware('opentrons_24_tuberack_nest_1.5ml_snapcap', 'D1')
# Carregue pipeta
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# Abra a tampa do thermocycler
tc_mod.open_lid()
# Distribua master mix
p300.distribute(
20,
reagents['A1'],
tc_plate.wells(),
new_tip='once'
)
# Adicione amostras (exemplo para os 8 primeiros poços)
for i, well in enumerate(tc_plate.wells()[:8]):
p300.transfer(5, reagents.wells()[i+1], well, new_tip='always')
# Execute PCR
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
# Perfil de PCR
tc_mod.set_block_temperature(95, hold_time_seconds=180)
profile = [
{'temperature': 95, 'hold_time_seconds': 15},
{'temperature': 60, 'hold_time_seconds': 30},
{'temperature': 72, 'hold_time_seconds': 30}
]
tc_mod.execute_profile(steps=profile, repetitions=35, block_max_volume=25)
tc_mod.set_block_temperature(72, hold_time_minutes=5)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.open_lid()
```
## Melhores Práticas
1. **Sempre especifique nível de API**: Use a versão estável mais recente nos metadados
2. **Use labels significativos**: Etiquete labware para identificação mais fácil nos logs
3. **Verifique disponibilidade de tips**: Certifique-se de que há tips suficientes para conclusão do protocolo
4. **Adicione comentários**: Use `protocol.comment()` para debugging e logging
5. **Simule primeiro**: Sempre teste protocolos em simulação antes de executar no robô
6. **Trate erros corretamente**: Adicione pausas para intervenção manual quando necessário
7. **Considere timing**: Use atrasos quando protocolos requerem períodos de incubação
8. **Rastreie líquidos**: Use rastreamento de líquidos para melhor validação de setup
9. **Otimize uso de tips**: Use `new_tip='once'` quando apropriado para economizar tips
10. **Controle taxas de fluxo**: Ajuste taxas de fluxo para líquidos viscosos ou voláteis
## Solução de Problemas
**Problemas Comuns:**
- **Fora de tips**: Verifique se a capacidade do tip rack corresponde aos requisitos do protocolo
- **Colisão de labware**: Verifique o layout do deck para conflitos espaciais
- **Erros de volume**: Certifique-se de que volumes não excedem capacidades de poço ou pipeta
- **Módulo não responde**: Verifique se o módulo está conectado corretamente e o firmware está atualizado
- **Volumes imprecisos**: Calibre pipetas e verifique bolhas de ar
- **Protocolo falha em simulação**: Verifique compatibilidade de versão de API e definições de labware
## Recursos
Para documentação detalhada da API, consulte `references/api_reference.md` neste diretório de skill.
Para templates de protocolo de exemplo, consulte o diretório `scripts/`.Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!