Arrow PT3 Energy Storage System Documentation

Table of Contents

  1. System Requirements
  2. System/Component Overview
  3. Interfaces
  4. Bill of Materials
  5. Mechanical Description
  6. Electrical Power Supply Architecture
  7. Performance Characteristics
  8. Mode of Operations
  9. Installation Requirements/Consideration
  10. Safety Features
  11. Harness Requirements/Connectors
  12. System Reliability
  13. System/Unit Test & Validation

System Requirements

Content goes here

System/Component Overview

The PT3 Energy Storage System utilises a general layout of 6 independent batteries. Each battery is powering one of the six Motors and ESCs. Each batterie is also supplying power into the low voltage system. The main reason behind this layout is system redundancy. In case one of the batteries fails, the aircraft is still able to operate and land safely.

General System Layout

The battery cells have the greatest influence on the performance of the energy storage system. Each PT3 main battery consists of 120 cylindrical 21700 cells. The key data points of the whole system can be seen below:

Specification Value
Voltage (V) 88.8V (24S)
Total capacity (Ah) 135Ah (6X 22.5Ah)
Total capacity (kWh) 11.664 kWh (6X 1.944 kWh)
Continuous discharge current 1350A (6X 225A) (80°C cut-off)
Total weight 72kg (6X 12kg)
System energy density (Wh/kg) 162 Wh/kg

Datasheet of the MOLICEL INR-21700-P45B batterie cell that is used in the energy storage system (Battery configuration: 5P24S):

Batteries Datasheet

The structure of the batteries can be divided into 3 main groups:

  1. Cell pack:
    • 120X MOLICEL INR-21700-P45B cells that are orientated in a 5P24S configuration
    • The battery cells are enclosed by a 3D printed cell holder (Material used: PETG-CF)
    • Laser cut copper and stainless steel sheet metal parts are used as cell connectors. They are nickel plated after the laser cutting and then spot welded on top of the battery cells.

Cell pack

  1. Battery PCBs:

    Several PCBs are mounted in the battery pack:

    • ENNOID XLITE V4 BMS for the battery managment
    • Arduino MKR 1010 to add customized functions such as extended contactor control and contactor feedback
    • Battery power PCB for the power distribution and power conversion inside the battery pack
    • Battery signal PCB for connecting the signals to the wiring harness outside of the battery pack
    • Two Flexible PCBs for the cell voltage connections and cell temperatures

Battery PCBs

  1. Housing of the battery

    The housing of the battery starts with two mica sheets on top of the sheet metal cell connectors (top and bottom). The mica sheets are electrically isolating and also used to increase fire protection. The main top and bottom parts in the PT3 batteries are 5mm cfk sheets with a honeycomb infill. They are lightweight and stiff. The sides are protected by bended aluminum sheets with a thickness of 2mm. The front and back of a battery pack is closed with 3D printed lids made of PETG-CF.

Battery Housing

Interfaces

Can bus Interface

Two digital CAN bus interfaces are utilized in each battery. One CAN bus interface on the BMS and one on the Arduino MKR 1010.

  • CAN bus Interface on the BMS:

    • This interface is responsible for data output related to the battery cells.
    • It provides detailed information including:
      • Cells voltages
      • Overall battery voltage
      • Temperatures
      • State of Charge (SOC)
      • State of Health (SOH)
      • Charging current
      • Charging voltage
      • Operating state
  • CAN bus Interface on the Arduino:

    • This interface is primarily used for mode of operation control.
    • It controls the contactor and precharging functions.
    • It mainly receives commands from the flight controller.

Bill of Materials

Overall bill of materials (PCBs as one component):

Pos. Description Part Number Qty 1 Battery
1 21700 Battery Cell MOLICEL INR-21700-P45B 120
2 Bottom 3D print cell holder PRINT_BTM_HOLDER 1
3 Top 3D print cell holder PRINT_TOP_HOLDER 1
4 Bottom 3D print adjustment dapter PRINT_BTM_ADJ 1
5 Top 3D print adjustment dapter PRINT_TOP_ADJ 1
6 5P2S copper cell connector 02_COPPER_5P2S 22
7 5P2S steel cell connector 02_STEEL_5P2S 22
8 5P1S positive copper cell terminal 02_COPPER_POS_5P1S 1
9 5P1S positive steel cell terminal 02_STEEL_POS_5P1S 1
10 5P1S negative copper cell terminal 02_COPPER_NEG_5P1S 1
11 5P1S negative steel cell terminal 02_STEEL_NEG_5P1S 1
12 5P2S_M mid pack copper cell connector 02_COPPER_MID_5P2S_M 1
13 5P2S_M mid pack steel cell connector 02_STEEL_MID_5P2S_M 1
14 M4 scew insert for 3D print M4_56_81 34
15 M2 scew insert for 3D print M2_32_40 7
16 Left side flexible PCB FLEX_L 1
17 Right side flexible PCB FLEX_R 1
18 Battery power PCB B_PWR_PCB 1
19 Battery signal PCB B_SIG_PCB 1
20 Arduino MKR 1010 MKR_1010 1
21 ENNOID XLITE V4 BMS (Modified) XLITE_V4_M_PT3 1
22 Contactor EVD_150 1
23 Mica Insulation Sheet 02_MICA 2
24 Top housing cfk sheet CFK_TOP 1
25 Bottom housing cfk sheet CFK_BTM 1
26 Left housing aluminum side ALU_LEFT 1
27 Right housing aluminum side ALU_RIGHT 1
28 Front housing cover 3D print PRINT_FRONT_COVER 1
29 Back housing cover 3D print PRINT_BACK_COVER 1
30 M4x10 flat hat screw M4_10_FLAT 34
31 M2x5 screw M2_5 7
31 M2 distance adapter M2_DIST 14

Bill of materials battery power PCB (components):

Pos. Name Description Designator Part Number Qty 1 PCB
1 47uF/10V 47uF ± 10% 10V C1, C2 GRT31CR61A476KE13L 2
2 NO FIT DC high voltage EV relay CON1 EVD150 1
3 AMX-300 Automotive Fuses AMX Fuse, 300 A, 125Vdc, 30 mm, Std Pack F1 AMX-300 1
4 3403.0170.11 Schurter 2.5A T Surface Mount Fuse, 125 V dc, 250 V ac F2, F4 3403.0170.24 2
5 3403.0176.11 Schurter 2.5A T Surface Mount Fuse, 125 V dc, 250 V ac F3 3403.0176.24 1
6 7461383 Terminals WP-SHFU Pin-Plate 16Pin M5 Shank 180A J1, J2 7461383 2
7 NO FIT Busbar Positive Terminal_1 J3 Sheet metal part 1
8 NO FIT Busbar Positive Terminal_2 J4 Sheet metal part 1
9 NO FIT Busbar Positive Terminal_3 J5 Sheet metal part 1
10 Molex Socket 2119370002 Heavy Duty Power Connectors PowerWize HC 6mm HDR M DR 2CKT KEY A RD J6 211937-0002 1
11 Molex Connector Heavy Duty Power Connectors PowerWize HC 6mm Connector Housing - 211942-0002 1
12 Molex Crimp Heavy Duty Power Connectors PowerWize HC 6mm Crimp Contact - 204608-0006 or 204608-4006 2
13 NO FIT Busbar Negative Terminal_2 J7 Sheet metal part 1
14 282834-4 Fixed Terminal Blocks 4P SIDE ENTRY 2.54mm J8 282834-4 1
15 NO FIT Busbar Negative Terminal_1 J9 Sheet metal part 1
16 AYC5F2010 125C heat resistance, Connectors for board-to-FPC, Receptacle, 20 pins J10, J12 AYC5F2010 2
17 ESQT-112-03-F-S-310 Headers & Wire Housings FleXYZ Flexible-Height Socket Strip, 2.00mm Pitch J11 ESQT-112-03-F-S-310 1
18 XT30UPB-F XT30 vertical PCB connector J13 XT30UPB-F 1
19 SSW-114-01-T-S Headers & Wire Housings Tiger Buy Socket Strip with PCB Tails, .100\ Pitch J14, J15 SSW-114-01-T-S 2
20 ESQT-102-03-F-S-310 Headers & Wire Housings FleXYZ Flexible-Height Socket Strip, 2.00mm Pitch J16, J19 ESQT-102-03-F-S-310 2
21 ESQT-114-03-F-S-310 Headers & Wire Housings FleXYZ Flexible-Height Socket Strip, 2.00mm Pitch J17 ESQT-114-03-F-S-310 1
22 ZW-03-12-T-D-620-100 Board to Board & Mezzanine Connectors Flexible Board Stacking Header, 0.100\ Pitch J18 DW-03-12-S-D-620 1
23 CPC1718J 100V Single-Pole, Normally Open DC-Only Power Relay Source: Datasheet K1 CPC1718J 1
24 CPC1916Y Solid State Relays - PCB Mount 100V Single Pole SIP Power Relay K2, K3 CPC1916Y 2
25 RED Standard LEDs - SMD Super Red, 645nm 180mcd, 20mA LED1 720-LST676-Q1R2-1-Z 1
26 NO FIT Arduino MKR WiFi 1010 M1 ABX00023 1
27 NO FIT ENNOID-BMS XLITE V4 M2 Order from Ennoid.me 1
28 TMU_3-1211 3 Watt DC/DC converter, industrial, +/-10% SIP-4 PS1 TMU 3-1211 1
29 RSDW20H-12 Isolated DC/DC Converters 20W 43-160Vin 12V 1670mA 2x1 DIP Iso PS2 RSDW20H-12 1
30 FMMT555TA Diodes Inc FMMT555TA PNP Bipolar Transistor, -1 A, -150 V, 3-Pin SOT-23 Q1 FMMT555TA 1
31 PWR163S-25-50R0F Res Thick Film 50 Ohm 1% 25W +/-100ppm/C Epoxy D-Pak Gull Wing SMD R1, R2, R3 PWR163S-25-50R0F 3
32 220 220 Ohms ±1% 0.125W R4, R5, R9 RC0805FR-07220RL 3
33 1M 1 MOhms ±1% 0.125W R6, R10 RC0805FR-071ML 2
34 75K 75 kOhms ±1% 0.125W R7, R11 RC0805FR-0775KL 2
35 680R 0.1W/ 680ohm±1% R8 RC0603FR-07680RL 1
36 SLW-913535-2A-SMT Slide Switches 9.1 x 3.5 x 3.5 mm, 2 mm Raised Slide Actuator, Vertical, Surface Mount S1 SLW-913535-2A-SMT 1

Bill of materials battery signal PCB (components):

Pos. Name Description Designator Part Number Qty 1 PCB
1 100nF 100nF ± 10% 50V C1, C2, C3 CC0805KRX7R9BB104 3
2 8pF 8pF ± 10% 50V C4, C5 CC0603JRNPO9BN8R0 2
3 PESD0603-240 LITTELFUSE - PESD0603-240 - ESD SUPPRESSOR, 0603, 24V, 0.25PF D1, D2 PESD0603-240 2
4 XT30UPB-M XT30 vertical PCB adapter J1 XT30UPB-M 1
5 TSW-114-14-T-S Headers & Wire Housings Classic PCB Header Strips, 0.100\ pitch” J2, J3 TSW-114-14-T-S 2
6 SSW-103-01-T-D Headers & Wire Housings Tiger Buy Socket Strip with PCB Tails, .100\ Pitch” J4 SSW-103-01-T-D 1
7 ESQT-103-03-F-S-310 3 Position Elevated Socket Connector 0.079 (2.00mm) Through Hole Gold J5 ESQT-103-03-F-S-310 1
8 ESQT-104-03-F-S-310 CONN SOCKET 4POS 0.079 GOLD PCB J6 ESQT-104-03-F-S-310 1
9 ESQT-106-03-F-S-310 6 Position Elevated Socket Connector 0.079 (2.00mm) Through Hole Gold J7 ESQT-106-03-F-S-310 1
10 AT04-12PB-BM04 Automotive Connectors AT RCPT 12P (Ni) PCB BRD MNT POTING BK J8 AT04-12PB-BM04 1
11 AT06 Connector 12 Pos AT06 Connector 12 Pos - AT06-12SB 1
12 AT Retention Wedge 12 AT Retention Wedge 12 Pos - AW12S 1
13 AT04-08PB-BM04 AMPHENOL SINE/TUCHEL - AT04-08PB-BM04 - RECTANGULAR CONN, RCPT, 8POS, PCB, BLACK J9 AT04-08PB-BM04 1
14 AT06 Connector 8 Pos AT06 Connector 8 Pos - AT06-08SB 1
15 AT Retention Wedge 8 AT Retention Wedge 8 Pos - AW8S 1
16 AT04-2P-BM04 Conn Power RCP 2 POS 5.4mm Solder ST Thru-Hole 2 Terminal 1 Port J10 AT04-2P-BM04 1
17 AT06 Connector 2 Pos AT06 Connector 2 Pos - AT06-2S-ORG 1
18 AT Retention Wedge AT Retention Wedge 2 Pos - AW2S 1
19 AT Crimp Crimp contacts for AT connectors 20-16 AWG - AT62-201-16141 22
20 10K 10 kOhms ±1% 0.125W R1, R3, R4, R5 RC0805FR-0710KL 4
21 120 120 Ohms ±1% 0.125W R2 RC0805FR-07120RL 1
22 TL3305BF260QG Tactile Switch SPST-NO Top Actuated Surface Mount S1 TL3305BF260QG 1
23 SLW-913535-2A-SMT Slide Switches 9.1 x 3.5 x 3.5 mm, 2 mm Raised Slide Actuator, Vertical, Surface Mount S2 SLW-913535-2A-SMT 1
24 TJA1049T/3J CAN transceiver U1 TJA1049T/3J 1
25 MCP2515-I/SO CANbus Controller CAN 2.0 SPI Interface 18-SOIC U2 MCP2515-I/SO 1
26 8MHz A small surface-mount type crystal unit, ideal for an engine control CPU clock X1 NX3225GD-8MHZ-STD-CRA-3 1

Bill of materials battery flexible PCB (components):

Pos. Name Description Designator Part Number Qty 1 PCB
1 AYC6F2010 FFC & FPC Connectors 1A 50VDC 800VAC 20-pin Header 29.8mm J1 AYC6F2010 1
2 NCP21WF104J03RA NTC (Negative Temperature Coefficient) Thermistors 100K OHM 5% R1 NCP21WF104J03RA 1

Mechanical Description

This section describes the layout of the battery from the inside out:

  1. Cell Placement:

    • The battery cells are positioned between the top and bottom cell holders, which are 3D printed to ensure precise alignment and secure placement.
  2. Cell Connectors:

    • The sheet metal cell connectors are spot welded onto the battery cells, providing a reliable and robust electrical connection.
  3. Flexible Cell Voltage PCBs:

    • Two flexible cell voltage PCBs are attached to the left and right sides of the 3D printed cell housing. These PCBs are crucial for monitoring the cell voltages and ensuring the battery operates safely and efficiently.
  4. Electrical Insulation:

    • For electrical insulation, a mica sheet is added to the cell-facing side of the outer battery housing, both at the top and bottom. In the prototypes, a 5mm carbon fiber sheet with honeycomb infill was used for structural support, and the mica sheet, with a thickness of 0.2mm, provided the necessary insulation.
  5. Battery Power PCB:

    • The battery power PCB is mounted with screws at the front of the battery. It directly connects to the sheet metal cell connectors via busbars, which are soldered onto the PCB, forming the positive and negative battery terminals.
  6. Mounting of BMS and Arduino:

    • The Xlite BMS and the Arduino MKR 1010 are mounted on the battery power PCB using distance screw adapters to ensure proper spacing and secure attachment.
  7. Battery Signal PCB:

    • Positioned on top of the Xlite BMS and Arduino, the battery signal PCB is mounted. It features connectors that face outside the battery box, creating a three-layer PCB sandwich connected through pin headers and sockets.
  8. Protective Aluminum Plates:

    • Bent aluminum plates are added to the left and right sides of the battery, protecting the flexible PCBs and providing mounting holes for securing the entire battery assembly.
  9. 3D Printed Lids:

    • The final components are the 3D printed lids, attached at the front and back of the battery. The front lid features holes for the connectors, while the back lid covers the exposed copper sheet metal of the cell connectors.

Electrical Power Supply Architecture

The electrical circuit is mainly divided into two custom PCBs. The battery power PCB and the battery signal PCB. Both schematics are shown below. The battery power PCB is handling the power supply, cell voltage routing and high current distribution. The battery signal PCB is mainly used for connecting the battery to the airraft.

Battery Power PCB Schematics

  • Internal power supply in each battery for 12V and 5V with isolated DCDC converters. It’s powering the arduino, the contactor and SSRs. The power supply is also used to give the enable sigal to the ENNOID XLITE BMS.
  • HV and high current output path to the main output power connector and also the HV path to the charging connector.

Battery Signal PCB Schematics

  • Canbus circuit
  • Internal signal routing
  • Connectors to the central signal distribution PCB, ESC and the charger

Performance Characteristics

Test Data Analysis

  • Full Thrust Stand Run:
    • A comprehensive test needs to be conducted to evaluate the performance of the battery system under full thrust conditions over a longer period of time. A short testrun was already successfully done with a short time at 100% throttle.
    • The test needs to involve running the system from 0% to 100% thrust and also running at hover thrust for a few minutes.
    • Key parameters that need to be measured during the test:
      • Voltage Level: Monitoring the voltage drop across the battery cells to assess their performance under load.
      • Power Output: Recording the power output to determine the efficiency and capability of the system.
      • Temperatures: Measuring the temperatures of the battery cells and other critical components to ensure thermal stability and safety.
    • The results will provide valuable insights into the system’s behavior under maximum operational stress, highlighting areas of efficiency and potential improvement.

Theoretical Performance

Component Selection and Performance Prediction: Looking at specific components we can make a prediction of the theoretical performance of the energy storage sysem. The main components and data points are:

  • Battery Cell and High Discharge Diagram:
    • (Source: Battery Mooch: https://endless-sphere.com/sphere/threads/bench-test-results-molicel-p45b-50a-4500mah-21700-an-extraordinary-cell.116190/)

    • The discharge characteristics of the battery cell are illustrated, showing how the voltage level changes with respect to the different discharge rates. The maxmium temperature during the discharge process is also illustrated.

    • Assuming a MTOW of 250kg for the whole aircraft, each motor needs to generate a thrust of 41.67kg for hovering. Lets assume a nominal thrust of 45kg. Looking into the table for the motor data from the manufacturer that equals to around 100A at 90V. This results into a nominal current of 20A for each cell (5P configuration). If we look at the two images above we can see that the temperatures stay around 54°C afte a full discharge. It will be higher in the battery pack and it will also depend on the outside temperature. In general we have enough room to conduct tests with higher currents and compare it to the cell data above.

These values serve as a benchmark for evaluating the actual test results and verifying the performance of the battery system. A deeper investigation on the whole battery system can be performed with a computer aided thermal analysis.

Mode of Operations

Operational States

  • Off State:

    • The system is completely powered down, with no active processes or functions. The DCDC converter and BMS are using a tiny amount of energy during the off state.
    • All control signals are inactive ecept the ones that are directly comping from the flight controler and just pass through the battery signal PCB.
  • Battery Enabled (Toggle Switch):

    • Precharging:
      • When the battery is enabled and the “armed” command is received, the system enters the precharging phase.
      • This phase ensures that the voltage across the contactor is equalized before it is closed, protecting the contactor and the capacitors on the ESC side from high inrush currents.
    • Armed (Contactor Enabled):
      • After precharging, the contactor is enabled, allowing current to flow through the main circuit.
      • This state indicates that the system is ready for normal operation.
    • Charging (Includes Balancing):
      • During charging, the system not only charges the battery but also balances the cells to ensure they all have the same voltage.
      • Charging can occour in “armed” and “disarmed” state.

Battery Code for Arduino MKR 1010 (May 16)

The following code is designed to manage the battery operations using an Arduino MKR 1010 and the Arduino IoT Cloud platform.

Description of the Code

  1. Overview: This Arduino sketch manages the control of relays and LEDs based on CAN messages received. It also connects the Arduino board to a WiFi network and integrates it with the Arduino IoT Cloud.

  2. Included Libraries:

    • thingProperties.h
    • WiFiNINA.h
    • wifi_drv.h
    • Servo.h
    • mcp_can.h
    • SPI.h
  3. Pin Definitions:

    • contactor_pin: Pin 2
    • precharge_pin: Pin 1
    • led_green_pin: Pin 26 (Green LED)
    • led_red_pin: Pin 25 (Red LED)
    • led_blue_pin: Pin 27 (Blue LED)
  4. CAN Controller Setup:

    • MCP_CAN CAN0(6): Set CS to pin 6
  5. Timing and Retry Intervals:

    • lastConnectAttempt: Tracks the last WiFi connection attempt time
    • connectInterval: Interval for retrying WiFi connection (40000 ms)
    • lastCloudUpdate: Tracks the last cloud update time
    • cloudUpdateInterval: Interval for updating the cloud (2000 ms)
  6. WiFi Connection Attempts:

    • maxConnectAttempts: Maximum number of WiFi connection attempts (5)
    • connectAttempts: Counter for WiFi connection attempts
  7. Global Variables for CAN Message Handling:

    • rxId: Received CAN message ID
    • len: Length of the received CAN message
    • rxBuf: Buffer for received CAN message data
    • msgString: Buffer to hold the message string
  8. Setup Function:

    • Initializes serial communication
    • Initializes properties defined in thingProperties.h
    • Sets initial LED states
    • Configures contactor and precharge pins
    • Initializes MCP2515 CAN controller
    • Attempts to connect to WiFi and Arduino IoT Cloud
  9. Loop Function:

    • Checks WiFi connection status
    • Updates Arduino IoT Cloud if connected
    • Retries WiFi connection if not connected
    • Checks for incoming CAN messages
  10. Helper Functions:

    • connectToWiFiAndCloud(): Connects to WiFi and Arduino IoT Cloud
    • checkCANMessages(): Checks for and processes incoming CAN messages
    • sendCANStatus(): Sends the current contactor status over CAN
    • onContactorControlChange(): Handles changes to the contactor control
    • onPrechargeControlChange(): Handles changes to the precharge control
  11. Properties Initialization:

    • initProperties(): Initializes IoT Cloud properties for contactor and precharge control
  12. WiFi Credentials:

    • SSID: Network SSID
    • PASS: Network password

Arduino Sketch

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/... 

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  bool contactor_control;
  bool precharge_control;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"
#include "WiFiNINA.h"
#include "utility/wifi_drv.h"
#include <Servo.h>
#include <mcp_can.h>
#include <SPI.h>

int contactor_pin = 2;
int precharge_pin = 1;
int led_green_pin = 26; // Green LED
int led_red_pin = 25;   // Red LED
int led_blue_pin = 27;  // Blue LED

MCP_CAN CAN0(6); // Set CS to pin 6
unsigned long lastConnectAttempt = 0;
const unsigned long connectInterval = 40000; // Retry connection every few seconds
unsigned long lastCloudUpdate = 0;
const unsigned long cloudUpdateInterval = 2000; // Call ArduinoCloud.update() every 2 seconds

const int maxConnectAttempts = 5; // Maximum number of WiFi connection attempts
int connectAttempts = 0; // Counter for WiFi connection attempts

// Global variables for CAN message handling
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128];  // Buffer to hold the message string

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500);
  Serial.println("Starting setup...");

  // Defined in thingProperties.h
  initProperties();

  // Set initial LED state: green on, red off
  WiFiDrv::pinMode(led_green_pin, OUTPUT); // Define GREEN LED
  WiFiDrv::pinMode(led_red_pin, OUTPUT);   // Define RED LED
  WiFiDrv::pinMode(led_blue_pin, OUTPUT);  // Define BLUE LED
  WiFiDrv::analogWrite(led_green_pin, 255); // Turn on green LED
  WiFiDrv::analogWrite(led_red_pin, 0);    // Turn off red LED

  pinMode(contactor_pin, OUTPUT);
  digitalWrite(contactor_pin, LOW);
  
  pinMode(precharge_pin, OUTPUT);
  digitalWrite(precharge_pin, LOW);

  // Set pin 5 as an output and pull it low
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);

  // Initialize MCP2515 running at 8MHz
  if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.println("MCP2515 Initialized Successfully!");
  } else {
    Serial.println("Error Initializing MCP2515...");
  }
  CAN0.setMode(MCP_NORMAL); // Change to normal mode to allow messages to be transmitted

  // Attempt to connect to WiFi and Arduino IoT Cloud
  connectToWiFiAndCloud();
}

void loop() {
  unsigned long currentMillis = millis();
  if (WiFi.status() == WL_CONNECTED) {
    if (currentMillis - lastCloudUpdate >= cloudUpdateInterval) {
      lastCloudUpdate = currentMillis;
      ArduinoCloud.update();
    }
  } else {
    if (connectAttempts < maxConnectAttempts && currentMillis - lastConnectAttempt >= connectInterval) {
      lastConnectAttempt = currentMillis;
      connectToWiFiAndCloud();
    }
  }
  checkCANMessages();
}

void connectToWiFiAndCloud() {
  Serial.println("Connecting to WiFi...");
  WiFi.begin(SECRET_SSID, SECRET_OPTIONAL_PASS);
  unsigned long startAttemptTime = millis();
  const unsigned long wifiTimeout = 2000; // 2 seconds timeout

  // Wait for connection or timeout
  while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < wifiTimeout) {
    delay(500);
    Serial.print(".");
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nWiFi connected!");

    // Once connected to WiFi, connect to Arduino IoT Cloud
    Serial.println("Connecting to Arduino IoT Cloud...");
    ArduinoCloud.begin(ArduinoIoTPreferredConnection);
    Serial.println("Connected to Arduino IoT Cloud!");
    connectAttempts = 0; // Reset the counter on successful connection
  } else {
    Serial.println("\nFailed to connect to WiFi within the timeout period.");
    connectAttempts++;
  }
}

void checkCANMessages() {
  if (CAN0.checkReceive() == CAN_MSGAVAIL) {  // Check if a CAN message is available
    CAN0.readMsgBuf(&rxId, &len, rxBuf);  // Read data: len = data length, buf = data byte(s)

    if ((rxId & 0x80000000) == 0x80000000) {  // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    } else {
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
    }

    Serial.print(msgString);

    if ((rxId & 0x40000000) == 0x40000000) {  // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for (byte i = 0; i < len; i++) {
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }

    Serial.println();

    // Mask the received ID to ignore the extended frame bit
    if ((rxId & 0x1FFFFFFF) == 0x12C && len == 2 && rxBuf[0] == 0x0A) {
      sendCANStatus();
      if (rxBuf[1] == 0x00) {
        if (contactor_control != false) {
          contactor_control = false;
          onContactorControlChange(); // Manually call the onChange function
        }
      } else if (rxBuf[1] == 0x01) {
        if (contactor_control != true) {
          contactor_control = true;
          onContactorControlChange(); // Manually call the onChange function
        }
      }
    }
  }
}

void sendCANStatus() {
  byte data[2] = {0x0A, contactor_control ? 0x01 : 0x00};
  CAN0.sendMsgBuf(0x131, 0, 2, data);
}

void onContactorControlChange() {
  if (contactor_control) {
    // Start precharge when contactor control is enabled
    digitalWrite(precharge_pin, HIGH); // Turn on precharge
    delay(5000); // Wait for 5 seconds to complete precharge
    // Close the contactor
    digitalWrite(contactor_pin, HIGH);
    delay(500); // Wait for the contactor to close
    digitalWrite(precharge_pin, LOW); // Turn off precharge
    // Turn LED red
    WiFiDrv::analogWrite(led_green_pin, 0); // Turn off green LED
    WiFiDrv::analogWrite(led_red_pin, 255); // Turn on red LED
  } 
  else {
    // Turn off both precharge and contactor if contactor control is disabled
    digitalWrite(precharge_pin, LOW); 
    digitalWrite(contactor_pin, LOW);
    // Turn LED green
    WiFiDrv::analogWrite(led_green_pin, 255); // Turn on green LED
    WiFiDrv::analogWrite(led_red_pin, 0); // Turn off red LED
  }
}

void onPrechargeControlChange() {
  digitalWrite(precharge_pin, precharge_control ? HIGH : LOW);
}

thingProperties.h

// Code generated by Arduino IoT Cloud, DO NOT EDIT.

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>

const char SSID[]     = SECRET_SSID;    // Network SSID (name)
const char PASS[]     = SECRET_OPTIONAL_PASS;    // Network password (use for WPA, or use as key for WEP)

void onContactorControlChange();
void onPrechargeControlChange();

bool contactor_control;
bool precharge_control;

void initProperties(){

  ArduinoCloud.addProperty(contactor_control, READWRITE, ON_CHANGE, onContactorControlChange);
  ArduinoCloud.addProperty(precharge_control, READWRITE, ON_CHANGE, onPrechargeControlChange);

}

WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);

Installation Requirements/Considerations

Mounting Orientation

  • Mounting Holes:
    • The mounting orientation has no effect on the performance of the battery pack.
    • Mounting holes are provided exclusively on the bent aluminum sides of the battery pack, designed to facilitate secure attachment to the mounting surface.
    • This design allows for flexibility in mounting positions while maintaining the structural integrity of the battery pack.

Wiring Space

  • Connector Sockets:
    • Sufficient space should be allocated in front of the connector sockets to accommodate wiring.
    • This ensures that all connections can be made without bending or stressing the cables, which could lead to connection failures or reduced performance.

Airflow Considerations

  • Cooling Requirements:
    • More in-depth tests need to be carried out to assess the required cooling options.

Environmental Protection

  • Water and Crash Protection:
    • The installation space should offer protection against environmental hazards, particularly water ingress.
    • Additionally, the mounting should ensure structural safety in the event of a crash, protecting the batteries from being punctured or damaged.
    • Proper shielding and robust installation practices are essential to safeguard the battery pack from potential damage, ensuring reliable and safe operation.

By adhering to these installation requirements and considerations, you can ensure that the battery pack is securely mounted, efficiently cooled, and protected from environmental hazards and potential impacts.

Safety Features

Short Circuit Protection

  • 350A Fuse:

    • A high-capacity 350A fuse is integrated into the system to provide robust protection against short circuits.
    • This fuse ensures that any excessive current flow, which could potentially damage the battery or associated electronics, is quickly interrupted.
  • Additional Fuses:

    • Additional fuses are installed specifically for the charging circuits and the power supply to the signal distribution PCB.
    • These fuses are designed to protect the system against overcurrent conditions that might arise during the charging process or within the power supply network.

Main Power Control

  • Contactor:
    • A contactor is employed to control the main power output, providing an effective means to switch the power on and off as needed.
    • This contactor allows for the main power output to be safely disconnected, especially in emergency situations or when maintenance is required.

These safety features collectively ensure that the battery system is well-protected against common electrical hazards, thereby enhancing its reliability and safety during operation.

Harness Requirements/Connectors

Multiple Pin Connectors

  1. 8 Pin Connector from Battery to Signal Distribution PCB (Socket: AT04-08PB-BM04, Connector: AT06-08SB)

    Pin Signal
    1 CANA L
    2 CANA H
    3 PWM Signal
    4 PWM 5V
    5 PWM GND
    6 HV+ (Fused with 2A)
    7 HV - (Fused with 2A)
    8 DCDC R.C. pin
  2. 12 Pin Connector from Battery to ESC (Socket: AT04-12PB-BM04, Connector: AT06-12SB)

    Pin Signal
    1 CANA L
    2 CANA H
    3 PWM Signal
    4 PWM 5V
    5 PWM GND
    6 UART GND
    7 UART TX
    8 UART RX
    9 HV+ Ignition (Fused with 2A)
    10 NC
    11 NC
    12 NC
  3. 2 Pin Connector from Battery to Charger (Socket: AT04-2P-BM04, Connector: AT06-2S-ORG)

    Pin Signal
    1 HV -
    2 HV +

Cables

  • The cable used for wiring the multiple pin connectors is a Helukabel “SUPER-PAAR-TRONIC-340-C-PUR grey 6 x 2 x 0.5 mm²” (49853)

  • The power cables from the battery to the ESC are 6 AWG (black for negative battery voltage, red for positive battery voltage).

Power Connector

The power connector assembly for the 6 AWG cables consists out of the “Molex 211937-0002” socket with the “Molex 211942-0002” connector housing.

System Reliability

The system reliablility is depending on several factors. The main advantage of the desigend system is the overall redundancy because of the six independet batteries.

Each battery is limited by its cell cycle life. MOLICEL states 500+ cylces for its P45B battery cell until it reaches around 80% retention. This can vary depending on how the cell is charged and discharged over time.

More real world tests have to be conducted to assess the system reliability. Other importand factors are:

  • The temperature ratings of components
  • The enviromental conditions under which we use the batteries

We had our first small aircraft crash with the batteries already installed. They all suffered no visual or technical damage during that incident. A statement on durability cannot yet be made at this time (15.07.2024).

System/Unit Test & Validation

Multimeter Tests

  • Battery Precharging and Contactor Switching:

    • To validate the precharging and contactor switching functionalities, use a multimeter to measure the voltage at the main power output connector.
    • This measurement should be taken after activating the armed state of the battery. A successful test will show the expected voltage level, confirming that the battery is precharging correctly and the contactor is switching as intended.
  • Insulation Test:

    • Perform an insulation test between the aluminum sides of the battery housing and the high-voltage (HV) terminals (both positive and negative).
    • This test ensures there is no electrical continuity, indicating proper insulation and preventing potential short circuits or leakage currents.

Thrust Stand Performance Validation

  • Full Performance Validation:
    • Conduct a test on a thrust stand to validate the battery’s performance under full operational conditions.
    • Key aspects to monitor during this test include:
      • Cell Voltage Consistency:
        • Ensure that all cell voltages remain similar throughout the test, indicating balanced performance and no significant deviations among individual cells.
      • Temperature Monitoring:
        • Verify that the temperature sensors are reporting normal temperature levels. Abnormal readings may indicate potential issues with the battery cells or cooling system.
      • Thermal Camera Inspection:
        • After completing the thrust stand test, use a thermal camera to inspect the battery pack for any hotspots or irregular temperature distributions. This helps in identifying potential thermal issues.

Charging Test

  • Full Charging Cycle:
    • Perform a charging test from empty to full charge to ensure the battery is capable of taking in the required energy.
    • This test involves monitoring the charging process to confirm that the battery charges efficiently and reaches its full capacity without any issues.
    • The results should indicate that the battery is still performing optimally and able to handle the charging requirements.

By conducting these tests and validations, you can ensure that the battery system meets the necessary performance and safety standards, providing reliable and efficient operation in various conditions.