Calculix FEA Tutorial Image Problem

I’ve had a number of requests from people to get the images working for the tutorials. I hate to say it but iClippy.com where the service is hosted has failed me. I’m paying for service yet I have no access to my own data. Better yet their customer service is vaporware at best after several attempts to contact them. Hopefully they will resolve the issue and I will move those pictures to better hosting service providers. Too bad really, they offered a nifty service but it seems to be a dead end.

Posted in Digitizing Data | Leave a comment

36er Klydesdale by Choice Collective

The mythical 36er bike has been on my mind for quite a while.  When the frame of a bike is the right size it for a tall guy it makes even a 29er mountain bike tire look a little small.  When I noticed the 36er built by Black Sheep bikes it got me thinking about a true clydesdale size bike for a big rider.  In the back of my head I’ve been thinking it would be fun to try a 36er but I couldn’t justify buying a turn key custom Black Sheep bike.  Not that I wouldn’t have them build me a frame, I might just choose a 29er hardtail dialed into my exacting requirements that I would lovingly ride for years to come.  The 36er is still a very experimental platform.  That is what makes it so cool and a 36er Klydesdale from Choice Collective is the perfect testbed.

Choice Collective did a custom run of 200 Klydesdale Cruzer bikes which are priced very well at $799.  That is a good price considering the small market segment and this type of build quality.  My personal bike is pictured below.  I’ve made a few modifications to the original setup to facilitate my style of riding.  I wanted straight bars and a seat which would remind me of my other bikes.  The standard out of the box build comes with big ape-hanger handlebars and a large plush seat.  I saved a few pounds and got controls I’m accustomed to riding in the switch.

The pictures don’t do it justice, this is one big bike.  However, it rides very well and I’m quite happy with the overall performance.  I took it for a 28 mile round trip to work and it turns heads.  A friend of mine at work, who is also tall and rides, loved the idea.  Everybody else couldn’t help but notice it parked in the hallway next to the regular, pony sized bikes.  This is one sweet ride.

One small modification I would recommend is to replace the plastic chain tensioner jockey wheel which comes with the bike in the stock configuration.  It is a quick and cheap fix that goes a long way.  The stock wheel does not have a bearing and it  makes a quite a squeaky noise as it spins.  I used the jockey wheel from a DMR single speed conversion kit for a vertical dropout bike.  It turns out the DMR part has a bearing with the correct inside diameter to be used on the Klydesdale 36er.  The parts and swap are shown below.

I used the red/orange colored jockey wheel from the DMR conversion kit along with the shaft/nut.  I used the bolt and washers from the Klydesdale.  The DMR kit and the Klydesdale have functionally equivalent shaft/nuts that the jockey wheel rides on.  They are the same length, diameter, and internal thread size.

This picture shows the final installation.  The tab sticking down from the frame is sandwiched by two washers.  The steel shaft/nut does not go through the inside washer.

After putting some good miles on this setup I’ve noticed the new jockey wheel likes to sit right up on the washer next to the tab.  Some of the time it walks over while the bearing it rides on stays put on the left side at the head of the nut/shaft.  I’m planning to add a couple washers to the left side of the jockey wheel to keep it closer to the tab where it naturally sits during a ride.

Overall I’m very happy with the 36er and plan to keep riding it as one of my three primary bikes.  It is going to make a great summer bike for short rides around town and up the beach bike path.  I’m also planning to start researching lighter wheels and tires.  The current setup works fine but I’m curious to know what is out on the market.  This bike is a great platform to start experimenting with 36er technology.

Thanks for reading!

-Ty Beede

Posted in Digitizing Data | 1 Comment

Processing Garmin GPS Data

I’ve finished compiling the GPS data for a recent outdoor adventure.  This is my first trip with a GPS device and here is how I realized it was a wonderful addition to my collection.  I did a number of different things with the data to slice and dice it.  The first thing was to import the raw GPS data into the Garmin BaseCamp application as shown in the image below.  This is the program that comes with the Garmin 24K U.S. West Topo map set that includes all of California.  The program is rather crude and offers limited features beyond management which topo maps are loaded into the Garmin handheld unit.  However, it allows you to export the path data for a trip into Google Earth which is a much more powerful visualization tool.  The Garmin application reports 53.5 miles traveled over 11 hours and 30 minutes.  I started the GPS route a little before we left the parking spot.

The result of exporting the data into Google Earth is shown below.  This overlays the GPS path with Google’s satellite data.  Install Google Earth and use it to manipulate *.kmz files and duplicate similar results.  The top of the display shows the teal colored trace from the GPS on the satellite image.  The red graph below shows the elevation profile over the left to right direction of the path traveled.  Note, the red elevation profile does not appear by default when loading the *.kmz file.  You need to display it by right clicking on the path icon(not shown) and selecting the elevation profile.

While looking at data in Google Earth I discovered a bug to be aware of if you use it to post process the dataset.  When the size of the Google Earth window changes in horizontal length the elevation profile graphic display also expands or contracts.  The problem is that when it contracts the data is reduced down and looses fidelity as displayed in pixels.  The Google Earth program seems to be pulling its trip data statistics from the same set of data used to plot the pixels of the graph. Rather than the original dataset that is shown in the teal path plot as recorded by the GPS.  Route length is shorter and elevation gain is lost when the Google Earth window is made more narrow.  This is shown in the picture below.  The larger horizontal length image reports a distance of 51.0 miles and 8234 feet of elevation gain.  The smaller image shows 47 miles traveled and 6515 feet of elevation gain.  When dynamically moving the Google Earth window the red graph plot area continually updates, and right along with it the data statistics summary area.  This is erroneous and dataset statistics shouldn’t change value with the resolution of the display plot.  They are only limited by the resolution of GPS points and Google Earth is reporting false results for narrow windows.  This elevation profile functionality is new to Google earth so I would assume they have a few things to work out and a bug report was submitted.  This leads to the next question, what is the best answer for the final statistics that can be pulled from the dataset as recorded by the GPS?

At this point Garmin BaseCamp and Google Earth have failed to give me a number I can trust for elevation gain.  However, Google Earth hinted at the correct value as the length of the horizontal plot grew longer and greater detail was captured in the final stats calculation.  If I had a really long monitor I’m sure the values would converge.  In order to determine the final answer it became apparent that I would need to process the raw *.gpx file data as recorded by the Garmin GPS.  I did some of research about this and discovered a blog article about applying a smoothing filter to the elevation dataset which improves the accuracy by reducing noise in the path.  The posting even features code in the Ruby language to manipulate the dataset which can be easily converted to Matlab or Scilab.  Fortunately for me I didn’t have to convert the code because this crazy mountain biker guy has a whole site dedicated to mashing up ride GPS data and maps named http://www.mtbguru.com I added the *.gpx data from our backbone trip to his site and it is accessible from this link.  With the filter algorithm he uses applied to the dataset it shows a total elevation gain of 8555 feet.  The results are shown below in a screen shot from the link above.

After reading his article about GPS data processing I realized that it would have been nice to get the Garmin Etrex 30 GPS which features a built in altimeter.  This helps improve the accuracy of the elevation data by supplementing the triangulated GPS signal.  In an effort to better understand the dataset I used http://www.gpsvisualizer.com to pull information from the 30-meter horizontal resolution NASA Space Shuttle Radar Topography Mission (SRTM1) and the U.S. Geological Survey’s National Elevation Dataset (NED). Copies of both databases are stored at GPS Visualizer for public access.  Simply use their online scripts to create *.gpx elevation data pulled from the topographic databases based on the GPS coordinates of location.  The results from the two databases show greater elevation gains of 9069 feet for NASA and 10162 feet for NED.  The NED data is considered to be a better source.  Screen shots of the profiles are shown below and accessible at mtbguru.com from these links, NED and NASA.

Summary of GPS Dataset Information

GPS Miles Traveled: 53.5 miles
TJ’s Calculated Miles Traveled: 55 miles
Google Earth Satellite Elevation Gain:  8234 feet
Garmin GPS Elevation Gain with Filtering: 8555 feet
NASA Space Shuttle Radar Topography Mission Dataset Elevation Gain: 9069 feet
U.S. Geographical National Elevation Dataset Elevation Gain: 10162 feet

Average of Mileage Data Points: 54.25 miles
Average of Elevation Gain Data Points: 9005 feet

Thanks for Reading,
-Ty Beede

Posted in Digitizing Data | Leave a comment

Monster Cross Version 1.0

This is the final product of the monster cross build that was started with BikeCAD.

Posted in Bicycle Design and Fabrication | Leave a comment

Full Scale Bike Frame Prints

BikeCAD is an excellent program to use for frame design.  One of the primary benefits to the hobby builder is the ability to export a full scale drawing of the frame design.  The picture below shows a 36″ x 48″ print of my new frame design.  I’ve also used BikeCAD to generate an 11″ x 17″ color print with the key dimensions.

For a hobby builder who isn’t planning to build frames with production efficiency, a full size print can be used with a flat surface as a template for frame construction.  A number of flat surfaces can be used as the datum.  Typical industry frame tolerances are on the order of 1.5 mm or about 0.060″.  That means you can have a frame that isn’t straight by about a 16th of an inch before it will become perceptible for enough consumers to cause a problem.

In the realm of flat surfaces there are a few places to start shopping.  Large granite surface plates often pop up on Craigslist at very reasonable prices.  I personally missed a locally sold 36″ x 48″ plate with stand and cover for $200.  In addition, Enco has an imported black granite plate in a 36″ x 48″ size for $309.95.  The Enco plate is grade A and flat to 0.0004″.  That is really flat, so much so that the tolerance of the paper thickness will likely be greater.  A large granite plate will also require some straps and engine hoist to move around.  A steel stand will be necessary to support its weight.

If a more versatile option is required, a 3/4″ thick steel plate can be prepared to use as a datum surface.  It will be necessary to stress relieve it at a heat treating facility to properly prepare a steel plate.  Then the surface is blanchard ground at a grinding shop to about 0.005″ flat across the surface.  The nice part about using a steel plate is its dual purpose nature.  After grinding both sides will be nice and flat.  Use one side for general purpose fabrication and the other for layout.

In the realm of inexpensive options a large slab of black granite counter top material can be acquired cheaply.  Its likely that a big enough granite plate can be located at a home supply store.  Granite counter tops are flat enough to use for bicycle frame construction, perhaps on the order of 0.030″.  I would recommend looking for one with a small grain size like those in the black color.  These are also light enough to be moved by hand with a friend, rather than by engine hoist.

Once a flat surface has been located it will be necessary to get a few v-blocks and squares.  Grizzly has v-blocks at very economical prices.  Here is a link to their selection of blocks.  A set of two cast iron 3″ v-blocks can be had for $8.95.  A set of machinist’s squares to line up the edge of the tube with the edge of the print on the paper will also be necessary.  Grizzly has a set of 4 squares for $17.75.  Here is a link to their selection of squares.  The square is used such that it sits flat on the surface plate on one side an touches the tube on the other.  Then line up the tube on v-blocks with the square to the edge printed on the drawing.

Couple this technology with a grinder to notch the tubes and a TIG welder and it will be fairly easy to get going on a frame project.   If a TIG welder isn’t available it won’t break any rules to glue the tubes together with a MIG, brazing, or lugs.  It may also be necessary to source some flat spacer blocks to get all the tubes and bottom bracket spaced at the right distances to ensure they have the same centerline despite differences in diameter.  The rear triangle can be a bit tricky, but this problem is often solved by using a true rear wheel to align the left and right sides before tacking them in place.

Even if you’re using a frame jig the full size print is useful.  It has all the dimensions you’ll need to setup the jig and serve as a sanity check while in construction.

Thanks for reading!
-Ty Beede

Posted in Bicycle Design and Fabrication | Leave a comment

Ramberg-Osgood Calculations with SciLab

The Ramberg-Osgood method is a material model used to extend the linear elastic region to include plastic deformation. The correlation between stress and plastic strain is described by an exponential factor.  The material model is described mathematically by the following equations.

Calculix ccx has access to this material model through the *DEFORMATION PLASTICITY input card.  In order to use it, the Ramerg-Osgood parameter must be calculated.  This means stress-strain data from an experimental or reference source is necessary.  The ASM Atlas of Stress-Strain Curves is hosted online by Google Books.  Not all of it is available, however, it does have thousands of curves to reference.  Simply take a screen shot of the desired page and use this article to digitize the data into a CSV file.  The SciLab program below calculates the value for the Ramberg-Osgood parameter based on the method outlined in the Mil-5 Handbook section 9.3.2.4.  The section from the book is available for download from their site or at this link.

The value of n, the Ramberg-Osgood parameter, is equal to the inverse of the linear regression line slope which passes through the plastic strain vs stress points on a log-log plot.  The following image shows this plot for the 1020 cold drawn steel sample which was described in the article about digitizing data from an image.  The SciLab program stores the value of the slope in the variable a which is output to the terminal window.  In the case of the 1020 cold drawn steel, a equals 0.143 which leads to n=7.

The following plot shows the data points from the digitized curve with the resulting Ramberg-Osgood stress-strain curve model shown in bold red.  This curve is a combination of the elastic and plastic parts up to the 0.2% yield strength.

The Ramberg-Osgood model is valuable in this case because the cold worked steel does not display the typical sharp plateau at the elastic limit common to hot rolled mild steel.  In the case of 1020 cold rolled steel the usable engineering range is extended by choosing to design around the 0.2% yield strength and the Ramberg-Osgood material model is a convienent method to capture this information.  Instead of using the *ELASTIC card and engineering at the limit of elasticity the *DEFORMATION PLASTICITY card is used and the full yield strength of the materials is captured at the 0.2% yield offset.  However, this is not a hard and fast rule and it is always appropriate to make sure the analysis choices match well with the desired requirements for the part’s functionality.

The SciLab program and 1020 cold roll steel CSV file is available for download from this link as a zip file.  The source code is shown below.

path = pwd();
fid = mopen(path + "\1020_cold_worked.csv", "r");
if (fid == -1)
  error("File was not able to be opened for reading");
end

i=1;
done=0;
while (done == 0)
  [num_read, strain(i), stress(i)] = mfscanf(fid, "%f,%f");
  if(num_read > 0)
    strain(i) = strain(i)*10^-3;
    stress(i) = stress(i)*10^3;
  end

  i=i+1;
  if(num_read <= 0)     done = 1;   end end mclose(fid); printf("End of data from file\n"); E=30*10^6; strainElastic = stress/E; strainPlastic = strain - strainElastic; k=1; rambergStrain=[0 0]; rambergStress=[0 0]; for j = 1 : 1 : max(size(strain))   if( strainPlastic(j) >= (0.0002*0.98) & strainPlastic(j) < (0.002*1.02) )
    printf("INDEX = %i --- STRESS = %5.1f --- PLASTIC STRAIN = %0.5f\n", j, stress(j), strainPlastic(j));
    rambergStrain(k) = strainPlastic(j);
    rambergStress(k) = stress(j);
    k=k+1;
  end
end

[a,b,sig]=reglin( log(rambergStrain), log(rambergStress) )
subplot(2,1,1)
plot2d( log(rambergStrain), log(rambergStress), style=-1)
plot2d( log(rambergStrain), a*log(rambergStrain)+b)
currentAxis=get("current_axes");
currentAxis.x_label.font_size=3;
currentAxis.y_label.font_size=3;
currentAxis.title.font_size=3;
xtitle('Ramberg Osgood Linear Regression 1020 Cold Roll Steel','Logarithmic Strain (in/in)','Logarithmic Stress (psi)');
subplot(2,1,2)
plot2d(strain, stress, style=-1);
stressYield=66000;
calculatedStress = 0 : 1000 : stressYield;
calculatedStrain = calculatedStress/E + 0.002*(calculatedStress/stressYield)^(1/a);
plot2d(calculatedStrain,calculatedStress,style=5);
currentAxis=get("current_axes");
currentAxis.x_label.font_size=3;
currentAxis.y_label.font_size=3;
currentAxis.title.font_size=3;
a1=gca();
a1.children.children(1).thickness=3;
xtitle('Stress Strain Curve 1020 Cold Roll Steel','Engineering Strain (in/in)','Engineering Stress (psi)');

Thanks for reading!
-Ty Beede

Posted in Digitizing Data | Leave a comment