summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--architecture.drawio161
-rw-r--r--power-seq-software/CMakeLists.txt51
-rwxr-xr-xpower-seq-software/flash.sh6
-rw-r--r--power-seq-software/power-seq-software.cpp47
-rw-r--r--relay-driver.txt17
5 files changed, 282 insertions, 0 deletions
diff --git a/architecture.drawio b/architecture.drawio
new file mode 100644
index 0000000..1738f3b
--- /dev/null
+++ b/architecture.drawio
@@ -0,0 +1,161 @@
+<mxfile host="Electron" modified="2025-08-22T07:31:13.719Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.21 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="CM1afp43bA9izsOq-ZkN" version="22.1.21" type="device">
+ <diagram name="Page-1" id="-o8cL_uSjTV1za5755RE">
+ <mxGraphModel dx="988" dy="570" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-1" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="480" y="280" width="430" height="430" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-8" target="2eTkTFWO_e10ghnzvoxV-10">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-8" target="2eTkTFWO_e10ghnzvoxV-11">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-8" target="2eTkTFWO_e10ghnzvoxV-12">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-8" target="2eTkTFWO_e10ghnzvoxV-13">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="670" y="425" />
+ <mxPoint x="670" y="510" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-8" target="2eTkTFWO_e10ghnzvoxV-16">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="670" y="425" />
+ <mxPoint x="670" y="560" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-8" target="2eTkTFWO_e10ghnzvoxV-15">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="670" y="425" />
+ <mxPoint x="670" y="610" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-8" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="720" y="320" width="170" height="140" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-9" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" target="2eTkTFWO_e10ghnzvoxV-8">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="1170" y="355" as="sourcePoint" />
+ <mxPoint x="1150" y="320" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-10" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="510" y="320" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-11" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="510" y="370" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-12" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="510" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-13" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="510" y="490" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-15">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="1140" y="670" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-15" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="510" y="590" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-16" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
+ <mxGeometry x="510" y="540" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-17" value="tinyfpga" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="764" y="325" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-19" target="2eTkTFWO_e10ghnzvoxV-17">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-19" value="AC/DC" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="810" y="325" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-29" target="2eTkTFWO_e10ghnzvoxV-19">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="853" y="355" />
+ <mxPoint x="853" y="340" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-22" target="2eTkTFWO_e10ghnzvoxV-17">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="760" y="335" />
+ <mxPoint x="760" y="340" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-22" value="switch" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="720" y="320" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-24" target="2eTkTFWO_e10ghnzvoxV-30">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-24" value="Relay" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="764" y="375" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-26" target="2eTkTFWO_e10ghnzvoxV-31">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-26" value="Relay" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="764" y="410" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-29" target="2eTkTFWO_e10ghnzvoxV-24">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="850" y="355" />
+ <mxPoint x="850" y="390" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fillColor=#f8cecc;strokeColor=#b85450;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-29" target="2eTkTFWO_e10ghnzvoxV-26">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="850" y="355" />
+ <mxPoint x="850" y="425" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-29" value="C14" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="860" y="340" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-30" value="C13" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="720" y="375" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-31" value="C13" style="rounded=0;whiteSpace=wrap;html=1;fontSize=8;" vertex="1" parent="1">
+ <mxGeometry x="720" y="410" width="30" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;jumpStyle=arc;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-17" target="2eTkTFWO_e10ghnzvoxV-26">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="779" y="360" />
+ <mxPoint x="810" y="360" />
+ <mxPoint x="810" y="418" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="2eTkTFWO_e10ghnzvoxV-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;jumpStyle=arc;fillColor=#dae8fc;strokeColor=#6c8ebf;" edge="1" parent="1" source="2eTkTFWO_e10ghnzvoxV-17" target="2eTkTFWO_e10ghnzvoxV-24">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="779" y="360" />
+ <mxPoint x="810" y="360" />
+ <mxPoint x="810" y="383" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/power-seq-software/CMakeLists.txt b/power-seq-software/CMakeLists.txt
new file mode 100644
index 0000000..002f651
--- /dev/null
+++ b/power-seq-software/CMakeLists.txt
@@ -0,0 +1,51 @@
+# Generated Cmake Pico project file
+
+cmake_minimum_required(VERSION 3.13)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
+
+# Initialise pico_sdk from installed location
+# (note this can come from environment, CMake cache etc)
+set(PICO_SDK_PATH "/usr/share/pico-sdk")
+
+set(PICO_BOARD pico CACHE STRING "Board type")
+
+# Pull in Raspberry Pi Pico SDK (must be before project)
+include(pico_sdk_import.cmake)
+
+# We also need PICO EXTRAS
+include($ENV{PICO_EXTRAS_PATH}/external/pico_extras_import.cmake)
+
+if (PICO_SDK_VERSION_STRING VERSION_LESS "1.4.0")
+ message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.4.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
+endif()
+
+project(power-seq-software C CXX ASM)
+
+# Initialise the Raspberry Pi Pico SDK
+pico_sdk_init()
+
+# Add executable. Default name is the project name, version 0.1
+
+add_executable(power-seq-software power-seq-software.cpp )
+
+pico_set_program_name(power-seq-software "power-seq-software")
+pico_set_program_version(power-seq-software "0.1")
+
+pico_enable_stdio_uart(power-seq-software 0)
+pico_enable_stdio_usb(power-seq-software 1)
+
+# Add the standard library to the build
+target_link_libraries(power-seq-software
+ pico_stdlib
+ hardware_sleep)
+
+# Add the standard include files to the build
+target_include_directories(power-seq-software PRIVATE
+ ${CMAKE_CURRENT_LIST_DIR}
+ ${CMAKE_CURRENT_LIST_DIR}/.. # for our common lwipopts or any other standard includes, if required
+)
+
+pico_add_extra_outputs(power-seq-software)
+
diff --git a/power-seq-software/flash.sh b/power-seq-software/flash.sh
new file mode 100755
index 0000000..058349d
--- /dev/null
+++ b/power-seq-software/flash.sh
@@ -0,0 +1,6 @@
+#/usr/bin/zsh
+
+sudo mount $1 /mnt
+sudo cp power-seq-software.uf2 /mnt
+sudo umount /mnt
+
diff --git a/power-seq-software/power-seq-software.cpp b/power-seq-software/power-seq-software.cpp
new file mode 100644
index 0000000..cb10215
--- /dev/null
+++ b/power-seq-software/power-seq-software.cpp
@@ -0,0 +1,47 @@
+#include <cstddef>
+#include <cstdint>
+#include <array>
+#include "pico/stdlib.h"
+#include "pico/sleep.h"
+#include "hardware/gpio.h"
+
+static constexpr std::size_t button_gpio = 6;
+static constexpr std::size_t led_gpio = 2;
+static constexpr std::array<std::size_t, 3> gpio_on_sequence { 3, 4, 5 };
+static constexpr std::array<std::size_t, 3> gpio_off_sequence { 5, 4, 3 };
+static constexpr std::size_t delay_ms = 100;
+
+int main()
+{
+ bool state = false;
+
+ // init LED
+ gpio_init(led_gpio);
+ gpio_set_dir(led_gpio, GPIO_OUT);
+ gpio_put(led_gpio, state);
+
+ // init relay GPIOs
+ for (auto const & relay : gpio_off_sequence)
+ {
+ gpio_init(relay);
+ gpio_set_dir(relay, GPIO_OUT);
+ gpio_put(relay, state);
+ }
+
+ while (true)
+ {
+ sleep_run_from_xosc();
+ sleep_goto_dormant_until_edge_high(button_gpio);
+ sleep_power_up();
+
+ state = !state;
+ gpio_put(led_gpio, state);
+
+ auto const & sequence = state ? gpio_on_sequence : gpio_off_sequence;
+ for (auto const & relay : sequence)
+ {
+ gpio_put(relay, state);
+ sleep_ms(delay_ms);
+ }
+ }
+}
diff --git a/relay-driver.txt b/relay-driver.txt
new file mode 100644
index 0000000..6ee9bac
--- /dev/null
+++ b/relay-driver.txt
@@ -0,0 +1,17 @@
+$ 1 0.000005 10.20027730826997 50 5 50 5e-11
+R 352 304 304 304 0 0 40 5 0 0 0.5
+s 352 368 416 368 0 1 false
+r 416 368 496 368 0 1000
+r 496 368 496 448 0 10000
+g 496 448 496 464 0 0
+f 496 368 560 368 32 1.5 0.02
+w 560 384 560 448 0
+w 560 448 496 448 0
+178 448 272 560 272 6 1 0.2 2.2143523761996582e-7 0.05 1000000 0.02 20 0.015 0.005 0
+w 560 352 560 304 0
+R 448 272 384 272 0 1 50 230 0 0 0.5
+r 560 288 656 288 0 100000
+g 656 288 656 320 0 0
+w 352 304 448 304 0
+R 352 368 304 368 0 0 40 3.3 0 0 0.5
+o 11 2 0 4099 80 0.00078125 0 2 11 3