Spacebridge HAB PCB Development
I have been spending a lot of time at Noisebridge. One of their many cool ongoing projects is Spacebridge, a DIY high altitude balloon group. We are using low cost LoRa/meshtastic hardware to send up, track, and recover our own weather balloons! I’ve gotten lot’s of help from some of the folks over at SF HAB, including some folks that put together the amazing Pico Balloon Project. I have a PCB in my hand now, which I’ll be testing in the upcoming weeks. You can follow my GitHub repo.
In this post I would just like to give and overview of the hardware and explain some of my design choices.
Here is the mainboard.ato file for reference:
module Mainboard:
power = new ElectricPower
power_5V = new ElectricPower; power_5V.gnd ~ power.gnd
power_3V3 = new ElectricPower; power_3V3.gnd ~ power.gnd
power_vbat = new ElectricPower; power_vbat.gnd ~ power.gnd
battery_conn = new XH2A
battery_conn.p1 ~ power_vbat.vcc; battery_conn.p2 ~ power_vbat.gnd
C_batconn = new Capacitor; C_batconn.value = 10uF +/- 20%; C_batconn.package = "C0805"
C_batconn.power ~ power_vbat
usbc = new USBCConn
power_usb = new ElectricPower
power_usb.vcc ~ usbc.usb2.buspower.hv; power_usb.gnd ~ usbc.usb2.buspower.gnd
power_5V ~ power_usb
i2c_conn = new _4P1MMJST
i2c_conn.power ~ power_3V3
i2c_conn2 = new _4P1MMJST
i2c_conn2.power ~ power_3V3
uc = new ESP32S3
uc.power ~ power_3V3
uc.i2c ~ i2c_conn.i2c
uc.i2c ~ i2c_conn2.i2c
uc.usb2 ~ usbc.usb2
gpio_conn = new _7P1MMJST
gpio_conn.p1 ~ uc.io45
gpio_conn.p2 ~ uc.io48
gpio_conn.p3 ~ uc.io47
gpio_conn.p4 ~ uc.io21
gpio_conn.p5 ~ uc.io14
gpio_conn.p6 ~ power_3V3.vcc
gpio_conn.p7 ~ power_3V3.gnd
pressure_sensor = new GZP6859D101KPP
pressure_sensor.i2c ~ uc.i2c
pressure_sensor.power ~ power_3V3
C_pres = new Capacitor; C_pres.value = 100nF +/- 20%; C_pres.package = "C0402"
C_pres.power ~ pressure_sensor.power
ldo = new Regulator
ldo.ic.EN ~ ldo.Vin.vcc
ldo.Vin ~ power_vbat
ldo.Vin ~ power_usb
# DO NOT PLUG IN USB-C AND BATTERY AT THE SAME TIME
ldo.Vout ~ power_3V3
assert ldo.OUTPUT_VOLTAGE is 3.3V +/- 5%
lora = new Lora
lora.power ~ power_3V3
lora.spi ~ uc.spi2
lora.lora.spi_cs.line ~ uc.spi2_cs.line
bme688 = new Nose
bme688.power ~ power_3V3
bme688.i2c ~ uc.i2c
gps = new ATGM336H
gps.power ~ power_3V3
gps.i2c ~ uc.i2c
C_gps1 = new Capacitor; C_gps1.value = 2.2uF +/- 20%; C_gps1.package = "C0603"
C_gps1.power ~ gps.power
C_gps2 = new Capacitor; C_gps2.value = 100nF +/- 20%; C_gps2.package = "C0402"
C_gps2.power ~ gps.power
gps_bat = new Keystone_2998; gps_bat.power.vcc ~ gps.VBAT; gps_bat.power.gnd ~ power.gnd
RF_conn = new IPEX
RF_conn.RF_IN ~ gps.RF_IN
RF_conn.GND ~ gps.GND
rf_L = new Murata_Electronics_LQP03TG47NJ02D
gps.VCC_RF ~ rf_L.p1; rf_L.p2 ~ RF_conn.RF_IN
cutoff = new Cutoff
cutoff.power ~ power_vbat # cutoff.power--/\1kohm/\-->|supercap|
# IO can be remapped as needed for layout, check esp32s3.ato
cutoff.SC_GATE ~ uc.io0 # Dis/connect supercapacitor
cutoff.CUTOFF_GATE ~ uc.io1 # Fire cutoff, active high
cutoff.SC_Sense ~ uc.io37
ntc = new NCP03WF104F05RL
R_div = new Resistor; R_div.value = 10kohm +/- 5%; R_div.package = "R0201"
R_div.p1 ~ uc.power.vcc; R_div.p2 ~ ntc.p1; ntc.p2 ~ uc.power.gnd
signal TEMP; TEMP ~ ntc.p1
uc.io16 ~ TEMP