Arrow PT3 Energy Storage System Documentation
Table of Contents
- System Requirements
- System/Component Overview
- Interfaces
- Bill of Materials
- Mechanical Description
- Electrical Power Supply Architecture
- Performance Characteristics
- Mode of Operations
- Installation Requirements/Consideration
- Safety Features
- Harness Requirements/Connectors
- System Reliability
- 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.

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):

The structure of the batteries can be divided into 3 main groups:
- 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.

-
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

-
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.

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:
-
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.
-
Cell Connectors:
- The sheet metal cell connectors are spot welded onto the battery cells, providing a reliable and robust electrical connection.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
- Precharging:
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
-
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.
-
Included Libraries:
thingProperties.hWiFiNINA.hwifi_drv.hServo.hmcp_can.hSPI.h
-
Pin Definitions:
contactor_pin: Pin 2precharge_pin: Pin 1led_green_pin: Pin 26 (Green LED)led_red_pin: Pin 25 (Red LED)led_blue_pin: Pin 27 (Blue LED)
-
CAN Controller Setup:
MCP_CAN CAN0(6): Set CS to pin 6
-
Timing and Retry Intervals:
lastConnectAttempt: Tracks the last WiFi connection attempt timeconnectInterval: Interval for retrying WiFi connection (40000 ms)lastCloudUpdate: Tracks the last cloud update timecloudUpdateInterval: Interval for updating the cloud (2000 ms)
-
WiFi Connection Attempts:
maxConnectAttempts: Maximum number of WiFi connection attempts (5)connectAttempts: Counter for WiFi connection attempts
-
Global Variables for CAN Message Handling:
rxId: Received CAN message IDlen: Length of the received CAN messagerxBuf: Buffer for received CAN message datamsgString: Buffer to hold the message string
-
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
-
Loop Function:
- Checks WiFi connection status
- Updates Arduino IoT Cloud if connected
- Retries WiFi connection if not connected
- Checks for incoming CAN messages
-
Helper Functions:
connectToWiFiAndCloud(): Connects to WiFi and Arduino IoT CloudcheckCANMessages(): Checks for and processes incoming CAN messagessendCANStatus(): Sends the current contactor status over CANonContactorControlChange(): Handles changes to the contactor controlonPrechargeControlChange(): Handles changes to the precharge control
-
Properties Initialization:
initProperties(): Initializes IoT Cloud properties for contactor and precharge control
-
WiFi Credentials:
SSID: Network SSIDPASS: 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
-
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 -
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 -
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.
- Cell Voltage Consistency:
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.