diff --git a/src/flight-software/main.py b/src/flight-software/main.py index 5713455..0855078 100644 --- a/src/flight-software/main.py +++ b/src/flight-software/main.py @@ -5,6 +5,8 @@ import board import digitalio import microcontroller +from lib.adafruit_mcp230xx.mcp23017 import MCP23017 +from lib.adafruit_tca9548a import TCA9548A from lib.proveskit_rp2350_v5b.register import Register from lib.pysquared.beacon import Beacon from lib.pysquared.cdh import CommandDataHandler @@ -13,14 +15,14 @@ from lib.pysquared.hardware.digitalio import initialize_pin from lib.pysquared.hardware.imu.manager.lsm6dsox import LSM6DSOXManager from lib.pysquared.hardware.magnetometer.manager.lis2mdl import LIS2MDLManager +from lib.pysquared.hardware.power_monitor.manager.ina219 import INA219Manager from lib.pysquared.hardware.radio.manager.rfm9x import RFM9xManager from lib.pysquared.hardware.radio.manager.sx1280 import SX1280Manager from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter +from lib.pysquared.protos.power_monitor import PowerMonitorProto from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager -from lib.pysquared.sleep_helper import SleepHelper -from lib.pysquared.watchdog import Watchdog from version import __version__ boot_time: float = time.time() @@ -41,23 +43,55 @@ software_version=__version__, ) +logger.debug("Initializing Config") +config: Config = Config("config.json") + loiter_time: int = 5 for i in range(loiter_time): logger.info(f"Code Starting in {loiter_time-i} seconds") time.sleep(1) try: - watchdog = Watchdog(logger, board.WDT_WDI) - watchdog.pet() + SPI0_CS0 = initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True) + SPI1_CS0 = initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True) + GPIO_RESET = initialize_pin( + logger, board.GPIO_EXPANDER_RESET, digitalio.Direction.OUTPUT, True + ) - logger.debug("Initializing Config") - config: Config = Config("config.json") + i2c1 = initialize_i2c_bus( + logger, + board.SCL1, + board.SDA1, + 100000, + ) - mux_reset = initialize_pin( - logger, board.MUX_RESET, digitalio.Direction.OUTPUT, False + i2c0 = initialize_i2c_bus( + logger, + board.SCL0, + board.SDA0, + 100000, ) - # TODO(nateinaction): fix spi init + mcp = MCP23017(i2c1) + + # GPB + FACE4_ENABLE = mcp.get_pin(8) + FACE0_ENABLE = mcp.get_pin(9) + FACE1_ENABLE = mcp.get_pin(10) + FACE2_ENABLE = mcp.get_pin(11) + FACE3_ENABLE = mcp.get_pin(12) + FACE5_ENABLE = mcp.get_pin(13) + + # GPA + ENABLE_HEATER = mcp.get_pin(0) + PAYLOAD_PWR_ENABLE = mcp.get_pin(1) + FIRE_DEPLOY2_B = mcp.get_pin(2) + PAYLOAD_BATT_ENABLE = mcp.get_pin(3) + RF2_IO2 = mcp.get_pin(4) + RF2_IO1 = mcp.get_pin(5) + RF2_IO0 = mcp.get_pin(6) + RF2_IO3 = mcp.get_pin(7) + spi0 = _spi_init( logger, board.SPI0_SCK, @@ -76,28 +110,19 @@ logger, config.radio, spi1, - initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True), + SPI1_CS0, initialize_pin(logger, board.RF2_RST, digitalio.Direction.OUTPUT, True), - initialize_pin(logger, board.RF2_IO0, digitalio.Direction.OUTPUT, True), + RF2_IO0, 2.4, initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, False), initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, False), ) - i2c1 = initialize_i2c_bus( - logger, - board.SCL1, - board.SDA1, - 100000, - ) - - sleep_helper = SleepHelper(logger, config, watchdog) - uhf_radio = RFM9xManager( logger, config.radio, spi0, - initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), + SPI0_CS0, initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), ) @@ -109,7 +134,7 @@ logger, uhf_radio, config.radio.license, - Counter(Register.message_count), + Counter(2), 0.2, ) @@ -119,21 +144,53 @@ logger, config.cubesat_name, uhf_packet_manager, - boot_time, + time.monotonic(), imu, magnetometer, uhf_radio, sband_radio, - error_count, - boot_count, ) + # Face Control Helper Functions + def all_faces_off(): + """ + This function turns off all of the faces. Note the load switches are disabled low. + """ + FACE0_ENABLE.value = False + FACE1_ENABLE.value = False + FACE2_ENABLE.value = False + FACE3_ENABLE.value = False + FACE4_ENABLE.value = False + + def all_faces_on(): + """ + This function turns on all of the faces. Note the load switches are enabled high. + """ + FACE0_ENABLE.value = True + FACE1_ENABLE.value = True + FACE2_ENABLE.value = True + FACE3_ENABLE.value = True + FACE4_ENABLE.value = True + + mux_reset = initialize_pin( + logger, board.MUX_RESET, digitalio.Direction.OUTPUT, False + ) + all_faces_on() + time.sleep(0.1) + mux_reset.value = True + tca = TCA9548A(i2c0, address=int(0x77)) # all 3 connected to high + + battery_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c0, 0x40) + solar_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c0, 0x41) + def nominal_power_loop(): logger.debug( "FC Board Stats", bytes_remaining=gc.mem_free(), ) + all_faces_on() + uhf_packet_manager.send(config.radio.license.encode("utf-8")) beacon.send() diff --git a/src/flight-software/repl.py b/src/flight-software/repl.py index b97c533..a9e1335 100644 --- a/src/flight-software/repl.py +++ b/src/flight-software/repl.py @@ -3,12 +3,8 @@ import board import digitalio -from lib.adafruit_mcp230xx.mcp23017 import ( - MCP23017, # This is Hacky V5a Devel Stuff### -) -from lib.adafruit_tca9548a import TCA9548A # This is Hacky V5a Devel Stuff### - -# from lib.pysquared.Big_Data import AllFaces ### This is Hacky V5a Devel Stuff### +from lib.adafruit_mcp230xx.mcp23017 import MCP23017 +from lib.adafruit_tca9548a import TCA9548A from lib.pysquared.beacon import Beacon from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config @@ -17,6 +13,9 @@ from lib.pysquared.hardware.digitalio import initialize_pin from lib.pysquared.hardware.imu.manager.lsm6dsox import LSM6DSOXManager from lib.pysquared.hardware.light_sensor.manager.veml7700 import VEML7700Manager +from lib.pysquared.hardware.load_switch.manager.loadswitch_manager import ( + LoadSwitchManager, +) from lib.pysquared.hardware.magnetometer.manager.lis2mdl import LIS2MDLManager from lib.pysquared.hardware.power_monitor.manager.ina219 import INA219Manager from lib.pysquared.hardware.radio.manager.rfm9x import RFM9xManager @@ -27,7 +26,8 @@ from lib.pysquared.nvm.counter import Counter from lib.pysquared.protos.power_monitor import PowerMonitorProto from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager -from lib.pysquared.sleep_helper import SleepHelper + +# from lib.pysquared.sleep_helper import SleepHelper from lib.pysquared.watchdog import Watchdog from version import __version__ @@ -44,6 +44,12 @@ software_version=__version__, ) +watchdog = Watchdog(logger, board.WDT_WDI) +watchdog.pet() + +logger.debug("Initializing Config") +config: Config = Config("config.json") + def get_temp(sensor): for i in range(1000): @@ -51,15 +57,63 @@ def get_temp(sensor): time.sleep(0.1) -watchdog = Watchdog(logger, board.WDT_WDI) -watchdog.pet() +SPI0_CS0 = initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True) +SPI1_CS0 = initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True) -logger.debug("Initializing Config") -config: Config = Config("config.json") +# manually set the pin high to allow mcp to be detected +GPIO_RESET = ( + initialize_pin(logger, board.GPIO_EXPANDER_RESET, digitalio.Direction.OUTPUT, True), +) -mux_reset = initialize_pin(logger, board.MUX_RESET, digitalio.Direction.OUTPUT, False) +i2c1 = initialize_i2c_bus( + logger, + board.SCL1, + board.SDA1, + 100000, +) -# TODO(nateinaction): fix spi init +i2c0 = initialize_i2c_bus( + logger, + board.SCL0, + board.SDA0, + 100000, +) + + +mcp = MCP23017(i2c1) + + +# #GPB +FACE4_ENABLE = mcp.get_pin(8) +FACE0_ENABLE = mcp.get_pin(9) +FACE1_ENABLE = mcp.get_pin(10) +FACE2_ENABLE = mcp.get_pin(11) +FACE3_ENABLE = mcp.get_pin(12) +FACE5_ENABLE = mcp.get_pin(13) +# READ ONLY +# CHARGE + +# GPA +ENABLE_HEATER = mcp.get_pin(0) +PAYLOAD_PWR_ENABLE = mcp.get_pin(1) +FIRE_DEPLOY2_B = mcp.get_pin(2) +PAYLOAD_BATT_ENABLE = mcp.get_pin(3) +RF2_IO2 = mcp.get_pin(4) +RF2_IO1 = mcp.get_pin(5) +RF2_IO0 = mcp.get_pin(6) +RF2_IO3 = mcp.get_pin(7) + +# # This defines the direction of the GPIO pins +FACE4_ENABLE.direction = digitalio.Direction.OUTPUT +FACE0_ENABLE.direction = digitalio.Direction.OUTPUT +FACE1_ENABLE.direction = digitalio.Direction.OUTPUT +FACE2_ENABLE.direction = digitalio.Direction.OUTPUT +FACE3_ENABLE.direction = digitalio.Direction.OUTPUT +ENABLE_HEATER.direction = digitalio.Direction.OUTPUT +PAYLOAD_PWR_ENABLE.direction = digitalio.Direction.OUTPUT + + +# # TODO(nateinaction): fix spi init spi0 = _spi_init( logger, board.SPI0_SCK, @@ -78,35 +132,22 @@ def get_temp(sensor): logger, config.radio, spi1, - initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True), + SPI1_CS0, initialize_pin(logger, board.RF2_RST, digitalio.Direction.OUTPUT, True), - initialize_pin(logger, board.RF2_IO0, digitalio.Direction.OUTPUT, True), + RF2_IO0, 2.4, initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, False), initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, False), ) -i2c1 = initialize_i2c_bus( - logger, - board.SCL1, - board.SDA1, - 100000, -) - -i2c0 = initialize_i2c_bus( - logger, - board.SCL0, - board.SDA0, - 100000, -) -sleep_helper = SleepHelper(logger, config, watchdog) +# sleep_helper = SleepHelper(logger, config, watchdog) uhf_radio = RFM9xManager( logger, config.radio, spi0, - initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), + SPI0_CS0, initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), ) @@ -135,38 +176,11 @@ def get_temp(sensor): sband_radio, ) -## Initialize the MCP23017 GPIO Expander and its pins ## -GPIO_RESET = initialize_pin( - logger, board.GPIO_EXPANDER_RESET, digitalio.Direction.OUTPUT, True -) -mcp = MCP23017(i2c1) - -# This sets up all of the GPIO pins on the MCP23017 -FACE4_ENABLE = mcp.get_pin(8) -FACE0_ENABLE = mcp.get_pin(9) -FACE1_ENABLE = mcp.get_pin(10) -FACE2_ENABLE = mcp.get_pin(11) -FACE3_ENABLE = mcp.get_pin(12) -ENAB_RF = mcp.get_pin(13) -VBUS_RESET = mcp.get_pin(14) -SPI0_CS1 = mcp.get_pin(15) -ENABLE_HEATER = mcp.get_pin(0) -PAYLOAD_PWR_ENABLE = mcp.get_pin(1) -Z_GPIO0 = mcp.get_pin(2) -Z_GPIO1 = mcp.get_pin(3) -RF2_IO2 = mcp.get_pin(4) -RF2_IO1 = mcp.get_pin(5) - -# This defines the direction of the GPIO pins -FACE4_ENABLE.direction = digitalio.Direction.OUTPUT -FACE0_ENABLE.direction = digitalio.Direction.OUTPUT -FACE1_ENABLE.direction = digitalio.Direction.OUTPUT -FACE2_ENABLE.direction = digitalio.Direction.OUTPUT -FACE3_ENABLE.direction = digitalio.Direction.OUTPUT -ENAB_RF.direction = digitalio.Direction.OUTPUT -VBUS_RESET.direction = digitalio.Direction.OUTPUT -ENABLE_HEATER.direction = digitalio.Direction.OUTPUT -PAYLOAD_PWR_ENABLE.direction = digitalio.Direction.OUTPUT +load_switch_0 = LoadSwitchManager(FACE0_ENABLE, True) +load_switch_1 = LoadSwitchManager(FACE1_ENABLE, True) +load_switch_2 = LoadSwitchManager(FACE2_ENABLE, True) +load_switch_3 = LoadSwitchManager(FACE3_ENABLE, True) +load_switch_4 = LoadSwitchManager(FACE4_ENABLE, True) # Face Control Helper Functions @@ -174,33 +188,36 @@ def all_faces_off(): """ This function turns off all of the faces. Note the load switches are disabled low. """ - FACE0_ENABLE.value = False - FACE1_ENABLE.value = False - FACE2_ENABLE.value = False - FACE3_ENABLE.value = False - FACE4_ENABLE.value = False + load_switch_0.disable_load() + load_switch_1.disable_load() + load_switch_2.disable_load() + load_switch_3.disable_load() + load_switch_4.disable_load() def all_faces_on(): """ This function turns on all of the faces. Note the load switches are enabled high. """ - FACE0_ENABLE.value = True - FACE1_ENABLE.value = True - FACE2_ENABLE.value = True - FACE3_ENABLE.value = True - FACE4_ENABLE.value = True + load_switch_0.enable_load() + load_switch_1.enable_load() + load_switch_2.enable_load() + load_switch_3.enable_load() + load_switch_4.enable_load() ## Face Sensor Stuff ## # This is the TCA9548A I2C Multiplexer + +mux_reset = initialize_pin(logger, board.MUX_RESET, digitalio.Direction.OUTPUT, False) all_faces_on() +time.sleep(0.1) mux_reset.value = True -tca = TCA9548A(i2c1, address=int(0x77)) +tca = TCA9548A(i2c0, address=int(0x77)) # all 3 connected to high -# Light Sensors +# # Light Sensors light_sensors = [] try: sensor = VEML7700Manager(logger, tca[0]) @@ -227,7 +244,7 @@ def all_faces_on(): logger.debug("WARNING!!! Light sensor 3 failed to initialize") light_sensors.append(None) try: - sensor = VEML7700Manager(logger, tca[4]) + sensor = VEML7700Manager(logger, tca[5]) light_sensors.append(sensor) except Exception: logger.debug("WARNING!!! Light sensor 4 failed to initialize") @@ -237,20 +254,20 @@ def all_faces_on(): # Onboard Temp Sensors temp_sensors = [] -# Direct I2C sensors -try: - temp_sensor5 = MCP9808Manager(logger, i2c0, addr=25) # Antenna Board -except Exception: - logger.debug("WARNING!!! Temp sensor 5 (Antenna Board) failed") - temp_sensor5 = None -temp_sensors.append(temp_sensor5) - -try: - temp_sensor6 = MCP9808Manager(logger, i2c1, addr=27) # Flight Controller Board -except Exception: - logger.debug("WARNING!!! Temp sensor 6 (Flight Controller Board) failed") - temp_sensor6 = None -temp_sensors.append(temp_sensor6) +# # Direct I2C sensors +# try: +# temp_sensor5 = MCP9808Manager(logger, i2c0, addr=40) # Antenna Board +# except Exception: +# logger.debug("WARNING!!! Temp sensor (Antenna Board) failed") +# temp_sensor5 = None +# temp_sensors.append(temp_sensor5) + +# try: +# temp_sensor6 = MCP9808Manager(logger, i2c1, addr=41) # Flight Controller Board +# except Exception: +# logger.debug("WARNING!!! Temp sensor (Flight Controller Board) failed") +# temp_sensor6 = None +# temp_sensors.append(temp_sensor6) # TCA-connected temp sensors try: @@ -263,7 +280,7 @@ def all_faces_on(): sensor = MCP9808Manager(logger, tca[1], addr=27) temp_sensors.append(sensor) except Exception: - logger.debug("WARNING!!! Temp sensor 1]) failed") + logger.debug("WARNING!!! Temp sensor 1 failed") temp_sensors.append(None) try: sensor = MCP9808Manager(logger, tca[2], addr=27) @@ -275,19 +292,31 @@ def all_faces_on(): sensor = MCP9808Manager(logger, tca[3], addr=27) temp_sensors.append(sensor) except Exception: - logger.debug("WARNING!!! Temp sensor3 failed") + logger.debug("WARNING!!! Temp sensor 3 failed") + temp_sensors.append(None) +try: + sensor = MCP9808Manager(logger, tca[5], addr=24) + temp_sensors.append(sensor) +except Exception: + logger.debug("WARNING!!! Temp sensor 4 failed (Z- Face Bottom pins") temp_sensors.append(None) +# these are the bottom 6 pins on the z- face connection, uncomment if that is where you plug in a face for the z- board +# try: +# sensor = MCP9808Manager(logger, tca[6], addr=24) +# temp_sensors.append(sensor) +# except Exception: +# logger.debug("WARNING!!! Temp sensor 4 failed (Z- Face Top pins)") +# # temp_sensors.append(None) try: - sensor = MCP9808Manager(logger, tca[4], addr=27) + sensor = MCP9808Manager(logger, tca[7], addr=25) temp_sensors.append(sensor) except Exception: - logger.debug("WARNING!!! Temp sensor 4 failed") + logger.debug("WARNING!!! Temp sensor 5 failed (Antenna Board)") temp_sensors.append(None) -battery_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c1, 0x40) -solar_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c1, 0x44) +battery_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c0, 0x40) +solar_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c0, 0x41) -## Init Misc Pins ## burnwire_heater_enable = initialize_pin( logger, board.FIRE_DEPLOY1_A, digitalio.Direction.OUTPUT, False ) diff --git a/src/ground-station/lib/requirements.txt b/src/ground-station/lib/requirements.txt index 05be484..7048407 100644 --- a/src/ground-station/lib/requirements.txt +++ b/src/ground-station/lib/requirements.txt @@ -1,4 +1,4 @@ adafruit-circuitpython-asyncio @ git+https://github.com/adafruit/adafruit_circuitpython_asyncio@1.3.3 adafruit-circuitpython-rfm==1.0.3 adafruit-circuitpython-ticks==1.1.1 -proveskit-ground-station @ git+https://github.com/proveskit/circuitpython_ground_station@0.0.1 +pysquared-ground-station @ git+https://github.com/proveskit/pysquared@d1b22be#subdirectory=circuitpython-workspaces/ground-station diff --git a/src/ground-station/repl.py b/src/ground-station/repl.py index b54af6c..924bda3 100644 --- a/src/ground-station/repl.py +++ b/src/ground-station/repl.py @@ -1,7 +1,7 @@ import board import digitalio from busio import SPI -from lib.proveskit_ground_station.proveskit_ground_station import GroundStation +from lib.ground_station.ground_station import GroundStation from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config from lib.pysquared.hardware.busio import _spi_init