Skip to the content
4 layers95.9 × 90.2 mmKENSAT EPS v1.2, the printed circuit board in 3D

KENSAT EPS v1.2

kenchangh/kensat119

KENSAT, Edge-AI Compute in Orbit - A 2U CubeSat that runs a large language model on-orbit. A power-gated NVIDIA Jetson Orin Nano executes neural-network inference in space, and the results are downlinked over a custom UHF radio link to amateur ground stations.

Size
95.9 × 90.2 mm
Copper layers
4
Thickness
1.6 mm
Parts
218
Nets
235
Pads
757
Tracks, vias
961, 1,058
Pours
140
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
17 Jun 2026
Updated
27 Oct 2026

Overview

KENSAT EPS v1.2 is an open-source printed circuit board by kenchangh, from the kenchangh/kensat repository on GitHub. It is a 4-layer board of 95.9 × 90.2 mm with 218 parts on 235 nets, routed with 961 tracks and 1,058 vias.

It is built around the TPS62130ARGTR, BQ24650RVAR and LM74700QDBVTQ1, with the CSD16406Q3, HY2120-CB and MY-18650-02 among its other parts. Its parts include 65 resistors, 64 capacitors, 21 diodes, 14 ICs and 14 transistors. It belongs with the radio and wireless and computers and single-board computers boards of this library.

Main components

12

README

README.md

KENSAT — Edge-AI Compute in Orbit

A 2U CubeSat that runs a large language model on-orbit. A power-gated NVIDIA Jetson Orin Nano executes neural-network inference in space, and the results are downlinked over a custom UHF radio link to amateur ground stations.

The assembled KENSAT 2U CubeSat on the bench — Pumpkin chassis with body-mounted solar panels and a Remove-Before-Flight tag

KENSAT's mission is to demonstrate autonomous AI compute on a small satellite — taking a GPU-class accelerator and a quantized LLM out of the data center and running them inside the tight power, thermal, and reliability envelope of a 2U CubeSat. The on-board computer wakes the Jetson only when needed, runs an inference within a measured energy budget, and frames the output for downlink. Everything else in the spacecraft — the flight software, the UHF radio and its RF matching networks, the power system, and the antenna-deployment hardware — exists to get that compute on orbit, keep it alive, and get its results to the ground.

Why it's hard. Edge AI in orbit means treating a multi-watt accelerator as a scheduled, fault-tolerant load: powering it from a battery-backed bus only in defined windows, dissipating its heat passively in vacuum, recovering it if it hangs, and surviving the brownouts and resets that come with switching that much current on a small satellite. KENSAT is built end to end around that problem.

Mission profile: a 520 km sun-synchronous orbit, operating UHF amateur radio at 437.08 MHz for beaconing, telemetry downlink, and command uplink. Telemetry — including downlinked inference results — is intentionally unencrypted so amateur operators worldwide can receive and decode it.


Radio link (for receiving stations)

KENSAT beacons openly on the UHF amateur band — no encryption, no keys. Anyone with a 70 cm receiver and a G3RUH-capable TNC (Direwolf, gr-satellites, SatNOGS) can decode it.

Beacon / downlink frequency437.080 MHz
TransmitterMode U — GFSK 1k2 AX.25 G3RUH
ModulationGFSK
Baud1200
FramingAX.25 UI, NRZI + G3RUH
Source callsignKO6IKZ
Beacon interval~10 s
Statusactive
Encryptionnone — telemetry is open by design

Everything in the info field is plain ASCII. Frames are identified by their first token:

FrameCarries
BCNHousekeeping beacon: cumulative sequence number, boot count, reset cause, uptime, body rates, uplink frames received
LLMOne per on-orbit inference: Jetson temperatures and peaks, power, RAM, model-load and inference times, result CRC-32, and how many text frames to expect
TXTThe text the on-board LLM generated, as numbered chunks — s= result, c=<k>/<m> chunk, h= CRC-32 of the whole result
ACKAcknowledgement of a received telecommand

A result is sent one chunk per beacon cycle and the whole set twice, because the link has no ARQ. To reassemble: group by s=, order by c=, concatenate, and check h= (standard CRC-32). ground-station/llm_downlink.py does this for you, from live decoder output or a saved log.

Command uplink is a short authenticated ASCII telecommand (Si4463 native framing, CRC-16) that can inhibit the transmitter, ping the spacecraft, uplink a prompt of up to 256 characters for the LLM in a single frame (which starts the inference), or run a library prompt. Formats, verbs and the reasoning behind them are in firmware/obc/README.md.

Decoders, the result reassembler and an end-to-end test harness live in ground-station.


System at a glance

text
        ┌──────────────────────────────────────────────┐
        │  Burn-Wire Board (custom)                     │  Slot 4 (top)
        │  Antenna-release driver · resistive heating   │
        ├──────────────────────────────────────────────┤
        │  Radio Board (custom)                         │  Slot 3
        │  Si4463 UHF transceiver + AS179 T/R switch    │
        │  Jetson Orin Nano (edge-AI payload)           │
        ├──────────────────────────────────────────────┤
        │  EPS Board (custom)                           │  Slot 2
        │  2S2P 18650 pack · rails · hardware watchdog  │
        ├──────────────────────────────────────────────┤
        │  Pumpkin MB + PPM D1 (PIC24FJ256GB210)        │  Slot 1 (bottom)
        │  OBC — always-on C&DH, Salvo RTOS             │
        └──────────────────────────────────────────────┘
              104-pin CubeSat Kit Bus (H1/H2)

   UHF dipole ── U.FL ── matching network ── AS179 ── Si4463 ── SPI ── PIC24

Boards interconnect over the 104-pin CubeSat Kit Bus. The PIC24 is the always-on flight computer; it talks to the EPS over I²C, drives the Si4463 radio over SPI, controls and exchanges data with the Jetson over UART, and fires the antenna-deployment burn wires over GPIO.

See docs/system-architecture.md for the full spec: pinouts, bus map, operational modes, deployment state machine, power budget, and thermal analysis.


Subsystems

SubsystemWhat it isHighlights
firmware/obcPIC24 flight software (C, Salvo RTOS)Fault-tolerant antenna deployment with flash-persisted state, AX.25 beacons, Si4463 driver, IMU, SD/serial-flash logging, command parser
radioCustom 437 MHz UHF radio boardSi4463 + AS179 T/R switch, ESP32-S3 firmware, KiCad 2-layer design
radio/rf-designRF matching-network design & testCustom scikit-rf optimizer over LCSC-stocked parts, CPWG parasitic modeling, ADALM-Pluto SDR test bench
epsElectrical power system board2S2P 18650 pack, regulated rails, hardware watchdog (KiCad)
burnwireAntenna-release deployment boardRedundant nichrome burn-wire driver (KiCad)
jetsonEdge-AI payloadJetson Orin Nano running a quantized LLM (llama.cpp/TinyLlama) over UART, systemd daemons, thermal management
ground-stationSDR ground station & decodersADALM-Pluto RX/TX, AX.25 beacon decoder, DSP diagnostics, end-to-end test harness
docsSystem documentationArchitecture spec, radio guide, Jetson startup, debug notes

Engineering highlights

  • An LLM running in orbit. The payload is an NVIDIA Jetson Orin Nano running a quantized TinyLlama model under llama.cpp. The always-on PIC24 keeps it powered down, then — on schedule or command — switches on its rail through a high-side load switch, waits for the Jetson to boot and signal READY over UART, dispatches a prompt, collects the generated text, powers the Jetson back off, and queues the result for downlink. The whole cycle is bounded by a measured per-inference energy budget so a single run can't drain the pack. Prompts come either from a library pre-loaded on the payload — so the mission produces results with no uplink at all — or from the ground, uplinked as a single 256-byte prompt field that the OBC runs as soon as it arrives. (docs/system-architecture.md §6.2, jetson/)

  • Treating a GPU as a spacecraft load. Running multi-watt edge compute on a 2U bus is a systems problem: the EPS sizes a battery-backed rail and a hardware watchdog around the Jetson's draw, the OBC power-gates it and can recover a hung payload by cutting power, and the design accounts for dissipating its heat passively in vacuum, where there's no convection. (docs/system-architecture.md §8.1)

  • Fault-tolerant by construction. Both the inference cycle and the antenna burn-wire release are one-shot, flash-persisted state machines that survive the brownouts and resets that come with switching large currents: attempt counts are written before energizing, success flags only after completion, and the RF-silence hold fails safe toward staying quiet. (details)

  • A complete UHF link to get results down. TX / RX / antenna matching networks were designed with a custom scikit-rf grid-search optimizer that models PCB traces as CPWG transmission lines (elliptic-integral method) and snaps to real LCSC part values, then validated on an ADALM-Pluto SDR loopback bench (gain sweep, harmonics, insertion loss). Inference output is framed as AX.25 and downlinked openly. (radio/rf-design)

  • Signal-integrity-aware bus design. The Si4463 SPI bus crosses two board-to-board connectors; the design derates the clock and adds series termination accordingly. (docs/spi-debug-notes.md)


Repository layout

text
kensat/
├── docs/             System architecture spec + guides
├── firmware/obc/     PIC24 flight software (app/ + bsp/)
├── radio/            UHF radio: ESP32 firmware, KiCad board, RF design
├── eps/              Electrical power system board (KiCad)
├── burnwire/         Antenna deployment board (KiCad)
├── jetson/           Edge-AI payload daemon + systemd units
└── ground-station/   SDR scripts, beacon decoder, diagnostics

Building

  • OBC firmware depends on proprietary vendor SDKs (Pumpkin CubeSat Kit BSP, Salvo RTOS) that are not redistributed here. See firmware/obc/BUILD.md.
  • Radio firmware builds with arduino-cli for the ESP32-S3.
  • RF design / ground-station tools are Python; see the requirements.txt in each directory.

License

Original work in this repository is released under the MIT License. Proprietary vendor SDKs the firmware builds against are not included and are not covered by that license — see the LICENSE file and firmware/obc/BUILD.md.


KENSAT — UHF amateur satellite, 437.08 MHz. Telemetry is open and unencrypted by design, in the tradition of the amateur radio community.

Parts

218
QtyValueFootprintReferences
210.1uFCapacitor_SMD:C_0603_1608MetricC6, C12, C13, C19, C21, C22, C26, C31, C32, C34, C42, C46, C47, C53, C57, C58 +5
12100kResistor_SMD:R_0603_1608MetricR3, R14, R20, R25, R31, R35, R36, R39, R47, R53, R60, R65
121uFCapacitor_SMD:C_0603_1608MetricC3, C4, C5, C16, C17, C18, C39, C40, C41, C50, C51, C52
1122uFCAPC3225X270N:CAPC3225X270NC1, C14, C20, C23, C24, C25, C35, C36, C48, C62, C63
11NetTie_2Jumper:SolderJumper-2_P1.3mm_Bridged2Bar_Pad1.0x2.5mmNT1, NT2, NT3, NT4, NT5, NT6, NT7, NT8, NT9, NT10, NT11
910uFCapacitor_SMD:C_1210_3225MetricC9, C10, C28, C29, C33, C43, C44, C54, C55
92kResistor_SMD:R_0603_1608MetricR11, R12, R13, R15, R30, R32, R46, R48, R59
8LEDResistor_SMD:R_0603_1608MetricD4, D5, D9, D10, D14, D15, D19, D20
8MY-18650-02254TR:BAT_254TRBTN1, BTN2, BTN3, BTN4, BTP1, BTP2, BTP3, BTP4
40.022EResistor_SMD:R_1206_3216MetricR9, R27, R44, R57
410EResistor_SMD:R_1206_3216MetricR2, R19, R38, R52
410VDiode_SMD:D_SOD-123D1, D6, D11, D16
410kConnector_PinHeader_2.00mm:PinHeader_1x02_P2.00mm_VerticalTH1, TH2, TH3, TH4
42.2uFCapacitor_SMD:C_1210_3225MetricC2, C15, C38, C49
422pFCapacitor_SMD:C_0603_1608MetricC11, C30, C45, C56
4249kResistor_SMD:R_0603_1608MetricR7, R22, R42, R55
42EResistor_SMD:R_2010_5025MetricR1, R18, R37, R51
43.3kResistor_SMD:R_0603_1608MetricR16, R33, R49, R62
430.1kResistor_SMD:R_0603_1608MetricR8, R26, R43, R56
430kResistor_SMD:R_0603_1608MetricR17, R34, R50, R63
436kResistor_SMD:R_0603_1608MetricR10, R28, R45, R58
45.23kResistor_SMD:R_0603_1608MetricR5, R21, R41, R54
46.8uH@5ACSEG0440H-100M:INDDFN420X420X420-2NL1, L3, L5, L6
4BQ24650RVARBQ24650:QFN50P350X350X100-17NU2, U7, U10, U12
4CSD17571Q2CSD17571Q2:TRANS_CSD17571Q2Q3, Q6, Q9, Q12
4D_SchottkyDiode_SMD:D_SOD-323D3, D8, D13, D18
4HC-1.25-8ADF13-8P:DF138P125DSAJ1, J2, J3, J4
4LM74700QDBVTQ1LM74700QDBVTQ1:SOT95P280X145-6NU3, U8, U11, U13
4SI7288DP-T1-GE3SI7288DP-T1-GE3:TRANS_SI7288DP-T1-GE3Q2, Q5, Q8, Q11
4SMCJ15CASMCJ15CA:DIOM7959X262ND2, D7, D12, D17
4SSM6J507NU_LFSSM6J507NU:TRANS_SSM6J507NU_LFQ1, Q4, Q7, Q10
3330EResistor_SMD:R_1206_3216MetricR4, R6, R61
2CSD16406Q3CSD16406Q3:TRANS_CSD16406Q3U4, U5
2ESQ-126-39-G-DHTSW-126:ESQ-126-39-G-DH1, H2
2STL9P3LLH6STL9P3LLH6:TRANS_STL9P3LLH6Q13, Q14
10.82uFCapacitor_SMD:C_0603_1608MetricC59
110kResistor_SMD:R_0603_1608MetricR64
119.1kResistor_SMD:R_0603_1608MetricR29
11kResistor_SMD:R_1206_3216MetricR23
12.2uH@5.4A74439334047:WE-XHMI_5030L4
13.3nFCapacitor_SMD:C_0603_1608MetricC37
131.6kResistor_SMD:R_0603_1608MetricR24
132kResistor_SMD:R_0603_1608MetricR40
133pFCapacitor_SMD:C_0603_1608MetricC27
14.7uH@6.8A74439334047:WE-XHMI_5030L2
1B2B-XH-A_LF__SN_B2B-XH-A_LF__SN:JST_B2B-XH-A_LF__SN_J5
1HY2120-CBPackage_TO_SOT_SMD:SOT-23-6U1
1LMR51450SDRRRLMR51450SDRRR:CONV_LMR51450SDRRRU6
1RBR3MM60ATFTRRBR3MM60ATFTR:SOD-123FL-2D21
1TPS3430WDRCRTPS3430WDRCR:VREG_V62_16624-01YEU14
1TPS62130ARGTRTPS62130ARGTR:QFN50P300X300X100-17NU9

The 214 most common of 218 parts.

More from kenchangh/kensat

1
  • 2 layers90.2 × 95.9 mmBurnwire, the printed circuit board in 3D

    Burnwire

    kenchangh/kensat

    KENSAT, Edge-AI Compute in Orbit - A 2U CubeSat that runs a large language model on-orbit. A power-gated NVIDIA Jetson Orin Nano executes neural-network inference in space, and the results are downlinked over a custom…

    19 parts119

Similar boards

  • 2 layers139 × 45 mmNewbatt, the printed circuit board in 3D

    Newbatt

    jlab-sensing/ENTS-node-hardware

    Schematics and design for soil MFC voltage and current sensing

    33 parts
  • 2 layers82 × 55 mmBmo power, the printed circuit board in 3D

    Bmo power

    nealjack/BMO

    Code, Art and Design files to make BMO from adventure time

    83 parts9
  • 4 layers455.2 × 254.8 mmRDAT, the printed circuit board in 3D

    RDAT

    Astrid-Delestine/Remote-Access-Desktop-Terminal

    All project requirements are listed in ./projreq.md

    520 partsMIT
  • 4 layers52 × 80 mmLeddimmer hw, the printed circuit board in 3D

    Leddimmer hw

    Wassasin/leddimmer

    Quick low-side PWM device to crudely dim two 24V 4A LED strips

    117 parts
  • 2 layers35 × 20 mmBuck bras robot, the printed circuit board in 3D

    Buck bras robot

    AresEnsea/2526_Projet2A_AresCFR

    Ce repository GitHub regroupe l'ensemble des projets et documents réalisés par l'équipe Ares pour la Coupe de France de Robotique 2026.

    31 parts5
  • 6 layers90.2 × 95.9 mmCubesat rp2040, the printed circuit board in 3D

    Cubesat rp2040

    macnetic/rp2040-cubesat

    A CubeSat Onboard Computer, using the RP2040 microcontroller.

    215 parts4
  • 4 layers165.2 × 72 mmAudiograb, the printed circuit board in 3D

    Audiograb

    oveljosland/audiograb-pcb

    Design files for the Audiograb PCB.

    134 parts4CERN-OHL-S-2.0
  • 4 layers90.2 × 95.9 mmHestia, the printed circuit board in 3D

    Hestia

    mawson-rovers/hestia

    Hestia is a space-ready heater & temperature measurement system developed by Mawson Rovers in Sydney. Its first mission will demonstrate a novel UTS heatsink design, aboard the Waratah Seed cubesat mission.

    184 parts3MIT

Questions

How big is the KENSAT EPS v1.2 PCB?

It measures 95.9 × 90.2 mm and has 4 copper layers, 1.6 mm thick.

What parts does the KENSAT EPS v1.2 use?

218 parts, built around the TPS62130ARGTR, BQ24650RVAR, LM74700QDBVTQ1 and CSD16406Q3. 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 KENSAT EPS v1.2 KiCad files?

From the kenchangh/kensat repository on GitHub, at the commit this page was made from: the board is eps/hardware/KENSAT_EPS_v1.2.kicad_pcb and its schematic burnwire/hardware/burnwire.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the KENSAT EPS v1.2 design in my own project?

Its repository states no licence, so its author keeps all rights: ask kenchangh before reusing the design.