Skip to the content
PCBKitNew board
2 layers62 × 82 mmSat ir link, the printed circuit board in 3D

COR-SAT turns natural-language mission requests into tested Python mission packages for a Raspberry Pi satellite payload.

Size
62 × 82 mm
Copper layers
2
Thickness
1.6 mm
Parts
21
Nets
11
Pads
39
Tracks, vias
69, 0
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
13 Jul 2026
Updated
7 Aug 2026

Overview

Sat ir link is an open-source printed circuit board by dmarcr1997, from the dmarcr1997/COR-SAT repository on GitHub, published under the MIT licence. It is a 2-layer board of 62 × 82 mm with 21 parts on 11 nets, routed with 69 tracks and 0 vias.

It is built around the TSAL6200 and TSOP38238. Its parts include 5 resistors, 4 capacitors, 3 connectors, 1 diode and 1 transistor.

Main components

2

README

README.md

COR-SAT

COR-SAT turns natural-language mission requests into tested Python mission packages for a Raspberry Pi satellite payload. It combines AI-assisted generation, deterministic evaluation, a supervised runtime, a Python hardware SDK, a Rust HAL, camera capture, and prototype infrared communications hardware.

Experimental project. Generated missions are limited to the capabilities and checks documented below.

System overview

mermaid
flowchart LR
    A[Mission request] --> B[Typed requirements]
    B --> C[Minimal generator]
    C --> D{Evaluator}
    D -->|Pass| H[Mission package]
    D -->|Fail| E[Robust generator]
    E --> D
    D -->|Both fail| F[Repair once]
    F --> D
    H --> I[Runner]
    I --> J[Python SDK]
    J --> K[Rust HAL]
    K --> L[Pi camera]

    M[IR breadboard] -. prototype .-> N[KiCad PCB]

Model calls return text only and never write project files. The controller validates requirements, evaluates behavior, writes the package, derives manifest.json, and validates the final package against the runner schema.

Project status

AreaStatus
Camera mission generationWorking
Timed capture and heartbeatsWorking
Shutdown handlingWorking
Sparse Lucas-Kanade optical flowWorking
Mission supervision and logsWorking on Linux and Raspberry Pi OS
IR communications hardwareBreadboard and KiCad prototype
IR communications mission APINot implemented
IMU and actuator supportNot implemented

Repository map

PathPurpose
agents/Parse, generate, evaluate, repair, and package missions
runner/Validate, launch, supervise, stop, and inspect missions
sdk/Python client for the satellite HAL
hal/Rust HTTP service for camera and system access
missions/Reviewed mission packages
runtime/Mission state, heartbeat data, and logs
schematics/KiCad project, schematic PDF, PCB, and STEP models
demo/Offline HTML presentation with embedded media
tests/Unit and acceptance tests

Requirements

Development and mission generation

  • Git
  • Python 3.11+
  • Ollama
  • qwen3:4b-instruct

Physical payload runtime

  • Raspberry Pi running Linux or Raspberry Pi OS
  • Rust 1.85+ and Cargo
  • Raspberry Pi camera stack with rpicam-still
  • IMX219 NoIR camera for the current HAL tuning configuration

Optional optical flow

  • OpenCV
  • NumPy

Mission generation and tests can run without camera hardware. Physical mission execution and runner supervision are intended for Linux or the Raspberry Pi.

1. Clone and install

bash
git clone https://github.com/dmarcr1997/COR-SAT.git
cd COR-SAT
python -m venv .venv

Activate the environment:

PlatformCommand
Linux or Raspberry Pisource .venv/bin/activate
Windows PowerShell.\.venv\Scripts\Activate.ps1

Commands below use python. On Raspberry Pi OS, use python3 if python is not available.

Install the SDK and generation dependencies:

bash
python -m pip install --upgrade pip
python -m pip install -e . ollama requests

For missions that calculate optical flow:

bash
python -m pip install opencv-python numpy

2. Configure Ollama

Pull the model used by the generator:

bash
ollama pull qwen3:4b-instruct

Start Ollama if it is not already running:

bash
ollama serve

The generator expects Ollama on its default local endpoint and uses qwen3:4b-instruct. The model is configured in agents/generator.py. There is currently no project CLI flag for changing the model or Ollama host.

3. Verify the software setup

bash
python -m unittest discover -s tests -v
cargo test --manifest-path hal/Cargo.toml

The Python suite mocks model calls, camera hardware, time delays, and OpenCV behavior. It does not require Ollama or a connected camera. The Cargo command tests the Rust HAL.

4. Generate a mission

bash
python -m agents.cli "Capture seven images at three-second intervals and send a heartbeat before every capture." --candidate demo

Generated files:

text
agents/candidates/demo/
|-- manifest.json
`-- mission.py

Use a new candidate name for each run. Existing candidate directories are not overwritten.

Supported request examples

text
Capture one image.
Capture five images at two-second intervals.
Capture twenty images and calculate sparse optical flow in four groups.
Capture seven images, heartbeat before each capture, and handle shutdown signals.

Requests for communications, IMU, or actuator behavior are rejected before generation.

5. Prepare the Raspberry Pi

Install the camera module and use a current Raspberry Pi OS release. Raspberry Pi OS includes the standard rpicam-* tools. See the official camera setup guide.

Install Rust with rustup, then select an edition 2024-compatible toolchain:

bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup update stable
rustc --version

Rust 1.85 or newer is required.

Confirm that the camera stack can see the sensor:

bash
rpicam-still --list-cameras

The current HAL uses the Raspberry Pi 5 IMX219 NoIR tuning file. Confirm it exists:

bash
test -f /usr/share/libcamera/ipa/rpi/pisp/imx219_noir.json

Earlier Raspberry Pi models store tuning files under /usr/share/libcamera/ipa/rpi/vc4/. Update the HAL tuning path before building if you use one of those models.

Build the HAL:

bash
cargo build --release --manifest-path hal/Cargo.toml

Start the HAL from the repository root:

bash
cargo run --release --manifest-path hal/Cargo.toml

The service listens on 0.0.0.0:3000. The Python SDK connects to http://localhost:3000 by default, so the runner and HAL should run on the same Pi unless the client configuration is changed.

Verify the HAL

bash
curl http://localhost:3000/v1/system/health
curl http://localhost:3000/v1/system/status
curl http://localhost:3000/v1/system/capabilities
curl -X POST http://localhost:3000/v1/camera/capture

Camera captures are written to hal/caps/ when the HAL is started from the repository root.

6. Run a mission

Run the included camera mission:

bash
python -m runner.cli supervise periodic-camera

Run a generated candidate:

bash
python -m runner.cli supervise demo --candidate

supervise monitors the process, checks heartbeats, and restarts one unexpected failure. Use start when supervision is not needed.

supervise stays in the foreground. Open a second terminal to inspect status or logs, or to stop the mission.

Runtime controls

ActionCommand
Start reviewed missionpython -m runner.cli start periodic-camera
Supervise reviewed missionpython -m runner.cli supervise periodic-camera
Start candidatepython -m runner.cli start demo --candidate
Supervise candidatepython -m runner.cli supervise demo --candidate
Show statuspython -m runner.cli status demo
Show logspython -m runner.cli logs demo --lines 100
Stop missionpython -m runner.cli stop demo

Runtime artifacts:

text
runtime/<mission-name>/
|-- heartbeat.json
|-- mission.log
`-- state.json

Mission-generated files are stored beside the mission code:

Mission typeOutput directory
Reviewedmissions/<name>/outputs/
Candidateagents/candidates/<name>/outputs/

Optical-flow missions write JPEG results to that outputs/ directory.

Validation pipeline

Every candidate must pass:

  1. Validated typed requirements
  2. Python syntax checks
  3. Import and file-write safety checks
  4. Fake SDK execution
  5. Capture, timing, heartbeat, and output checks
  6. Mission-specific optical-flow checks when requested
  7. Runner manifest validation

If both generated candidates fail, the highest-scoring failure is repaired once and evaluated again. A failed repair stops the pipeline without creating a package.

Hardware

The camera payload is connected through the Rust HAL. The infrared link is a separate hardware prototype and is not yet exposed through the SDK or mission generator.

Horizontal IR communications breadboard prototype

ArtifactLink
KiCad projectsat_ir_link.kicad_pro
PCB layoutsat_ir_link.kicad_pcb
Schematicsat_ir_link.kicad_sch
Schematic PDFsat_ir_link.pdf
Board STEP modelv23d-print-board.step

Presentation demo

Open demo/index.html in a browser. The presentation works offline and includes keyboard navigation, speaker notes, the software demonstration, and project hardware images.

KeyAction
Left or Right arrowChange slide
NToggle speaker notes
FToggle fullscreen

Troubleshooting

ProblemCheck
Ollama connection failsRun ollama serve and confirm the model is pulled
Candidate already existsChoose a new value for --candidate
HAL reports an unhealthy cameraRun rpicam-still --list-cameras
Camera capture failsConfirm rpicam-still and the IMX219 NoIR tuning file are installed
Mission cannot reach HALConfirm the HAL is running on port 3000 on the same host
Supervision or stop fails on WindowsRun the mission runtime on Linux or Raspberry Pi OS
Optical-flow mission fails at runtimeInstall opencv-python and numpy in the mission environment

License

MIT

Parts

21
QtyValueFootprintReferences
7TestPointTestPoint:TestPoint_THTPad_D4.0mm_Drill2.0mmTP1, TP2, TP3, TP4, TP5, TP6, TP7
2100nFCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mmC1, C3
21kΩResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR2, R5
1100ΩResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR4
110kΩResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR3
110µFCapacitor_THT:CP_Radial_D5.0mm_P2.00mmC2
12N2222Package_TO_SOT_THT:TO-92_InlineQ1
14.7µFCapacitor_THT:CP_Radial_D5.0mm_P2.00mmC4
168ΩResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1
1RX ConnectorConnector:FanPinHeader_1x03_P2.54mm_VerticalJ2
1TSAL6200LED_THT:LED_D5.0mmD1
1TSOP38238Connector:FanPinHeader_1x03_P2.54mm_VerticalJ3
1TX ConnectorConnector:FanPinHeader_1x03_P2.54mm_VerticalJ1

Questions

How big is the Sat ir link PCB?

It measures 62 × 82 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Sat ir link use?

21 parts, built around the TSAL6200 and TSOP38238. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Sat ir link KiCad files?

From the dmarcr1997/COR-SAT repository on GitHub, at the commit this page was made from: the board is schematics/sat_ir_link/sat_ir_link.kicad_pcb and its schematic schematics/sat_ir_link/sat_ir_link.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Sat ir link design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers181.4 × 179.8 mmRubber duckey, the printed circuit board in 3D

    Rubber duckey

    ajvizganapathy-pixel/FlipperZero-DIY-STM32WB55-NucleusDark

    DIY Flipper Zero clone using STM32WB55CGU6 — KiCad PCB, Momentum firmware, 200+ apps, BadUSB scripts, wiring diagrams

    37 parts10
  • 2 layers76.8 × 63 mmFlopper one, the printed circuit board in 3D

    Flopper one

    JBlitzar/flopper-one

    esp knockoff flipper

    14 parts5GPL-3.0
  • 2 layers40 × 30 mmIrblaster c3, the printed circuit board in 3D

    Irblaster c3

    AskAlice/home-automation-pcbs

    Daily Kimi-generated home automation PCB designs with KiCad sources, 3D models, and rendered documentation

    27 parts1MIT
  • 2 layersTvbgone, the printed circuit board in 3D

    Tvbgone

    bikeNomad/micropython-tv-b-gone

    A MicroPython version of the classic TV-B-Gone tool with new code database

    5 parts17
  • 2 layers32 × 48 mmDiyIrTower, the printed circuit board in 3D

    DiyIrTower

    maehw/DiyIrTower

    Do-it-yourself infrared serial communication tower (compatible with LEGO IR serial tower)

    17 parts12GPL-3.0
  • 2 layersEsp32 gateway, the printed circuit board in 3D

    Esp32 gateway

    radioelf/esp32_gateway_MQTT

    PCB para Gateway ESP32

    79 parts3
  • 2 layers55.9 × 82.6 mmLIRC HighPowerSerialTransceiver, the printed circuit board in 3D

    LIRC HighPowerSerialTransceiver

    cedric-dufour/LIRC-HighPowerSerialTransceiver

    LIRC High-Power Serial Transceiver [CC-BY]

    40 parts1CC-BY-4.0
  • 2 layers74.5 × 146 mmCalculator, the printed circuit board in 3D

    Calculator

    Samuel-Malaj/PicoCalc-Open-Source-Student-Scientific-Calculator

    Open source scientific calculator built on Raspberry Pi Pico W — custom PCB, WiFi messaging, IR projector control and games.

    48 parts1