Zephyr Kite Companion

ZEPHYR KITE COMPANION is a lightweight module that hitches a ride on your kite while collecting local environmental data.

Quick project summary:

Step 1: Sourcing components

Step 2: Programming the module

Step 3: Prototyping the housing

Step 4: Designing the UI

Step 5: Testing and future additions

Technical skills employed:

Hardware: RPi Pico, Adafruit Feather 32u4, RFM69HCW Low-frequency radio module, BNO055 IMU, MPRLS pressure sensor, BMP390 altimeter, TCA9548A I2C Expander, ILI9341 TFT capacitive touch display

Programming: CircuitPython, Arduino/C++, 900MHz radio communication, I2C, SPI

UI Design: Pixel Artwork, CircuitPython graphics library

When I was feeling especially cooped up during the coronavirus pandemic lockdown, one of my favorite things to do was hike up a hill near my house in San Luis Obispo to fly my kite. At some point in the last year or so I became really interested in the idea of creating a kite-powered renewable energy source, and after coming across companies like KitePower and EnerKite, I decided to design and create my own small-scale kite generator based on their concepts. Since then I’ve spent my spare time after work and on weekends creating the first working prototype of what I’m calling the Zephyr Kite Companion.

The first step in my design process centered around researching and sourcing my components. The first big challenge was figuring out how best to reliably transmit information from the sensor module (strapped to the kite in the air potentially hundreds of feet up) back down to earth. Common wireless options like Bluetooth don’t work well at that range, so I elected to use low-frequency ISM radio modules instead.

Keeping in mind that I needed my module to be as low-cost, lightweight, and compact as possible, I limited my sensors to a barometric altimeter for measuring altitude, an IMU for measure changes in orientation, and a pitot-static tube feeding two ported pressure sensors for measuring wind speed.

After sourcing my components, I began the process of programming the sensor and receiver modules. I wired my electronics together on a solderless breadboard and began tinkering with my code.

I iterated through different hardware and programming configurations rapidly during this stage. Unforeseen issues with the pressure sensor communications meant I had to tack on an I2C multiplexer to my sensor module. I also swapped out an incompatible altimeter and upgraded to an IMU with onboard sensor fusion.

The most consequential change I made involved swapping out my controllers in the sensing and receiving modules. Initially, I used a Raspberry Pi Pico microcontroller in the sensor module and a Raspberry Pi 4 in the receiver. I later switched to using an Adafruit Feather 32u4 for the sensor module and repurposed the Pico in the receiver. This led to much more efficient use of processing resources, and the built-in radio module and battery charging capabilities of the Feather led to a more compact sensor module. However, the switch did require nearly a full rewrite of all my programming, since Raspberry Pis are Python-based modules while the Feather is Arduino-based.

I’ve gone through several iterations of the sensor module housing since beginning this project. The housing poses a special challenge because it has to be lightweight and compact while having enough room for all the components and remaining at least somewhat aerodynamic. I usually started out each idea by making a rough prototype out of cardboard and tape. For the better designs, I made a second, more sturdy version using heat-formed ABS.

However, I always run into the same problem for each version of the housing; I haven’t found a good way to mount the sensor module on the kite. My kite’s flexibility makes it difficult to mount without making permanent alterations to the kite, which I’ve avoided doing until I land on a relatively final idea for the housing. In the meantime, I use a ton of gaffer tape and that seems to do the trick!

For future iterations, I’m experimenting with a cylindrical housing tethered to the main line underneath the kite. This is a simple mounting configuration that would work well with many different types of kites. It might also facilitate steering the kite when I add that capability down the line. However, the module would not have a rigid connection to the body of the kite, so the IMU data may be less reliable, and it might make launching the kite more difficult as well.

I built the receiver module is on the other end of the radio from the sensor module to capture and display all the data being collected. I wanted something stand-alone so that I would not have to bring a computer into the field, which required adding a display and internal battery to the receiver. I chose to use a touch-sensitive display to minimize the number of components and a rechargeable LiPoly battery to reduce waste.

Because the receiver module is controlled using a Raspberry Pi Pico microcontroller, I had to program the user interface using very low-level techniques. I created a user-interface class in CircuitPython that runs on a finite-state machine and shares resources and data with the main receiver script using timing intervals. I wanted the user interface to have appealing graphics, and I took inspiration from pixel-based video games. I included start, home, sensor calibration screens, as well as screens to display each different set of data (altitude, wind speed, and orientation).

After conducting field tests with the first-round prototype, I determined several aspects of my design that needed to be modified.

First, the pitot-static tube - which I had mounted at the tip of the kite so as to read wind speed before local surface effects - took significant damage and got clogged when the kite inevitably nose-planted during take-off. It also did not provide meaningfully accurate readings (as compared to local weather data), which was probably due to the grit in the tube, compounding poor sensor resolution, and constantly changing orientation with respect to the velocity of wind. Because wind speed is not an essential measurement for functionality, I decided to remove wind speed measurement from the scope of my design.

Second, sensor data was not being communicated at a quick enough rate. This was a result of relatively slow MicroPython code execution on the RPi Pico microcontrollers. I selected new SAMD21-based controllers from Adafruit, which also featured built-in radio modules and battery ports, and rewrote by programming in Arduino/C++.

Third, the user interface was too slow and clunky to be very useful. I decided that a cleaner and more effective user interface could be implemented using a smartphone app. This required Bluetooth connection to the receiver module, but the benefits include faster scans and less load on the receiver MCU, as well as easier UI programming and design using app development tools.

Updates:

I’m currently developing a steering device as the second phase of my kite project. When complete, the kite’s movement can be monitored using the altimeter and IMU, and a closed-loop control system will keep the kite stable in a desired location or altitude.

I’ve developed a 3D printed housing for the sensor module, sourced new components, and improved my programming considerably. I’m also studying up on PCB design so that I can eventually make a slimmed-down version of the circuitry inside the sensor and receiver modules.

I’m also planning to implement a base module farther down the road capable of generating small amounts of electrical power. There are already companies developing large-scale versions of this technology (up to even the megawatt range), but I’m setting my sights on being able to generate a few watts over a day at the beach — just enough to charge a phone or portable speaker.

Previous
Previous

Animatronic Mask