Articles

High Power Launch April 2025

On April 12th I launched my “Fanton 438 (EXL)” kit. This is a 64 inch tall, 4 inch diameter rocket. Here is the video, with a breakdown below: Your browser does not support the video tag. Why did the rocket fail? Looking at the video closely, you can see that the rocket deployed the main chhute on the way up, leading to a complete separation of the upper and lower stage.

FIRST Robotics 2025

For the past 10 weeks I have mentored FIRST Robotics Team 6566 “Battering Rams” out of Lamphere High School in Madison Heights, MI. FIRST is an after school program that uses robots to teach STEM topics to high school students, and prepare them for work in a team based environment. Engineering concepts like gear ratios, power/energy/velocity/acceleration relationships, torque, Object Oriented Programming, systems engineering 3d modeling, and most importantly: Teamwork! Just yesterday the team made it to 2nd place in the district championship held in Belleville, MI.

Ham Radio Repair & Upgrade

This is the humble TM-732A, a Kenwood brand Ham Radio, with both UHF and VHF capabilities. Originally, it came with orange incandescent bulbs. These bulbs were attached to a dimmer circuit that used a transistor. It used 4 lights in 2 pairs, each pair with a 10 Ohm resistor in series. Bulbs Dimmer I chose to replace these bulbs, as they had burnt out, with sick red LEDs, to give the radio a more cyberpunk / professional appearance.

Most of the cool stuff I've Done

So in no particular order, here are some of the things that I’ve done that I think are worth mentioning. Ran a First Robotics Team and got to the World Championships One of my most proud accomplishments is getting to the world championships, and I can’t thank the wonderful mentors that joined me enough! Every success and failure was shared and being here at this time and place has truly been a blessing.

Landing Prediction App

This app is designed to solve a particular problem I have discovered in my amateur rocketry setup: The code I use to decode telemetry from my rocket data only runs on a laptop, as its writtin in MATLAB. While I’m out in the desert I want to be carrying as little weight as possible, a 200g phone is much easier than a multiple kg laptop. This code also benefits from sensors in the phone, namely positioning and altitude.

First Robotics 2023

For the last two years, I have been a mentor for First Robotics Team 5901. This year, we advanced far enough to get to the Michigan State Championship as well as the World Championship in Houston, TX. We had a hectic time organizing it last minute but I wouldn’t trade that time for anything. My team performed at their peak, placing well above expectations and predictions. Watching my students put all of their mechanical work, practice, and skill into every match was great to see.

Looking Glass Tips

Looking glass can be really difficult to setup correctly, so heres some tips IVSHEM Device Make sure to disable secure boot in the VM’s BIOS/UEFI. You can enter the bios by using Windows 10’s secure boot options entry in the start menu, then navigating thru that until you find the UEFI settings Scream This one should work out of the box, once you figure out where to download it and how to install it.

Kicad PCB Design

My Apartment does not have in-unit laundry. So, when the laundry is done, I do not hear the laundry machine stop, and would often set timers to avoid my clothes becoming wrinkly. This doesn’t solve my issue though, sometimes the laundry machine takes less time than you expect due to the automatic cycle, which I prefer to use. This PCB is intended to fix that. it consists of: An ESP8266 NodeMCU An MPU6050 Accelerometer connected via SPI This circuit board A strong magnet so I can easily attach and detach my gadget Two AA batteries, for cost effectiveness.

Ham Radio

I found this nifty little code that shows you current local space weather.

High Power Rocketry

Back in college one of my extracurriculars was rocketry. You’d buy a kit, put it all together, drive out to the desert, launch it, and finally: recover it. For me, that last part was the toughest. Here’s an image of the area that I launched rockets in: The geography was very homogenous, landmarks spaced far apart, easy to get lost in. My rocket didn’t have any tracking equipment besides the two eyes in my head and that wasn’t enough.

Drone Mapping Project

This RC plane is designed to fly over an area with a gopro or similar camera and map areas. Its part of my strategy to not lose rockets I have launched in the desert. It will have a wingspan of about 4 ft 11 in. I’m trying to make as much of it 3d printed as possible, so that I can have fun designing it as a side project, and so that I can share it with the world when its done.

Website creation

I created this website to hold onto important things I’ve found on the internet, and to more generally carve out my own little spot. I hope you like it! On the bottom left are contact pages so you can get a hold of me if need be. This website uses Hugo to generate the HTML because I dont want to do it myself, and it uses a theme called “Digital Garden” to make it look nice, expecially for phones.

Ghost Image Display

This display uses a string of LEDs (WS2812b, if you want to buy some on amazon), connected to an arduino and SD card. The arduino reads images from the SD card, and displays them one column at a time to make this ghostly display. Any image sized corectly will do! Here is a couple more pictures of this display! and here is another one, with (in)famous frog, Pepe.

Inav Telemetry Fix

I’ve Been running Matek boards on my quadcopter for quite some time due to their nice build quality and associated PDB. However I was never able to get their telemetry working via softserial. I recently got the Matek F411 Wing board for a drone project and attempted to get this fixed. After hours and hours of banging my head against the wall and trying to get my boards to output that sweet sweet data, I found the one thing I needed to do all along: Screw around with half duplex.

using new disks for LVM tutorial

use lsblk to identify disks to use. on a blank disk, use sudo pvcreate /dev/<diskdevicename> If you get this error: Cannot use /dev/<diskdevicename>: device is partitioned Use this line to completeley wipe the disk: sudo wipefs --all --backup /dev/<diskdevicename> use sudo pvs to see your volume groups and disks associated with them. use sudo vgextend /dev/<volumegroupname>/<logicalvolumename> /dev/<diskdevicename> to add your new disk to your existing volume group. I ticked the box during OS installation to use LVM, so I already have a volume group.

High Power Rocketry

March 31, 2022

Back in college one of my extracurriculars was rocketry. You’d buy a kit, put it all together, drive out to the desert, launch it, and finally: recover it. For me, that last part was the toughest. Here’s an image of the area that I launched rockets in:

OROC Launch Site

The geography was very homogenous, landmarks spaced far apart, easy to get lost in. My rocket didn’t have any tracking equipment besides the two eyes in my head and that wasn’t enough. I spent several hours out in this desert looking for my rocket and I could not find it. Next time will be different, I will make sure of that.

The Solution

Arduino powered Avionics!

Kit Rocket AV Bay

It consists of:

  • Stratologger for altitude measurement
  • GPS for positional measurement
  • Arduino for converting that GPS dat
  • an HC12 for transmitting to the ground
  • a 2 cell Li-ion battery pack

I don’t really have a plan as to when it will get launched.

Now I need to do the following before I launch it:

  • Spotweld the 2s Lithium-ion battery together
  • Create a new bracket to hold the battery in the telemetry bay
  • Add a screw switch for safety purposes (might have to make these myself)
  • Possibly re orient the Telemetry antenna (the spring in the top photo)
  • swap out the plastic M2 spacers for brass (better strength)
  • hot glue the electronics together as a sort of poor man’s potting
  • Figure out how to use the stratologger to deploy parachutes
  • make deployment charges for the stratologger to trigger
  • attach ferrules to all wires going into the stratologger’s screw terminals
  • attach launch lugs / tube
  • sand down the leading and trailing edges of the fins
  • paint the rocket and add decals

Once I arrive at the launch site I’ll need to do the following

  • Charge the Battery up
  • Fold and pack the chute(s)
  • Load the “dog barf” shredded insulation
  • load the powder charges and more dog barf
  • activate the stratologger, confirm the deployment at peak altitude settings
  • make sure telemetry is functioning
  • launch

Here is how the Launch went!

The arduino is running this code:

#include <TinyGPS++.h> //Requires the TinyGPSPlus library
#include <SoftwareSerial.h>
#include <PrintEx.h>
/*
   This sketchis designed for an arduino nano to take in GPS NMEA strings from a hobby grade GPS (BN220, BN880Q, Ublox M8N, etc).
   I designed this sketch to use a HC12 radio (for simplicity, although that didnt turn out), these radios by default
   use 9600 baud, but this script will run far lower baud than that.

   to get minimum baud necessary I used the following math:  (52 bytes/packet)*( ~2 packets per second) * (8 bits/byte)  = ~~840 baud (or bps, your choice).
   This is nice and low. i'd recommend minimum of 1200 baud. Some radios use a higher baud for internal error checking, so go to the next higher available, probalby 2400.
   heres where I got some inspiration:
   https://github.com/iNavFlight/inav/blob/master/docs/Telemetry.md

  Output format:
  A44.568103,O-123.271810,T12:00:01,H464.0,S13,V8.19
*/
const int RX1Pin = 5, TX1Pin = 4, TimetoTX = 950; // Pin assignment, and minimum delay in milliseconds between 2 transmissions
const int ardSX = A4;
const uint16_t GPSBaud = 9600; // gps baud (usually 9600)
const uint16_t TXBaud = 2400; // radio serial baud (usually 57600)
const int16_t local_TZ_hrs = -8; // your local time zone, use negative and positive where applicable
short Local_time_hrs = 0; // holds the hr for GMT - > GMT-X conversion
unsigned long timeTX = 0; // holds last transmission time
const int battsensepin = A5; // pin for sensing battery voltage
TinyGPSPlus gps;// The TinyGPS++ object

SoftwareSerial ss(RX1Pin, TX1Pin); // RX, TX
PrintEx myPrint = ss;
void setup()
{
  pinMode(13,OUTPUT);
  // The serial connection to the GPS device
  Serial.begin(GPSBaud); //GPS spits out a lot of data, and since this mirrors USB comms, we shouldnt send those bytes to the TX
  ss.begin(TXBaud);  // software serial because of low baud (like 1200 or 2400, very easy for the aruino to handle
  //setupTX(1);
  digitalWrite(13,HIGH);
  ss.println(F("Serial GPS sender for Kit Rocketry"));
  delay(50);
  ss.print(F("TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  delay(50);
  ss.println(F("\nSketch By Kyle Magness (541-745-9954, KJ7HCI)"));
  ss.println();
  digitalWrite(13,LOW);
}
void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (Serial.available() > 0) // if its connected to the GPS (should be soldered), run the parser, else check next tick
    if (gps.encode(Serial.read()) &  ((millis() - timeTX) > TimetoTX)) { // send coords if available & not sent too recently
      sendInfo(); // that big ass function below
      timeTX = millis(); //set new TX time
    }
}


void sendInfo() //collects data from GPS and formats into compact string for sending over radio
{
  if (gps.time.hour() > -local_TZ_hrs) { // if later than 8am in Greenwich
    Local_time_hrs = gps.time.hour() + local_TZ_hrs;
  }
  else {
    Local_time_hrs = 24 + (gps.time.hour() + local_TZ_hrs); // this allows us to print in nice 24hr time,
  }                                              // with a gmt -X timezone
  if (Local_time_hrs == 24) {
    Local_time_hrs = 0;
  }

  // now we format our string and insert our sensor values, then send it off to the radio for transmission
  digitalWrite(13,HIGH);
  myPrint.printf("A%-11.6f,O%-11.6f,T%02.0d:%02.0d:%02.0d,H%07.1f,P%02.0d,V%04.2f\n",
                 gps.location.lat(),
                 gps.location.lng(),
                 Local_time_hrs,
                 gps.time.minute(),
                 gps.time.second(),
                 gps.altitude.meters(),
                 gps.hdop.value(),
                 sense_battery());

  //.println(output);
  digitalWrite(13,LOW);
}

float sense_battery() { // Reads battery voltage and returns the value as a string for printing
  // make sure to use a 1 - 1 voltage divider, so that voltage is divided by 2! for a 2S lithium battery, this works best.
  int senseval = map(analogRead(battsensepin) * (1.8223), 0, 1023, 0, 5000); // convert sensor pin value to millivolts, multiplied by 2 for voltage divider
  //String outstring =  String(float(senseval)/1000,3); // I now everone hates floats and strings but this was fastest and I have many cycles to spare
  //String outstring = String(sensestring[0] + "." + sensestring[1] + sensestring[2] + sensestring[3]+ '\0'); // I wanted to do it this way but it kept failing for some reason
  return senseval;
}

void setupTX(bool mode) {
  if (mode)
  {
    pinMode(ardSX, OUTPUT);
    digitalWrite(ardSX, LOW);
    delay(200);
    Serial.println("AT+B2400"); //set baud to 2400 bits/sec
    Serial.println("AT+FU3"); //set normal mode
    ss.println("AT + P1"); // set power mode (1 = 1dbm, 8=20dbm)
    delay(100);
    ss.println("AT + C001");
    delay(100);
    pinMode(ardSX, INPUT);
  }
  else
  {
    pinMode(ardSX, INPUT);
  }
}