Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
2a8c0a7
initial byonoy draft
rickwierenga Jul 23, 2025
6df2963
improve response parsing
rickwierenga Jul 26, 2025
f3a7c98
absorbance
rickwierenga Jul 27, 2025
d9be377
support device wavelengths
rickwierenga Jul 27, 2025
8f25dbf
use send_command in luminescence
rickwierenga Jul 27, 2025
d47624f
move into seperate classes
rickwierenga Jul 28, 2025
581d659
rename to backend
rickwierenga Jul 28, 2025
bce4852
resource modeling draft
rickwierenga Aug 9, 2025
7ba4fcc
some tests
rickwierenga Aug 10, 2025
fda5bd2
rewrite byonoy with delf suggestions
rickwierenga Oct 1, 2025
26492cb
Merge branch 'main' into byonoy-luminescence
rickwierenga Oct 1, 2025
204d7b7
lint, typo, type (not tests yet)
rickwierenga Oct 1, 2025
911d427
Merge branch 'main' into byonoy-luminescence
rickwierenga Oct 17, 2025
7c3fa78
Small Docs Update for Byonoy Absorbance 96 Automate (#690)
BioCam Oct 17, 2025
15a6a27
update type
rickwierenga Oct 17, 2025
a3f1c5c
relax the checks
rickwierenga Oct 17, 2025
125b7ff
lint
rickwierenga Oct 17, 2025
90f4262
try
rickwierenga Oct 21, 2025
701be0c
set get_available_absorbance_wavelengths routing info to 8040
rickwierenga Oct 21, 2025
e8b1b21
fix typo
rickwierenga Oct 21, 2025
36b2bd4
update
rickwierenga Oct 21, 2025
6ed6d33
typo
rickwierenga Oct 22, 2025
f9bca03
fix missing measurement initialization
BioCam Nov 30, 2025
e0dfbf2
upgrade pylabrobot.hid
BioCam Nov 30, 2025
36a033a
Merge branch 'main' into byonoy-luminescence
BioCam Dec 16, 2025
6d36ae9
update docs
BioCam Dec 17, 2025
23f573a
Merge branch 'main' into byonoy-luminescence
rickwierenga Dec 18, 2025
287ea02
fixes
rickwierenga Dec 18, 2025
c6c9367
type, use plr plate reading standard
rickwierenga Dec 18, 2025
903781f
testing
BioCam Dec 19, 2025
363092e
Merge branch 'main' into byonoy-luminescence
BioCam Dec 21, 2025
db772e6
slowly building new resource model
BioCam Dec 22, 2025
673557f
Merge branch 'main' into byonoy-luminescence
BioCam Dec 22, 2025
d4d5f6b
parameterise `ByonoyBaseUnit`
BioCam Dec 22, 2025
0f67085
create abstracted parking/detection "base" units
BioCam Dec 25, 2025
f53da0c
Merge branch 'main' into byonoy-luminescence
rickwierenga Jan 15, 2026
5e362ff
Merge branch 'main' into byonoy-luminescence
BioCam Jan 30, 2026
edf8507
Merge branch 'main' into byonoy-luminescence
rickwierenga Feb 2, 2026
b9ac147
Fix type errors in byonoy module and related files
rickwierenga Feb 2, 2026
ed6f6ff
Remove num_measurement_replicates parameter from read_absorbance
rickwierenga Feb 2, 2026
ac3d95d
add eppendorf_96_wellplate_1000ul_Vb (#868)
rickwierenga Feb 2, 2026
ed64e9f
return empty string on hid success error (#869)
rickwierenga Feb 3, 2026
b257c8c
Refactor byonoy backend to use io/binary.py Reader/Writer
rickwierenga Feb 3, 2026
26b2601
wip
rickwierenga Feb 3, 2026
50411d4
Create `STARBackend.channel_request_y_minimum_spacing()` (#870)
BioCam Feb 3, 2026
f1bc17c
model
rickwierenga Feb 4, 2026
c9f8838
Merge branch 'main' into byonoy-luminescence
rickwierenga Feb 4, 2026
b7164c7
add preferred_pickup_location
rickwierenga Feb 4, 2026
a49ee2e
rename file
rickwierenga Feb 4, 2026
f81d238
Add Byonoy L96 and L96A luminescence reader resources
rickwierenga Feb 4, 2026
d8231e4
Fix MRO issue by adding preferred_pickup_location to ByonoyAbsorbance…
rickwierenga Feb 4, 2026
171908f
Add Byonoy absorbance and luminescence documentation notebooks
rickwierenga Feb 4, 2026
1204e90
updates
rickwierenga Feb 4, 2026
f4943d3
Merge branch 'main' into byonoy-luminescence
rickwierenga Feb 4, 2026
395546d
Update byonoy tests and fix error messages
rickwierenga Feb 4, 2026
85aa7c6
rm
rickwierenga Feb 4, 2026
85e229c
Fix unused imports and error messages
rickwierenga Feb 4, 2026
66f68b0
Fix unused imports in hid.py
rickwierenga Feb 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,583 changes: 1,583 additions & 0 deletions docs/user_guide/02_analytical/plate-reading/byonoy.ipynb

Large diffs are not rendered by default.

231 changes: 231 additions & 0 deletions docs/user_guide/02_analytical/plate-reading/byonoy/absorbance.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "63d8a7a6-1107-4334-8b73-598aa1ca97c4",
"metadata": {},
"source": [
"# Byonoy Absorbance 96 Automate\n",
"\n",
"- [OEM Link](https://byonoy.com/absorbance-automate/)\n",
"- **Communication Protocol / Hardware:** HID / USB-A/C\n",
"- **Communication Level:** Firmware\n",
"- VID:PID `16d0:1199`\n",
"- Takes a single SLAS-format 96-wellplate on the detection unit, enables movement of the cap/illumination unit over it, and reads all 96 wells simultaneously.\n",
"- Up to 6 configurable absorbance wavelengths (dependent on specifications during purchase)."
]
},
{
"cell_type": "markdown",
"id": "840adda3-0ea1-4e7c-b0cb-34dd2244de69",
"metadata": {},
"source": [
"---\n",
"## Setup Instructions (Physical)\n",
"\n",
"The Byonoy Absorbance 96 Automate (A96A) is a an absorbance plate reader consisting of...\n",
"1. a `detection_unit` containing the light sensors,\n",
"2. a `illumination_unit` containing the light source,\n",
"3. a `parking_unit` representing a simple resource_holder for the `illumination_unit` that is equivalent to the detection unit in terms of shape, and\n",
"4. an `sbs_adapter` which is an optional holder for the `detection_unit` or `parking_unit`, enabling placement of this machine onto a standard SLAS/SBS-format plate holder.\n",
"\n",
"### Communication\n",
"It requires only one cable connection to be operational:\n",
"1. USB cable (USB-C at `base` end; USB-A at control PC end)"
]
},
{
"cell_type": "markdown",
"id": "e4aa8066-9eb5-4f8a-8d69-372712bdb3b5",
"metadata": {},
"source": [
"---\n",
"## Setup Instructions (Programmatic)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4907224e",
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "38a9cf2d-840c-49ce-a886-da29c67fb124",
"metadata": {},
"outputs": [],
"source": [
"from pylabrobot.plate_reading.byonoy import byonoy_a96a"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad91bfca",
"metadata": {},
"outputs": [],
"source": [
"reader, illumination_unit = byonoy_a96a(\"Absorbance96 Automate\")\n",
"reader"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0f86d997",
"metadata": {},
"outputs": [],
"source": [
"await reader.setup()"
]
},
{
"cell_type": "markdown",
"id": "30619f34-af58-4a74-b4fd-e2d53033c2de",
"metadata": {},
"source": [
"### Query Machine Configuration"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2254228f-2864-4174-a615-9d1aed119ad5",
"metadata": {},
"outputs": [],
"source": [
"wavelengths = await reader.backend.get_available_absorbance_wavelengths()\n",
"wavelengths"
]
},
{
"cell_type": "markdown",
"id": "fc15c1b4-be77-4180-a5ce-d8a31480d0d4",
"metadata": {},
"source": [
"### Measure Absorbance"
]
},
{
"cell_type": "markdown",
"id": "9c1d898e",
"metadata": {},
"source": [
"Before you can do a plate reading measurement in PLR, you need to assign a plate to the reader."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "34f54968",
"metadata": {},
"outputs": [],
"source": [
"from pylabrobot.resources.corning.plates import Cor_96_wellplate_360ul_Fb\n",
"demo_plate = Cor_96_wellplate_360ul_Fb(name=\"plate\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8f6a50bd",
"metadata": {},
"outputs": [],
"source": [
"reader.assign_child_resource(demo_plate)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e5a1d2e2-7b2c-4077-bde6-338f257b1993",
"metadata": {},
"outputs": [],
"source": [
"wavelength = wavelengths[0] # Choose the first available wavelength\n",
"\n",
"data = await reader.read_absorbance(\n",
" wavelength=wavelength,\n",
" use_new_return_type=True,\n",
")\n",
"\n",
"print(f\"Wavelength: {data[0]['wavelength']} nm\")\n",
"print(f\"Time: {data[0]['time']}\")\n",
"print(f\"Temperature: {data[0]['temperature']}\")\n",
"print(\"Data\")\n",
"print(data[0]['data'])"
]
},
{
"cell_type": "markdown",
"id": "1a33230d-8243-4d21-88e1-4a4eb6cba7c8",
"metadata": {},
"source": [
"## Disconnect from Reader"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "21a72488",
"metadata": {},
"outputs": [],
"source": [
"await reader.stop()"
]
},
{
"cell_type": "markdown",
"id": "ad4bdba5",
"metadata": {},
"source": [
"## Resource model"
]
},
{
"cell_type": "markdown",
"id": "a2f610f3",
"metadata": {},
"source": [
"In the example above, we instantiated the Byonoy Absorbance 96 Automate reader using the `byonoy_a96a` function, which automatically creates the necessary resources for the reader."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5e58d4ef",
"metadata": {},
"outputs": [],
"source": [
"reader.illumination_unit_holder.resource is illumination_unit"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading