Joshua Hall

Projects

ADS-B Receiver Antenna

Apr 2025Present

Custom antenna designed to receive 1090 MHz ADS-B signals from aircraft, utilizing Raspberry Pi hardware to decode and display tracking data.

RTL-SDRRaspberry PiLinuxRF DesignOptimization

Overview

I consider this my signature project - one that I am certainly most proud of. During my freshman year my dorm was situated under the inbound/outbound flight path for SeaTac airport. I often used Flightradar24 to guess airplane models when they flew overhead, but I was curious if I could track them myself. No ads. No apps. My goal was to track airplanes 24/7 cost effectively and accurately.

How It Works

To start this project I researched how planes are even tracked in the first place. Flightradar24 tracks airplanes from every corner of the world… how? How does ATC manage the location of aircraft in extremely tense environments? The answer is ADS-B (Automatic Dependent Surveillance-Broadcast), a modern surveillance broadcasting system that replaces GPS. It is a highly-accurate broadcasting system that transmits aircraft location, speed, altitude, destination, type, and heading via a transponder mounted on the aircraft. These signals can be broadcast over two frequency bands, 1090 MHz and 978 MHz. My antenna is designed to read 1090 MHz, as that is the frequency most high-performance aircraft use. 978 MHz is mainly used for aircraft flying below 18,000ft.

My antenna is called a quarter-wavelength antenna, consisting of 4 ground planes and one radial sticking straight up. Each prong is a copper wire cut to 69mm, which was determined using the wavelength formula:

λ=cf=3×108 m/s1090×106 Hz=0.275 m\lambda = \frac{c}{f} = \frac{3 \times 10^8 \text{ m/s}}{1090 \times 10^6 \text{ Hz}} = 0.275 \text{ m}
λ4=0.0688 m69 mm\frac{\lambda}{4} = 0.0688 \text{ m} \approx 69 \text{ mm}

To account for conduction losses in the wires due to thickness and soldering connections, wavelength is multiplied by 0.95 to get around 65mm. I didn’t think of this at the time of initial construction, so all of my radials are around 69mm. The antenna still performs great compared to other antennas I researched online. I will go more into performance optimization later, as some other fascinating changes drastically improved my performance.

My antenna ‘core’ is an SO239 Female FR Coax connector, which screws on to the end of a coax cable and provides mounting holes on the four corners with a vertical element. These pieces are used for a wide variety of different antenna applications. This component provided an easy base that allowed me to connect a coax cable straight to my antenna. Next, via a 20ft RG8x coax cable, my data is then sent into an ADSBexchange RTL2832U 1090MHz filter. ‘Filter’ is the key word here, as this component is a bandpass filter that ensures any noisy frequencies from cell phones, TV’s, and FM radio don’t interfere with the data that my Raspberry Pi reads. Being in the University District, signal interference is a big deal. The RTL2832U is just a blue stick that plugs in via USB-A into my Pi and has a small coax male end. I used an adapter to connect my RG8x coax to the stick. I researched that these filters are basically required since they boost signal quality by so much. They were listed in almost every tutorial I researched. They are usually very expensive, so I ordered a cheaper one on amazon that doesn’t exist anymore and it seems to do the job. Last but not least, the brains of my operation, a Raspberry Pi 4B. This project was my first time using Raspberry Pi, and I had a blast setting it up and discovering what these little computers are capable of. Luckily for me, ADS-B antennas have a large community with plenty of open source software on github that makes setup (mostly) straightforward.

My data is acquired through the filter via USB and is first run through readsb, a popular decoding software. This turns whatever data that is passed through my filter into actual aircraft data that is readable. The output of this program can be a wicked-fast list of latitudes, longitudes, model numbers and speeds updating every second, but I wanted to visually see my tracked planes on a map, just like Flightradar24. At this point, my data junctions in two directions within my Pi. A program called tar1090 reads my readsb data and outputs my aircraft data on map with a convenient list of all aircraft currently tracked by my antenna, the number of aircraft currently tracked, and a messages/sec statistic that I used to test the performance of my antenna. The readsb data is also sent to a Flightradar24 program that allows hobbyists like me to send my tracking information to their app and enhance their tracking models, with a free business-tiered subscription as a reward. I discovered that I could do this during my software setup phase on the Pi, so it motivated me even more to enhance my data. At this point, I had a fully working antenna setup that read a specific frequency, decoded aircraft signals, and displayed them on a map that I could see in my dorm room 24/7.

For fun, I bought an old Dell XPS from 2015 off of a guy on facebook marketplace, gently tore out the screen, and used its LCD display as the main screen for my Pi so I could have a live map continually running in my dorm room for me and my roommate.

A large portion of this project was optimizing my setup to get the best possible messages/sec. This statistic was congruent with data quality, number of aircraft tracked, and range. More messages meant more planes and smoother updates. When I first got the software set up, I used a stock antenna that was shipped with my filter, and got around 15 msg/sec, which was quite low. This roughly translates to about 15 aircraft with ~20 miles of range. I plugged in my DIY antenna and that immediately jumped the messages to 60-80 with over 40 aircraft tracked simultaneously. This was because the stock antenna was just a vertical radial, it had no reflectors (the four ground planes on my antenna) that allowed better directionality. After lots of software research, physical positioning changes, and deeper research into what interferes with ADS-B signals, I discovered the following parameters that I adjusted to get optimal tracking quality.

  • Physical space around the antenna was the single most important factor in data quality. This surprised me initially and I discovered this by accident. When I first plugged in my antenna, it was free to move around and only bound by the long coax cable, so the first thing I did was move the antenna right next to my window, and I discovered that the proximity to a solid surface decreased the quality of my data. If I held the antenna in the center of my dorm room away from walls, I acquired better data. When I returned home for the summer, I built a mount out of PVC pipes to put the antenna on the roof of my house. Since the antenna was out in open air with a clear view of the sky, I was able to track planes all the way south to Portland, OR, and north to Vancouver, BC. This was where I acquired my best data: 258 messages/sec with over 150 nautical miles of range.
  • Within readsb there is a digital gain parameter that boosts or quiets incoming ADS-B signals into my antenna. My understanding of the parameter is like this: my antenna is like a microphone and nearby aircraft are emitting a sound (not engine noise, but their ADS-B data) at a certain volume. If the aircraft is further away, its sound is quieter. If it's closer, it's louder. The digital gain parameter is essentially turning up the sensitivity of my ‘microphone’ which records the ADS-B ‘sounds’. The higher the gain, the louder distant signals are, but so are closer signals. If my gain was too high, nearby aircraft would blast my antenna with huge amounts of noise, causing my messages/sec to skyrocket and clip the data coming in, causing the data to be unreliable and sometimes unreadable. I attenuated my gain so I could get more range without clipping nearby signals.
  • Geographical location is the last optimization that had a large impact on my performance. This parameter, however, was the hardest to change because where I lived greatly impacted the performance of my antenna. In the dorms, I had a fantastic view south with minimal obstructions, so I was able to reach Oregon from my dorm. But since I was at the south edge of the building, I wasn't able to track much further than 10 miles north of my dorm. At home, which is 45 minutes southeast of Seattle, gave me the best performance because of the open air. Both of these locations had Mt. Rainier impact tracking performance, as tar1090 showed my range would drop out just around the mountain due to its size. Long story short - clear, open, flat views provided the best performance.

Result

I’ve learned a lot from working on this project and iterating on it over time. I discovered the general workings of how antennas work, aircraft communication, how to use Raspberry Pi hardware and software, and most importantly: troubleshooting. Throughout the entire course of the project I was constantly researching and using AI to find solutions to bad data or malfunctioning software on my Pi. The project was a lot of trial and error, most of it was brute forcing though software setups and not understanding how they worked, but over time I learned how to dissect where my errors originated more efficiently. Lastly, I acquired a free business tier subscription for sending my tracking data to FlightRadar24 which unlocks a plethora of tracking features. I also discovered a lot about aircraft routes in the area (SeaTac flips which directions planes land and takeoff based on weather and time of day), busiest airspace times (about 4pm), and when certain aircraft fly over my location every day.

Updates

STM32-Powered Electronic Speed Controller

Dec 2025Present

Reconstructed ESC (Electronic Speed Controller) for brushless motors, designed in KiCad and prototyped on a perfboard with an STM32 Nucleo board

STM32KiCadPCB ProtoypingSoldering

Overview

The most ambitious of my engineering endeavors, this project originated as a task for my WAAR (Washington Aerial Robotics) club. I was tasked with redesigning a 4-in-1 ESC (Electronic Speed Controller) with the purpose of merging it on the same board as a 5A buck converter. WAAR’s goal is to build fully autonomous drones that are less than 1lb, so the purpose of merging the buck and ESC is to minimize complexity and weight. As I stated initially, a full ESC redesign was much more complex than I or any of my club leadership expected, so the scale of this project has turned into something more R&D for a singular ESC to control one motor. That way, when one prototype works, we can essentially ‘copy paste’ the design 3 more times. The direction of the club, for the summer 2026 competition at least, has shifted towards a premade ESC, with the goal of using my ESC work next year.

How It Works

An electronic speed control works to control brushless motors, not to be confused with brushed motors. Unlike brushed motors, brushless require alternating currents through 3 separate phases to drive 3 coils that induce a magnetic field to pull a spinning motor. The physics behind the motor are complex and not the goal of what I am trying to convey here. The critical information to know is there is a PWM switching frequency that controls how fast the MOSFET’s turn on and off on an ESC. This controls how much average voltage reaches the BLDC motor. There is also an Electrical Commutation Frequency, which is defined by the motor's speed. This is how fast the phases alternate to drive the motor speed. I already discussed the nature of how a brushless motor is driven here in my WAAR Notion folder, if you are unfamiliar with BLDC motors. Any questions you may have after reading my work here will most likely be answered in this file:

https://www.notion.so/Electronics-Speed-Controller-3256b287dfd480c699cecdc5e1bcf5b4?source=copy_link

NOTE: What has been completed for this project is a KiCad schematic and a full soldered prototype on a perfboard. I am currently working with my firmware lead to upload code to an STM32 Nucleo dev board to power and control the prototype ESC at the time of writing this (05/15/2026). This will be a major milestone in the development of this ESC. If it does not function properly it will require a lot of debugging.

I began this project with zero knowledge of how an ESC functioned – which led to a lot of research. Not so long after I began this research I realized how difficult it is to properly design an ESC due to the extremely rapid power modulation that occurs within the circuit. Subtle changes in capacitor locations could introduce fluctuations in the PWM current that could cause the phases to not output their correct voltage. I decided to start simple, which led me to find a schematic created by someone making a simpler ESC design for one motor with an Arduino as the driving hardware. The schematic was relatively simple, the only difference being the computer for the ESC – which is a big difference. I reached out to a former club member of WAAR who currently works at SpaceX and he suggested to use an STM32 Nucleo developer kit, which is essentially another kind of Raspberry Pi or Arduino, but instead mimics the properties of the actual STM32 chip we are planning to use on the finished product. In a simplified manner, I was replacing the Arduino in the schematic I found with the Nucleo as it has all of the same functionality needed to generate PWM signals, read phase currents, and run open-source motor control software. Once I had hope that the schematic could be driven by the Nucleo, we ordered the parts to design a larger working prototype. I decided with my leadership to develop a working prototype from the schematic before designing the PCB to ensure that our design functioned properly without fully committing to the bit. This part of the project took the longest. It took almost a month to get all of the right parts. Once I acquired everything I spent a week building the prototype. All components on the board are the exact components that would be on the PCB other than the MOSFETs. The MOSFETs on the prototype have all the same specifications other than they have a much higher voltage rating, hence their large size. Continuity was tested on all nodes, so theoretically everything is wired correctly.

I have concerns over the performance of the ESC that could cause us to run into issues:

  • The quality of the wiring used is subpar. Any increase in resistance of excess wire length can introduce back-emf or unreliable currents that could drive the motor incorrectly
  • At the time of writing this I have no knowledge of C++, but hopefully the open source software should suffice for our testing. I am unsure of the ease of simply plug-and-playing software with hardware it has never seen. I truly do not know the outcome but I will update as the project continues.

Result

The results of this project are fairly unknown and still in-progress, but I can discuss what stands so far. I have a decent looking prototype board with quality solder connections. This was one of my most intricate soldering jobs, and after finishing the soldering all connections were tested for continuity, all of which passed. I also learned about MOSFET’s and how they are used in HI and LOW sides to drive different directions of current. Lastly, I have been getting into the trenches of how STM-based hardware can be tested using their Nucleo dev kits. From setting up the IDE’s to wiring the dev board to my esc are all tasks I am learning and problem solving through as I progress. The further I make it through, the more excited I am to see if my prototype works. Stay tuned!

Updates

Yagi-Uda Directional Wi-Fi Antennas

Apr 2026Present

Pair of two highly directional WiFi antennas designed and optimized to beam a local 2.4GHz WiFi signal over long distances using ESP32 hardware and 4nec2 simulations

RF DesignAntenna Theory4nec2ESP32Optimization

Overview

Placeholder

My Role

Placeholder

How It Works

Placeholder

Result

Placeholder

Updates

Portfolio Website

Jan 2025Present

This website! Built using Next.js and launched via Vercel

Next.jsTypeScriptTailwind CSSVercelVSCode

Overview

Placeholder

How It Works

Placeholder

Result

Placeholder

Updates

Network Management w/ Multiband Optimizations & Pi-Hole

Sep 2025Present

Home network management using a Raspberry Pi to run network-wide ad blocking and DNS management

Raspberry PiPi-HoleDNSNetworking

Overview

Placeholder

How It Works

Placeholder

Result

Placeholder

Updates

Audio-Reactive LED Strips

Apr 2026Present

A fun project to turn my bedroom into a club - a small voltage step down module and ESP32 reading audio data from an audio interface to control light patterns based on frequency and amplitude data

ArduinoFastLEDSolderingAudio ProcessingESP32

Overview

Placeholder

How It Works

Placeholder

Result

Placeholder

Updates

Lab Final Projects — Academic Coursework

EE 201

Autonomous Line-Following Robot

Dec 2025

An autonomous robot that follows a line using a custom photoresistor PCB sensor array and a PID control loop programmed via Arduino IDE. Built as a group final project.

ArduinoPID ControlPCB DesignSoldering3D Printing
EE 233

Tri-Band Audio Filter

Mar 2026

A multi-band active audio filter designed using op-amps and passive components, applying Laplace transform analysis for low-pass, band-pass, and high-pass filter stages.

Filter DesignOp-AmpsCircuit TheoryLaplace Transforms
EE 331

AC/DC Converter & Booster

Jun 2026

An AC to DC rectifier circuit with a boost converter stage, designed and tested as a final lab project applying semiconductor device theory.

Power ElectronicsRectifierBoost ConverterSemiconductors