diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 686d36a..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: ci -on: - push: - branches: - - master - - main -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: pip install mkdocs-material mkdocs-bibtex - - run: mkdocs gh-deploy --force - \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..02f6c89 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,56 @@ +name: docs + +on: + push: + branches: [main] + paths: + - "docs/**" + - "zensical.toml" + - "pyproject.toml" + - "uv.lock" + - ".github/workflows/docs.yml" + workflow_dispatch: + +# Allow the workflow to publish to GitHub Pages. +permissions: + contents: read + pages: write + id-token: write + +# One Pages deployment at a time; let an in-progress one finish. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Install dependencies + run: uv sync + + # `poe build` regenerates the Ingredients catalogue from data/ then runs + # `zensical build` into ./site. + - name: Build site + run: uv run poe build + + - uses: actions/upload-pages-artifact@v3 + with: + path: site + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 0e8195b..10a81e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,11 @@ # Files generated by build /site +.cache/ + +# Python / uv +.venv/ +__pycache__/ + +# Editor / OS *.vscode *.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index b50d73e..8d4c9f1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,48 @@

- +

-# BeeHive +# BeeHive documentation + +The documentation site for [BeeHive](https://github.com/BeeHive-org/BeeHive) — +a flexible open electronics platform for building research equipment and +teaching electronics. + +Built with [Zensical](https://zensical.org/) and managed with +[uv](https://docs.astral.sh/uv/). + +## Develop + +```bash +uv sync # install dependencies +uv run poe serve # live-reload preview at http://127.0.0.1:8000 +uv run poe build # build the static site into ./site +uv run poe gen # regenerate the Ingredients catalogue from docs/data/ingredients/ +uv run poe sync # refresh the vendored board BOMs from the BeeHive repo +``` + +`serve` and `build` run `gen` first, so the auto-generated +[Ingredients catalogue](docs/ingredients/index.md) always mirrors the YAML in +[`docs/data/ingredients/`](docs/data/ingredients/). + +Board bills-of-materials are pulled from the BeeHive hardware repo's +`kitspace.yaml` and **vendored** into [`docs/data/kitspace/`](docs/data/kitspace/) +so builds stay offline. Run `uv run poe sync` occasionally (and commit the +result) to refresh them; `gen` reads the vendored copy and never needs the +network. + +## Structure + +Everything the site needs lives under `docs/`, so it can be dropped into another +repository as a self-contained folder: + +- `docs/` — the Markdown pages (`ingredients/*.md` is **generated** — don't edit + by hand). +- `docs/data/ingredients/` — the board catalogue, single source of truth (YAML). +- `docs/data/kitspace/` — vendored board BOMs (from `uv run poe sync`). +- `docs/scripts/build_ingredients.py` — generates the Ingredients pages. +- `docs/scripts/sync_kitspace.py` — refreshes the vendored BOMs. +- `zensical.toml` — site config, theme, and navigation. +- `docs/stylesheets/extra.css` — the "bumblebee" pixi.sh-style layout. + +See [Contributing](docs/contributing.md) for how to add boards and recipes. diff --git a/docs/ai-use-policy.md b/docs/ai-use-policy.md new file mode 100644 index 0000000..3314ffc --- /dev/null +++ b/docs/ai-use-policy.md @@ -0,0 +1,62 @@ +--- +title: AI use policy +description: How to use AI tools when contributing to BeeHive — you are accountable for what you submit. +--- + +# AI use policy + +BeeHive welcomes contributions made with the help of AI tools — but **you are +responsible for everything you submit**. This page sets out how to use them well. + +## The core principle + +We are humans who enjoy working with other humans. Use whatever tools help you, +but you are ultimately accountable for the boards, code, and documentation you +contribute. If you would not be comfortable explaining a change and standing +behind it, it is not ready to submit. + +## Please don't + +- Let an AI agent open pull requests on your behalf. +- Submit a board design, recipe, code, or docs change you have not personally + understood and tested. +- Let a chatbot carry on a conversation (an issue thread, a PR review) for you. + +Pull requests that appear to ignore these guidelines may be closed without +review — checking un-vetted machine output costs maintainers more time than it +saves. + +## Using AI to build and code + +- **Get familiar with what you are changing first.** Understanding the board, + the [design rules](introduction/design-rules.md), or the code you are touching + lets you write better prompts *and* judge whether the output is right. +- **Don't trust an assistant's claims about how BeeHive works.** LLMs are often + confidently wrong, even about things the docs answer directly. Check against + the design rules, the board's schematics, or a real device. +- **Test on hardware.** A recipe or snippet that looks plausible is not a + contribution until it actually runs on the boards it claims to. +- **Keep pull requests small and focused,** even if a tool generated everything + in one go. One board, one recipe, or one fix per PR is far easier to review. +- **Edit AI-written comments and prose.** Prefer clarity and brevity over + exhaustive, generic text; delete comments that just restate the code. + +## Using AI to communicate + +- **Say why, not what.** A PR description that merely restates the diff adds + nothing — explain your reasoning and what you tested. +- **Fill in the templates yourself.** Issue and PR templates exist to save + everyone time; complete them rather than having a tool do it. +- **Verify anything you post.** Don't paste unchecked AI output into an issue or + a pull request. +- **Link, don't quote.** Pointing to the primary source — a datasheet, the docs, + a repo file — beats quoting an LLM. If you must quote one, put it in a + `>` blockquote so it is clearly machine output, not your own words. +- **Clarity over polish.** A clear, slightly imperfect message beats a + perfectly-worded one that hides the point. + +## Attribution + +This policy is adapted from the +[napari AI use policy](https://napari.org/dev/developers/contributing/ai.html), +which was itself adapted from Zulip's AI usage guidelines. diff --git a/docs/assembly-guide.md b/docs/assembly-guide.md deleted file mode 100644 index 18cba27..0000000 --- a/docs/assembly-guide.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: What we need -description: ---- - -## Knowledge base -To fully assemble the BeeHive system, it is important to go through the basics of soldering and the required tools to do so. [A handy sparkfun tutorial](https://learn.sparkfun.com/tutorials/how-to-solder-through-hole-soldering/all) is a very good place to start although the particular tools and consumables are left to user's discretion. - -## Tools -Links, that are provided below, are for reference. You are free to buy whatever brand and product suits you, and, generally speaking, you will require the following: - -- [Soldering iron](https://www.pine64.org/) - an open source tool -- [Soldering station](https://www.amazon.co.uk/Soldering-Station%EF%BC%8CSoldering-Adjustable-Function-Switching/dp/B0B5GM885M/ref=sr_1_16?c=ts&keywords=Soldering+Stations&qid=1701894116&s=diy&sr=1-16&ts_id=1939419031) -- [Solder](https://uk.rs-online.com/web/p/solder/2441549) -- Extractor fan -- Flush cutters -- Solering wick (for desoldering) - -## Components -Most components can be found on [Kitspace](https://kitspace.org) - -### Resistors -[Resistor colour band calculator](https://www.digikey.co.uk/en/resources/conversion-calculators/conversion-calculator-resistor-color-code) -- 47 🟨🟪⬛️-Gold -- 220 🟥🟥⬛️⬛️-🟫 -- 560 🟩🟦🟫- -- 1000 (1K) 🟫⬛️🟥- -- 4700 (4.7K) 🟨🟪⬛️🟫- -- 10000 (10K) 🟫⬛️⬛️🟥- - -### Capacitors - -### Connectors -- 2-pin JST PH connector -- 3-pin JST PH connector -- 4-pin JST PH connector -- Barrel jack connector -- 20-pin female header - -- P1-14: 4-pin JST connectors, 14 -- P15-16: 2-pin JST connectors, 2 -- Barrel Jack: Barrel jack connector, 1 -- C1: Capacitors...? -- C2: -- D1: -- L1: -- V1: -- Board footprint: 20 pin female header, 2 diff --git a/docs/assets/apple-touch-icon.png b/docs/assets/apple-touch-icon.png new file mode 100644 index 0000000..87f8c3e Binary files /dev/null and b/docs/assets/apple-touch-icon.png differ diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png index 89d127b..8a4647d 100644 Binary files a/docs/assets/favicon.png and b/docs/assets/favicon.png differ diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000..6173beb Binary files /dev/null and b/docs/assets/logo.png differ diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..33dc410 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,60 @@ +--- +title: Contributing +description: How to contribute boards, recipes, and fixes to BeeHive. +--- + +# Contributing + +BeeHive is open source and community-driven. Contributions aren't confined to +one institution — anyone can add a board, share a recipe, or improve the docs. + +!!! note "Using AI tools?" + That's fine — but you're accountable for what you submit. Please read the + [AI use policy](ai-use-policy.md) first. + +## Ways to contribute + +- 🧩 **A new board (ingredient).** Design a daughter board that follows the + [design rules](introduction/design-rules.md) and share it. See + [Build your own board](techniques/build-your-own-board.md). +- 🍯 **A new recipe.** Built an instrument with BeeHive? Document it as a recipe + so others can reproduce it — especially outside neuroscience. +- 🐛 **Fixes & improvements.** Corrections to boards, code, or these docs are all + welcome. + +## Adding a board to the catalogue + +The [Ingredients catalogue](ingredients/index.md) is generated from YAML — you +don't edit the page directly: + +1. Add an entry to `docs/data/ingredients/boards.yaml` (or drop in a new + `docs/data/ingredients/.yaml`). +2. Run `uv run poe gen` to regenerate the catalogue. +3. Preview with `uv run poe serve`. + +See the comments at the top of `boards.yaml` for the field reference. If the +board has a project in the [BeeHive repo's](https://github.com/BeeHive-org/BeeHive) +`kitspace.yaml`, add its `kitspace:` key too — `uv run poe sync` then vendors the +board's bill of materials and fabrication-file links into the catalogue. + +## Editing the docs + +The docs are a [Zensical](https://zensical.org/) site managed with +[uv](https://docs.astral.sh/uv/): + +```bash +uv sync # install dependencies +uv run poe serve # live-reload preview at http://127.0.0.1:8000 +uv run poe build # build the static site into ./site +``` + +`serve` and `build` regenerate the Ingredients catalogue first, so it always +matches the YAML. + +## Get in touch + +- Issues & discussion: + [github.com/BeeHive-org/BeeHive/issues](https://github.com/BeeHive-org/BeeHive/issues) +- Email: [a.maia-chagas@sussex.ac.uk](mailto:a.maia-chagas@sussex.ac.uk) + +If in doubt — reach out. We're glad to help. diff --git a/docs/courses/intro-to-electronics/friday.md b/docs/courses/intro-to-electronics/friday.md new file mode 100644 index 0000000..89ed424 --- /dev/null +++ b/docs/courses/intro-to-electronics/friday.md @@ -0,0 +1,26 @@ +--- +title: Friday +description: Sketching your own protocols and building a project. +--- + +# Friday + +Time to sketch your own protocols! Our suggestion is to start with a mockup of your project/need, in other words, think about in general terms of steps needed to be taken for your software/project to be up and running. Example for the reaction time task we created: + + + +1. Inter trial interval (random?) +2. LED comes on +3. Start counting time until button is pressed +4. Detect button press +5. Turn led off +6. Record time elapsed +7. Start next trial +* Take the next XX minutes to think about and write down the steps for your task. +* Now, show your sketch to the person next to you! While they are reading yours, take a moment to read theirs and make comments! Can you see if something is missing? Is there something that is not clear to you? + +Time to implement your task using the training board! + + + +* Using the training board, start writing actual code to implement your task. Preferably, it needs to be connected to your subject area and achieve a goal that you have set. One of the most time-effective ways to do that is to write small parts of the code and test often to see if the board and code are reacting the way you would expect them to react. But first, create a sketch-diagram showing how your code is supposed to work diff --git a/docs/courses/intro-to-electronics/glossary.md b/docs/courses/intro-to-electronics/glossary.md new file mode 100644 index 0000000..4c9e111 --- /dev/null +++ b/docs/courses/intro-to-electronics/glossary.md @@ -0,0 +1,38 @@ +--- +title: Glossary +description: Key terms from the electronics course. +--- + +# Glossary + +**Microcontroller** - a small computer made on an integrated circuit + +**Integrated circuit** - a tiny chip that contains a lot of components (resistors, transistors, capacitors) that are all electrically connected together and work together to reach a certain goal (compare or amplify signals, rectification, etc.) + +**Central processing unit** - An electronic circuit on chip which executes instructions + +**Nonvolatile memory** - a type of computer memory that can retain stored information even after power is removed + +**Volatile memory** - a type of computer memory that loses information after power is removed + +**Internet of Things (IoT)** - Sensors, electronic devices and actuators that are comprised in one system which sends, receives and process information from the said elements with a help of network + +**Shift register** - IC that allows to control multiple elements via saving the output in the register + +**Logic level** - voltage value that is high enough to be recognised by a microcontroller as 1, or logic HIGH, usually 3.3 V or 5V. + +**Pulse-Width Modulation (PWM)** - a signal that consist of logic HIGH and logic LOW pulses at a certain frequency. Duration of logic HIGH pulse determines PWM duty cycle which consequently is the percentage of power that the signal carries. + +**Bit** - it can either be 0 or 1, a single cell that contains binary data. The fundamental piece of information storage. + +**Byte** - 8 bits + +**Word** - 2 bytes + +**Object oriented programming** - a programming paradigm based on use of objects and classes. + +**To compile code** - a compiler is a software that translates high-level programming language to machine code which can be executed + +**Analog-to-digital converter **- a circuitry that recreates arbitrary analog signal with digital code, accuracy of which depends on converter’s resolution + +**Baud rate **- the rate of information transmission diff --git a/docs/courses/intro-to-electronics/index.md b/docs/courses/intro-to-electronics/index.md new file mode 100644 index 0000000..dbde1d1 --- /dev/null +++ b/docs/courses/intro-to-electronics/index.md @@ -0,0 +1,18 @@ +--- +title: Intro to Electronics +description: A project-based introduction to microcontrollers, circuits, and MicroPython, over a week. +--- + +# Intro to Electronics + +This course introduces microcontrollers, basic electronics, and MicroPython +from the ground up. It comes with code from BeeHive's [2022 workshop](https://github.com/BeeHive-org/BeeHive/tree/master/workshops/2022_autum/code). + +It's organised as a week of hands-on days: + +- **[Monday](monday.md)** — microcontrollers, Ohm's Law, and first steps in Python/MicroPython +- **[Tuesday](tuesday.md)** — timers and counters +- **[Wednesday](wednesday.md)** — data logging +- **[Thursday](thursday.md)** — putting BeeHive boards together +- **[Friday](friday.md)** — sketching your own protocols +- **[Glossary](glossary.md)** — key terms diff --git a/docs/courses/intro_to_electronics.md b/docs/courses/intro-to-electronics/monday.md similarity index 73% rename from docs/courses/intro_to_electronics.md rename to docs/courses/intro-to-electronics/monday.md index cacb718..8cae691 100644 --- a/docs/courses/intro_to_electronics.md +++ b/docs/courses/intro-to-electronics/monday.md @@ -1,34 +1,11 @@ - - - -## **Part one - Multum in parvo - Monday** +--- +title: Monday +description: Microcontrollers, Ohm’s Law, and first steps in Python and MicroPython. +--- + +# Monday + +## Part one — Multum in parvo A latin saying “Multum in parvo”, much in little, conveys the main idea of the following lectures. We are going to investigate what is a microcontroller, what it consist of, what is its applications, what are difficulties of using it, what is information, what is a signal, what is a program, how to program your microcontroller and how to put all of this together to make a project that will do what you want it to do. @@ -50,7 +27,7 @@ A microcontroller consists of a central processing unit (CPU), nonvolatile memor memory (information gets lost if the system is off), peripherals, and support circuitry. -![MCU](../assets/images/course/1_MCU.png) +![MCU](../../assets/images/course/1_MCU.png) #### The Central Processing Unit @@ -88,7 +65,7 @@ More sophisticated microcontrollers perform critical functions in aircraft, spac In scientific instruments, a microcontroller can be responsible for actuating all the peripheral objects such as a Peltier element (to heat up samples), a fan, an LED strip and so on. In BeeHive, as you will see, the microcontroller is used for sending commands to other boards which in turn accomplish a specific goal like actuation or reading sensor. -## **Part two - By Ohm’s Law** +## Part two — Ohm’s Law ### **What is circuitry and what is Ohm’s Law** @@ -112,12 +89,10 @@ In this algebraic expression, voltage (V) is equal to current (I) multiplied by -$$ I = {V \over R} $$ -and -$$ R = {V \over I} $$ +$$ I = {V \over R} \quad\text{and}\quad R = {V \over I} $$ -![Ohm's Law](../assets/images/course/2_ohm_law.jpg) +![Ohm's Law](../../assets/images/course/2_ohm_law.jpg) This might be an easier way of remembering Ohm's law. @@ -131,7 +106,7 @@ Let’s see how these equations might work to help us analyze simple circuits: -![Ohm's Law](../assets/images/course/3_Ohm_1.png) +![Ohm's Law](../../assets/images/course/3_Ohm_1.png) @@ -144,7 +119,7 @@ In this first example, we will calculate the amount of current (I) in a circuit, -![Ohm's Law](../assets/images/course/4_Ohm_2.png) +![Ohm's Law](../../assets/images/course/4_Ohm_2.png) @@ -165,7 +140,7 @@ In this second example, we will calculate the amount of resistance (R) in a circ -![Ohm's Law](../assets/images/course/5_Ohm_3.png) +![Ohm's Law](../../assets/images/course/5_Ohm_3.png) @@ -188,7 +163,7 @@ In the last example, we will calculate the amount of voltage supplied by a batte -![Ohm's Law](../assets/images/course/6_Ohm_4.png) +![Ohm's Law](../../assets/images/course/6_Ohm_4.png) @@ -229,7 +204,7 @@ VOL -- Maximum OUTPUT Voltage level a device will provide for a LOW signal. VIL -- Maximum INPUT Voltage level to still be considered a LOW. -![TTL](../assets/images/course/7_TTL.png) +![TTL](../../assets/images/course/7_TTL.png) You will notice that the minimum output HIGH voltage (VOH) is 2.7 V. Basically, this means that output voltage of the device driving HIGH will always be at least 2.7 V. The minimum input HIGH voltage (VIH) is 2 V, or basically any voltage that is at least 2 V will be read in as a logic 1 (HIGH) to a TTL device. @@ -248,7 +223,7 @@ As mentioned before, using a binary system, computers and microcontrollers can c -![TTL](../assets/images/course/8_bitbyte.png) +![TTL](../../assets/images/course/8_bitbyte.png) Bits are the fundamental part of information or data based on which the Microcontroller operates. The bit can take value either as 1 or 0. Bytes are defined as the collection of 8 bits. Words consist of 2 bytes or 16-bits. @@ -257,7 +232,7 @@ Registers are small memory elements in a Microcontroller where a specific value -![Bits](../assets/images/course/9_binnum.png) +![Bits](../../assets/images/course/9_binnum.png) @@ -324,11 +299,11 @@ If you connect a serial output pin which sends a “A” (ascii 41 or 01000001 i -![UART](../assets/images/course/10_uart.png) +![UART](../../assets/images/course/10_uart.png) -## **Part three - Python and MicroPython** +## Part three — Python and MicroPython ### History of Python programming @@ -413,7 +388,7 @@ Python interprets non-zero values as `True`. `None` and `0` are interpreted as ` -![If-else](../assets/images/course/11_if-statement.jpg) +![If-else](../../assets/images/course/11_if-statement.jpg) Fig: Flowchart of if Statement @@ -477,7 +452,7 @@ Loop continues until we reach the last item in the sequence. The body of for loo -![For-loop](../assets/images/course/12_for_loop.jpg) +![For-loop](../../assets/images/course/12_for_loop.jpg) Fig: Flowchart of for Loop @@ -525,7 +500,7 @@ In the real world, analog signals are signals that have a continuous sequence wi -![ADC](../assets/images/course/13_adc.png) +![ADC](../../assets/images/course/13_adc.png) ** ** Figure: A continuous signal (analog) turning into a digital signal. (Source: Waqas Akram – Quantization in ADCs) @@ -541,11 +516,11 @@ The ADC’s sampling rate, also known as sampling frequency, can be tied to the One important equation on the sample rate is: -$$ fs = {1 \over T} $$ +$$ f_s = {1 \over T} $$ Where, -$$ fs = {Sample Rate \over Frequency} $$ +$$ f_s = {\text{Sample Rate} \over \text{Frequency}} $$ T = Period of the sample or the time it takes before sampling again @@ -557,7 +532,7 @@ If the sampling rate is slow and the frequency of the signal is high, the ADC wi -![Alias](../assets/images/course/14_alias.png) +![Alias](../../assets/images/course/14_alias.png) ** ** @@ -568,11 +543,11 @@ In this example, you can see where the sampling occurs in the analog input signa One rule of thumb when figuring out if aliasing will happen is using Nyquist Theorem. According to the theorem, the sampling rate/frequency needs to be at least twice as much as the highest frequency in the signal to recreate the original analog signal. The following equation is used to find the Nyquist frequency: -$$ fNyquist = 2fMax $$ +$$ f_\text{Nyquist} = 2 f_\text{max} $$ Where, -$$ fNyquist = Nyquist frequency $$ +$$ f_\text{Nyquist} = \text{Nyquist frequency} $$ fMax = The max frequency that appears in the signal @@ -587,7 +562,7 @@ The ADC’s resolution can be tied to the precision of the ADC. The resolution o -![Resolution](../assets/images/course/15_res.png) +![Resolution](../../assets/images/course/15_res.png) Figure: Example on how resolution affects the digital signal. (Source: Apple Inc – Soundtrack Pro 3: Audio Fundamentals) @@ -620,7 +595,7 @@ Figure 4 shows common bit length and their number of levels. It also shows what -![Bit size](../assets/images/course/16_bit-size_table.png) +![Bit size](../../assets/images/course/16_bit-size_table.png) Figure : Bit Length and their number of levels and step size for a 5V reference range. @@ -634,128 +609,3 @@ Analog to digital and digital to analog: [https://www.electronics-tutorials.ws/combination/analogue-to-digital-converter.html](https://www.electronics-tutorials.ws/combination/analogue-to-digital-converter.html) [https://www.arrow.com/en/research-and-events/articles/engineering-resource-basics-of-analog-to-digital-converters](https://www.arrow.com/en/research-and-events/articles/engineering-resource-basics-of-analog-to-digital-converters) - - -## **Part Four - Tuesday** - - -### What is timer and what is counter? - -[timers.dvi (ou.edu)](https://www.cs.ou.edu/~fagg/classes/es_general/timers.pdf) - -Counters, as the name suggests, are hardware mechanisms for counting some form of event. At the heart of the counter is a special purpose register that stores the current value of the counter. Any time that a certain event occurs, the value of this counter is incremented (+1 is added to the value). The type of event that causes this increment is typically configurable through other special purpose registers. Because the counter value is stored in a special purpose register, this implies that the value can also be read from or written to by the executing code. Also, different counters will store values of different sizes. The typical sizes for 8-bit microcontrollers, such as the Atmel MegaX line, are 8 and 16 bits (1 and 2 bytes). Because of this finite size, the counter can only count to a maximum value (255 for an 8-bit counter, and 65535 for a 16-bit counter). Once the counter reaches this maximum value, and a new event occurs, the counter resets back to zero. From here, the counter continues to increment with each event - -In addition to counting external events, it is possible to also count events that are internal to the processor. In particular, by using the system clock (or a derivative thereof), the counter can be incremented at regular intervals. In this form, the counter becomes a form of timer. Often, the system clock is running at some “high” frequency (e.g., in our microcontrollers, we might see clocks of 16 MHz or 20 MHz). However, it is often the case that we may want our timer to count at much slower rates. This is handled in microcontrollers through the use of hardware prescalers that divide the system clock down to some reasonable frequency. Figure 3 shows the relationship between the system clock, the prescaler and the counter value. Prescalers are implemented as counters in and of themselves. Recall that if some counter is being incremented at a regular frequency, f, then bit 0 of the counter is exhibiting a regular signal at a frequency of f/2. Furthermore, bit 1 has a frequency of f/4. By “tapping into” the prescaler counter at different bits, we can divide the system clock by a range of different divisors (where the divisor takes a form of 2i for some i). - -We would now like to answer questions involving the rate at which our counter is counting or the amount of time that a certain number of counts will take. In order to talk about these ideas, we first must be able to distinguish between cycles/second of the main system clock and of the prescaled signal. Here, we have artificially defined the unit of a “tick” as a single cycle of the system clock and “tock” as a single cycle of the prescaled signal. Hence, we can express prescaler values in terms of ticks per tock, i.e, how many system clock cycles compose a single prescaled cycle. Example: assume a system clock of 16, 000, 000 ticks/sec and a prescaler of 64 ticks/tock. What is the period of a single increment of the Timer 0 counter? - -The answer: - - - -$$ {64ticks/tock \over 16,000,000ticks/sec} * {1tock} = 4 \mu s $$ - - -Example: What is the period of 250 increments of the Timer 0 counter? Answer: - - - -$$ {64ticks/tock \over 16,000,000ticks/sec} * {250tocks} = 4 ms $$ - - -What timers are in ESP32? (optional) - - -## Wednesday - - -### Data logging - -One important thing we want to accomplish with our microcontrollers is to save the data they are collecting while performing a certain task, and given the constraints imposed by the nature of microcontrollers (memory space, communication speeds, time critical events, etc), it is a good idea to give this careful thought when designing experiments/systems. - -Let’s use a practical example so that we have a better understanding of the critical points to be observed: - -The ESP32 we are using has 320kb of RAM, which can accomplish a lot, but won’t be enough for recording hours of data stream. In fact, if your system is recording data from a temperature sensor, using 12 bit resolution, you would need 2 bytes (each byte “carries” 8 bits of information) for each data point. If you would like to add information about time to each data collected, plus identify from which system the data has been collected, you would need another ~5 bytes. So every data point would be 7 bytes of information. Considering most applications will have several streams of data (temperature, humidity, triggering time of events, other sensors), and that we still have to factor in the code we write and upload to the board, this can consume all the space available in no time. Therefore, we need to find ways to “unload” data from the microcontroller’s main memory. This normally means transmitting the data to an external storage space, either an SD card, or a computer. - -Data transmission can be done using serial communication. We have seen a typical communication speed of 115200 bits per second [which is equivalent to 14400 bytes/sec - 14.4kb/s], so if we want to transmit data from thetemperature sensor, above together with identifiying info, we need seven bytes per data point, plus the overhead of the communication protocol being used. Therefore in one second we can theoretically transmit ~2000 data points for temperature readings (in reality this is less as the device needs to spend time opening the communication port, sending the data, sending other check bits, etc). Another thing to observe is that the microcontroller will be busy sending out data, pretty much unable to do anything else, so we also need to be careful in observing which are appropriate moments to send/receive data. - -Once the data is prepared to be transmitted out of the microcontroller, we need code on the receiving side to know what kind of data to expect, where to store it, how often, etc. - - - - -### Wednesday second part - -Now we take a small break from doing and working with code, to answer possible questions you might have that have not been covered during the course. - - -## Thursday - -BeeHive - -This project started out of an interest to streamline the way we set up research systems. We needed something Open Source, modular, affordable and easy to reproduce. To avoid reinventing the wheel, we based the connectivity of BeeHive on the Grove ecosystem. Developed by Seeed Studio, Grove is an open source system with dozens of sensors and actuators. With this compatibility in place we can focus on developing modules that are not present in Grove, and add to their ecosystem at the same time. Beehive follows the principle of one function per board, and is built with Through-hole components, so that boards can be hand soldered. All documentation is already [publicly available](https://github.com/beehive-org). - -For this part of the course we will demo an example on how beehive boards can be put together to control different systems. - -Demo: Turn on a fan with boards. - -Putting boards together to do your own tasks - -Show that BeeHive can be combined with Grove system through connectors and Grove modules can be used to achieve objectives that otherwise can not be completed with the current version of BeeHive. Also, point out that Beehive is an open source project so if anybody wishes, they can propose, develop and add their own stuff on top of what is already there. - - -## Friday - -Time to sketch your own protocols! Our suggestion is to start with a mockup of your project/need, in other words, think about in general terms of steps needed to be taken for your software/project to be up and running. Example for the reaction time task we created: - - - -1. Inter trial interval (random?) -2. LED comes on -3. Start counting time until button is pressed -4. Detect button press -5. Turn led off -6. Record time elapsed -7. Start next trial -* Take the next XX minutes to think about and write down the steps for your task. -* Now, show your sketch to the person next to you! While they are reading yours, take a moment to read theirs and make comments! Can you see if something is missing? Is there something that is not clear to you? - -Time to implement your task using the training board! - - - -* Using the training board, start writing actual code to implement your task. Preferably, it needs to be connected to your subject area and achieve a goal that you have set. One of the most time-effective ways to do that is to write small parts of the code and test often to see if the board and code are reacting the way you would expect them to react. But first, create a sketch-diagram showing how your code is supposed to work - -## Glossary - -**Microcontroller** - a small computer made on an integrated circuit - -**Integrated circuit** - a tiny chip that contains a lot of components (resistors, transistors, capacitors) that are all electrically connected together and work together to reach a certain goal (compare or amplify signals, rectification, etc.) - -**Central processing unit** - An electronic circuit on chip which executes instructions - -**Nonvolatile memory** - a type of computer memory that can retain stored information even after power is removed - -**Volatile memory** - a type of computer memory that loses information after power is removed - -**Internet of Things (IoT)** - Sensors, electronic devices and actuators that are comprised in one system which sends, receives and process information from the said elements with a help of network - -**Shift register** - IC that allows to control multiple elements via saving the output in the register - -**Logic level** - voltage value that is high enough to be recognised by a microcontroller as 1, or logic HIGH, usually 3.3 V or 5V. - -**Pulse-Width Modulation (PWM)** - a signal that consist of logic HIGH and logic LOW pulses at a certain frequency. Duration of logic HIGH pulse determines PWM duty cycle which consequently is the percentage of power that the signal carries. - -**Bit** - it can either be 0 or 1, a single cell that contains binary data. The fundamental piece of information storage. - -**Byte** - 8 bits - -**Word** - 2 bytes - -**Object oriented programming** - a programming paradigm based on use of objects and classes. - -**To compile code** - a compiler is a software that translates high-level programming language to machine code which can be executed - -**Analog-to-digital converter **- a circuitry that recreates arbitrary analog signal with digital code, accuracy of which depends on converter’s resolution - -**Baud rate **- the rate of information transmission diff --git a/docs/courses/intro-to-electronics/thursday.md b/docs/courses/intro-to-electronics/thursday.md new file mode 100644 index 0000000..2c94231 --- /dev/null +++ b/docs/courses/intro-to-electronics/thursday.md @@ -0,0 +1,18 @@ +--- +title: Thursday +description: Putting BeeHive boards together to control systems. +--- + +# Thursday + +BeeHive + +This project started out of an interest to streamline the way we set up research systems. We needed something Open Source, modular, affordable and easy to reproduce. To avoid reinventing the wheel, we based the connectivity of BeeHive on the Grove ecosystem. Developed by Seeed Studio, Grove is an open source system with dozens of sensors and actuators. With this compatibility in place we can focus on developing modules that are not present in Grove, and add to their ecosystem at the same time. Beehive follows the principle of one function per board, and is built with Through-hole components, so that boards can be hand soldered. All documentation is already [publicly available](https://github.com/beehive-org). + +For this part of the course we will demo an example on how beehive boards can be put together to control different systems. + +Demo: Turn on a fan with boards. + +Putting boards together to do your own tasks + +Show that BeeHive can be combined with Grove system through connectors and Grove modules can be used to achieve objectives that otherwise can not be completed with the current version of BeeHive. Also, point out that Beehive is an open source project so if anybody wishes, they can propose, develop and add their own stuff on top of what is already there. diff --git a/docs/courses/intro-to-electronics/tuesday.md b/docs/courses/intro-to-electronics/tuesday.md new file mode 100644 index 0000000..0c39a4b --- /dev/null +++ b/docs/courses/intro-to-electronics/tuesday.md @@ -0,0 +1,32 @@ +--- +title: Tuesday +description: Timers and counters on the microcontroller. +--- + +# Tuesday + +### What is timer and what is counter? + +[timers.dvi (ou.edu)](https://www.cs.ou.edu/~fagg/classes/es_general/timers.pdf) + +Counters, as the name suggests, are hardware mechanisms for counting some form of event. At the heart of the counter is a special purpose register that stores the current value of the counter. Any time that a certain event occurs, the value of this counter is incremented (+1 is added to the value). The type of event that causes this increment is typically configurable through other special purpose registers. Because the counter value is stored in a special purpose register, this implies that the value can also be read from or written to by the executing code. Also, different counters will store values of different sizes. The typical sizes for 8-bit microcontrollers, such as the Atmel MegaX line, are 8 and 16 bits (1 and 2 bytes). Because of this finite size, the counter can only count to a maximum value (255 for an 8-bit counter, and 65535 for a 16-bit counter). Once the counter reaches this maximum value, and a new event occurs, the counter resets back to zero. From here, the counter continues to increment with each event + +In addition to counting external events, it is possible to also count events that are internal to the processor. In particular, by using the system clock (or a derivative thereof), the counter can be incremented at regular intervals. In this form, the counter becomes a form of timer. Often, the system clock is running at some “high” frequency (e.g., in our microcontrollers, we might see clocks of 16 MHz or 20 MHz). However, it is often the case that we may want our timer to count at much slower rates. This is handled in microcontrollers through the use of hardware prescalers that divide the system clock down to some reasonable frequency. Figure 3 shows the relationship between the system clock, the prescaler and the counter value. Prescalers are implemented as counters in and of themselves. Recall that if some counter is being incremented at a regular frequency, f, then bit 0 of the counter is exhibiting a regular signal at a frequency of f/2. Furthermore, bit 1 has a frequency of f/4. By “tapping into” the prescaler counter at different bits, we can divide the system clock by a range of different divisors (where the divisor takes a form of 2i for some i). + +We would now like to answer questions involving the rate at which our counter is counting or the amount of time that a certain number of counts will take. In order to talk about these ideas, we first must be able to distinguish between cycles/second of the main system clock and of the prescaled signal. Here, we have artificially defined the unit of a “tick” as a single cycle of the system clock and “tock” as a single cycle of the prescaled signal. Hence, we can express prescaler values in terms of ticks per tock, i.e, how many system clock cycles compose a single prescaled cycle. Example: assume a system clock of 16, 000, 000 ticks/sec and a prescaler of 64 ticks/tock. What is the period of a single increment of the Timer 0 counter? + +The answer: + + + +$$ {64\ \text{ticks/tock} \over 16{,}000{,}000\ \text{ticks/sec}} \times 1\ \text{tock} = 4\ \mu\text{s} $$ + + +Example: What is the period of 250 increments of the Timer 0 counter? Answer: + + + +$$ {64\ \text{ticks/tock} \over 16{,}000{,}000\ \text{ticks/sec}} \times 250\ \text{tocks} = 4\ \text{ms} $$ + + +What timers are in ESP32? (optional) diff --git a/docs/courses/intro-to-electronics/wednesday.md b/docs/courses/intro-to-electronics/wednesday.md new file mode 100644 index 0000000..257daed --- /dev/null +++ b/docs/courses/intro-to-electronics/wednesday.md @@ -0,0 +1,25 @@ +--- +title: Wednesday +description: Data logging and getting data off the microcontroller. +--- + +# Wednesday + +### Data logging + +One important thing we want to accomplish with our microcontrollers is to save the data they are collecting while performing a certain task, and given the constraints imposed by the nature of microcontrollers (memory space, communication speeds, time critical events, etc), it is a good idea to give this careful thought when designing experiments/systems. + +Let’s use a practical example so that we have a better understanding of the critical points to be observed: + +The ESP32 we are using has 320kb of RAM, which can accomplish a lot, but won’t be enough for recording hours of data stream. In fact, if your system is recording data from a temperature sensor, using 12 bit resolution, you would need 2 bytes (each byte “carries” 8 bits of information) for each data point. If you would like to add information about time to each data collected, plus identify from which system the data has been collected, you would need another ~5 bytes. So every data point would be 7 bytes of information. Considering most applications will have several streams of data (temperature, humidity, triggering time of events, other sensors), and that we still have to factor in the code we write and upload to the board, this can consume all the space available in no time. Therefore, we need to find ways to “unload” data from the microcontroller’s main memory. This normally means transmitting the data to an external storage space, either an SD card, or a computer. + +Data transmission can be done using serial communication. We have seen a typical communication speed of 115200 bits per second [which is equivalent to 14400 bytes/sec - 14.4kb/s], so if we want to transmit data from thetemperature sensor, above together with identifiying info, we need seven bytes per data point, plus the overhead of the communication protocol being used. Therefore in one second we can theoretically transmit ~2000 data points for temperature readings (in reality this is less as the device needs to spend time opening the communication port, sending the data, sending other check bits, etc). Another thing to observe is that the microcontroller will be busy sending out data, pretty much unable to do anything else, so we also need to be careful in observing which are appropriate moments to send/receive data. + +Once the data is prepared to be transmitted out of the microcontroller, we need code on the receiving side to know what kind of data to expect, where to store it, how often, etc. + + + + +### Wednesday second part + +Now we take a small break from doing and working with code, to answer possible questions you might have that have not been covered during the course. diff --git a/docs/data/ingredients/boards.yaml b/docs/data/ingredients/boards.yaml new file mode 100644 index 0000000..a9388f5 --- /dev/null +++ b/docs/data/ingredients/boards.yaml @@ -0,0 +1,237 @@ +# BeeHive Ingredients — single source of truth for the board catalogue. +# +# docs/scripts/build_ingredients.py reads every docs/data/ingredients/*.yaml file +# (each may hold a single board mapping or a `boards:` list) and generates the +# docs/ingredients/ pages. To add a board, add an entry here (or drop in a new +# YAML file) and run `uv run poe gen`. +# +# Fields: +# slug stable id, used for the page anchor and cross-links (required) +# name display name (required) +# category one of: mainboard | power | actuator | sensor | utility (required) +# function short one-line function (required) +# description longer prose for the board's section +# size "Big" (71 x 45.5 mm) | "Small" (48.5 x 45.5 mm) | "" (n/a) +# components key ICs / parts, list of strings +# power input/output notes +# repo link to the board's wiki / repo page +# image URL or docs-relative path to a board render/photo +# kitspace project key in the BeeHive repo's kitspace.yaml; pulls in the +# Bill of materials + fabrication-file links. Run `uv run poe sync` +# to refresh the vendored BOMs under data/kitspace/. + +boards: + # --- Mainboards ---------------------------------------------------------- + - slug: esp32-mainboard + kitspace: central-hub + name: ESP32 BeeHive mainboard + category: mainboard + function: Carries the ESP32 microcontroller and breaks out every pin. + description: > + The heart of the BeeHive system. Built around the ESP32 (8 digital lines, + 3 analog inputs, 2 I2C channels, 1 UART, plus SPI, Bluetooth and WiFi), + it exposes all pins through the standard 4-pin JST daughter-board + connectors and handles 12 V power management. Programmable in MicroPython + or C++ (Arduino). + size: "" + components: [ESP32-WROOM, "12 V to 5 V regulator", JST-PH connectors] + power: "12 V DC in; supplies 12 V and 5 V to daughter boards" + repo: https://github.com/BeeHive-org/BeeHive/wiki/Main-hub + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/central_hub/central_hub_3D.png?raw=true + + - slug: mikrobus-mainboard + name: MikroBUS-compatible BeeHive mainboard + category: mainboard + function: ESP32 mainboard with added MikroBUS / Click Board compatibility. + description: > + Same ESP32 core as the original mainboard, plus connectors for the + MikroBUS open standard — opening up MikroElektronika's ecosystem of 500+ + Click Boards while keeping MicroPython control. Serves as an integration + example with an established third-party platform. + size: "" + components: [ESP32-WROOM, MikroBUS sockets, Qwiic connectors] + power: "12 V DC in" + repo: https://github.com/BeeHive-org/BeeHive + + # --- Power management ---------------------------------------------------- + - slug: 12v5a-breakout + kitspace: 12V5A_breakout + name: 12V5A breakout + category: power + function: Distributes 12 V / 5 A to other boards. + description: > + A barrel-jack input, a power LED indicator and nine connectors that fan + 12 V / 5 A out to the mainboard and daughter boards. + size: "" + components: [Barrel jack, Power LED, "9 × output connectors"] + power: "12 V / 5 A in and out" + repo: https://github.com/BeeHive-org/BeeHive/wiki/12V5A-breakout + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/12V5A_breakout/12V5A_breakout_3D.png?raw=true + + - slug: 5v3a-breakout + name: 5V3A breakout + category: power + function: Steps 12 V / 5 A down to 5 V / 3 A. + description: > + Converts 12 V / 5 A to 5 V / 3 A using an LM2596 regulator. Fed from either + mainboard 12 V output; can be daisy-chained to another 5 V / 3 A breakout. + size: "" + components: [LM2596] + power: "12 V / 5 A in; 5 V / 3 A out" + repo: https://github.com/BeeHive-org/BeeHive/wiki/5V3A-breakout + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/power_supply/power_supply_3D.png?raw=true + + - slug: 12v-24v-boost + kitspace: 12_24_boost_converter + name: 12V/24V boost converter + category: power + function: Boosts 12 V / 5 A up to 24 V / 1 A. + description: > + A 555-based step-up converter that provides up to 24 V / 1 A — used to + power solenoids in "Spike & Hold" mode, or any other 24 V device. Powered + from the mainboard or the 12V5A breakout. + size: "" + components: ["555 timer IC"] + power: "12 V / 5 A in; 24 V / 1 A out" + repo: https://github.com/BeeHive-org/BeeHive/wiki/Boost-converter-12V-to-24V + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/12_24_boost_converter/12_24_boost_converter_3D.png?raw=true + + # --- Actuators ----------------------------------------------------------- + - slug: h-bridge-driver + kitspace: hbridge_driver + name: H-bridge driver + category: actuator + function: Drives DC motors and Peltier elements. + description: > + A full-bridge driver (2 n-channel + 2 p-channel MOSFETs driven by a TC4420) + with a connector for a DS18B20 temperature sensor. A low-pass filter makes + it Peltier-compatible. Output up to 12 V / 5 A. + size: Big + components: ["TC4420 driver", "n/p-channel MOSFETs", DS18B20 connector] + power: "12 V / 5 A max output" + repo: https://github.com/BeeHive-org/BeeHive/wiki/H-bridge-driver + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hbridge_driver/hbridge_driver_3D.png?raw=true + + - slug: switch-array + kitspace: 8-switch-array + name: Switch array + category: actuator + function: Switches many low-power loads (e.g. LEDs) over few pins. + description: > + Uses a 74HC595 shift register to control many components from few pins. + Switched load voltage can vary from 5 to 12 V. + size: "" + components: ["74HC595 shift register"] + power: "5–12 V switched" + repo: https://github.com/BeeHive-org/BeeHive/wiki/Switch-array + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/8_switch_array/8_switch_array_3D.png?raw=true + + - slug: high-power-switch-array + kitspace: hp-led-switch + name: High-power switch array + category: actuator + function: Switches power-demanding loads (e.g. high-power LEDs). + description: > + Based on a TC4427 driver and n-channel MOSFETs for switching + power-hungry components at 12 V / 5 A, drawn from the mainboard or the + 12V5A breakout. + size: "" + components: ["TC4427 driver", "n-channel MOSFETs"] + power: "12 V / 5 A" + repo: https://github.com/BeeHive-org/BeeHive/wiki/High-power-switch-array + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hp_led_switch/hp_led_switch_3D.png?raw=true + + - slug: solenoid-control-board + name: Solenoid control board + category: actuator + function: Controls solenoid valves (standard speed). + description: > + A "traditional" solenoid driver for applications that do not need the + fastest opening times. Use the Spike & Hold board when sub-millisecond + opening matters. + size: "" + components: [MOSFET driver] + power: "12 V" + repo: https://github.com/BeeHive-org/BeeHive/wiki/Solenoid-control-board + + - slug: spike-and-hold-board + name: Spike & Hold board + category: actuator + function: Drives solenoids in "Spike & Hold" mode for fast opening. + description: > + A purpose-built driver replicating the Lee Company "Spike & Hold" circuit, + overdriving solenoids for opening times in the hundreds of microseconds + (at the cost of solenoid lifetime). Pairs with the 12V/24V boost converter. + size: "" + components: ["Spike & Hold circuit"] + power: "12 V / 24 V" + repo: https://github.com/BeeHive-org/BeeHive/wiki/Spike&Hold-board + + # --- Sensors ------------------------------------------------------------- + - slug: gas-sensor + kitspace: gas_sensor + name: Gas sensor + category: sensor + function: Detects gas-related environmental variables. + description: > + Built around an MQ-6 gas sensor; swapping in another MQ-series sensor + lets it detect different gases. + size: "" + components: ["MQ-6 (MQ-series) sensor"] + repo: https://github.com/BeeHive-org/BeeHive/wiki/Gas-sensor + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/gas_sensor/gas_sensor_3d.png?raw=true + + - slug: humidity-temperature-sensor + kitspace: hum_temp_sensor + name: Humidity & temperature sensor + category: sensor + function: Monitors humidity and temperature. + description: Compatible with both DHT11 and DHT22 sensors. + size: "" + components: [DHT11, DHT22] + repo: https://github.com/BeeHive-org/BeeHive/wiki/Humidity-and-temperature-sensor + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hum_temp_sensor/hum_temp_sensor_3d.png?raw=true + + - slug: ir-sensor-array + name: IR sensor array + category: sensor + function: Hosts paired IR LEDs and phototransistors (e.g. nose-poke ports). + description: > + Accommodates 6 pairs of infrared LEDs and matching phototransistors — + used for nose-poke detection and beam-break tracking with microsecond + precision. + size: "" + components: ["6 × IR LED + phototransistor pairs"] + repo: https://github.com/BeeHive-org/BeeHive/wiki/IR-sensor-array + + # --- Training ------------------------------------------------------------ + - slug: training-board + kitspace: testing_board + name: Training board + category: training + function: A teaching board covering the core electronic building blocks. + description: > + A board bringing together the modules a beginner needs to learn + electronics and MicroPython: LEDs, push buttons, potentiometers, shift + registers, rotary encoders, relays, and a temperature sensor. Together + they cover digital input and output, analog input, and SPI communication. + Paired with the guided exercises, it lets learners master coding and wiring + one at a time, and doubles as a testbed for validating experiment logic + before committing it to a real setup. + size: "" + components: [8-bit shift register + LED matrix, Push buttons, Potentiometers, Rotary encoders, Relay module, Digital temperature sensor] + repo: https://github.com/BeeHive-org/BeeHive + image: "" + + # --- Utilities ----------------------------------------------------------- + - slug: level-shifter + name: Level shifter + category: utility + function: Bi-directional 5 V ↔ 3.3 V logic level translation. + description: > + A bi-directional level shifter (based on the BSS138 MOSFET, inspired by + Adafruit's design) letting 5 V and 3.3 V devices communicate. + size: "" + components: ["BSS138 MOSFET"] + repo: https://github.com/BeeHive-org/BeeHive/wiki/Level-shifter + image: https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/level_shifter/level_shifter_3D.png?raw=true diff --git a/docs/data/kitspace/bom/12V5A_breakout.csv b/docs/data/kitspace/bom/12V5A_breakout.csv new file mode 100644 index 0000000..6207dbd --- /dev/null +++ b/docs/data/kitspace/bom/12V5A_breakout.csv @@ -0,0 +1,5 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer_1,MPN_2,Manufacturer_3,MPN_4,Manufacturer_5,MPN_6,Manufacturer_7,MPN_8,Digikey,Mouser,RS,Newark,Farnell +J1;,1,2.1mm socket,Cliff,FC68148 DC10A,Lumberg,NEB 21 R,Cliff,FC68148,Gravitech,CON-SOCJ-2155,Parallax,452-00007,452-00007-ND,992CONSOCJ2155,5051609,08WX2563,224959 +J2; J3; J4; J5; J6; J7; J8; J9; J10;,9,CONN HEADER XH TOP 2POS 2.5MM,JST,B2B-XH-A (LF)(SN),,,,,,,,,455-2247-ND,,8201554P,73M9415,1516276 +R1;,1,Resistor 560 ohm 250mW through-hole,Stackpole Electronics,CF14JT270R,Yageo,MFR-25FBF52-220R,TE Connectivity,CFR16J270R,Ohmite,OD271JE,Kamaya,RC1/4271JB ,CF14JT270RCT-ND,791-RC1/4-271JB ,148360,95W5736,2329504 +D1,D2;,2,3mm LED any colour,Bivar Inc,ELM 5-065,492-2284-ND,,,,,,,,,,, diff --git a/docs/data/kitspace/bom/12_24_boost_converter.csv b/docs/data/kitspace/bom/12_24_boost_converter.csv new file mode 100644 index 0000000..a48ee7e --- /dev/null +++ b/docs/data/kitspace/bom/12_24_boost_converter.csv @@ -0,0 +1,14 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +Q1;,1,IRFZ24NPBF or IRFZ44NPbF footprint TO-220AB,Infineon,IRFZ44NPbF,Infineon,IRFZ44NPBF,,,,,,,,,,,,,,,IRFZ44NPBF-ND,942IRFZ44NPBF,5409777,,1544411 +R1;R2;R3;,3,Resistor 47 ohm 250mW through-hole,TE Connectivity,LR1F47R,TE Connectivity,ROX1SJ47R,,,,,,,,,,,,,,,A131472CT-ND,279LR1F47R,148174,,1738569 +R4;,1,Resistor 1k ohm 250mW through-hole,TE Connectivity,CFR16J1K0,TE Connectivity,ROX2SJ1K0,,,,,,,,,,,,,,,A104669CT-ND,279ROX2SJ1K0,2141951,,1738638 +R5;,1,Resistor 560 ohm 250mW through-hole,TE Connectivity,CFR25J560R,KOA Speer,CF1/2CT52R561J,,,,,,,,,,,,,,,2019-CF1/2CT52R561JCT-ND,279CFR25J560R,131227,,2329690 +C1;C2;,2,100nF Capacitor Disc,Multicomp,MCFYU6104Z6,KEMET,C052C104K5R5CA,KEMET,C052K104K5X5CA,KEMET,C052T104K5X5CS,KEMET,C321C104K5R5HA,KEMET,CK05BX104K,Vishay,K104K15X7RF5TH5,Vishay,K104Z15Y5VF5TL2,Multicomp,MC0805B104K500A5.08MM,BC1101CT-ND,594K104K15X7RF5TH5,8523277,73M2154,2395773 +C3;,1,22uF CP_Radial_D5.0mm_P2.00mm,Panasonic,ECA-1HM220,,,,,,,,,,,,,,,,,P5179-ND,667ECA1HM220,2286880,,9693777 +L1;,1,INDUCTOR 33�H Neosid MA-Bs75,Bourns,RLB0914-330KL,Bourns,RLB9012-330KL,,,,,,,,,,,,,,,RLB9012-330KL-ND,652RLB9012330KL,8118853,61J7916,2309242 +J1;J2;J3;J4,4,CONN HEADER XH TOP 2POS 2.5MM,JST,B2B-XH-A (LF)(SN),JST,B2B-XH-A(LF)(SN),,,,,,,,,,,,,,,455-2247-ND,,8201554,73M9415,1516276 +D1;,1,Diode Schottky 5A DO-201AD,Vishay,1N5822-E3/73,Zetex,SB5100-T,,,,,,,,,,,,,,,1N5822-E3/73GICT-ND,6251N5822E3/73,751-4843,17T8202,1336553 +D2;,1,3mm LED any colour,Bivar Inc,ELM 5-065,Bivar,ELM 5-065,,,,,,,,,,,,,,,492-2284-ND,749ELM5065,,, +cables,16,"JUMPER SXH-001T-P0.6 X2 10""""",JST,ASXHSXH22K254,,,,,,,,,455-4223-ND,,,,,,,,,,,, +connectors 2pin,4,CONN HOUSING 2.5MM 2POS,JST,XHP-2,,,,,,,,,455-2266-ND,,8201611,,1516264,,,,,,,, +connectors 4pin,6,CONN HOUSING 2.5MM 4POS,JST,XHP-4,,,,,,,,,455-2267-ND,,8201618,,1516266,,,,,,,, diff --git a/docs/data/kitspace/bom/8-switch-array.csv b/docs/data/kitspace/bom/8-switch-array.csv new file mode 100644 index 0000000..c1b403b --- /dev/null +++ b/docs/data/kitspace/bom/8-switch-array.csv @@ -0,0 +1,10 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +U1;,1,SN74HC595 – PDIP-16,,,,,,,,,,,296-1600-5-ND,595SN74HC595N,2175695,,3120865 +Q1; Q2; Q3; Q4; Q5; Q6; Q7; Q8;,8,1A NPN,ON Semiconductor/fairchild,PN2222ATF,,,,,,,,,PN2222ATFCT-ND,512PN2222ATF,8061296,31Y3451,1695606 +R1; R2; R3; R4; R5; R6; R7; R8;,8,Resistor 270 ohm 250mW through-hole,Stackpole Electronics,CF14JT270R,Yageo,MFR-25FBF52-220R,TE Connectivity,CFR16J270R,Ohmite,OD271JE,Kamaya,RC1/4271JB,CF14JT270RCT-ND,791RC1/4271JB,148360,95W5736,2329504 +C1;,1,100nF Capacitor Disc,Multicomp,MCFYU6104Z6,KEMET,C052C104K5R5CA,KEMET,C052K104K5X5CA,KEMET,C052T104K5X5CS,KEMET,C321C104K5R5HA,BC1160CT-ND,80C321C104K5R5HA,8523277,73M2154,2395773 +J1;J2;,2,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN),,,,,,,,,455-2249-ND,,8201551,,1516278 +J3; J4; J5; J6; J7; J8; J9; J10; J11;,9,CONN HEADER XH TOP 2POS 2.5MM,JST,B2B-XH-A (LF)(SN),,,,,,,,,455-2247-ND,,8201554P,73M9415,1516276 +cables,26,"JUMPER SXH-001T-P0.6 X2 10""""",JST,ASXHSXH22K254,,,,,,,,,455-4223-ND,,,, +connectors 2pin,18,CONN HOUSING 2.5MM 2POS,JST,XHP-2,,,,,,,,,455-2266-ND,,8201611,,1516264 +connectors 4pin,4,CONN HOUSING 2.5MM 4POS,JST,XHP-4,,,,,,,,,455-2267-ND,,8201618,,1516266 diff --git a/docs/data/kitspace/bom/central-hub.csv b/docs/data/kitspace/bom/central-hub.csv new file mode 100644 index 0000000..d634a07 --- /dev/null +++ b/docs/data/kitspace/bom/central-hub.csv @@ -0,0 +1,10 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +U1;,1,LM2596 5v,ITO-220,Texas Instruments,Texas Instruments,LM2596T-5.0/NOPB,,,,,,,LM2596T-5.0/NOPB-ND,926LM2596T5.0/NOPB,5333743,,3008166 +U3;,1,ESP32-DevKitC-VIB,,,,,,,,,,,1965-ESP32-DEVKITC-VIE-ND,,,, +P1;P2;P3;P4;P5;P6;P7;P8;P9;P10;P11;P12;P13;P14;,14,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN),,,,,,,,,455-2249-ND,,8201551,,1516278 +P15;P16,2,CONN HEADER XH TOP 2POS 2.5MM,JST,B2B-XH-A (LF)(SN),,,,,,,,,455-2247-ND,,820-1554,,1516276 +L1;,1,INDUCTOR 33µH Neosid MA-Bs75,Bourns,RLB0914-330KL,Bourns,RLB9012-330KL,,,,,,,RLB9012-330KL-ND,652RLB0914330KL,8118853,,2309242 +D1;,1,Diode Schottky 5A DO-201AD,Vishay,1N5822-E3/73,Zetex,SB5100-T,,,,,,,1N5822-E3/73GICT-ND,6251N5822E3/73,7514843,,1336553 +CON1;,1,2.1mm socket,Cliff,FC68148 DC10A,Lumberg,NEB 21 R,Cliff,FC68148,Gravitech,CON-SOCJ-2155,Parallax,452-00007,SC1313-ND,992CONSOCJ2155,5051609,,1217037 +C1;,1,680µF Capacitor,Rubycon,16ZL680MEFC10X16,Panasonic,EEU-FC1A681,Panasonic,EEU-FP1E681,,,,,1189-3978-ND,667EEUFP1E681,1793151,,2911616 +C2;,1,CAP ALUM 220UF 20% 25V RADIAL,Panasonic,EEU-FM1E221,Panasonic,ECA-1CM221B,Panasonic,ECE-A0GKS221,Panasonic,EEU-EB1A221S,,,P13456-ND,667ECA1CM221B,7472036,,9451099 diff --git a/docs/data/kitspace/bom/gas_sensor.csv b/docs/data/kitspace/bom/gas_sensor.csv new file mode 100644 index 0000000..21424c9 --- /dev/null +++ b/docs/data/kitspace/bom/gas_sensor.csv @@ -0,0 +1,9 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer_1,MPN_2,Manufacturer_3,MPN_4,Manufacturer_5,MPN_6,Manufacturer_7,MPN_8,Digikey,Mouser,RS,Newark,Farnell +A1;,1,MQ-135 or any other MQ sensor,MQ,-,-,,,,,,,,,,,, +U1;,1,LM393,PDIP-8,ON Semiconductor,ON Semiconductor,,,,,,,,,,,, +RV1;,1,3362P-1-103 10k Ohm,Bourns,3362P-1-103,ON Semiconductor,,,,,,,,,,,, +R1;,1,Resistor 4.7k ohm 250mW through-hole,Stackpole Electronics,CF14JT270R,Yageo,MFR-25FBF52-220R,TE Connectivity,CFR16J270R,Ohmite,OD271JE,Kamaya,RC1/4271JB ,CF14JT270RCT-ND,791-RC1/4-271JB ,148360,95W5736,2329504 +R2; R3;,2,Resistor 220 ohm 250mW through-hole,Stackpole Electronics,CF14JT270R,Yageo,MFR-25FBF52-220R,TE Connectivity,CFR16J270R,Ohmite,OD271JE,Kamaya,RC1/4271JB ,CF14JT270RCT-ND,791-RC1/4-271JB ,148360,95W5736,2329504 +C1;,1,100nF Capacitor Disc,Multicomp,MCFYU6104Z6,KEMET,C052C104K5R5CA,KEMET,C052K104K5X5CA,KEMET,C052T104K5X5CS,KEMET,C321C104K5R5HA,BC1160CT-ND,80C321C104K5R5HA,852-3277,73M2154,2395773 +J1;,1,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN) ,,,,,,,,,455-2249-ND ,,820-1551,,1516278 +D1,D2;,2,3mm LED any colour,Bivar Inc,ELM 5-065,492-2284-ND,,,,,,,,,,, diff --git a/docs/data/kitspace/bom/grove_adaptor.csv b/docs/data/kitspace/bom/grove_adaptor.csv new file mode 100644 index 0000000..b27a0b7 --- /dev/null +++ b/docs/data/kitspace/bom/grove_adaptor.csv @@ -0,0 +1,4 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +J1,1,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN),,,,,,,,,455-2249-ND,,8201551,,1516278 +J2,1,Grove male header,M5Stack Technology Co. Ltd.,A118,,,,,,,,,2221-A118-ND,,,, + diff --git a/docs/data/kitspace/bom/grove_adaptor_panel.csv b/docs/data/kitspace/bom/grove_adaptor_panel.csv new file mode 100644 index 0000000..6209cee --- /dev/null +++ b/docs/data/kitspace/bom/grove_adaptor_panel.csv @@ -0,0 +1,4 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +J1,12,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN),,,,,,,,,455-2249-ND,,8201551,,1516278 +J2,12,Grove male header,M5Stack Technology Co. Ltd.,A118,,,,,,,,,2221-A118-ND,,,, + diff --git a/docs/data/kitspace/bom/hbridge_driver.csv b/docs/data/kitspace/bom/hbridge_driver.csv new file mode 100644 index 0000000..032e0d4 --- /dev/null +++ b/docs/data/kitspace/bom/hbridge_driver.csv @@ -0,0 +1,18 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +U1;U2,2,TC4420 footprint PDIP-8,Microchip,TC4420CPA,Microchip,TC4420EPA,,,,,,,,,,,,,,,TC4420EPA-ND,579TC4420EPA,6811124,,9762566 +Q1;Q2,4,IRF9Z34NPBF or IRF4905PbF footprint TO-220AB,Infineon,IRF4905PBF,Infineon,IRF9Z34NPBF,,,,,,,,,,,,,,,IRF9Z34NPBF-ND,942IRF9Z34NPBF,5409799,,8648689 +Q3;Q4,4,IRFZ24NPBF or IRFZ44NPbF footprint TO-220AB,Infineon,IRFZ44NPbF,Infineon,IRFZ44NPBF,,,,,,,,,,,,,,,IRFZ44NPBF-ND,942IRFZ44NPBF,5409777,,1544411 +R3;R4;R5;R7,4,Resistor 47 ohm 250mW through-hole,TE Connectivity,LR1F47R,TE Connectivity,ROX1SJ47R,,,,,,,,,,,,,,,A131472CT-ND,279LR1F47R,148174,,1738569 +R1;R2;R8;R9,4,Resistor 1k ohm 250mW through-hole,TE Connectivity,CFR16J1K0,TE Connectivity,ROX2SJ1K0,,,,,,,,,,,,,,,A104669CT-ND,279ROX2SJ1K0,2141951,,1738638 +R10;,1,Resistor 220 ohm 250mW through-hole,Yageo,MFR-25FBF52-220R,TE Connectivity,LR1F220R,,,,,,,,,,,,,,,MFR-25FBF52-220R-ND,279LR1F220R,148348,,2330065 +R11;,1,Resistor 560 ohm 250mW through-hole,TE Connectivity,CFR25J560R,KOA Speer,CF1/2CT52R561J,,,,,,,,,,,,,,,2019-CF1/2CT52R561JCT-ND,279CFR25J560R,131227,,2329690 +C1;C2;C6;C7,4,100nF Capacitor Disc,Multicomp,MCFYU6104Z6,KEMET,C052C104K5R5CA,KEMET,C052K104K5X5CA,KEMET,C052T104K5X5CS,KEMET,C321C104K5R5HA,KEMET,CK05BX104K,Vishay,K104K15X7RF5TH5,Vishay,K104Z15Y5VF5TL2,Multicomp,MC0805B104K500A5.08MM,BC1101CT-ND,594K104K15X7RF5TH5,8523277,73M2154,2395773 +C3;C4;C5,3,22uF CP_Radial_D5.0mm_P2.00mm,Panasonic,ECA-1HM220,,,,,,,,,,,,,,,,,P5179-ND,667ECA1HM220,2286880,,9693777 +L1; L2;,2,INDUCTOR 33�H Neosid MA-Bs75,Bourns,RLB0914-330KL,Bourns,RLB9012-330KL,,,,,,,,,,,,,,,RLB9012-330KL-ND,652RLB9012330KL,8118853,61J7916,2309242 +J1;J2,2,CONN HEADER XH TOP 2POS 2.5MM,JST,B2B-XH-A (LF)(SN),JST,B2B-XH-A(LF)(SN),,,,,,,,,,,,,,,455-2247-ND,,8201554,73M9415,1516276 +J3;,1,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN),JST,B4B-XH-A(LF)(SN),,,,,,,,,,,,,,,455-2249-ND,,8201551,,1516278 +J6;,1,Terminal block 5mm,RS Pro,494-8906,TE Connectivity,282837-2,RS Pro,4948906,,,,,,,,,,,,,A113320-ND,5712828372,7100100,,1784860 +D1;D2,2,3mm LED any colour,Bivar Inc,ELM 5-065,Bivar,ELM 5-065,,,,,,,,,,,,,,,492-2284-ND,749ELM5065,,, +cables,16,"JUMPER SXH-001T-P0.6 X2 10""""",JST,ASXHSXH22K254,,,,,,,,,455-4223-ND,,,,,,,,,,,, +connectors 2pin,4,CONN HOUSING 2.5MM 2POS,JST,XHP-2,,,,,,,,,455-2266-ND,,8201611,,1516264,,,,,,,, +connectors 4pin,6,CONN HOUSING 2.5MM 4POS,JST,XHP-4,,,,,,,,,455-2267-ND,,8201618,,1516266,,,,,,,, diff --git a/docs/data/kitspace/bom/hp-led-switch.csv b/docs/data/kitspace/bom/hp-led-switch.csv new file mode 100644 index 0000000..1f6e920 --- /dev/null +++ b/docs/data/kitspace/bom/hp-led-switch.csv @@ -0,0 +1,11 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell +J1;J2;,2,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN),,,,,,,,,455-2249-ND,,8201551,,1516278 +J3; J4; J5; J6;,4,CONN HEADER XH TOP 2POS 2.5MM,JST,B2B-XH-A (LF)(SN),,,,,,,,,455-2247-ND,,8201554P,73M9415,1516276 +C1;C2;,2,100nF Capacitor Disc,Multicomp,MCFYU6104Z6,KEMET,C052C104K5R5CA,KEMET,C052K104K5X5CA,KEMET,C052T104K5X5CS,KEMET,C321C104K5R5HA,BC1101CT-ND,80C321C104K5R5HA,8523277,73M2154,2395773 +Q1;Q2;Q3;Q4;,4,IRFZ24NPBF or IRFZ44NPbF footprint TO-220AB,Infineon,IRFZ44NPbF,,,,,,,,,IRFZ44NPBF-ND,942IRFZ44NPBF,5409777,,1544411 +U1;U2,2,TC4427 footprint PDIP-8,Microchip,TC4427,Microchip,TC4427CPA,,,,,,,TC4427CPA-ND,579TC4427CPA,2070180,,9762639 +R1;R2;R3;R4,4,Resistor 47 ohm 250mW through-hole,TE Connectivity,ROX1SJ47R,,,,,,,,,A131472CT-ND,279ROX1S47R,2140964,,1738569 +R5;R6;R7;R8,4,Resistor 1k ohm 250mW through-hole,TE Connectivity,CFR16J1K0,,,,,,,,,A104669CT-ND,279216239273,1251150,,2329486 +cables,6,"JUMPER SXH-001T-P0.6 X2 10""""",JST,ASXHSXH22K254,,,,,,,,,455-4223-ND,,,, +connectors 2pin,8,CONN HOUSING 2.5MM 2POS,JST,XHP-2,,,,,,,,,455-2266-ND,,8201611,,1516264 +connectors 4pin,4,CONN HOUSING 2.5MM 4POS,JST,XHP-4,,,,,,,,,455-2267-ND,,8201618,,1516266 diff --git a/docs/data/kitspace/bom/hum_temp_sensor.csv b/docs/data/kitspace/bom/hum_temp_sensor.csv new file mode 100644 index 0000000..21124a6 --- /dev/null +++ b/docs/data/kitspace/bom/hum_temp_sensor.csv @@ -0,0 +1,8 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer_1,MPN_2,Manufacturer_3,MPN_4,Manufacturer_5,MPN_6,Manufacturer_7,MPN_8,Digikey,Mouser,RS,Newark,Farnell +A1;,1,DHT11 or DHT22,-,-,-,,,,,,,,1528-1228-ND,,,, +RV1;,1,3362P-1-103 10k Ohm,Bourns,3362P-1-103,ON Semiconductor,,,,,,,,3362P-1-103LF,,,, +R1;,1,Resistor 5.1k ohm 250mW through-hole,Stackpole Electronics,CF14JT270R,Yageo,MFR-25FBF52-220R,TE Connectivity,CFR16J270R,Ohmite,OD271JE,Kamaya,RC1/4271JB ,CF14JT270RCT-ND,791-RC1/4-271JB ,148360,95W5736,2329504 +R2;,1,Resistor 220 ohm 250mW through-hole,Stackpole Electronics,CF14JT270R,Yageo,MFR-25FBF52-220R,TE Connectivity,CFR16J270R,Ohmite,OD271JE,Kamaya,RC1/4271JB ,CF14JT270RCT-ND,791-RC1/4-271JB ,148360,95W5736,2329504 +C1;,1,100nF Capacitor Disc,Multicomp,MCFYU6104Z6,KEMET,C052C104K5R5CA,KEMET,C052K104K5X5CA,KEMET,C052T104K5X5CS,KEMET,C321C104K5R5HA,BC1160CT-ND,80C321C104K5R5HA,852-3277,73M2154,2395773 +J1;,1,CONN HEADER XH TOP 4POS 2.5MM,JST,B4B-XH-A (LF)(SN) ,,,,,,,,,455-2249-ND ,,820-1551,,1516278 +D1;,1,3mm LED any colour,Bivar Inc,ELM 5-065,492-2284-ND,,,,,,,,,,,, diff --git a/docs/data/kitspace/bom/testing_board.csv b/docs/data/kitspace/bom/testing_board.csv new file mode 100644 index 0000000..b894869 --- /dev/null +++ b/docs/data/kitspace/bom/testing_board.csv @@ -0,0 +1,13 @@ +References,Qty,Description,Manufacturer,MPN,Manufacturer,MPN,Digikey,Mouser,RS,Newark,Farnell,LCSC,JLC Assembly +d1;d2;d3;d4;d5;d6;d7;d8;d9;d10;d11;d12;d13;d14;d15;d16;d17;d18;d21;d22,20,indicator leds,Marktech Optoelectronics,MT7403A-UR-A,,,1125-1181-ND,193MT7403AURA,,,,, +d19;d20,2,flyback diodes,Vishay,1N5822-E3/73,Diodes Inc.,SB5100-T,1N5822-E3/73GICT-ND,6251N5822E3/73,7514843,,1336553,, +j1;j2;j3;j4;j5;j6;j7;j8;j9;j16,10,connector,JST,B4B-XH-A (LF)(SN),,,455-2249-ND,,,,1516278,, +u3,1,tpic6595n,Texas Instruments,TPIC6B595N,Texas Instruments,TPIC6C595N,296-1956-5-ND,595TPIC6B595N,528145,,3120896,, +RV1;RV2,2,potentiometer,ALPS,RK09K1130AH1,Bourns,PTV09A-4025F-B503,PTV09A-4025F-B503-ND,688RK09K1130AH1,7293587,,1191725,, +U1;U2,2,temp sensor,Maxim Integrated,DS18B20+,,,DS18B20+T&RCT-ND,,,,,, +sw1;sw2;sw3;sw4,4,push buttons,TE Connectivity,1825910-2,,,450-1649-ND,506FSM2JH,4791390,,2469975,, +RLY1;RLY2,2,relays,omron,G5LE-1-36 DC5,,,G5LE-1-36DC5-ND,653G5LE136DC5,,,1798616,, +r1;r;2;r3;r4;r5;r6;r7;r13;14;r15;r16;r20;r21;r22;r23;r24;r25,20,resistor 220 ohm,Yageo,CFR-25JB-52-220R,,,220QBK-ND,603CFR25JB52220R,,,3952580,, +r18,1,resistor 4.7kohm,Stackpole Electronics,CF14JT4K70,,,CF14JT4K70CT-ND,,,,,, +r8;r9;r10;r12;,1,resistor 1kohm,Stackpole Electronics,CF14JT1K00,,,CF14JT1K00CT-ND,,,,,, +r19;r26,1,resistor 330ohm,,CF14JT330R,,,CF14JT330RCT-ND,,,,,, diff --git a/docs/data/kitspace/manifest.yaml b/docs/data/kitspace/manifest.yaml new file mode 100644 index 0000000..e634840 --- /dev/null +++ b/docs/data/kitspace/manifest.yaml @@ -0,0 +1,111 @@ +multi: + central-hub: + summary: the central hub of BeeHive + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/central_hub/1-click-bom.csv + gerbers: hardware/PCBs/central_hub/gerber + eda: + type: kicad + pcb: hardware/PCBs/central_hub/beehive.kicad_pcb + 8-switch-array: + summary: an array of 8 individually addresseable NPN transistors + readme: hardware/PCBs/8_switch_array/readme.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/8_switch_array/1-click-bom.csv + gerbers: hardware/PCBs/8_switch_array/gerber + eda: + type: kicad + pcb: hardware/PCBs/8_switch_array/8_switch_array.kicad_pcb + 12_24_boost_converter: + summary: a 12V to 24V boost converter + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/12_24_boost_converter/1-click-bom.csv + gerbers: hardware/PCBs/12_24_boost_converter/gerber + eda: + type: kicad + pcb: hardware/PCBs/12_24_boost_converter/12_24_boost_converter.kicad_pcb + 12V5A_breakout: + summary: a breakout board to split a 12V 5A line into several cable connectors + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/12V5A_breakout/1-click-bom.csv + gerbers: hardware/PCBs/12V5A_breakout/gerber + eda: + type: kicad + pcb: hardware/PCBs/12V5A_breakout/12V5A_breakout.kicad_pcb + gas_sensor: + summary: a board to house different types of gas_sensors + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/gas_sensor/1-click-bom.csv + gerbers: hardware/PCBs/gas_sensor/gerber + eda: + type: kicad + pcb: hardware/PCBs/gas_sensor/gas_sensor.kicad_pcb + grove_adaptor: + summary: an adaptor board to connect JST-XH plugs to Grove system plugs + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/grove_adaptor/1-click-bom.csv + gerbers: hardware/PCBs/grove_adaptor/gerber + eda: + type: kicad + pcb: hardware/PCBs/grove_adaptor/grove_adaptor.kicad_pcb + grove_adaptor_panel: + summary: a panel of adaptor boards to connect JST-XH plugs to Grove system plugs + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/grove_adaptor_panel/1-click-bom.csv + gerbers: hardware/PCBs/grove_adaptor_panel/gerber + eda: + type: kicad + pcb: hardware/PCBs/grove_adaptor_panel/grove_adaptor_panel.kicad_pcb + hbridge_driver: + summary: An H-Bridge driver for peltiers, motors, linear actuators. + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/hbridge_driver/1-click-bom.csv + gerbers: hardware/PCBs/hbridge_driver/gerber + eda: + type: kicad + pcb: hardware/PCBs/hbridge_driver/hbridge_driver.kicad_pcb + hp-led-switch: + summary: A board to control high powered leds + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/hp_led_switch/1-click-bom.csv + gerbers: hardware/PCBs/hp_led_switch/gerber + eda: + type: kicad + pcb: hardware/PCBs/hp_led_switch/hp_led_switch.kicad_pcb + hum_temp_sensor: + summary: A board porting temperature and humidity sensort + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/hum_temp_sensor/1-click-bom.csv + gerbers: hardware/PCBs/hum_temp_sensor/gerber + eda: + type: kicad + pcb: hardware/PCBs/hum_temp_sensor/hum_temp_sensor.kicad_pcb + testing_board: + summary: A training board for users to practice programming + readme: README.md + color: green + site: https://github.com/beeHive-org/beeHive + bom: hardware/PCBs/training_board/1-click-bom.csv + gerbers: hardware/PCBs/training_board/gerber + eda: + type: kicad + pcb: hardware/PCBs/training_board/training_board.kicad_pcb diff --git a/docs/getting-started.md b/docs/getting-started.md deleted file mode 100644 index 9301c17..0000000 --- a/docs/getting-started.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Getting started ---- - -# Welcome to BeeHive! - -In this page you will find links to specific topics in this documentation, a way to get in touch with the developers and a list of the labs already using it. - -#### contact: - -If something is not clear, or you would like to contribute as a developer and/or user, feel free to reach out to us on our ["issues page"](https://github.com/BeeHive-org/BeeHive/issues) or via [email](mailto:a.maia-chagas@sussex.ac.uk). We are an open community, and would love to hear from you! - -#### Labs using it: - -- King's lab -- Maravall lab -- Schroeder lab -- Baden lab -- Niven lab -- Lagnado lab \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 28500eb..df1fe1a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,57 @@ --- -title: Beehive -template: overrides/home.html +title: Open electronics for research +description: A flexible open electronics platform for building research equipment and teaching electronics. --- +# BeeHive + +**BeeHive is an open-source electronics ecosystem for building your own research +equipment** — and for learning the electronics and programming to do it. An +ESP32 **mainboard** plus single-function **daughter boards** click together like +building blocks, so you can assemble, repurpose, and share custom instruments +without starting from scratch each time. + +![BeeHive mainboard](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/central_hub/central_hub_3D.png?raw=true){ width=420 } + +!!! success "Free & open source" + All BeeHive hardware designs, firmware, and docs are released under + open-source licences — free to copy, learn from, modify, and build on. The + designs live at + [github.com/BeeHive-org/BeeHive](https://github.com/BeeHive-org/BeeHive). + +## Ingredients & recipes + +BeeHive is organised around a simple metaphor: + +- 🧩 **[Ingredients](ingredients/index.md)** — the boards. A *mainboard* carries + the microcontroller; *daughter boards* each do one job (drive a solenoid, read + a sensor, switch an LED). They share one 4-pin connector, so they mix freely. +- 🍯 **[Recipes](recipes/index.md)** — the builds. Combine ingredients to make a + working instrument: a [reward-delivery rig](recipes/head-fixed-reward.md), an + [odour stimulator](recipes/odour-stimulator.md), a + [gas-analyser multiplexer](recipes/li850-multiplexer.md), and more. +- 🔧 **[Techniques](techniques/soldering.md)** — the kitchen skills: soldering a + board, flashing MicroPython, and designing your own daughter board. +- 🎓 **[Courses](courses/intro-to-electronics/index.md)** — a project-based + introduction to electronics and MicroPython for total beginners. + +## Why BeeHive + +- ⚡ **Built for the lab.** Runs on 12 V DC (mains adapter *or* battery), + handles the currents and voltages real equipment needs (e.g. Peltier elements + at 12 V / 5 A) that hobby prototyping systems don't. +- 🔁 **Interoperable.** The connector order matches + [Grove](https://wiki.seeedstudio.com/Grove_System/), + [Qwiic](https://www.sparkfun.com/qwiic) and + [STEMMA](https://learn.adafruit.com/introducing-adafruit-stemma-qt/what-is-stemma), + and a MikroBUS mainboard opens up 500+ Click Boards. +- 🐍 **One language, end to end.** Program in MicroPython — the same Python you + already use for data analysis — from experiment control to plotting. Or drop + to C++ (Arduino) when you need an existing library. +- 🌍 **Buildable anywhere.** Through-hole parts, 1–2 layer boards, and cheap + worldwide-available components mean boards can be hand-soldered or home-etched. + +!!! tip "New here?" + Start with [What is BeeHive?](introduction/what-is-beehive.md) for the + concepts, then [Getting started](introduction/getting-started.md) to pick + your path — build a recipe, learn the basics, or design a new board. diff --git a/docs/ingredients/actuators.md b/docs/ingredients/actuators.md new file mode 100644 index 0000000..479408e --- /dev/null +++ b/docs/ingredients/actuators.md @@ -0,0 +1,125 @@ +--- +title: Actuators +--- + + + +# Actuators + +Actuator boards make things happen in the world — drive motors, solenoids, Peltier elements, and LEDs. + +## H-bridge driver { #h-bridge-driver } + +![H-bridge driver](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hbridge_driver/hbridge_driver_3D.png?raw=true){ width=280 } + +A full-bridge driver (2 n-channel + 2 p-channel MOSFETs driven by a TC4420) with a connector for a DS18B20 temperature sensor. A low-pass filter makes it Peltier-compatible. Output up to 12 V / 5 A. + +| | | +| --- | --- | +| **Key parts** | TC4420 driver, n/p-channel MOSFETs, DS18B20 connector | +| **Power** | 12 V / 5 A max output | +| **Size** | Big | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/H-bridge-driver) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/hbridge_driver) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/hbridge_driver/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/hbridge_driver/hbridge_driver.kicad_pcb) + +??? note "Bill of materials — 17 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | U1, U2 | 2 | TC4420 footprint PDIP-8 | + | Q1, Q2 | 4 | IRF9Z34NPBF or IRF4905PbF footprint TO-220AB | + | Q3, Q4 | 4 | IRFZ24NPBF or IRFZ44NPbF footprint TO-220AB | + | R3, R4, R5, R7 | 4 | Resistor 47 ohm 250mW through-hole | + | R1, R2, R8, R9 | 4 | Resistor 1k ohm 250mW through-hole | + | R10 | 1 | Resistor 220 ohm 250mW through-hole | + | R11 | 1 | Resistor 560 ohm 250mW through-hole | + | C1, C2, C6, C7 | 4 | 100nF Capacitor Disc | + | C3, C4, C5 | 3 | 22uF CP_Radial_D5.0mm_P2.00mm | + | L1, L2 | 2 | INDUCTOR 33µH Neosid MA-Bs75 | + | J1, J2 | 2 | CONN HEADER XH TOP 2POS 2.5MM | + | J3 | 1 | CONN HEADER XH TOP 4POS 2.5MM | + | J6 | 1 | Terminal block 5mm | + | D1, D2 | 2 | 3mm LED any colour | + | cables | 16 | JUMPER SXH-001T-P0.6 X2 10"" | + | connectors 2pin | 4 | CONN HOUSING 2.5MM 2POS | + | connectors 4pin | 6 | CONN HOUSING 2.5MM 4POS | + +## Switch array { #switch-array } + +![Switch array](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/8_switch_array/8_switch_array_3D.png?raw=true){ width=280 } + +Uses a 74HC595 shift register to control many components from few pins. Switched load voltage can vary from 5 to 12 V. + +| | | +| --- | --- | +| **Key parts** | 74HC595 shift register | +| **Power** | 5–12 V switched | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Switch-array) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/8-switch-array) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/8_switch_array/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/8_switch_array/8_switch_array.kicad_pcb) + +??? note "Bill of materials — 9 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | U1 | 1 | SN74HC595 – PDIP-16 | + | Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 | 8 | 1A NPN | + | R1, R2, R3, R4, R5, R6, R7, R8 | 8 | Resistor 270 ohm 250mW through-hole | + | C1 | 1 | 100nF Capacitor Disc | + | J1, J2 | 2 | CONN HEADER XH TOP 4POS 2.5MM | + | J3, J4, J5, J6, J7, J8, J9, J10, J11 | 9 | CONN HEADER XH TOP 2POS 2.5MM | + | cables | 26 | JUMPER SXH-001T-P0.6 X2 10"" | + | connectors 2pin | 18 | CONN HOUSING 2.5MM 2POS | + | connectors 4pin | 4 | CONN HOUSING 2.5MM 4POS | + +## High-power switch array { #high-power-switch-array } + +![High-power switch array](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hp_led_switch/hp_led_switch_3D.png?raw=true){ width=280 } + +Based on a TC4427 driver and n-channel MOSFETs for switching power-hungry components at 12 V / 5 A, drawn from the mainboard or the 12V5A breakout. + +| | | +| --- | --- | +| **Key parts** | TC4427 driver, n-channel MOSFETs | +| **Power** | 12 V / 5 A | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/High-power-switch-array) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/hp-led-switch) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/hp_led_switch/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/hp_led_switch/hp_led_switch.kicad_pcb) + +??? note "Bill of materials — 10 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | J1, J2 | 2 | CONN HEADER XH TOP 4POS 2.5MM | + | J3, J4, J5, J6 | 4 | CONN HEADER XH TOP 2POS 2.5MM | + | C1, C2 | 2 | 100nF Capacitor Disc | + | Q1, Q2, Q3, Q4 | 4 | IRFZ24NPBF or IRFZ44NPbF footprint TO-220AB | + | U1, U2 | 2 | TC4427 footprint PDIP-8 | + | R1, R2, R3, R4 | 4 | Resistor 47 ohm 250mW through-hole | + | R5, R6, R7, R8 | 4 | Resistor 1k ohm 250mW through-hole | + | cables | 6 | JUMPER SXH-001T-P0.6 X2 10"" | + | connectors 2pin | 8 | CONN HOUSING 2.5MM 2POS | + | connectors 4pin | 4 | CONN HOUSING 2.5MM 4POS | + +## Solenoid control board { #solenoid-control-board } + +A "traditional" solenoid driver for applications that do not need the fastest opening times. Use the Spike & Hold board when sub-millisecond opening matters. + +| | | +| --- | --- | +| **Key parts** | MOSFET driver | +| **Power** | 12 V | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Solenoid-control-board) | + +## Spike & Hold board { #spike-and-hold-board } + +A purpose-built driver replicating the Lee Company "Spike & Hold" circuit, overdriving solenoids for opening times in the hundreds of microseconds (at the cost of solenoid lifetime). Pairs with the 12V/24V boost converter. + +| | | +| --- | --- | +| **Key parts** | Spike & Hold circuit | +| **Power** | 12 V / 24 V | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Spike&Hold-board) | + diff --git a/docs/ingredients/index.md b/docs/ingredients/index.md new file mode 100644 index 0000000..88bb575 --- /dev/null +++ b/docs/ingredients/index.md @@ -0,0 +1,40 @@ +--- +title: Ingredients +--- + + + +# Ingredients + +Every BeeHive build is made from **ingredients**: a *mainboard* that carries the microcontroller, plus *daughter boards* that each do one job — drive an actuator or read a sensor. Combine them like a recipe to build an application. Each board follows the same 4-pin connector (two data lines, power, ground), so they mix and match freely. + +## Categories + +- **[Mainboards](mainboards.md)** — The mainboard carries the microcontroller and breaks out every pin. Most builds need exactly one. *(2 boards)* +- **[Power management](power.md)** — Power-management boards distribute and convert the 12 V supply so each part of a build gets the voltage and current it needs. *(3 boards)* +- **[Actuators](actuators.md)** — Actuator boards make things happen in the world — drive motors, solenoids, Peltier elements, and LEDs. *(5 boards)* +- **[Sensors](sensors.md)** — Sensor boards read the world — gas, humidity, temperature, and infrared. *(3 boards)* +- **[Utilities](utilities.md)** — Utility boards condition or translate signals rather than driving an actuator or reading a sensor — the glue between other boards. *(1 board)* +- **[Training](training.md)** — The Training board is for learning, not for a build — a testbed that gathers common components so you can master electronics and MicroPython one concept at a time. See the [Intro to Electronics course](../courses/intro-to-electronics/index.md). *(1 board)* + +## At a glance + +| Board | Category | Function | +| ----- | -------- | -------- | +| [ESP32 BeeHive mainboard](mainboards.md#esp32-mainboard) | Mainboards | Carries the ESP32 microcontroller and breaks out every pin. | +| [MikroBUS-compatible BeeHive mainboard](mainboards.md#mikrobus-mainboard) | Mainboards | ESP32 mainboard with added MikroBUS / Click Board compatibility. | +| [12V5A breakout](power.md#12v5a-breakout) | Power management | Distributes 12 V / 5 A to other boards. | +| [5V3A breakout](power.md#5v3a-breakout) | Power management | Steps 12 V / 5 A down to 5 V / 3 A. | +| [12V/24V boost converter](power.md#12v-24v-boost) | Power management | Boosts 12 V / 5 A up to 24 V / 1 A. | +| [H-bridge driver](actuators.md#h-bridge-driver) | Actuators | Drives DC motors and Peltier elements. | +| [Switch array](actuators.md#switch-array) | Actuators | Switches many low-power loads (e.g. LEDs) over few pins. | +| [High-power switch array](actuators.md#high-power-switch-array) | Actuators | Switches power-demanding loads (e.g. high-power LEDs). | +| [Solenoid control board](actuators.md#solenoid-control-board) | Actuators | Controls solenoid valves (standard speed). | +| [Spike & Hold board](actuators.md#spike-and-hold-board) | Actuators | Drives solenoids in "Spike & Hold" mode for fast opening. | +| [Gas sensor](sensors.md#gas-sensor) | Sensors | Detects gas-related environmental variables. | +| [Humidity & temperature sensor](sensors.md#humidity-temperature-sensor) | Sensors | Monitors humidity and temperature. | +| [IR sensor array](sensors.md#ir-sensor-array) | Sensors | Hosts paired IR LEDs and phototransistors (e.g. nose-poke ports). | +| [Level shifter](utilities.md#level-shifter) | Utilities | Bi-directional 5 V ↔ 3.3 V logic level translation. | +| [Training board](training.md#training-board) | Training | A teaching board covering the core electronic building blocks. | + diff --git a/docs/ingredients/mainboards.md b/docs/ingredients/mainboards.md new file mode 100644 index 0000000..f4b194f --- /dev/null +++ b/docs/ingredients/mainboards.md @@ -0,0 +1,49 @@ +--- +title: Mainboards +--- + + + +# Mainboards + +The mainboard carries the microcontroller and breaks out every pin. Most builds need exactly one. + +## ESP32 BeeHive mainboard { #esp32-mainboard } + +![ESP32 BeeHive mainboard](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/central_hub/central_hub_3D.png?raw=true){ width=280 } + +The heart of the BeeHive system. Built around the ESP32 (8 digital lines, 3 analog inputs, 2 I2C channels, 1 UART, plus SPI, Bluetooth and WiFi), it exposes all pins through the standard 4-pin JST daughter-board connectors and handles 12 V power management. Programmable in MicroPython or C++ (Arduino). + +| | | +| --- | --- | +| **Key parts** | ESP32-WROOM, 12 V to 5 V regulator, JST-PH connectors | +| **Power** | 12 V DC in; supplies 12 V and 5 V to daughter boards | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Main-hub) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/central-hub) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/central_hub/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/central_hub/beehive.kicad_pcb) + +??? note "Bill of materials — 9 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | U1 | 1 | LM2596 5v | + | U3 | 1 | ESP32-DevKitC-VIB | + | P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14 | 14 | CONN HEADER XH TOP 4POS 2.5MM | + | P15, P16 | 2 | CONN HEADER XH TOP 2POS 2.5MM | + | L1 | 1 | INDUCTOR 33µH Neosid MA-Bs75 | + | D1 | 1 | Diode Schottky 5A DO-201AD | + | CON1 | 1 | 2.1mm socket | + | C1 | 1 | 680µF Capacitor | + | C2 | 1 | CAP ALUM 220UF 20% 25V RADIAL | + +## MikroBUS-compatible BeeHive mainboard { #mikrobus-mainboard } + +Same ESP32 core as the original mainboard, plus connectors for the MikroBUS open standard — opening up MikroElektronika's ecosystem of 500+ Click Boards while keeping MicroPython control. Serves as an integration example with an established third-party platform. + +| | | +| --- | --- | +| **Key parts** | ESP32-WROOM, MikroBUS sockets, Qwiic connectors | +| **Power** | 12 V DC in | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive) | + diff --git a/docs/ingredients/power.md b/docs/ingredients/power.md new file mode 100644 index 0000000..7e478f0 --- /dev/null +++ b/docs/ingredients/power.md @@ -0,0 +1,78 @@ +--- +title: Power management +--- + + + +# Power management + +Power-management boards distribute and convert the 12 V supply so each part of a build gets the voltage and current it needs. + +## 12V5A breakout { #12v5a-breakout } + +![12V5A breakout](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/12V5A_breakout/12V5A_breakout_3D.png?raw=true){ width=280 } + +A barrel-jack input, a power LED indicator and nine connectors that fan 12 V / 5 A out to the mainboard and daughter boards. + +| | | +| --- | --- | +| **Key parts** | Barrel jack, Power LED, 9 × output connectors | +| **Power** | 12 V / 5 A in and out | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/12V5A-breakout) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/12V5A_breakout) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/12V5A_breakout/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/12V5A_breakout/12V5A_breakout.kicad_pcb) + +??? note "Bill of materials — 4 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | J1 | 1 | 2.1mm socket | + | J2, J3, J4, J5, J6, J7, J8, J9, J10 | 9 | CONN HEADER XH TOP 2POS 2.5MM | + | R1 | 1 | Resistor 560 ohm 250mW through-hole | + | D1 | D2; | 2 | + +## 5V3A breakout { #5v3a-breakout } + +![5V3A breakout](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/power_supply/power_supply_3D.png?raw=true){ width=280 } + +Converts 12 V / 5 A to 5 V / 3 A using an LM2596 regulator. Fed from either mainboard 12 V output; can be daisy-chained to another 5 V / 3 A breakout. + +| | | +| --- | --- | +| **Key parts** | LM2596 | +| **Power** | 12 V / 5 A in; 5 V / 3 A out | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/5V3A-breakout) | + +## 12V/24V boost converter { #12v-24v-boost } + +![12V/24V boost converter](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/12_24_boost_converter/12_24_boost_converter_3D.png?raw=true){ width=280 } + +A 555-based step-up converter that provides up to 24 V / 1 A — used to power solenoids in "Spike & Hold" mode, or any other 24 V device. Powered from the mainboard or the 12V5A breakout. + +| | | +| --- | --- | +| **Key parts** | 555 timer IC | +| **Power** | 12 V / 5 A in; 24 V / 1 A out | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Boost-converter-12V-to-24V) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/12_24_boost_converter) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/12_24_boost_converter/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/12_24_boost_converter/12_24_boost_converter.kicad_pcb) + +??? note "Bill of materials — 13 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | Q1 | 1 | IRFZ24NPBF or IRFZ44NPbF footprint TO-220AB | + | R1, R2, R3 | 3 | Resistor 47 ohm 250mW through-hole | + | R4 | 1 | Resistor 1k ohm 250mW through-hole | + | R5 | 1 | Resistor 560 ohm 250mW through-hole | + | C1, C2 | 2 | 100nF Capacitor Disc | + | C3 | 1 | 22uF CP_Radial_D5.0mm_P2.00mm | + | L1 | 1 | INDUCTOR 33µH Neosid MA-Bs75 | + | J1, J2, J3, J4 | 4 | CONN HEADER XH TOP 2POS 2.5MM | + | D1 | 1 | Diode Schottky 5A DO-201AD | + | D2 | 1 | 3mm LED any colour | + | cables | 16 | JUMPER SXH-001T-P0.6 X2 10"" | + | connectors 2pin | 4 | CONN HOUSING 2.5MM 2POS | + | connectors 4pin | 6 | CONN HOUSING 2.5MM 4POS | + diff --git a/docs/ingredients/sensors.md b/docs/ingredients/sensors.md new file mode 100644 index 0000000..a7661f0 --- /dev/null +++ b/docs/ingredients/sensors.md @@ -0,0 +1,71 @@ +--- +title: Sensors +--- + + + +# Sensors + +Sensor boards read the world — gas, humidity, temperature, and infrared. + +## Gas sensor { #gas-sensor } + +![Gas sensor](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/gas_sensor/gas_sensor_3d.png?raw=true){ width=280 } + +Built around an MQ-6 gas sensor; swapping in another MQ-series sensor lets it detect different gases. + +| | | +| --- | --- | +| **Key parts** | MQ-6 (MQ-series) sensor | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Gas-sensor) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/gas_sensor) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/gas_sensor/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/gas_sensor/gas_sensor.kicad_pcb) + +??? note "Bill of materials — 8 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | A1 | 1 | MQ-135 or any other MQ sensor | + | U1 | 1 | LM393 | + | RV1 | 1 | 3362P-1-103 10k Ohm | + | R1 | 1 | Resistor 4.7k ohm 250mW through-hole | + | R2, R3 | 2 | Resistor 220 ohm 250mW through-hole | + | C1 | 1 | 100nF Capacitor Disc | + | J1 | 1 | CONN HEADER XH TOP 4POS 2.5MM | + | D1 | D2; | 2 | + +## Humidity & temperature sensor { #humidity-temperature-sensor } + +![Humidity & temperature sensor](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hum_temp_sensor/hum_temp_sensor_3d.png?raw=true){ width=280 } + +Compatible with both DHT11 and DHT22 sensors. + +| | | +| --- | --- | +| **Key parts** | DHT11, DHT22 | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Humidity-and-temperature-sensor) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/hum_temp_sensor) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/hum_temp_sensor/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/hum_temp_sensor/hum_temp_sensor.kicad_pcb) + +??? note "Bill of materials — 7 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | A1 | 1 | DHT11 or DHT22 | + | RV1 | 1 | 3362P-1-103 10k Ohm | + | R1 | 1 | Resistor 5.1k ohm 250mW through-hole | + | R2 | 1 | Resistor 220 ohm 250mW through-hole | + | C1 | 1 | 100nF Capacitor Disc | + | J1 | 1 | CONN HEADER XH TOP 4POS 2.5MM | + | D1 | 1 | 3mm LED any colour | + +## IR sensor array { #ir-sensor-array } + +Accommodates 6 pairs of infrared LEDs and matching phototransistors — used for nose-poke detection and beam-break tracking with microsecond precision. + +| | | +| --- | --- | +| **Key parts** | 6 × IR LED + phototransistor pairs | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/IR-sensor-array) | + diff --git a/docs/ingredients/summary.md b/docs/ingredients/summary.md deleted file mode 100644 index 273d43b..0000000 --- a/docs/ingredients/summary.md +++ /dev/null @@ -1,21 +0,0 @@ -# Summary of hardware - - -| Hardware | Type || Function || - ----- | ---- | - | ----- | - | -[Main hub](https://github.com/BeeHive-org/BeeHive/wiki/Main-hub) | Control | ![dc-driver](../assets/icons/chip.svg) | Control | ![hub](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/central_hub/central_hub_3D.png?raw=true) -[12V5A breakout](https://github.com/BeeHive-org/BeeHive/wiki/12V5A-breakout) | Power management | ![dc-driver](../assets/icons/chip2.svg) | 12V breakout | ![12V5A](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/12V5A_breakout/12V5A_breakout_3D.png?raw=true) -[5V3A breakout](https://github.com/BeeHive-org/BeeHive/wiki/5V3A-breakout) | Power management | ![dc-driver](../assets/icons/chip2.svg) | 5V breakout | ![5V3A](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/power_supply/power_supply_3D.png?raw=true) -[12V/24V boost converter](https://github.com/BeeHive-org/BeeHive/wiki/Boost-converter-12V-to-24V) | Power management | ![dc-driver](../assets/icons/chip2.svg) | 12V to 24V converter | ![12V-to-24V](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/12_24_boost_converter/12_24_boost_converter_3D.png?raw=true) -[Gas sensor](https://github.com/BeeHive-org/BeeHive/wiki/Gas-sensor) | Sensor | ![dc-driver](../assets/icons/chip4.svg) | Gas sensor | ![gas-sensor](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/gas_sensor/gas_sensor_3d.png?raw=true) -[H-bridge driver](https://github.com/BeeHive-org/BeeHive/wiki/H-bridge-driver) | Actuator | ![dc-driver](../assets/icons/heater.svg) | Peltier element and DC motor driver | ![h-bridge](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hbridge_driver/hbridge_driver_3D.png?raw=true) -[Switch array](https://github.com/BeeHive-org/BeeHive/wiki/Switch-array) | Actuator | ![dc-driver](../assets/icons/led.svg) | Low power LEDs driver | ![switch](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/8_switch_array/8_switch_array_3D.png?raw=true) -[High power switch array](https://github.com/BeeHive-org/BeeHive/wiki/High-power-switch-array) | Actuator | ![dc-driver](../assets/icons/led.svg) | High power LEDs driver | ![hp-switch](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hp_led_switch/hp_led_switch_3D.png?raw=true) -[Humidity and temperature sensor](https://github.com/BeeHive-org/BeeHive/wiki/Humidity-and-temperature-sensor) | Sensor | ![dc-driver](../assets/icons/thermometer.svg) | Humidity and temperature sensor | ![hum-temp-sensor](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/hum_temp_sensor/hum_temp_sensor_3d.png?raw=true) -[IR sensor array](https://github.com/BeeHive-org/BeeHive/wiki/IR-sensor-array) | Actuator/Sensor | ![dc-driver](../assets/icons/led.svg) | IR emitter and sensor | -[Level shifter](https://github.com/BeeHive-org/BeeHive/wiki/Level-shifter) | Control | ![dc-driver](../assets/icons/chip3.svg) | Bi-directional logic level shifter | ![level-shifter](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/level_shifter/level_shifter_3D.png?raw=true) -[Solenoid control board](https://github.com/BeeHive-org/BeeHive/wiki/Solenoid-control-board) | Actuator | ![dc-driver](../assets/icons/valve.svg) | Solenoid | -[Spike&Hold board](https://github.com/BeeHive-org/BeeHive/wiki/Spike&Hold-board) | Actuator | ![dc-driver](../assets/icons/chip2.svg) | Solenoid | - -!!! tip - Something useful. diff --git a/docs/ingredients/training.md b/docs/ingredients/training.md new file mode 100644 index 0000000..c15af5e --- /dev/null +++ b/docs/ingredients/training.md @@ -0,0 +1,39 @@ +--- +title: Training +--- + + + +# Training + +The Training board is for learning, not for a build — a testbed that gathers common components so you can master electronics and MicroPython one concept at a time. See the [Intro to Electronics course](../courses/intro-to-electronics/index.md). + +## Training board { #training-board } + +A board bringing together the modules a beginner needs to learn electronics and MicroPython: LEDs, push buttons, potentiometers, shift registers, rotary encoders, relays, and a temperature sensor. Together they cover digital input and output, analog input, and SPI communication. Paired with the guided exercises, it lets learners master coding and wiring one at a time, and doubles as a testbed for validating experiment logic before committing it to a real setup. + +| | | +| --- | --- | +| **Key parts** | 8-bit shift register + LED matrix, Push buttons, Potentiometers, Rotary encoders, Relay module, Digital temperature sensor | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive) | + +**Hardware files:** [Order & BOM on Kitspace](https://kitspace.org/BeeHive-org/BeeHive/testing_board) · [Gerbers](https://github.com/BeeHive-org/BeeHive/tree/master/hardware/PCBs/training_board/gerber) · [KiCad PCB](https://github.com/BeeHive-org/BeeHive/blob/master/hardware/PCBs/training_board/training_board.kicad_pcb) + +??? note "Bill of materials — 12 lines" + + | Ref | Qty | Description | + | --- | --- | ----------- | + | d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d21, d22 | 20 | indicator leds | + | d19, d20 | 2 | flyback diodes | + | j1, j2, j3, j4, j5, j6, j7, j8, j9, j16 | 10 | connector | + | u3 | 1 | tpic6595n | + | RV1, RV2 | 2 | potentiometer | + | U1, U2 | 2 | temp sensor | + | sw1, sw2, sw3, sw4 | 4 | push buttons | + | RLY1, RLY2 | 2 | relays | + | r1, r, 2, r3, r4, r5, r6, r7, r13, 14, r15, r16, r20, r21, r22, r23, r24, r25 | 20 | resistor 220 ohm | + | r18 | 1 | resistor 4.7kohm | + | r8, r9, r10, r12 | 1 | resistor 1kohm | + | r19, r26 | 1 | resistor 330ohm | + diff --git a/docs/ingredients/utilities.md b/docs/ingredients/utilities.md new file mode 100644 index 0000000..1a4d51e --- /dev/null +++ b/docs/ingredients/utilities.md @@ -0,0 +1,22 @@ +--- +title: Utilities +--- + + + +# Utilities + +Utility boards condition or translate signals rather than driving an actuator or reading a sensor — the glue between other boards. + +## Level shifter { #level-shifter } + +![Level shifter](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/level_shifter/level_shifter_3D.png?raw=true){ width=280 } + +A bi-directional level shifter (based on the BSS138 MOSFET, inspired by Adafruit's design) letting 5 V and 3.3 V devices communicate. + +| | | +| --- | --- | +| **Key parts** | BSS138 MOSFET | +| **Details** | [Board page & schematics](https://github.com/BeeHive-org/BeeHive/wiki/Level-shifter) | + diff --git a/docs/introduction/design-rules.md b/docs/introduction/design-rules.md new file mode 100644 index 0000000..bf21d82 --- /dev/null +++ b/docs/introduction/design-rules.md @@ -0,0 +1,48 @@ +--- +title: Design rules +description: The minimal rules that keep every BeeHive board interoperable. +--- + +# Design rules + +BeeHive has deliberately **few** rules. Enough to keep every board +interoperable and buildable anywhere — but not so many that they get in the way +of new ideas. A handful are strict; the rest are strong recommendations. + +## Strict rules + +These define what makes a board "BeeHive". Follow them and your board works with +everything else. + +1. **Two types of board.** *Mainboards* carry a microcontroller. *Daughter + boards* each perform **one** function (e.g. control a solenoid valve). +2. **One connector.** Main-to-daughter connections use a **4-pin connector**: + two general-purpose I/O (data) lines, one power line (VCC), and one ground + line (GND). + +![Connector pinout: DATA 1, DATA 2, VCC, GND](https://github.com/BeeHive-org/BeeHive/raw/master/hardware/PCBs/central_hub/central_hub_3D.png?raw=true){ width=320 } + +## Recommended rules + +Follow these so anyone, anywhere, can build and understand your board: + +- **1–2 PCB layers.** Keep routing to top and bottom layers so boards can be + replicated locally with perfboard, chemical etching, or CNC — or ordered + cheaply from [JLCPCB](https://jlcpcb.com/), [PCBway](https://www.pcbway.com/), + [OSH Park](https://oshpark.com/), or [Aisler](https://aisler.net). +- **Through-hole components** so boards can be hand-soldered with minimal kit, + by people with no prior experience. +- **Populate one side** of the board only. +- **Label everything** by the existing convention: connector pin identifiers, + the daughter-board name, and a version number. +- **Prefer a standard size:** + - **Big** — 71 × 45.5 mm + - **Small** — 48.5 × 45.5 mm +- **Size up** if the board is getting cramped. +- **Mounting holes:** typically 4, for M3 screws, each centre 3.5 mm from the + board edge. +- **If in doubt — reach out!** + +!!! tip "Ready to design one?" + See **[Build your own board](../techniques/build-your-own-board.md)** for a + step-by-step walkthrough from picking a function to submitting your design. diff --git a/docs/introduction/getting-started.md b/docs/introduction/getting-started.md new file mode 100644 index 0000000..94e0e4b --- /dev/null +++ b/docs/introduction/getting-started.md @@ -0,0 +1,59 @@ +--- +title: Getting started +description: Pick your path through BeeHive — build a recipe, learn the basics, or design a new board. +--- + +# Getting started + +There's no single way into BeeHive. Pick the path that matches what you're here +to do. + +## 🍯 I want to build something + +Head to the **[Recipes](../recipes/index.md)** — complete, documented builds you +can reproduce. Each lists the [ingredients](../ingredients/index.md) it uses, +the wiring, and the code. Good first recipes: + +- **[LI-850 multiplexer](../recipes/li850-multiplexer.md)** — parallelise gas + analysis across six chambers. +- **[Head-fixed reward delivery](../recipes/head-fixed-reward.md)** — add reward + + lick detection to a behavioural rig. + +Then you'll need to **[solder your boards](../techniques/soldering.md)** and +**[flash MicroPython](../techniques/micropython.md)** onto the mainboard. + +## 🎓 I'm new to electronics or coding + +Start with the **[Intro to Electronics course](../courses/intro-to-electronics/index.md)** +— a project-based introduction to microcontrollers, circuits, and MicroPython, +built around BeeHive's Training board. It lets you learn coding and electronics +one at a time before wiring up a real experiment. + +## 🧩 I want to design a new board + +Read **[What is BeeHive?](what-is-beehive.md)** and the +**[Design rules](design-rules.md)**, then follow +**[Build your own board](../techniques/build-your-own-board.md)**. New daughter +boards that follow the rules drop straight into the ecosystem. + +## What you'll need + +For most recipes: + +- A BeeHive **mainboard** and the daughter boards the recipe lists. +- A **12 V DC** supply (mains adapter or battery). +- Basic soldering kit — see [Soldering](../techniques/soldering.md). +- A computer with [Thonny](https://thonny.org/) to flash and program the ESP32. + +## Get in touch + +BeeHive is an open community — we'd love to hear from you, whether you're +building, teaching, or contributing. + +- 🐛 Questions & ideas: the + [issues page](https://github.com/BeeHive-org/BeeHive/issues) +- ✉️ Email: [a.maia-chagas@sussex.ac.uk](mailto:a.maia-chagas@sussex.ac.uk) + +!!! note "Labs using BeeHive" + King, Maravall, Schröder, Baden, Niven, and Lagnado labs — among others. + Using BeeHive in your lab? [Let us know](https://github.com/BeeHive-org/BeeHive/issues). diff --git a/docs/introduction/what-is-beehive.md b/docs/introduction/what-is-beehive.md new file mode 100644 index 0000000..8782160 --- /dev/null +++ b/docs/introduction/what-is-beehive.md @@ -0,0 +1,78 @@ +--- +title: What is BeeHive? +description: The concepts behind BeeHive — mainboards, daughter boards, and the ingredients-and-recipes model. +--- + +# What is BeeHive? + +**BeeHive is an open system that makes it easier to build scientific equipment +and to learn basic electronics.** It grew out of a simple problem: researchers +often need custom instruments, but building one usually means either +commissioning a company or starting a bespoke design from scratch — and the +result rarely gets reused. + +BeeHive fixes that with a small set of standard, reusable parts and a **minimal +set of design rules** that keep everything interoperable. + +## The building blocks + +BeeHive has just two kinds of board: + +- **Mainboard** — carries the microcontroller (an ESP32) and breaks out every + pin through standard connectors. Most builds need exactly one. +- **Daughter boards (DBs)** — each does *one* job: drive a solenoid, switch + high-power LEDs, read a temperature sensor, and so on. + +They connect through a single **4-pin connector** — two data lines, one power +line, one ground — so any daughter board plugs into any port. Because each DB is +self-contained and single-purpose, the same board works across wildly different +experiments: a solenoid controller might meter a water reward for a mouse in one +lab and drive greenhouse irrigation in another. + +Browse the full catalogue in **[Ingredients](../ingredients/index.md)**. + +## Ingredients and recipes + +We describe BeeHive the way you'd describe cooking: + +| Metaphor | In BeeHive | +| -------- | ---------- | +| **Ingredients** | Boards — the mainboard and daughter boards | +| **Recipes** | Complete builds that combine boards into a working instrument | +| **Techniques** | The skills a recipe assumes: soldering, flashing firmware, board design | + +A [recipe](../recipes/index.md) lists the ingredients it uses (e.g. *mainboard +1×, solenoid control board 6×*), how to wire them, and the code to run them — +just like a cooking recipe lists ingredients and method. + +## Software + +- **MicroPython first.** BeeHive is driven mostly with + [MicroPython](https://micropython.org/), a Python 3 implementation for + microcontrollers. Since it's the same language most researchers already use + for data analysis, you can go from experiment control to plotting without + switching languages — and beginners learn one language for everything. +- **C++ when you need it.** The ESP32 can also run Arduino/C++, so you can reuse + existing libraries (the [mouse maze](../recipes/mouse-maze.md) recipe does + exactly this for the Adafruit servo driver). + +## Why not use an existing system? + +BeeHive is compatible with prototyping systems like +[Grove](https://wiki.seeedstudio.com/Grove_System/), +[Qwiic](https://www.sparkfun.com/qwiic) and +[STEMMA](https://learn.adafruit.com/introducing-adafruit-stemma-qt/what-is-stemma) +(same connector order; adapter boards available). But it exists because those +systems weren't built for the lab: + +1. **Power.** Scientific gear often needs currents and voltages hobby systems + don't handle — e.g. Peltier elements at 12 V / 5 A. BeeHive runs on 12 V DC + and its boards are rated for it. +2. **Control.** Owning the ecosystem means we can design exactly the daughter + boards research needs, behaving exactly as required — and fill gaps where no + commercial board exists. + +!!! tip "Where next?" + Read the **[Design rules](design-rules.md)** to understand what keeps + BeeHive interoperable, or jump to **[Getting started](getting-started.md)** + to pick a path. diff --git a/docs/javascripts/Mathjax.js b/docs/javascripts/Mathjax.js index 0f4b6e6..3639287 100644 --- a/docs/javascripts/Mathjax.js +++ b/docs/javascripts/Mathjax.js @@ -1,16 +1,34 @@ +// MathJax configuration for pymdownx.arithmatex (generic mode). +// +// Arithmatex wraps each formula in an element with class "arithmatex"; MathJax +// renders those. `document$` is Zensical/Material's instant-navigation +// observable, so we re-typeset after every client-side page swap. window.MathJax = { - tex: { - inlineMath: [["\\(", "\\)"]], - displayMath: [["\\[", "\\]"]], - processEscapes: true, - processEnvironments: true - }, - options: { - ignoreHtmlClass: ".*|", - processHtmlClass: "arithmatex" + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true, + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex", + }, +}; + +// Re-typeset on every (instant-)navigation. The guard matters: `document$` fires +// its first emission immediately — before the MathJax library (loaded by the +// next -{% endblock %} diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 56e8e86..0000000 --- a/mkdocs.yml +++ /dev/null @@ -1,86 +0,0 @@ -# Site information -site_name: BeeHive -site_url: https://beehive-org.github.io/ -site_description: A flexible open hardware platform for equipment development -#site_sub_description: Science your way - -# Repository -repo_name: BeeHive-org -repo_url: https://github.com/BeeHive-org/ - -# Theme -theme: - custom_dir: material/ - name: material - include_sidebar: true - features: - - navigation.sections - - navigation.tabs - - toc.integrate - logo: 'assets/images/beehive.png' - icon: - repo: 'fontawesome/brands/github' - palette: - - media: "(prefers-color-scheme: light)" - primary: amber - accent: indigo - toggle: - icon: material/toggle-switch-off-outline - name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - toggle: - icon: material/toggle-switch - name: Switch to light mode - - -# Extras -extra_javascript: - - https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js - - javascripts/tables.js - #math formulas - - javascripts/mathjax.js - - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - - -plugins: - - search - #- bibtex: - # cite_style: 'plain' - # bib_file: 'docs/bibliography.bib' - #csl_file: 'docs/apa.csl' - -markdown_extensions: - - footnotes - - admonition - - attr_list - - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg -# Page tree -nav: - - Home: index.md - - Introduction: - - getting-started.md - - what-is-about.md - - Preparations: - - Assembly guide: - - assembly-guide.md - - soldering.md - - Boards: - - board-hub.md - - Microcontrollers: - - micropython.md - - Usage: - - user-guide.md - - Recipes: - - recipes/intro.md - - LI850 multiplexer: recipes/LI850-multiplexer.md - - 5 choice serial reaction task: recipes/5-choice-serial-reaction-task.md - - 3 axis controller: - - test: mkdosrecipes/3-axis-controller/test.md - - Ingredients: - - ingredients/summary.md - - Courses: - - courses/intro_to_electronics.md diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..38a5a65 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "beehive-docs" +version = "0.1.0" +description = "Documentation site for BeeHive — a flexible open electronics platform for research equipment." +requires-python = ">=3.12" +dependencies = [] + +# The documentation site is built with Zensical (the successor to MkDocs by the +# Material for MkDocs team). Tasks are run with poethepoet, e.g. `uv run poe +# serve`. The `gen` task regenerates every auto-built page (the Ingredients +# catalogue) from the YAML sources in ./data, so the site always mirrors the +# single source of truth; `serve` and `build` run it first. +[dependency-groups] +docs = [ + "zensical>=0.0.46", + "pyyaml>=6", + "poethepoet>=0.29", +] + +[tool.poe.tasks] +sync = { cmd = "python docs/scripts/sync_kitspace.py", help = "Vendor board BOMs from the BeeHive repo's kitspace.yaml into docs/data/kitspace/" } +gen = { cmd = "python docs/scripts/build_ingredients.py", help = "Regenerate the Ingredients catalogue from docs/data/ingredients/*.yaml" } +serve = { cmd = "zensical serve", deps = ["gen"], help = "Serve the docs locally with live reload" } +build = { cmd = "zensical build", deps = ["gen"], help = "Build the static site into ./site" } + +[tool.uv] +default-groups = ["docs"] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..b41bf2a --- /dev/null +++ b/uv.lock @@ -0,0 +1,303 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "beehive-docs" +version = "0.1.0" +source = { virtual = "." } + +[package.dev-dependencies] +docs = [ + { name = "poethepoet" }, + { name = "pyyaml" }, + { name = "zensical" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +docs = [ + { name = "poethepoet", specifier = ">=0.29" }, + { name = "pyyaml", specifier = ">=6" }, + { name = "zensical", specifier = ">=0.0.46" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "deepmerge" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/78/6e9e20106224083cfb817d2d3c26e80e72258d617b616721a169b87081e0/deepmerge-2.1.0.tar.gz", hash = "sha256:07ca7a7b8935df596c512fa8161877c0487ac61f691c07766e7d71d2b23bdd2f", size = 21449, upload-time = "2026-06-22T05:46:07.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/25/2a75b47cb057b1e164c604fb81ab690a6cdb5e2260ce651194eae90f64a3/deepmerge-2.1.0-py3-none-any.whl", hash = "sha256:8f148339a91d680a75ecb74ade235d9e759a93df373a0b04e9d31c8666cfeb75", size = 14345, upload-time = "2026-06-22T05:46:06.742Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "pastel" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/f1/4594f5e0fcddb6953e5b8fe00da8c317b8b41b547e2b3ae2da7512943c62/pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d", size = 7555, upload-time = "2020-09-16T19:21:12.43Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/18/a8444036c6dd65ba3624c63b734d3ba95ba63ace513078e1580590075d21/pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364", size = 5955, upload-time = "2020-09-16T19:21:11.409Z" }, +] + +[[package]] +name = "poethepoet" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pastel" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/92/93a4af9511b8c7c647874521d9e6c904266be98067c2ee1eb2e74520d208/poethepoet-0.48.0.tar.gz", hash = "sha256:a06f49d244fadfc2e2e7faa78b54e64a9694727e4ce1d50e08f23cea3ded74f1", size = 148679, upload-time = "2026-07-05T21:48:30.106Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8d/d7c9455b15f8d2d7ce57e7b71a8ef8d02d9992ae4283c9777120620c9022/poethepoet-0.48.0-py3-none-any.whl", hash = "sha256:98da6096d060f49b8d84034770265863fb7dc92a40233b7694b9d216ac68737d", size = 185808, upload-time = "2026-07-05T21:48:28.601Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "11.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/a9/5f0c535ba3b08fe09270c16808e053a968868242ecbd5676d4e3a488bf28/pymdown_extensions-11.0.1.tar.gz", hash = "sha256:dd2905ae6fc5b75582fafb139a1266ffc754705efa902aa50067fa7ff4f94ec0", size = 857113, upload-time = "2026-07-02T17:59:22.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/54/da572c98c0b77626a91b5d3b89f0231d8bff5125c225420908632f8b342d/pymdown_extensions-11.0.1-py3-none-any.whl", hash = "sha256:db3943a62bab7e03af1364f0c4083e64b91fb097675a4b6cceccfbe9a77e5eb2", size = 269455, upload-time = "2026-07-02T17:59:21.271Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "zensical" +version = "0.0.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "deepmerge" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "pyyaml" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/79/f7959b13c766a831f1248779bb718555f70f40c5b8e68db7de1de9936662/zensical-0.0.50.tar.gz", hash = "sha256:7040e52ebe5e6a275e4edeb351bf2bc314d007f3fb5750f178a38d840723e69c", size = 3979246, upload-time = "2026-07-09T13:52:11.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/d2/e126d56642a5fd437eeb5a067b7c0d1f766c08e22d6a708bb923986f1d44/zensical-0.0.50-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:26dda9dbacab84db2743726f83202798e1893fbfddecb6a845812d7a331043ad", size = 12817706, upload-time = "2026-07-09T13:51:29.624Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9b/e1a22fb4ea8fc3e8377d7b394ee06cf0349e7f9a64ecb4c9873dee79b102/zensical-0.0.50-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:376887def6470c57509b48519870f74e2b987e30509cf5c819fcf372771f9403", size = 12691061, upload-time = "2026-07-09T13:51:33.194Z" }, + { url = "https://files.pythonhosted.org/packages/38/f5/16c087635680efb39e1d7b7aa3c2cca548305aa29ad51dee04f37b32b65f/zensical-0.0.50-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bbf3034a2cb1a9d2a72a5ee7047688717c93da0d8a90d25dd871db8d5f33a6d", size = 13129505, upload-time = "2026-07-09T13:51:36.383Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/50d02402e53aa01a5c5c116a3522c7bb18d6ae4da964d8b236173b6fa086/zensical-0.0.50-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26fe4167663d544ca385ef420a49d3b738c7606a79d7a62a6bedcbf74cd383e7", size = 13055300, upload-time = "2026-07-09T13:51:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/cf/0f/45f4f3e56a6483ea9f88478b20d6b434718e7c46579239589202e5135ec1/zensical-0.0.50-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8813d1f8895b19520d4a982d6bfcfd06372d73d96e6a63f0d2cf8f3b6036d5a1", size = 13445447, upload-time = "2026-07-09T13:51:43.106Z" }, + { url = "https://files.pythonhosted.org/packages/33/9b/1f5065c664afde6a63e0ada8c14eae75f9e6960df597a5ca28c07340f938/zensical-0.0.50-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a64f957f94f7d8e8847a7f1e8205509ba4b188c93c157c5e7be49bcb8556a127", size = 13098775, upload-time = "2026-07-09T13:51:46.437Z" }, + { url = "https://files.pythonhosted.org/packages/46/65/1e42e18d8f9a0cb9fcc8b871852810c7fe196237b79aaa831e863325091e/zensical-0.0.50-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:781d333bcb42c6a6b92360e05eadc944e2674794e1a95537971de1bf64cb9f89", size = 13305922, upload-time = "2026-07-09T13:51:51.107Z" }, + { url = "https://files.pythonhosted.org/packages/50/36/9cace194ba13aef3bdde8ca2d327f3a05cdf5c456e94f6d896852e2cbd38/zensical-0.0.50-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:5d0f86eec76c23efb04566cd444bf025845ac8a02e75c8a6b4af13a39a2a9955", size = 13325488, upload-time = "2026-07-09T13:51:54.883Z" }, + { url = "https://files.pythonhosted.org/packages/b1/80/2891a9316e486794dae43151561b49f3313499cfb2c95c7886abad7bcf2d/zensical-0.0.50-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:392a7299a3c4d1ac7ff288bbed181d77a9fd23e6614180476e01630aaee0d67e", size = 13496866, upload-time = "2026-07-09T13:51:58.257Z" }, + { url = "https://files.pythonhosted.org/packages/7e/09/fbd3af58081a0d399fa913ef1f2fd6a007f2f06f7026c8d6a6096e34b996/zensical-0.0.50-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cac3448d8c8a76dfb43e55908b4ca9ad17596aee89a9287a184c1a0ba7dce2a2", size = 13437565, upload-time = "2026-07-09T13:52:01.766Z" }, + { url = "https://files.pythonhosted.org/packages/d3/79/709311ff202326260ff223fb6e9ddefa3100474c428e3c70a04036cefe0e/zensical-0.0.50-cp310-abi3-win32.whl", hash = "sha256:32b244f96a930f68e049b2e03d50790c120ef701b6277ddd854905a33040c75f", size = 12371966, upload-time = "2026-07-09T13:52:05.207Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e1/4babb30544d7465c95a6a93abc0680b1c51752411a225c2b7f2cb44e80c7/zensical-0.0.50-cp310-abi3-win_amd64.whl", hash = "sha256:2f054769bf96ae46353de3eca2463ad4db6df1da9fde515c6d7fc54c3608e615", size = 12604832, upload-time = "2026-07-09T13:52:09.013Z" }, +] diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 0000000..79eb150 --- /dev/null +++ b/zensical.toml @@ -0,0 +1,141 @@ +[project] +site_name = "BeeHive" +site_description = "A flexible open electronics platform for building research equipment and teaching electronics." +site_author = "The BeeHive contributors" +site_url = "https://beehive-org.github.io/" +repo_url = "https://github.com/BeeHive-org/BeeHive" +repo_name = "BeeHive-org/BeeHive" +copyright = "Copyright © The BeeHive contributors — open-source licensed" + +# Structural + typographic touches (fonts, boxed content, sidebar, footer cards) +# live in the stylesheet. The colour palette is BeeHive's "bumblebee": amber +# primary with a near-black accent, mirroring the pixi.sh / Croppy layout. +extra_css = ["stylesheets/extra.css"] + +# MathJax, for the LaTeX formulas in the electronics course. Mathjax.js holds the +# arithmatex (generic-mode) config; the CDN script does the rendering. +extra_javascript = [ + "javascripts/Mathjax.js", + "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js", +] + +nav = [ + { "Home" = "index.md" }, + { "Introduction" = [ + { "What is BeeHive?" = "introduction/what-is-beehive.md" }, + { "Getting started" = "introduction/getting-started.md" }, + { "Design rules" = "introduction/design-rules.md" }, + ] }, + { "Ingredients" = [ + { "Overview" = "ingredients/index.md" }, + { "Mainboards" = "ingredients/mainboards.md" }, + { "Power management" = "ingredients/power.md" }, + { "Actuators" = "ingredients/actuators.md" }, + { "Sensors" = "ingredients/sensors.md" }, + { "Utilities" = "ingredients/utilities.md" }, + { "Training" = "ingredients/training.md" }, + ] }, + { "Recipes" = [ + { "Overview" = "recipes/index.md" }, + { "Write your own recipe" = "recipes/write-your-own.md" }, + { "Head-fixed reward delivery" = "recipes/head-fixed-reward.md" }, + { "Mouse maze" = "recipes/mouse-maze.md" }, + { "Odour stimulator" = "recipes/odour-stimulator.md" }, + { "LI-850 multiplexer" = "recipes/li850-multiplexer.md" }, + { "5-choice serial reaction time" = "recipes/5-csrtt.md" }, + { "Mouse-wheel speed controller" = "recipes/mouse-wheel.md" }, + { "OpenFlexure stage controller" = "recipes/openflexure-controller.md" }, + { "Beyond neuroscience" = "recipes/beyond-neuroscience.md" }, + ] }, + { "Techniques" = [ + { "Soldering" = "techniques/soldering.md" }, + { "Flashing MicroPython" = "techniques/micropython.md" }, + { "Build your own board" = "techniques/build-your-own-board.md" }, + ] }, + { "Courses" = [ + { "Intro to Electronics" = [ + { "Overview" = "courses/intro-to-electronics/index.md" }, + { "Monday" = "courses/intro-to-electronics/monday.md" }, + { "Tuesday" = "courses/intro-to-electronics/tuesday.md" }, + { "Wednesday" = "courses/intro-to-electronics/wednesday.md" }, + { "Thursday" = "courses/intro-to-electronics/thursday.md" }, + { "Friday" = "courses/intro-to-electronics/friday.md" }, + { "Glossary" = "courses/intro-to-electronics/glossary.md" }, + ] }, + ] }, + { "Contributing" = [ + { "Overview" = "contributing.md" }, + { "AI use policy" = "ai-use-policy.md" }, + ] }, +] + +[project.theme] +language = "en" +logo = "assets/logo.png" +favicon = "assets/favicon.png" + +# A pixi.sh-style left sidebar: collapsible sections (no `navigation.sections`, +# which would flatten them into always-open groups; no `navigation.tabs`, which +# would move them into the header). `navigation.indexes` folds a section's +# overview page into its header where one exists. +features = [ + "content.code.copy", + "content.code.annotate", + "navigation.instant", + "navigation.instant.progress", + "navigation.indexes", + "navigation.top", + "navigation.tracking", + "navigation.footer", + "toc.follow", + "search.highlight", + "search.suggest", +] + +# Body in Inter, code in JetBrains Mono (like pixi.sh); the warm display serif +# for headings/titles is set in stylesheets/extra.css. +[project.theme.font] +text = "Inter" +code = "JetBrains Mono" + +[[project.theme.palette]] +media = "(prefers-color-scheme: light)" +scheme = "default" +primary = "amber" +accent = "amber" +toggle.icon = "material/weather-night" +toggle.name = "Switch to dark mode" + +[[project.theme.palette]] +media = "(prefers-color-scheme: dark)" +scheme = "slate" +primary = "amber" +accent = "amber" +toggle.icon = "material/weather-sunny" +toggle.name = "Switch to light mode" + +[project.markdown_extensions.admonition] +[project.markdown_extensions.attr_list] +[project.markdown_extensions.md_in_html] +[project.markdown_extensions.tables] +[project.markdown_extensions.footnotes] + +[project.markdown_extensions.pymdownx.arithmatex] +generic = true + +[project.markdown_extensions.pymdownx.details] + +[project.markdown_extensions.pymdownx.highlight] +anchor_linenums = true + +[project.markdown_extensions.pymdownx.inlinehilite] + +[project.markdown_extensions.pymdownx.superfences] + +[project.markdown_extensions.pymdownx.tabbed] +alternate_style = true + +[project.markdown_extensions.pymdownx.tasklist] +custom_checkbox = true + +[project.markdown_extensions.pymdownx.emoji]