Central LED control architecture
In order to support advanced lighting modes such as:
strobe
nav lights
beacon
taxi / landing / approach lights
breathing “standy/decorative” lights
One extra CAN node (This does not have to be an LED board, it can be any CAN-enabled peripheral) will serve as a master controller on the CAN bus. This node will interpret the state of the drone over telemetry or custom lighting commands, offer synchronization messages, and command external LED boards to perform certain activities. Should this node go down (3+ sync frames missing), the next highest ID will assume control of synchronization & command (everyone can see ardupilot CAN messages). This continues until no nodes are available. If all nodes go down, it is reasonably expected that lights will default to < some error state >. If ardupilot CAN messages stop for any reason, it is expected that the LED’s will go to some < search pattern >
We choose to have this LED perform all of our actions for two reasons:
Defining & supporting our own CAN messages on our own firmware is pretty easy
It is easier to meet hard timing deadlines / requirements for synchronization, compared to using LUA scripts which make no such guarantees.
Lighting Control Messages
When desired, the central CAN node will send messages to request certain colours or patterns from all LED’s. The LED’s will be stored with enums to define their position static and relative to the drone. This means that you might expect the following series of messages:
LED FRONT_LEFT, BACK_LEFT set COLOUR_RED
LED FRONT_RIGHT, BACK_RIGHT set COLOUR_GREEN
LED <ALL> strobe at EVERY_SECOND
and on braking / descent, you might expect:
LED <ALL> flash_brake_lights
LED <ALL> enable_landing_lights
Control Synchronization
Largely TBD, but the master node will attempt to synchronize the lighting of all nodes, such that effects of strobe should be synchronized. How we intend to do this over CAN is still tbd, but our wires are pretty short so it’s possible just to send SYNC frames every N hz and have internal timers on the ST side re-synchronize. It is expected that the lowest-rate pattern (beacon) is at 0.5hz (once every 2 seconds) when in-air, while the fastest-rate pattern (search/strobe) might operate at 100hz (strobe is 100hz for double blink, every 1.5s)
Lighting Control Patterns
StaticColour: Set to a static colour
typically NAV lights
Beacon: breathing RED light, visible all around to indicate drone is powered on.
Half outwards nodes breathe until takeoff, other half show original colour
TBD on how this is wired, depending on ee …..
Upon takeoff, these nodes will flash LOW RATE red.
4 of 6 bottom LED’s breathe red until take-off. This needs to be bright enough to be visible above the
other 2 show nav colour
upon takeoff, only 2 bottom lights flash red (central)
Strobe: 2 pulses bright white (255, 255, 255), 100ms on, 100ms off (tbd). On only above 10m AGL (central node controlled).
2 of 6 bottom LED’s will flash, returning to the original colour when not set to white
It would be nice to make these the two OUTER LED’s, but then we’ll need markings on which side is installed facing outwards
all outwards LED’s will flash, returning to original colour when not set to white
Landing / Approach: four bottom facing LED’s bright white, beacon operation is now shared with nav lights & strobe.
When enabled, strobe / bcn brightness reduced to improve operator visibility.
Decorative: If powered up and no can messages are received from ardu
Assume we’re just powered up standalone, go to a nice breathing colour cycle, avoiding colours like red / green / yellow that might indicate flight status.
Potentially cycle led’s of different part of the drone indep of each other (i.e. led’s across from each other) to truly indicate “asleep”
Search: If CAN messages were received and are no longer viewable.
SCREAM