Machining

I’ve recently started to teach myself machining, specifically how to safely use a lathe and mill to create tools. A really great resource has been Machining Fundamentals by John R. Walker. This book goes through the fundamentals through to more advanced usage and also teaches important safety tips for each piece of equipment.

My first project was boring out this old piston from a diesel engine to make a cup holder. The finish is terrible if I’m honest, I think the combination of long extension on a relatively thing boring bar and interrupted cuts really didn’t make for happy machining. Unfortunately carbide was all I had at the time, if I ever try to clean it up I’ll have to get a HSS boring tool.

Engine Piston after boring
Completed Pen Holder!

My first “real” project was making this metal scribe out of old bolts that I found in the river near the CPR bridge. These bolts are definitely not made of a good machining alloy, it’s actually really difficult to get a good surface finish. But the end result turned out pretty well. I ended up using a vertical shear tool I ground in order to get the finish where I wanted. There’s also a lid for it to protect people from getting injured that’s no in the picture below.

Scribe (right, without pointy end installed) next to vertical shear tool

All this was to learn the basics to I could make myself a fire piston as designed by Clickspring. I think this turned out pretty good, although I have some modifications to make since it doesn’t quite start the char cloth on fire yet. After chatting with a machinist at work he suggested making the piston stroke a bit longer and to use double or triple o-rings on the piston. Once I make these changes and hopefully get it working I’ll post the results.

Completed Fire Piston

OpenSCAD

I found openSCAD a little while ago and started to play around with it. At first it seemed rather rudimentary when compared to SolidWorks, AutoCAD and others but it really grew on me. The power of scripted cad really becomes apparent after using it for awhile: with enough forethought you can design scripts that are able to be easily modified to fit other applications, allowing universal designs. To that end I designed a lens mount that should be universal to almost any camera lens.

https://www.thingiverse.com/thing:3343000

Point Grey Chameleon Camera with C-Mount Zoom lens and Grey camera mount

I’ve also designed a number of other simple tools:

Oil Cups for Watchmaking
Watch Mainspring Winders

Agricultural Robotics

For the last two years I’ve been working on an agricultural robotic project, specifically for the purpose of performing phenotyping research at the University of Saskatchewan.

PAMM, an acronym for Plant Phenotyping and Measurement Machine, is a RC controllable robotic platform that combines a mobile platform with data aquisition systems such as Cameras, Laser Scanners, and others to aid plant breeders in their research.

Here are a few pictures of the platform from our booth at Spectrum 2019:

Basically PAMM is a large remote controlled platform, with 4kW of electrical power going to a 4 wheel steer and drive system. It’s capable of around 3m/s top speed although that’s terrifying on rough ground when there’s no suspension.

Reverse Engineering 7 Segment Display

I recently came across an old five digit seven segment display and decided to see if I could give it a second live.  It appears to have been from a  weighing device of some kind, judging by the company name: Weigh Right Inc.

5 Digit 7 Segment Display

It’s a gorgeous piece of hand drawn circuitry with lovely smooth lines.  There are also very few jumpers on the board so clearly the designer had put in some effort into this single sided design.

Circuit of the 7 segment display

The display is essentially a serial to parallel converter, with 5 8bit 74C164 chips driving each digit.  Each 74C164 has the 8th bit connected to the following chip to create a single serial interface for the entire display.  To understand the design and how to interface to it I traced out the circuitry and drew up the schematic.  You can find it on the github page for this project.

After figuring out the binary codes for each segment and building a simple 5V to 12V logic translator with 2N3904 transistors, I wrote up a simple script for an Arduino that would light up all the segments, which was when I found the reason that it was in the scrap pile:

The display functioning, sort of…

Oh dear.

Rather than throw this away I figured I’d see if there was a way to fix it.  First step was to figure out if it was the 74C164’s.  They seemed really hot so I quickly figured out the current for each segment by turning one on at a time and watching the power draw on my bench supply.  18mA.  Which if you’ve read the data sheet for the 74C164 is a tad over the 8mA absolute maximum current of the device.  Since I didn’t have the original machine that this came from I can’t say for sure that the display wasn’t being flashed using PWM to reduce the drive current.  I can only hope that the original designer didn’t miss that.  I just reduced the drive voltage from 12V to 8V to get the current down to below 8mA per segment.

After further inspection that all the LEDs were okay on the dead segments I tested the voltage output from the 74C164: 7V, even higher than the lit segments.  A bit odd considering the LEDs themselves are fine.  Turns out whoever assembled the board decided to save power by putting the LEDs in backwards on a few of the segments!  An easy enough fix and now I have a fully functioning 5 digit 7 segment display!

All segments working now

You may notice one LED is brighter than the others.  One LED was actually dead and my replacement LED is much newer.  Not sure if that’s due to technological progress on LED efficacy or just wear (better on the former), but it’s quite a big difference!  There’s another dead LED but somehow it’s still conducting current so I might leave it in for now rather than having another strangely bright LED.  If I can scavenge a period correct LED (not something I thought I’d ever want) then I might drop it in.

Side note: 1970’s Solder smells weird.  Not sure if it’s the solder formulation, PCB materials, or flux residue.

Next step is just to figure out what to make with it!

Glider Performance

So I started wondering the other day just how each of our gliders at the club stack up against each other on OLC. Thankfully, the Online Contest website has a large amount of data available.  After grabbing a bunch of data and writing a python script to analyze it we have the following result:

The DG808/15m is the most successful aircraft for collecting Points.  This is not taking into account any bias on the pilot.  It could be that all 16 flights recorded were done by the best pilot on earth and are skewing the data (what a jerk!).  There is also the possibility of a bias based on how OLC rates the aircraft, since they have a “handicap” number for each aircraft.

What is interesting is that our oldest aircraft, the 1-26, rates at 230 on the chart, where other more advanced planes like the L-23 and L-33 are at 339 and 414 respectively.  Our best aircraft, the Cirrus, rates at 220, just barely above the 1-26.  So the handicap levels are working to level the playing field at least to some extent.

Something else that might be interesting is comparing the cost vs average number of points collected to see what is the most cost effective aircraft for collecting points.

The finished dataset can be downloaded here: aircraftStats

The python script used is below.

import csv
data = list()
canadaFiles = ['OLC_Daily Score_Canada_2016.csv',
                 'OLC_Daily Score_Canada_2015.csv',
                 'OLC_Daily Score_Canada_2014.csv',
                 'OLC_Daily Score_Canada_2013.csv']

worldFiles = ['OLC_Daily Score_Worldwide_2016.csv',
              'OLC_Daily Score_Worldwide_2015.csv',
              'OLC_Daily Score_Worldwide_2014.csv',
              'OLC_Daily Score_Worldwide_2013.csv',
              'OLC_Daily Score_Worldwide_2012.csv',
              'OLC_Daily Score_Worldwide_2011.csv',
              'OLC_Daily Score_Worldwide_2010.csv',
              'OLC_Daily Score_Worldwide_2009.csv',
              'OLC_Daily Score_Worldwide_2008.csv',
              'OLC_Daily Score_Worldwide_2007.csv']

for filename in worldFiles:
    with open(filename, 'rb') as file:
        csvreader = csv.reader(file)
        for line in csvreader:
            if line[0] is not '#':
                data.append(line)
print "Num Flights Examined: %d"%len(data)
# Sort by Aircraft type
aircraftSortedNames = list()
aircraftPoints = list()
aircraftDistance = list()
for row in data:
    if row[7] not in aircraftSortedNames:
        aircraftSortedNames.append(row[7])
        aircraftPoints.append(list())
        aircraftDistance.append(list())
    aircraftPoints[aircraftSortedNames.index(row[7])].append(float(row[1]))
    aircraftDistance[aircraftSortedNames.index(row[7])].append(float(row[3]))

# Aircraft stats formatted as [aircraft name, flightCount, Max Points, Min Points, Average Points per flight, max km, min km, ave km]
aircraftStats = list()
for index in range(len(aircraftSortedNames)):
    flightCount = len(aircraftPoints[index])
    maxPoints = max(aircraftPoints[index])
    minPoints = min(aircraftPoints[index])
    sumPoints = sum(aircraftPoints[index])
    avePoints = float(sumPoints)/float(flightCount)
    maxDist = max(aircraftDistance[index])
    minDist = min(aircraftDistance[index])
    sumDist = sum(aircraftDistance[index])
    aveDist = float(sumDist)/float(flightCount)
    # Remove anything with less than 3 flights, since it's not statistically significant (yes, even three is a stretch)
    if flightCount > 3:
        row = [aircraftSortedNames[index], flightCount, maxPoints, minPoints, avePoints, maxDist, minDist, aveDist]
        aircraftStats.append(row)

print "Num Aircraft: %d"%len(aircraftStats)

sortedList = sorted(aircraftStats, key=lambda l:l[4], reverse=True)

# Create a csv result file
with open('aircraftStats.csv', 'wb') as outfile:
    csvwriter = csv.writer(outfile, delimiter=',')
    csvwriter.writerow(['Aircraft name', 'FlightCount', 'Max Points', 'Min Points', 'Average Points per flight',
                        'Max km Flown', 'Min km Flown', 'Average km Flown'])
    for row in sortedList:
        csvwriter.writerow(row)

Glowing Ball

A simple project that a friend asked me to make for her to fit into her show.  Basically she wanted a glowing ball that would mimic the breathing light that apple computers have.  Going from a dollar store glow ball to a breathing ball was relatively simple, taking an ATiny micro and a LED RGB chip with built in controller and slapping it all together on some perf board.

Here’s what you get for a couple dollars from the Dollar Store:

2014-07-08 19.06.15

What you probably can’t see is the extreme amount of corrosion on the wires or the fact that there is no insulation on anything.  If that LED were to drop down and short across that nut (yes, it is just a nut glued in there) there is a chance for a fire.  Personally, I will never buy anything cheap from china anymore, it’s just too scary what they will do over there.

After modifying the design and adding in my perf board hack we have:

2014-07-10 11.53.32

Not bad.  Coating everything real well with hot glue to ensure nothing can come loose and cause a short the final product is this:2014-07-08 19.06.24

The circuit and code is hosted here on github, feel free to do with it as you please.  One thing that needs to be changed is adding a 5V boost regulator to keep the voltage constant, as the RGB led chip turns more and more red as the voltage droops lower.  As red less generally have lower forward voltage drops, my assumption is that the other LEDs are getting less current and thus the red colouring.

Here’s a short video showing the end result:

 

 

 

Replacement License Plate Bulb for CBR250R

A simple project to replace the incandescent bulb that lights up the license plate on my CBR250R bike that keeps burning out. This light and the tail light appear to be more prone to failure, perhaps due to the more rigid connection to the bike than the other lights. I’ve also been wanting to try and replace lights with LEDs as there is a theory that they provide additional safety due to the fast on times.

The project is really simple, just a PCB that fits into a 168 bulb socket and powers three LEDs with a resistor in series. I want to try and see if i can even do a simple retrofit like this before I think about moving to properly driven electronics.  Just sent the boards off to get manufactured, will update once the boards get here.

Project is hosted on Git.

 

Ring Clock Control Board

Just got some of the boards back from OSH Park and they look great!

2014-06-24 22.42.00

Next step is to get the components and try them out.

In the meantime I found a bluetooth enabled Arduino platform, the Lightblue Bean. This begs the question, would it be better to set the time of the clock with buttons on the clock or with a bluetooth app?  I think the coolest solution would be to use capacitive sensors along the perimeter but the cost would be higher than I want with this project at the moment.  Thankfully, due to the modularity of the design, I can easily change the control board and upgrade the device whenever I’d like.

More info on the project soon.

DOCSIS 3.1 Transmitter

As part of a class in my master’s program in Electrical Engineering, we were asked to create an OFDM transmitter/channel/receiver in Matlab.  In our next class we also created the transmitter in Verilog HDL for an Altera Stratix FPGA.  This is a that project.

Since this was a very interesting project for me I thought I’d share my code, hopefully it will benefit someone.

The transmitter is a very simplified design, with an FFT size of 256, Cyclic Prefix of 96 and a Roll off of 32.  A random number generator creates a sequence of bits which are converted into QPSK symbols.  After running through a FFT, the cyclic prefix and roll off are appended and prepended to the sequence.  This was one of the most interesting parts as it required creating a secondary clock which ran at (256+96+32)/256 (or 1.5) times the original clock rate.  The FFT output, now stored in RAM, was accessed in such a way that the cyclic prefix and roll off were added to the original sequence.

I should note that this is in no way a finished project, but does demonstrate the a starting point for implementing the DOCSIS 3.1 standard.  One of the most difficult parts of implementing this project is keeping track of every single bit, especially when switching clock speeds.  Modelsim was very helpful in this.

Likely the most challenging part of this project was the very long compile times.  It is very much well worth your time to read the compiler documentation.  Anything that can increase your compile times is going to save you a huge amount of time.

The repository is located here.