Skip to the content
PCBKitNew board
6 layers497.4 × 154.7 mmFCSTMV1.05, the printed circuit board in 3D

Open-source quadrotor flight stack: custom KiCad flight-controller and power distribution boards plus C++ firmware with a PID attitude loop, written from scratch.

Size
497.4 × 154.7 mm
Copper layers
6
Thickness
1.65 mm
Parts
1,198
Nets
1,045
Pads
3,875
Tracks, vias
9,863, 1,512
Pours
37
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
30 Oct 2026
Updated
30 Oct 2026

Overview

FCSTMV1.05 is an open-source printed circuit board by CGainsWorks, from the CGainsWorks/emb-drone-flight-stack repository on GitHub, published under the MIT licence. It is a 6-layer board of 497.4 × 154.7 mm with 1,198 parts on 1,045 nets, routed with 9,863 tracks and 1,512 vias.

It is built around the DRV8300DRGER-MS, INA240A1D and LMR33630ADDA, with the PSMN1R4-40YLDX, PMEG4010CEJ,115-JSM and PTS647SK70SMTR2N LFS among its other parts. Its parts include 396 connectors, 293 capacitors, 249 resistors, 32 transistors and 12 diodes. It belongs with the robots and motor control boards and the STM32 boards of this library.

Main components

12

README

README.md

emb-drone-flight-stack

Status: hardware design complete. Firmware written, tested on a host, run in simulation and on an emulated MCU but never run on hardware. The 6-layer flight controller is designed through to fabrication-ready Gerbers and assembly files. The firmware passes 259 host-side tests, flies a simulated quadrotor in software-in-the-loop and its real STM32F405 image boots and runs its control loop under Renode. The boards have not been assembled, powered or flown, so not one line of it has executed on silicon. Every number below comes from a script in this repository and is either a host test result, a simulation or an emulation; none is a measurement. See STATUS.md for the precise breakdown of what does and does not exist.

Design files imported from OpenSourceDrone, which remains the original working repository.

A quadrotor flight-controller PCB that integrates the power stage with an STM32F405, plus C++20 firmware written from scratch (not a Betaflight fork): attitude estimation, a cascaded PID attitude loop, a quad-X mixer, IMU, barometer, magnetometer and GPS drivers, PWM ESC output, DShot frame encoding, CRSF receiver and telemetry, plus arming and failsafe logic.

Simulated roll angle step

Simulated: the firmware's own control code flying an assumed quadrotor model on a host (firmware/sim/sil). Not hardware data. The gap between the blue and orange traces is a real finding, described under Findings.

Verification without hardware

No board exists yet, so each layer is checked on a normal PC and in CI (.github/workflows/ci.yml):

LayerWhat runsToolingResult
Host unit testsPortable core against HAL mocks, including a bit-level SPI slave modelCMake, g++17 suites, 259 tests, 186,608 assertions, 0 failures
Software in the loopUnmodified FlightController, IMU driver, PID, mixer and arming logic closed around a rigid-body quad with motor lag, output latency, sensor noise and a disturbance torquefirmware/sim/sil, tools/pid_tuner.py5 step scenarios within limits on a nominal and a perturbed plant (simulated)
Emulated MCUThe real fc_firmware.elf on Renode's STM32F4 platform, with a simulated ICM-42688-P decoding the firmware's bit-banged SPI from the GPIO pinsRenode 1.16.1, Robot Framework4 tests: boot text, IMU bring-up, control loop, estimator follows a simulated tilt (emulated)
Linked imageVector table, stack pointer, reset vector, USART1 slot, hard-float ABIArm GNU Toolchain 13.3.rel1, verify_image.shall checks pass
bash
cd firmware && ./run_tests.sh                    # host tests, no hardware needed
python3 tools/pid_tuner.py run                   # simulated step responses into test-results/sil
python3 tools/pid_tuner.py check test-results/sil/metrics.json
cd firmware && ./build_firmware.sh               # STM32F405 image, needs arm-none-eabi-gcc
renode-test firmware/sim/renode/fc_firmware.robot   # needs the image and Renode

tools/pid_tuner.py needs only the standard library, except plot, which needs pip install -r tools/requirements.txt.

Simulated step responses

From test-results/sil/metrics.json, generated by fc_sil with the firmware's default gains. Limits were set as requirements before tuning and are what CI gates on. Rate steps are judged on the true body rate; angle steps on the firmware's attitude estimate, which is the quantity the angle loop controls.

ScenarioStepOvershootSettling (5 %)Steady errorLimits
Roll rate51.6 deg/s4.7 %0.031 s3.0 %25 %, 0.25 s, 5 %
Pitch rate51.6 deg/s0.0 %0.035 s0.2 %25 %, 0.25 s, 5 %
Yaw rate57.3 deg/s19.1 %0.205 s3.0 %25 %, 0.5 s, 5 %
Roll angle17.5 deg0.0 %0.135 s1.0 %20 %, 1.0 s, 5 %
Pitch angle17.5 deg0.0 %0.156 s1.2 %20 %, 1.0 s, 5 %

On the perturbed plant (motor time constant 45 ms instead of 30 ms, inertia +30 %) the same gains also pass, with overshoot up to 21.7 % on yaw. The plant parameters (0.65 kg, 0.11 m arms, 9 N per motor and so on) are assumptions for a generic 5-inch 4S quad, recorded in firmware/sim/sil/quad_plant.hpp; none was measured on this airframe.

The default gains came from python3 tools/pid_tuner.py tune --start tools/placeholder_gains.json, starting from the untuned placeholders the firmware used to ship with; the search is recorded in test-results/sil/tuning.json. The result was rounded and the yaw P term eased by hand from 154 to 130 for overshoot margin. They are simulation-tuned starting values for bench tuning, not flight-proven gains.

Findings from simulation

  • The mixer had the pitch axis inverted. The quad-X table raised the rear motors for a nose-up command. With the documented motor layout that is positive feedback and the SIL airframe diverged in pitch within 0.3 s of release. The existing unit tests had encoded the same mistake. Fixed, and test_sil now checks the mixer's moments against independent rigid-body physics.
  • Angle mode drifts under a held tilt. The accelerometer on a multirotor sees thrust, not gravity, so while a tilt is held the Mahony correction pulls the estimate towards level. In the roll angle step the estimate holds 17.5 deg while the true angle reaches 36.4 deg two seconds after the step. There is no velocity aiding (GPS or optical flow) in the estimator to correct it. test_sil pins the effect so a change to it is noticed; fixing it is open work.

Firmware

firmware/README.mdArchitecture, build and test, simulation and emulation, plus what is deliberately not implemented
firmware/docs/PINOUT.mdThe pinout as extracted from the PCB netlist, including why the IMU cannot use hardware SPI1 on this board
firmware/docs/BRING_UP.mdBring-up procedure with expected values. Not yet performed

Hardware

  • hardware/flight-controller/: the FCSTMV1.05 6-layer board in KiCad, with Gerbers, drill files, BOM, interactive BOM, pick-and-place and the controlled-impedance stackup.
  • hardware/esc/ and hardware/rf/: ESC, control link and video link schematics (PDF).

A separate power distribution board is not designed.

Build checklist

Anything requiring a powered board is unchecked, because no board has been powered.

  • PDB schematic and layout
  • PDB fabrication and bench validation: efficiency, thermal, protection
  • Flight controller schematic with MCU pin-mux plan
  • Flight controller layout with a defined stackup
  • Fabrication and bring-up checklist executed: procedure written (firmware/docs/BRING_UP.md), not performed
  • IMU driver over SPI with verified data: driver written and tested against simulated devices on the host and on the emulated MCU; no data from real silicon
  • Attitude estimator with host-side unit tests
  • PID attitude loop with step-response tuning on a test rig: tuned in simulation only; never driven a motor
  • PWM and DShot ESC output: PWM implemented; DShot frame encoding implemented and tested but its timer DMA is not wired up
  • Barometer, magnetometer and GPS: drivers written and tested against simulated devices; no STM32 I2C driver yet and on this board revision the magnetometer and GPS do not reach the F405
  • UART telemetry and ground-station plotting: telemetry implemented; no ground-station tool yet
  • Loop timing budget measured: the firmware measures and reports its own loop timing; only an emulator has run it and emulated timing says nothing about silicon
  • Tethered hover
  • Free flight and logged flight data

Licence

MIT, see LICENSE.

Parts

1,198
QtyValueFootprintReferences
171Conn_01x01_PinConnector_PinSocket_2.54mm:PinSocket_1x01_P2.54mm_VerticalJ1, J10, J11, J12, J14, J100, J101, J105, J106, J111, J123, J139, J141, J143, J146, J147 +155
610.1uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC102, C103, C112, C113, C114, C115, C116, C119, C120, C122, C123, C124, C125, C126, C128, C129 +45
47Conn_01x01_PinConnector_Wire:SolderWirePad_1x01_SMD_5x10mmJ2, J13, J103, J104, J107, J119, J120, J134, J140, J161, J162, J175, J178, J179, J218, J221 +31
44Conn_01x03_PinConnector_PinSocket_2.54mm:PinSocket_1x03_P2.54mm_VerticalJ18, J19, J124, J130, J131, J142, J164, J166, J191, J192, J205, J210, J211, J215, J234, J235 +28
42Conn_01x02_PinConnector_PinSocket_2.54mm:PinSocket_1x02_P2.54mm_VerticalJ110, J112, J128, J135, J144, J149, J152, J155, J156, J157, J158, J163, J165, J172, J173, J203 +26
380 ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR112, R119, R121, R126, R127, R128, R131, R244, R245, R247, R260, R265, R266, R267, R270, R272 +22
32100nF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC10, C13, C14, C16, C19, C167, C168, C171, C172, C176, C188, C189, C192, C193, C197, C209 +16
2847uF, 50V, 2420CAA572X7R1H476M670LJ:CAPC6050X690NC1, C2, C159, C160, C161, C162, C163, C164, C165, C180, C181, C182, C183, C184, C185, C186 +12
2510k Ohm, 50V, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR13, R16, R146, R149, R154, R156, R157, R159, R172, R175, R180, R182, R183, R185, R198, R201 +9
2420 Ohm, 50V, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR1, R134, R135, R136, R138, R139, R140, R160, R161, R162, R164, R165, R166, R186, R187, R188 +8
24PSMN1R4-40YLDXPSMN1R440YLDX:BUK7Y1255B115Q1, Q2, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Q23 +8
2110k Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR10, R15, R105, R106, R116, R141, R143, R148, R167, R169, R174, R193, R195, R200, R212, R249 +5
191k ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR216, R217, R218, R219, R236, R242, R243, R254, R255, R256, R257, R259, R261, R262, R263, R264 +3
1810uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC12, C15, C21, C104, C107, C157, C170, C173, C175, C191, C194, C196, C212, C215, C217, C308 +2
1622uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC27, C30, C32, C34, C57, C58, C59, C61, C67, C69, C70, C71, C245, C246, C248, C249
16Conn_01x02_PinConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ16, J17, J23, J42, J189, J190, J196, J208, J232, J233, J239, J251, J275, J276, J282, J294
16Conn_01x05_PinConnector_PinSocket_2.54mm:PinSocket_1x05_P2.54mm_VerticalJ22, J40, J116, J195, J206, J238, J249, J281, J292, J307, J310, J339, J348, J375, J378, J388
16MountingHole_Pad_MPMountingHole:MountingHole_3.2mm_M3_DIN965_Pad_FIXEDH1, H2, H3, H4, H5, H6, H7, H8, H13, H14, H15, H16, H17, H18, H19, H20
151uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC24, C40, C51, C52, C65, C76, C87, C88, C89, C117, C127, C141, C153, C158, C243
15Conn_01x04_PinConnector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_VerticalJ24, J102, J127, J129, J136, J137, J145, J197, J240, J283, J333, J335, J341, J350, J364
12100k Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR17, R29, R35, R48, R50, R55, R56, R150, R176, R202, R231, R232
12100pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC11, C101, C111, C169, C190, C211, C285, C286, C288, C299, C306, C321
121k Ohm, 50V, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR14, R22, R25, R147, R155, R158, R173, R181, R184, R199, R207, R210
121uF, 50V, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC23, C26, C28, C177, C178, C179, C198, C199, C200, C219, C220, C221
12Conn_01x01_PinConnector_Wire:SolderWirePad_1x01_SMD_1x2mmJ37, J43, J92, J167, J168, J169, J170, J171, J311, J320, J330, J343
12PMEG4010CEJ,115Diode_SMD:D_SOD-323FD2, D3, D4, D9, D10, D11, D12, D13, D14, D15, D16, D17
111 uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC257, C268, C270, C284, C293, C295, C296, C297, C302, C307, C319
11100 Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR9, R11, R52, R60, R142, R144, R168, R170, R194, R196, R228
114.7uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC81, C106, C223, C229, C263, C272, C276, C279, C298, C303, C305
11Conn_01x07_PinConnector_PinSocket_2.54mm:PinSocket_1x07_P2.54mm_VerticalJ82, J84, J113, J114, J117, J122, J125, J321, J325, J362, J382
10100 ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR81, R87, R88, R89, R90, R220, R221, R222, R223, R294
10Conn_01x06_PinConnector_PinSocket_2.54mm:PinSocket_1x06_P2.54mm_VerticalJ33, J41, J126, J202, J207, J250, J293, J315, J346, J359
10KAF31BR71H104KTCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC77, C78, C137, C139, C140, C143, C145, C146, C149, C151
910k ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR94, R96, R213, R224, R225, R226, R227, R248, R251
910nF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC17, C29, C31, C174, C195, C216, C232, C233, C287
80 Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR18, R20, R151, R153, R177, R179, R203, R205
7100k ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR82, R95, R97, R237, R238, R239, R240
710pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC41, C54, C100, C109, C311, C316, C328
74.7uF, 50V, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC36, C37, C38, C45, C46, C47, C255
55.1k Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR28, R30, R74, R109, R113
56pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC292, C294, C300, C304, C310
5BFP520H6327XTSA1BFP520H6327XTSA1:INFINEON_SOT343Q30, Q31, Q32, Q34, Q35
5Conn_01x01_PinConnector_PinSocket_2.00mm:PinSocket_1x01_P2.00mm_VerticalJ93, J98, J99, J108, J148
5PTS647SK70SMTR2N_LFSPTS647SK70SMTR2N_LFS:PTS647SK70SMTR2NLFSS1, S2, S3, S4, S5
40 Ohm, 12060 Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR19, R152, R178, R204
40.005Ohms, 2512, 5W, Current SenseResistor_SMD:R_2512_6332Metric_Pad1.40x3.35mm_HandSolderR4, R137, R163, R189
410uF, 50V, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC18, C48, C62, C240
41k Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR12, R145, R171, R197
42.2uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC85, C118, C121, C147
42.7k Ohms, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR103, R104, R132, R133
42.7k ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR214, R215, R252, R253
422 Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR41, R42, R117, R118
422 ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR65, R66, R67, R284
42200 pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC8, C166, C187, C208
4220nF, 50V, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC20, C49, C63, C241
44.7k Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR108, R110, R124, R129
447uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC42, C43, C55, C56
4DRV8300DRGERDRV8300DRGER:DRV8300DRGER- VQFN-24_L4.0-W4.0-P0.50-BL-EP2.5INLA1, INLA2, INLA3, INLA4
4INA240A1DINA240A1D:SOIC127P600X175-8NM1, M2, M3, M4
4KGM31HR71E105KUCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC90, C91, C97, C99
4LEDConnector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_VerticalJ94, J308, J327, J376
4LMR33630ADDALMR33630ADDA:SOIC127P600X170-9NPS1, PS2, PS3, PS4
4STM32F051C8TxPackage_QFP:LQFP-48_7x7mm_P0.5mmU1, U10, U11, U12
4X ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR281, R282, R287, R291
4XAL7070-472MECXAL7070472MEC:XAL7070472MECL3, L4, L6, L7
31.2k ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR69, R71, R285
320pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC84, C260, C264
3220pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC105, C108, C110
343.2k Ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR36, R57, R233
375 ohm, 1206Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR68, R75, R278
3CL31Y475KCK6NWECapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC79, C94, C98
3Conn_01x08_PinConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ121, J132, J133
3FY0800027FY0800027:FY0800027Y1, Y2, Y5
3IRLML0030TRPBFIRLML0030TRPBF:SOT95P237X112-3NQ7, Q28, Q29
3RNCE1206BTE1K00Resistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR111, R120, R122
3XAL7030-682MECXAL7030682MEC:XAL7030682MECL1, L9, L11
20.01uF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC142, C291
20.01uF, Min. 50V, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC64, C242
212nH, 0603Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolderL19, L20
215pF, 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC93, C96

The 1,031 most common of 1,198 parts.

Questions

How big is the FCSTMV1.05 PCB?

It measures 497.4 × 154.7 mm and has 6 copper layers, 1.65 mm thick.

What parts does the FCSTMV1.05 use?

1,198 parts, built around the DRV8300DRGER-MS, INA240A1D, LMR33630ADDA and PSMN1R4-40YLDX. 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 FCSTMV1.05 KiCad files?

From the CGainsWorks/emb-drone-flight-stack repository on GitHub, at the commit this page was made from: the board is hardware/flight-controller/kicad/FCSTMV1.05.kicad_pcb and its schematic hardware/flight-controller/kicad/FCSTMV1.05.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the FCSTMV1.05 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

  • 4 layers65 × 64.5 mmScratch-001, the printed circuit board in 3D

    Scratch-001

    CrypticRage/scratch-001

    114 parts
  • 4 layers61.3 × 20.8 mmYetiX A DevBoard, the printed circuit board in 3D

    YetiX A DevBoard

    Supidoc/YetiX-A

    Small Devboard for the NXP MCX-A Series MCU's

    63 partsMIT
  • 2 layers53.1 × 81.9 mmPTN PumpControlBoard, the printed circuit board in 3D

    PTN PumpControlBoard

    lhr-solar/PS-PumpController

    Controls speed of liquid cooling pump and fans for the main battery pack. Additionally, interprets data from temperature sensors and flowrate sensors for fan/pump control loop

    115 parts1
  • 4 layers48.3 × 56.6 mm4 in 1 ESC, the printed circuit board in 3D

    4 in 1 ESC

    Triso01/FPV-Stack

    Making my own FPV Stack for Stardance (Hackclub)

    176 parts
  • 4 layers96 × 136 mmUSB C PD x2, the printed circuit board in 3D

    USB C PD x2

    Tuskar-Marine/hardware

    All tools for the Mermaid's Rest open sailing tools

    161 parts6
  • 6 layers68 × 52 mmRemotev1, the printed circuit board in 3D

    Remotev1

    ABauschat/ESPNuggetv1-ADS1262HAT

    49 parts
  • 4 layers100 × 100 mmFarmMesh Node, the printed circuit board in 3D

    FarmMesh Node

    chinawrj/FarmMesh-Node

    Developing an integrated hardware and software solution for farm-wide Mesh networking: RP2350B/ESP32-C5 nodes, firmware, network protocols, and Wi-Fi/BLE sensor access.

    164 parts