Skip to content

Commit e75f9fe

Browse files
rickwierengaclaude
andcommitted
docs(thermo_fisher): add ALPS 300/3000/5000 hello-world guides
Add a user-guide index for the ALPS heat sealer family and a hello-world notebook for each model, and list them under the Thermo Fisher user guide. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 527cc85 commit e75f9fe

5 files changed

Lines changed: 353 additions & 0 deletions

File tree

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "alps300-intro",
6+
"source": "# Thermo Scientific ALPS 300\n\nThe ALPS 300 is a heat sealer for microplates from Thermo Scientific, controlled over an RS-232 serial interface.\n\n| Property | Value |\n|---|---|\n| Communication | Serial / RS-232, ASCII command protocol |\n| Serial settings | 9600 baud, 8 data bits, no parity, 1 stop bit, no handshake |\n| Terminator | CR (`\\r`) |\n\nThe ALPS 300, 3000, and 5000 share a command core but use different status flags and error codes, so each has its own driver class.\n\n```{warning}\nThis driver has NOT been tested against hardware in PyLabRobot. If you verify\nit on a sealer, please open a PR to remove the not-tested warning.\n```",
7+
"metadata": {}
8+
},
9+
{
10+
"cell_type": "markdown",
11+
"id": "alps300-setup-md",
12+
"source": "## Physical setup\n\nConnect the sealer's RS-232 port to your computer, typically through a USB-to-serial adapter. Make sure the sealer's serial parameters match the driver defaults (9600 baud, 8 data bits, no parity, 1 stop bit, no handshake).",
13+
"metadata": {}
14+
},
15+
{
16+
"cell_type": "markdown",
17+
"id": "alps300-connect-md",
18+
"source": "## Connect\n\n`setup()` opens the serial port, waits for the device to be ready, and pre-heats to the preheating temperature. It also logs the not-tested warning.",
19+
"metadata": {}
20+
},
21+
{
22+
"cell_type": "code",
23+
"id": "alps300-connect-code",
24+
"source": "from pylabrobot.thermo_fisher.alps import ThermoScientificALPS300\n\nsealer = ThermoScientificALPS300(port=\"/dev/ttyUSB0\") # replace with your port\nawait sealer.setup()",
25+
"metadata": {},
26+
"execution_count": null,
27+
"outputs": []
28+
},
29+
{
30+
"cell_type": "markdown",
31+
"id": "alps300-seal-md",
32+
"source": "## Seal a plate\n\n`seal()` applies the time and temperature, waits for the heater to reach the setpoint, then seals the plate. Sealing time is 0.5–9.9 s; temperature is 5–199 °C.",
33+
"metadata": {}
34+
},
35+
{
36+
"cell_type": "code",
37+
"id": "alps300-seal-code",
38+
"source": "await sealer.seal(temperature=170, duration=2.5)",
39+
"metadata": {},
40+
"execution_count": null,
41+
"outputs": []
42+
},
43+
{
44+
"cell_type": "markdown",
45+
"id": "alps300-temp-md",
46+
"source": "## Temperature\n\nSet the sealing temperature setpoint and read the current heater temperature.",
47+
"metadata": {}
48+
},
49+
{
50+
"cell_type": "code",
51+
"id": "alps300-temp-code",
52+
"source": "await sealer.set_temperature(160)\nprint(\"Current temperature:\", await sealer.request_temperature(), \"C\")",
53+
"metadata": {},
54+
"execution_count": null,
55+
"outputs": []
56+
},
57+
{
58+
"cell_type": "markdown",
59+
"id": "alps300-status-md",
60+
"source": "## Status\n\nRead the status byte as a set of flags.",
61+
"metadata": {}
62+
},
63+
{
64+
"cell_type": "code",
65+
"id": "alps300-status-code",
66+
"source": "print(\"Status:\", await sealer.request_status())",
67+
"metadata": {},
68+
"execution_count": null,
69+
"outputs": []
70+
},
71+
{
72+
"cell_type": "markdown",
73+
"id": "alps300-teardown-md",
74+
"source": "## Teardown",
75+
"metadata": {}
76+
},
77+
{
78+
"cell_type": "code",
79+
"id": "alps300-teardown-code",
80+
"source": "await sealer.stop()",
81+
"metadata": {},
82+
"execution_count": null,
83+
"outputs": []
84+
}
85+
],
86+
"metadata": {
87+
"kernelspec": {
88+
"display_name": "Python 3 (ipykernel)",
89+
"language": "python",
90+
"name": "python3"
91+
},
92+
"language_info": {
93+
"name": "python",
94+
"version": "3.11.0"
95+
}
96+
},
97+
"nbformat": 4,
98+
"nbformat_minor": 5
99+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "alps3000-intro",
6+
"source": "# Thermo Scientific ALPS 3000\n\nThe ALPS 3000 is a heat sealer for microplates from Thermo Scientific, controlled over an RS-232 serial interface.\n\nProduct page: <https://www.thermofisher.com/order/catalog/product/AB-3000>\n\n| Property | Value |\n|---|---|\n| Communication | Serial / RS-232, ASCII command protocol |\n| Serial settings | 9600 baud, 8 data bits, no parity, 1 stop bit, no handshake |\n| Terminator | CR (`\\r`) |\n\nThe ALPS 300, 3000, and 5000 share a command core but use different status flags and error codes, so each has its own driver class.\n\n```{warning}\nThis driver has NOT been tested against hardware in PyLabRobot. If you verify\nit on a sealer, please open a PR to remove the not-tested warning.\n```",
7+
"metadata": {}
8+
},
9+
{
10+
"cell_type": "markdown",
11+
"id": "alps3000-setup-md",
12+
"source": "## Physical setup\n\nConnect the sealer's RS-232 port to your computer, typically through a USB-to-serial adapter. Make sure the sealer's serial parameters match the driver defaults (9600 baud, 8 data bits, no parity, 1 stop bit, no handshake).",
13+
"metadata": {}
14+
},
15+
{
16+
"cell_type": "markdown",
17+
"id": "alps3000-connect-md",
18+
"source": "## Connect\n\n`setup()` opens the serial port, waits for the device to be ready, and pre-heats to the preheating temperature. It also logs the not-tested warning.",
19+
"metadata": {}
20+
},
21+
{
22+
"cell_type": "code",
23+
"id": "alps3000-connect-code",
24+
"source": "from pylabrobot.thermo_fisher.alps import ThermoScientificALPS3000\n\nsealer = ThermoScientificALPS3000(port=\"/dev/ttyUSB0\") # replace with your port\nawait sealer.setup()",
25+
"metadata": {},
26+
"execution_count": null,
27+
"outputs": []
28+
},
29+
{
30+
"cell_type": "markdown",
31+
"id": "alps3000-seal-md",
32+
"source": "## Seal a plate\n\n`seal()` applies the time and temperature, waits for the heater to reach the setpoint, then seals the plate. Sealing time is 0.5–9.9 s; temperature is 5–199 °C.",
33+
"metadata": {}
34+
},
35+
{
36+
"cell_type": "code",
37+
"id": "alps3000-seal-code",
38+
"source": "await sealer.seal(temperature=170, duration=2.5)",
39+
"metadata": {},
40+
"execution_count": null,
41+
"outputs": []
42+
},
43+
{
44+
"cell_type": "markdown",
45+
"id": "alps3000-temp-md",
46+
"source": "## Temperature\n\nSet the sealing temperature setpoint and read the current heater temperature.",
47+
"metadata": {}
48+
},
49+
{
50+
"cell_type": "code",
51+
"id": "alps3000-temp-code",
52+
"source": "await sealer.set_temperature(160)\nprint(\"Current temperature:\", await sealer.request_temperature(), \"C\")",
53+
"metadata": {},
54+
"execution_count": null,
55+
"outputs": []
56+
},
57+
{
58+
"cell_type": "markdown",
59+
"id": "alps3000-status-md",
60+
"source": "## Status\n\nRead the status byte as a set of flags.",
61+
"metadata": {}
62+
},
63+
{
64+
"cell_type": "code",
65+
"id": "alps3000-status-code",
66+
"source": "print(\"Status:\", await sealer.request_status())",
67+
"metadata": {},
68+
"execution_count": null,
69+
"outputs": []
70+
},
71+
{
72+
"cell_type": "markdown",
73+
"id": "alps3000-teardown-md",
74+
"source": "## Teardown",
75+
"metadata": {}
76+
},
77+
{
78+
"cell_type": "code",
79+
"id": "alps3000-teardown-code",
80+
"source": "await sealer.stop()",
81+
"metadata": {},
82+
"execution_count": null,
83+
"outputs": []
84+
}
85+
],
86+
"metadata": {
87+
"kernelspec": {
88+
"display_name": "Python 3 (ipykernel)",
89+
"language": "python",
90+
"name": "python3"
91+
},
92+
"language_info": {
93+
"name": "python",
94+
"version": "3.11.0"
95+
}
96+
},
97+
"nbformat": 4,
98+
"nbformat_minor": 5
99+
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "alps5000-intro",
6+
"source": "# Thermo Scientific ALPS 5000\n\nThe ALPS 5000 is a heat sealer for microplates from Thermo Scientific, controlled over an RS-232 serial interface. It extends the shared ALPS protocol with initialisation, force-sensor control, foil length, sealing distance, and shuttle movement.\n\nProduct page: <https://www.thermofisher.com/order/catalog/product/AB-5000>\n\n| Property | Value |\n|---|---|\n| Communication | Serial / RS-232, ASCII command protocol |\n| Serial settings | 9600 baud, 8 data bits, no parity, 1 stop bit, no handshake |\n| Terminator | CR (`\\r`) |\n\nThe ALPS 300, 3000, and 5000 share a command core but use different status flags and error codes, so each has its own driver class.\n\n```{warning}\nThis driver has NOT been tested against hardware in PyLabRobot. If you verify\nit on a sealer, please open a PR to remove the not-tested warning.\n```",
7+
"metadata": {}
8+
},
9+
{
10+
"cell_type": "markdown",
11+
"id": "alps5000-setup-md",
12+
"source": "## Physical setup\n\nConnect the sealer's RS-232 port to your computer, typically through a USB-to-serial adapter. Make sure the sealer's serial parameters match the driver defaults (9600 baud, 8 data bits, no parity, 1 stop bit, no handshake).",
13+
"metadata": {}
14+
},
15+
{
16+
"cell_type": "markdown",
17+
"id": "alps5000-connect-md",
18+
"source": "## Connect\n\n`setup()` opens the serial port, runs the instrument initialisation routine, waits for the device to be ready, and pre-heats to the preheating temperature. It also logs the not-tested warning.",
19+
"metadata": {}
20+
},
21+
{
22+
"cell_type": "code",
23+
"id": "alps5000-connect-code",
24+
"source": "from pylabrobot.thermo_fisher.alps import ThermoScientificALPS5000\n\nsealer = ThermoScientificALPS5000(port=\"/dev/ttyUSB0\") # replace with your port\nawait sealer.setup()",
25+
"metadata": {},
26+
"execution_count": null,
27+
"outputs": []
28+
},
29+
{
30+
"cell_type": "markdown",
31+
"id": "alps5000-seal-md",
32+
"source": "## Seal a plate\n\n`seal()` applies the time and temperature, optionally enables the force sensor, waits for the heater to reach the setpoint, then seals the plate. Sealing time is 0.5–9.9 s; temperature is 5–199 °C.",
33+
"metadata": {}
34+
},
35+
{
36+
"cell_type": "code",
37+
"id": "alps5000-seal-code",
38+
"source": "await sealer.seal(temperature=170, duration=2.5, use_force_sensor=True)",
39+
"metadata": {},
40+
"execution_count": null,
41+
"outputs": []
42+
},
43+
{
44+
"cell_type": "markdown",
45+
"id": "alps5000-force-md",
46+
"source": "## Force and force sensor\n\nSet the sealing force (5–50) and enable or disable the force sensor independently of a seal.",
47+
"metadata": {}
48+
},
49+
{
50+
"cell_type": "code",
51+
"id": "alps5000-force-code",
52+
"source": "await sealer.set_force(30)\nawait sealer.enable_force_sensor(True)",
53+
"metadata": {},
54+
"execution_count": null,
55+
"outputs": []
56+
},
57+
{
58+
"cell_type": "markdown",
59+
"id": "alps5000-foil-md",
60+
"source": "## Foil length and sealing distance\n\nSet the foil length (119–128) and the sealing distance (10–50).",
61+
"metadata": {}
62+
},
63+
{
64+
"cell_type": "code",
65+
"id": "alps5000-foil-code",
66+
"source": "await sealer.set_foil_length(124)\nawait sealer.set_sealing_distance(20)",
67+
"metadata": {},
68+
"execution_count": null,
69+
"outputs": []
70+
},
71+
{
72+
"cell_type": "markdown",
73+
"id": "alps5000-shuttle-md",
74+
"source": "## Shuttle\n\nMove the shuttle in and out.",
75+
"metadata": {}
76+
},
77+
{
78+
"cell_type": "code",
79+
"id": "alps5000-shuttle-code",
80+
"source": "await sealer.shuttle_out()\nawait sealer.shuttle_in()",
81+
"metadata": {},
82+
"execution_count": null,
83+
"outputs": []
84+
},
85+
{
86+
"cell_type": "markdown",
87+
"id": "alps5000-temp-md",
88+
"source": "## Temperature\n\nSet the sealing temperature setpoint and read the current heater temperature.",
89+
"metadata": {}
90+
},
91+
{
92+
"cell_type": "code",
93+
"id": "alps5000-temp-code",
94+
"source": "await sealer.set_temperature(160)\nprint(\"Current temperature:\", await sealer.request_temperature(), \"C\")",
95+
"metadata": {},
96+
"execution_count": null,
97+
"outputs": []
98+
},
99+
{
100+
"cell_type": "markdown",
101+
"id": "alps5000-status-md",
102+
"source": "## Status\n\nRead the status byte as a set of flags.",
103+
"metadata": {}
104+
},
105+
{
106+
"cell_type": "code",
107+
"id": "alps5000-status-code",
108+
"source": "print(\"Status:\", await sealer.request_status())",
109+
"metadata": {},
110+
"execution_count": null,
111+
"outputs": []
112+
},
113+
{
114+
"cell_type": "markdown",
115+
"id": "alps5000-teardown-md",
116+
"source": "## Teardown",
117+
"metadata": {}
118+
},
119+
{
120+
"cell_type": "code",
121+
"id": "alps5000-teardown-code",
122+
"source": "await sealer.stop()",
123+
"metadata": {},
124+
"execution_count": null,
125+
"outputs": []
126+
}
127+
],
128+
"metadata": {
129+
"kernelspec": {
130+
"display_name": "Python 3 (ipykernel)",
131+
"language": "python",
132+
"name": "python3"
133+
},
134+
"language_info": {
135+
"name": "python",
136+
"version": "3.11.0"
137+
}
138+
},
139+
"nbformat": 4,
140+
"nbformat_minor": 5
141+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ALPS Heat Sealers
2+
3+
The Thermo Scientific ALPS family of heat sealers share a common serial command
4+
core but differ in their status flags, error tables, and available commands. Each
5+
model has its own driver.
6+
7+
```{toctree}
8+
:maxdepth: 1
9+
10+
alps300/hello-world
11+
alps3000/hello-world
12+
alps5000/hello-world
13+
```

docs/user_guide/thermo_fisher/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
66
cytomat/hello-world
77
multidrop_combi/hello-world
8+
alps/index
89
```

0 commit comments

Comments
 (0)