I. | Introduction |
II. | The Hardware |
III. | The Shopping List |
IV. | Assembly |
V. | Programming |
VI. | Wiring Connections |
VII. | Uploading Code |
VIII. | THE Code |
IX. |
Traffic Alerting Algorithm |
X. | Required Setup |
XI. |
Integrating "The Box" into your
Airplane |
XII. |
A word about the project |
Board Bottom |
Board Top |
Board Bottom Layer |
Board Top Layer |
Board Bottom Soldermask |
Board Top Soldermask |
Board Bottom Silkscreen |
Board Top Silkscreen |
Drills |
Quantity |
Approx Price |
Description |
Digi-Key p/n |
Mouser p/n |
1 |
$31 for 3 |
Oshpark Circuit Board |
||
1 |
$8 |
2.54mm Header Pins 40-pin Female | Amazon
Link |
|
1 |
$5 |
Murata OKI-78SR-5/1.5-W36H-C 5V DC/DC Converter | 811-2692-ND |
580-OKI78SR51.5W36HC |
1 |
$2 |
Panasonic 25SEP10M Capacitor
(Used for C9) |
P16317-ND |
667-25SEP10M |
2 or 10 |
$.12 |
Wurth WCAP-ATG5 50V .10uF capactitors
860020672001 (Note: You can use these *or* non-polarized Ceramic on the RS232 ICs; use these on the input power filter C10 and C11) |
732-8847-1-ND |
710-860020672001 |
0 or 8 |
$.40 |
Murata RCER71H104K0DBH03A 0.1uF
+/-10% 50V Ceramic Capacitors X7R (Automotive Grade) (These are good to use on the 8 spots required by the MAX3222 IC: C1 thru C8) |
490-7514-1-ND |
81-RCER71H104K0DBH3A |
2 |
$6.50 |
MAX32222EEPN+ RS-232 3-5.5V 250kbps transceiver | MAX3222EEPN+-ND |
700-MAX3222EEPN |
1 |
$3.60 |
Harting D-Sub board mount Female 15-pin connector 09682537612 | 1195-5133-ND |
617-09682537612 |
2 |
$2.00 |
Mill-Max 18-pin gold plated IC Socket 110-43-318-41-001000 | ED90035-ND |
575-11043318 |
1 |
$2.00 |
15-pin D-Sub Backshell 86303638BLF | 609-1425-ND |
649-86303638BLF |
1 |
$37.00 |
SparkFun Teensy 3.6 WITH Header Pin Board | 1568-1465-ND |
474-DEV-14058 |
1 |
$13.00 |
Hammond 3.2x2.2x.91" Extruded Aluminum Enclosure 1455C801 | HM969-ND |
546-1455C801 |
1 |
$.80 |
Cinch D-Sub Connector 15-pin Male 40-9815M
(To mate to "the box") |
367-1190-ND |
601-40-9815M |
2 |
$.30 |
4-40 thread Female Screwlocks 5207953-3
or 5748558-3 or similar (Or pull them off a junk
PC for free) |
5207953-3-ND |
571-5207953-3 |
1 |
$.50 |
Schottky Diode 20V 3A DO201AD 1N5820/E3/54
(To put inline with power wire) |
1N5820-E3/54GICT-ND |
625-1N5820-E3/73 |
Additional Optional Parts You May Want |
||||
Optional Parts you may want or
need: If you're converting an old NavWorX ADS600B, you
may want to buy a 37-pin connector and backshell similar to
(3-199-1253-7) to use to connect to all of the Echo UAT
components and "the box". Also, Kapton tape for
protecting the pins from the enclosure. (or use packaging
tape) D-Sub machined pins for the box connector (Pins
such as 204370-8 or MilSpec M39029/64-369 are not
included in the above). (Alternate Pin source:
SteinAir SA-1018) Echo Molex connectors 0436450600
and Pins 0462350001 for adding wires to the Echo
Harness. (Mouser and Digi-Key Sell the molex
parts) If you want to join the 37-pin connector shell
to another mating connector, you may want these hex nuts
Conec 160X10379X or Digi-Key 626-2113-ND. |
||||
Pin |
Function |
1 |
+14V Power |
2 |
Transmit 1
- Unused |
3 |
Receive 1
- GDL90 Traffic/Weather In from Echo |
4 |
n/c |
5 |
Receive 2
- Unused |
6 |
Transmit 2
- GDL90 Out - Filtered - To Display/EFIS |
7 |
Receive 4
- GTX In from Garmin 327/330 Xponder |
8 |
Transmit 4
- Unused |
9 |
Receive 3
- ICARUS Baro Alt In from Encoder |
10 |
Transmit 3
- GDL (SL-70) Baro+Squawk to Echo |
11 |
GND |
12 |
GND |
13 |
GND |
14 |
GND |
15 |
GND |
SETTING |
Description |
#define DEBUG |
This is commented out by default but if un-commented it will allow you to monitor the micro-usb in-flight and see what's happening on the serial monitor |
#define GDLCONTROL |
This is active by default and enables the
processing of the Altitude Encoder and Transponder
communications inputs and outputs. Note that this ONLY
uses ICARUS altitude format, and GTX transponder control
format, and ONLY outputs SL70 (GDL) format. |
#define SHADINZ |
If you are not using ICARUS format, but
getting SHADINZ format such as from a GRT EFIS for your
altitude encoder, you may need to disable ICARUS and use
SHADINZ format in. |
#define ICARUS |
Uncomment this option if you are using a
standard ICARUS format Altitude Encoder for Baro Alt. |
#include "Aircraft_Settings.h" |
This is new in version 1.6.0. It allows
you to have a separate file where you keep your tweaked
settings for your aircraft. This way if you want to
change things during testing, you can save various versions
of this file and simply load the one you want. The
filename can be change to whatever you want...suggest using
your N-Number, but make sure to change the "include" line in
the .ino file to match the filename. |
#define FRIENDS |
This is active by default and enables you to
have "Friendly" targets (Other airplanes) that will NEVER
give you traffic alerts. If you fly formation, it is
handy to not constantly have traffic alerts while you fly
with them. Additionally it will, on the Chelton EFIS
at least, display the friendly targets as a different symbol
type, whenever they are over a mile away from you.
This makes it easier to find your friends and join up with
them. |
int32_t ownModeSCode= |
Example: int32_t ownModeSCode=0xABC123 This is where you enter your own airplanes ICAO Code. You prefix it with "0x" The ICAO Code needs to be the HEX version, NOT the Octal version, from the FAA site. Whatever ICAO code is listed in this setting will never be displayed as traffic on the output data stream. |
int gdl90_outbaud=38400; |
This is the baud rate used for the output
GDL90 Data Stream to your EFIS |
int gdl90_inbaud=115200; |
This is the input baud rate from COM2 of the
Echo UAT or other system into "The Box" |
int icarus_inbaud=9600; |
This is the baud rate of your Altitude
Encoder's ICARUS Altitude |
int gtxremote_inbaud=9600; |
This is the baud rate of your GTX327/330
Squawk Signal |
const int outputBufferSize=3456; |
This sets some internal buffers for the
processing: gdl90_outbaud* 0.9; 10368 for 115200bps;
3456 for 38400bps |
bool maintenanceOverride=true; |
This will override the ADSB Maintenance flag
if there is a problem with the system. It should be
"false" by default but if you aren't using GTX and Altitude
Encoder inputs, it may need to be "true" to prevent spurious
alerts due to the poor function of transponder monitor on
the Echo. |
Ghost Filter
Settings |
|
float ghost_dist_diff=0.25; |
This is the distance in miles that shadow
targets (Ghosts) will be filtered out. Shadows caused
by being primary targets to radar have a different ICAO code
format, a "Track File ID" instead of an ICAO number.
We will not display airplanes that could be your own
airplane, in a close proximity to you, if they are a
trackfile ID. |
float ghost_alt_diff=200; |
This is the difference in altitude that the
track file ID shadow target will be filtered out, relative
to your altitude. |
float ghost_track_diff=45; |
This is the track difference from your own
track that helps identify a shadow target. If they are
on approximately the same track, it is probably you, and
should be filtered. Reduce this track angle to make it
more sensitive and not filter shadows as easily. |
Traffic
Alert Settings |
|
int32_t alert_alt_diff=400; |
This is the altitude difference maximum that
a nearby target must be, for it to cause a traffic
alert. Straight and level traffic that is more than
this value above or below your altitude will not
alert. To alert on airplanes more easily, expand this
value. |
int32_t alert_fuzzy_alt_diff=950; |
This is the altitude difference maximum that
a target will be, to cause an alert, if either it, or you
are climbing or descending. It us used in the
projected altitude functions to estimate if you will be
coming together with the other aircraft and be close in
altitude if you continue your trajectory. If you want
to have more alerting if you will be close in altitude when
you meet another plane, expand this number. If the
number is too large, you will have many alerts whenever
someone is climbing or descending to your general projected
position, even if they level off at a cruising altitude far
above or below you. That is why 950' was chosen as a
default. |
int32_t alert_seconds_before=40; |
This is the amount of time that will trigger
an alert when you are closing in on another airplane.
i.e. in 40 seconds or less, you will close in and come
together or have a near miss with the other aircraft.
This is done by time calculation so you will get 40 seconds
warning whether it's coming up fast behind you, or coming
head on in front of you, as it calculates actual "Time to
close" on the intruder. Expand this to get more
warning, but be aware that at 150kts you are traveling
nearly 3 miles in 60 seconds, so a 40 second gives you more
than 4 miles of warning in a head on situation with a
similar speed aircraft. |
int32_t alert_vector_length=40; |
To explain this, imagine a vector projected
out in front of your airplane, like a very long pitot tube
on your nose. This vector is 40 seconds long, and thus
is longer the faster you go. There are algorithms that
will use this vector ahead to monitor for traffic that will
be crossing paths anywhere along your 40 second vector with
their 40 second vector, like 2 Star Wars warriors with light
sabers. :) Should these light sabers touch, you
will get an alert. Make the vector longer and you will
have a greater look-ahead to traffic that may cross your
path. Make it too long and you will receive many
alerts. Make it too short and you won't get many at
all. |
float alert_dist_diff=0.5; |
This is the distance in miles that we have a
backup alert for alerting on close proximity that may be
traveling nearly parallel. If the track vectors will
not be crossing, even nearly head-on traffic may not alerts,
and this backup alert will still give you minimal warning
whenever someone is coming near to you. |
float
positive_closure_distance=1.0; |
This is the distance in miles that will be
alerted as long as a target has a positive closing rate on
your airplane. It is used in conjunction with
positive_closure_max_time for this alert. |
int32_t
positive_closure_max_time=180; |
This is the time in seconds that a
positive_closure_distance target must be under, before it
will alert. In the default of 180 seconds, a plane
must be coming at you where you will come together in less
than 3 minutes if it is within a mile of your
position. If you are converging so slowly that it will
take more than 180 seconds, it will not alert until it
reaches the alert_dist_diff setting above. This way
you can fly near other airplanes on similar tracks but if
you will not meet for more than x seconds, you will not
receive an alert. |
Traffic
Tracking Settings |
|
const int maxIntruders=60; |
This is the number of intruder airplanes that
are monitored in a table of targets. Only targets
within filterAltitudeAbove and filterAltitudeBelow altitudes
relative to you, and filterDistance range from you, are
added to the table. This is simply the number of
airplanes tracked in the table. The table always
sorts in order of distance, so you always are calculating on
the nearest 60 targets, but all of the others beyond 60 are
ignored. |
const int maxIntrudersOut=20; |
This is the maximum number of targets sent
out on the RS232 stream to the EFIS. 38,400 baud can
only handle 32 targets with 4 uplink messages per
second. By limiting the targets to 20, we can send one
additional uplink message per second, and prevent the EFIS
screen from being cluttered by targets. You can adjust
this as high as 32, but reduce maxUplinkMessages to 4 if you
go higher than 24. |
Traffic
Filtering Settings |
|
float filterDistance=80; |
This is the distance in miles that traffic
will be limited to. Any traffic further than this will
not be placed into the traffic table or displayed on the
EFIS. |
int32_t filterAltitudeAbove=5000; |
This is the number of feet above you beyond
which traffic will not be displayed. It eliminates
high-altitude aircraft from being displayed for you.
You may wish to expand this if you frequently fly near
parachuting operations. |
int32_t
filterAltitudeBelow=10000; |
This is the number of feet below you beyond
which traffic will not be displayed. It eliminates
low-altitude aircraft from being displayed for you.
The default is set higher so that you can see traffic at the
destination airport many miles out as you descend, but it
may be set to a number as low as 5000' if you do not wish to
see such traffic. |
Coasting
Settings |
|
uint16_t coastTime=15000; |
Traffic must report its position every 1-2
seconds to be displayed on the EFIS. If a target
doesn't transmit regularly or your antenna doesn't pick it
up regularly, it will disappear. The coasting
algorithm calculates where a target will be based on its
last transmission. coastTime=X is the number of
seconds to project where this target will be, before simply
dropping it. Be aware that if a target does a rapid
turn, climb, or descent, it may not be where it was
projected to be, so coasting is not perfect, but it is
better than not seeing the target on screen at all.
Keep this to 15000 miliseconds or lower (15 seconds) to
ensure the position is fairly accurate. Reduce it to
minimum to do no coasting or minimal coasting, but expect to
see traffic blink on and off at times. |
Misc |
|
maxUplinkMessages=5; |
This is the maximum number of uplink messages
to process in a second. 4 is the GDL90 standard
default. |
int heartbeatInterval=1000; |
This is a heartbeat packet interval between
the box and the EFIS. It sends one every 1000
milliseconds to keep the EFIS happy. |
Friendly
Settings |
|
const int totalFriends=8; |
This is the number of friend aircraft in the
array below this setting. You need this number of ICAO
Codes to match the number of them in the array. And
friends airplanes that you do NOT want to get traffic alerts
on, should be put into the array. Be aware that you
will NEVER get collision alerts on them. |
int32_t
friendArray[totalFriends]={0xABC123,ABD124}; |
This is the array of friends ICAO
codes. They are inserted with comma separation (no
spaces) if you have multiples. In this example, there are 2, and the above totalFriends value should be 2. |
float FRIEND_dist_start=1; |
This is the distance within where the
friendly targets will display with the standard
symbol. On the Chelton EFIS, standard is an
arrowhead. A friendly on the Chelton is made by
artificially degrading the appearance of the quality of
their signal, which makes them into a rounded nosed type
symbol. If set to 1, within 1 mile the friendly
will have the normal symbol. Set this number low if
you want to see that symbol all the time. Set it far
if you never want to see it. |
FRIEND_dist_max=80; |
This is the maximum difference that the
friend type symbol will be displayed. Beyond this
distance it would display with the standard arrow symbol. |
Alert
Setting |
|
unsigned long alert_hold_time=10; |
This is a hold timer on traffic alerts.
If you receive a traffic alert, but the airplane changes
course and will no longer be a factor, it will stop
alerting. This holds the alert to continue alerting
even if the algorithms no longer detect a collision. A
setting of 10 holds the alert for 10 extra seconds.
This is done to prevent an alert from stopping and starting
a lot if you happen to go in and out of conflicting paths
with another plane. If you are alerting too long, set
it lower. Too short, set it higher. |