DIY 212cc Go-Kart — Testing Gears, Tires, and Engine Mods to Increase Speed!

by nate4321 in Workshop > Metalworking

1535 Views, 8 Favorites, 0 Comments

DIY 212cc Go-Kart — Testing Gears, Tires, and Engine Mods to Increase Speed!

IMG_0244.jpeg
image.png
212cc Gas Go Kart Preview

Hi! My name is Nate and I am a seventh grade student who loves building things. I built this go-kart to see how fast I could make a 212cc engine go by testing different engineering changes. I included an Autodesk Fusion 360 model of my go-kart because it helps me understand how all the parts work together and I think it will really help people who are trying to build my go-kart. By combining calculations and real world testing, I optimized my go-kart for top speed. I started with a stock 212cc, 7hp gas engine then added a stage 2 carburetor kit and experimented with a lot of ways to make it faster and handle better.

For example, I upgraded the clutch, tires, brakes, and reduced weight to improve performance. I ran tests with my DIY speedometer, created with Autodesk Tinkercad, to measure top speed, acceleration, and hill climb top speeds. Also I did some calculations to see how changing the clutch and tires would affect speed. Instead of just guessing which upgrades would make it faster, I calculated the predicted speed and then tested the real results to compare them. I improved my top speed from 19 mph to 27 mph by upgrading clutch, tires, and carburetor. These improvements made me think this is a great project for the Let There Be Speed contest.

This Instructable shows how I tested, measured, and improved my go-kart step by step. Additionally, I used Autodesk Tinkercad to design my speedometer case. I hope this Instructable helps others to see how fun and interesting it is to use engineering to make things go faster! This project shows how engineering and testing can turn a simple go-kart into a fast vehicle. There is a longer video later in the Instructable.

Supplies

Frame / Structural Materials

  1. ~26ft of 1.25 in metal square tubing (frame main structure)
  2. ~9 ft of 1 in metal square tubing (support braces, engine and seat mounting)
  3. Sheet metal (for feet to rest on and other small pieces. Not much needed . 12x21 peice should work)

Engine and Drivetrain

  1. 212cc, 7hp gas engine [engine]
  2. Stage 2 carburetor kit + new exhaust [stage 2 carburetor kit with new exhaust ]
  3. Clutch (you may need a different sized spocket depending on your peferences) [12 tooth clutch]
  4. Rear sprocket (I replaced for correct chain size. I coundn't find many clutches with old chain size.) [sproket]
  5. Chain [chain]
  6. Rear axle + wheels + tires+ brakes (rear axle kit) Note: My original axle and wheels hubs broke after just a little use. The gear teeth stripped so I had to purchase a new axle and hubs. I might have just got a defective axel in the first kit but if you do not feel comfortable buying I recommend you try a different brand or style of axle. (I got a replacement and have had it for quiet some time and it is still fine.) Also two Amazon accounts I tried this link on worked but the third one didn't. If you can't open this link you will need to order a separate axel. Then some of the measurements may not match your set up. Always check before welding. [Origional kit, Replacment axel (only axel parts on replacement axel; no tires or front sprindles etc. (replacement sprocket still works on it)]
  7. Front spindles (came with rear axle kit)
  8. Front sprindle holders (I had mine custom made by a family friend)
  9. Front steering assembly [steering]
  10. Small pipe or tube to hold steering wheel and let it spin freely. I found one that fit at Home Depot
  11. Brake/gas pedals [pedals]
  12. Longer throttle cable (original wasn't long enough) [throttle cable]
  13. seat (I'm 5' 10", 150lbs and this seat fits me) [seat]
  14. Here is a link to spare tires that fit rear axle kit: spare tires
  15. fFag for visibility (so cars and other vehicles/people can see you)[flag]

Speedometer(Optional for speed and acceleration measurement)

Note: I got all my electronics from this starter kit. This kit comes with lots of extra components so if you are not looking for the extras I included links for each individual component(OLEDs will need to be purchased separately. They aren't in kit)

  1. Arduino Uno R3 (or similar) [Ellegoo_Arduino_Uno]
  2. Small breadboard (I used the one in my kit but any small breadboard will work. only used for extra 5vs and GND pins)
  3. 2× OLED displays [OLEDs]
  4. Joystick (for adjusting tire size on speedometer/resetting max speed etc.) [Joystick]
  5. 9V battery with snap connector for Arduino Uno [9v battery connecter]
  6. Linear hall sensor + magnet + mounting hardware (for speed detection) [Linear hall, any magnet found around your house (strength depends on how close you mount to the sensor. Test by putting magnet near sensor. If light turns on, magnet sensed.) ensure the magnet is strongly mounted]
  7. hot glue gun+hot glue

3D Printing / Accessories (optional but recommended for speedometer.)

  1. 3D printer [Ellegoo printer]
  2. Filament (PLA/ABS/etc.) [PLA+]
  3. 3D printed case for Arduino + electronics (Autodesk Tinkercad design included)

Tools

  1. Wrenches / socket set
  2. Screwdrivers
  3. Drill + bits
  4. Measuring tape / ruler
  5. Saw / grinder (for cutting tubing)
  6. Welding equipment or metal screws/bolts (for frame assembly)(I recommend renting if you're using a welder(I did))
  7. Duct tape to keep cables neat and to keep speedometer attached
  8. Safety gear: gloves, goggles, helmet

Building the Go Kart

IMG_0221.jpeg
IMG_0222.jpeg
IMG_0226.jpeg
IMG_0227.jpeg
IMG_0183.jpeg
IMG_0237.jpeg
IMG_0229.jpeg
IMG_0225.jpeg
IMG_0223.jpeg
IMG_0228.jpeg
IMG_0234.jpeg
IMG_0235.jpeg
IMG_0238.jpeg
IMG_0239.jpeg
IMG_0231.jpeg
IMG_0240.jpeg
IMG_0236.jpeg
IMG_0232.jpeg
IMG_0233.jpeg
IMG_0241.jpeg
IMG_0243.jpeg

Safety and supervision note

Do not attempt to build, cut, weld, or test the go kart vehicle unless you are supervised by an experienced adult (a parent, teacher, or experienced mechanic) and you have proper safety equipment and a safe test area. Also check cities laws before riding on public streets to unsure legality.

Note: If you are using different products then me you may need to change sizes or spacing. Check your components

Note 2: I am 5 ft 10 inches, 150 lbs and these sizes fit me.

Main Frame layout

The main base of the frame is built from two long 1.25-inch square tubing rails that run the length of the kart. Each of these rail is 5 feet 6 inches long. Those two long rails are held together by two connecter beams. One is made from the same 1.25-inch tubing and the back one is made of 1 inch tubing. The back one is 19 inches long and the front one is slightly longer to provide a bumper on the front(pictures 1 and 2) They are positioned near the front and back to keep the rails spaced and strong.

Smaller Support Beams and Bumper

I used 1-inch square tubing for smaller support pieces. These include seat and engine supports. Each of them are also 19 inches long. The two engine support beams are 6.5 inces apart(measured from closest side to closest side).( see picture 3)(the furthest back engine mount beam is the beam that we already welded to connect the two main beams) and the seat beams are 2.25 inches apart. The seat and engine beams are about 9 inches apart. (picture 4) These smaller beams help keep the frame light for max speed but still strong enough to hold together. After welding all the 1 inch beams with 1.25 inch square tubing we are going to make a bumper for safety. Weld a 27-30 inch long beam in the middle across the underside of the support beams and the rear 1.25 inch connecter beam. let it hang out the back side about 6 inches. Then horizontal to that beam weld another beam about 21 inches long so you have a rear bumper (shown in picture 5).

Rear axle

In front of the engine beams (between seat and engine) I have mounted the rear axle. The axle is under the frame to keep the weight of the go-kart on top of the axle instead of the weight being on the nuts and bolts that hold the axle on. I drilled four holes (two on each side) (measure to fit your axle mounts) straight into the main frame (the 2, 5 feet 6 inch long beams). Attach the clutch to the engine according to the clutches directions and assemble the axle according to the picture that came with it. make sure the rear axle sprocket and clutch sprocket line up then attach the chain. You may need to raise the engine with washers to keep chain tight(I did shown in picture 6). To attach brakes I welded a small piece of sheet metal next to the brake disc then attached the brake mechanism to the sheet metal (shown in pictures 7 and 8). Make sure your brakes are mounted strongly and are secure. Always do brake test before going fast to ensure capaibilty. Speaking of saftey now is a good time to mount the flag. Drill a hole in the bumper opposite side of the engine. Then put the flag into it and tighten the nut on the under side of the beam (shown in pictures 9 and 10). The flag lets other cars and people see you so you are more safe.

Front end & steering supports

The front end uses two beams (one is 1 inch tubing and one is 1.25 inch tubing. each 27 inches long). The 1.25 inch one is on top of the two main frame beams, running horizontal to them (shown in picture 11). Directly below that bar is the 1 inch sure tubing beam. connect the steering components together to measure. Hold up the steering wheel where you would want it. look at where the other components are. You should mount the beams slightly farther back from the spot. On the ends of the beams are the sprindle holders (picture 12). Make sure the sprindle holders are completely even in height. If one is lower than the other your drive train will sit sideways and one tire will wear down a lot quicker than the other. Once the spindle holders are mounted add another 1 inch tubing bar from main beam to main beam (19 inches long. weld it about 4.5 inches in front of sprindles bar.)(shown in picture 13). This will be where you mount the actual steering mechanism. Cut a small piece of sheet metal from where you cut the piece for the brake. You will need a 8x 21 square for later so be mindful while cutting. Your current piece should be about 2.5x6.5 inches. Drill holes to match the holes in the steering mechanism. Weld the piece in the center of the most recently welded beam(mine is bolted on because I didn't have access to a welder at the time.).( shown in pictures 14 and 15) Attach sprindles, then main steering mechanism to the previously drilled holes. Note: There are pieces you have to line up inside the mechanism in order to get to work. Do not over tighten, holes strip easily. After attaching that adjust tie rods so that both sprindles are perfectly straight. Attach tie rods. Hold up the steering column and steering wheel while sitting in seat. Position the steering wheel where you want it. Then directly under middle of steering wheel weld a 1.25inch beam (16 inches long) between the two main beams (it should be in between the two main beams instead of above them (shown in picture 16). On that beam weld two pieces of 1 inch tubing touching each other in the direct middle (shown in picture 16). Cut at desired steering wheel height. Cut to look like a triangle with the flat side on top and the point in the middle of the two beams. Then weld piece of pipe or tubing you are using to hold steering wheel on. Make sure everything fit before making the final weld (you can easily adjust the peace of tube before welding to the right length but not after). Make sure everything is sturdy and functional before riding. Attach wheel holders to sprindles and wheels to the wheel holders.(picture 17)

On the two upper beams on which the sprindles and the main steering mechaism are located weld another two beams (the front one is the same size as the one you are welding onto and the back on should be two smaller beams (6.5 inches long) to leave room for the steering) on top of the current one (shown in pictures 11, 18, and 19) Then weld a piece of sheet metal over that with a whole cut out for the steering column and for the place where the mechanism is mounted (shown in picture 17).

Attach pedals on this peice of sheet metal according to picture 20. Then hook the brake to one pedal (usually left pedal) as shown in the icture. After that attach throttle cable as shown in the pictures. Before starting ensure that both the brake and the gas work. Ensure that the gas returns to its starting position.

Design notes (why I picked these)

  1. I used larger 1.25-inch tubing for the main rails because it gives the frame stiffness where most of the loads are.
  2. The 1-inch tubing is lighter and works well for supports that don’t carry the full chassis load.
  3. The open middle reduces weight and makes it easier to get in and out while still keeping the frame sturdy

Performance Test (Stock Setup)

Before making upgrades, I wanted to see how the go kart performed in its stock setup. This is important because it gives a baseline so I can compare how much each modification actually improves speed and acceleration.

At this stage the kart had:

  1. Stock 212cc 7hp engine
  2. Stock carburetor and exhaust
  3. 10-tooth clutch
  4. Worn tires
  5. Slight brake rub (brake pads were slightly touching rotor)

Predicting Top Speed:

Before testing the go kart in real life, I calculated a top speed using the gear ratio and tire size. First I looked at the engine's specs on Amazon and found the engine could reach about 3600 RPM. Next I looked at the drivetrain parts:

  1. Clutch sprocket: 10 teeth
  2. Rear axle sprocket: 58 teeth
  3. Tire diameter: 11 inches

To calculate speed, we first find the gear ratio. Gear ratio formula: Driven sprocket ÷ driver sprocket

Mine:

58 ÷ 10 = 5.8 : 1 gear ratio

This means the axle spins once for every 5.8 engine rotations, which reduces speed but increases stength. Next we estimate how far the go kart travels for each time the wheel rotates. Tire circumference formula: Circumference = π × Tire Diameter

Mine:

3.14 × 11 inches = 34.54 inches per rotation

Then we convert axle RPM into speed. Estimated top speed formula:

Speed = (3600 × 34.54) ÷ (5.8 × 1056)

Using my specs, the top speed should be about 20 mph. This calculation is only an estimate because real factors like friction, wind resistance, and engine power limits affect the final speed. In real life most engines rarely reach their top RPM under load.

Real Life Test:

After calculating the predicted speed, I drove the kart and measured the real performance using my Arduino speedometer. I recorded:

  1. Top speed: 19 mph on flat ground. I went faster down hills.
  2. 0–18(couldn't do 0-20 MPH because it never reached that speed) mph acceleration time(average over 3 runs): about 4.9 seconds
  3. Hill climbing: I could maintain a speed of about 19 MPH on hills. This means I had plenty of power.

Increasing Top Speed by Changing the Clutch

IMG_0179.jpeg

After testing the kart with the original 10-tooth clutch, I still wasn't satisfied with the top speed so I tried to see if I could increase the top speed by decreasing the stregth. One of the easiest and quickest ways to change the speed of a go-kart is by changing the clutch sprocket size, because it directly affects the gear ratio between the engine and the rear axle. The original setup used:

  1. 10-tooth clutch
  2. 58-tooth rear sprocket

This produced a 5.8 : 1 gear ratio, which is good for acceleration and hill climbing but limits top speed. To increase speed, I replaced the clutch with a 12-tooth clutch.

Why This Makes the Go Kart Faster

A larger clutch sprocket means the chain moves farther with every engine rotation. This reduces the gear ratio which allows the rear axle to spin faster.

New gear ratio:

58 ÷ 12 = 4.83 : 1

Compared to the old 5.8 : 1 ratio, the axle now spins more times for each engine rotation, increasing the top speed.

Speed Increase

I calculated the new predicted top speed. The new top speed will be about 24 MPH.

This modification trades a small amount of power for a higher top speed.

Installing the New Clutch

  1. Remove the chain from the clutch sprocket.
  2. Loosen the clutch bolt on the engine shaft.
  3. take the old 10-tooth clutch off the engine shaft.
  4. Slide the new 12-tooth clutch onto the shaft
  5. Reinstall the clutch bolt and tighten securely.
  6. Reinstall the chain and check that the chain is aligned with the rear sprocket.
  7. You may need to change chain size to fit

What I Expected

Because the gear ratio is now lower, I expected:

  1. Higher top speed
  2. Slightly slower acceleration
  3. Slightly less hill climbing power

Real life tests:

  1. Top speed: 24 mph on flat ground.
  2. 0–20: about 5.8 seconds
  3. Hill climbing: I could get up to 20 MPH on hills. I noticed that this is higher than the 10t church. I think this is because the 10t clutch had so much extra power but because the engine limits at 3600 RPMs the power just had to keep the same speed.

New Tires for More Speed and Grip

IMG_0169.jpeg
IMG_0170.jpeg
IMG_0172.jpeg

Another change I made to improve the speed and handling of the go kart was replacing the old worn tires with new, larger tires (same tires but new ones). The old tires were 11 inches in diameter, but the new tires were 12 inches in diameter. At first the 1 inch might not seem like a big difference, but tire size actually has a noticeable effect on both speed and handling.

Why Larger Tires Can Increase Speed

Each time the axle rotates, the tire moves the go kart forward by the circumference of the tire. A larger tire has a larger circumference, which means the kart travels farther for every rotation compared to the old setup.

Old tires: 34.54 inches per rotation

New tires: 3.14 × 12 inches = 37.68 inches per rotation

That means every time the wheel spins, the go kart moves roughly 3 more inches forward compared to the old tires. Over many rotations this adds up and increases the top speed.

Improved Grip and Turning

The new tires also have much better tread than the old ones, which were very worn down. Because of this, the go kart has more grip to prevent sliding. With the old tires I would sometimes slide during turns, which meant I had to slow down a lot before turning.

Now with the new tires:

  1. The go kart grips the ground better
  2. It slides less in turns
  3. I can carry more speed through the corners
  4. The go kart has a higher top speed

Installing the New Tires

  1. Lift the rear of the kart so the wheels are off the ground. (do not let the go kart rest on the sproket and brake disc. This can damage them)
  2. Remove the old wheels from the axle.
  3. Deflate the old tire.
  4. Use a something to get leverage under the tire (I used flat head screw driver). Shove the screw driver between the rim (the metal parts) and the actual tire (rubber parts). Push down on screwdriver to push the tire over the top of the rim. Repeat until tire is completely off.
  5. Do the same process to put the new tires on. Put the air vaulve in the hole where the old air valve was.
  6. Repeat steps 3-5 for second wheel.
  7. Reattach wheels.

After installing the tires spin them by hand to make sure they rotate smoothly and do not rub against the frame.

Predicted speed increase:

Old speed: 24 MPH

New predicted speed: 26 MPH with better handling and more speed on turns.

Real life speeds and handling

My new top speed was 25 MPH but the turn improved from me going about 10 MPH before sliding to me going 15-20 MPH through turns without sliding. Now the 0-20 average is 5.3 seconds out of three tests.

Installing Stage 2 Caburater Kit

stage2kti.jpeg
Ari filters.jpeg
OHV.jpeg
spark plug.jpeg

Upgrading to a Stage 2 carburetor kit increases airflow into the engine, allowing it to produce more power and improve throttle response. Most Stage 2 kits include(mine does):

  1. New carburetor
  2. High-flow air filter (better than stock one)
  3. New exhaust+muffler
  4. Gaskets and mounting hardware
  5. New spark plug

Before starting, make sure the engine is cool and the fuel valve is turned off.

1. Remove the Stock Components

  1. Turn off the fuel valve.
  2. Remove the air filter cover and air box assembly.
  3. Disconnect the throttle linkage from the carburetor.
  4. Carefully remove the fuel line (have a rag ready in case any fuel drips out).
  5. Remove the bolts holding the stock carburetor to the engine.
  6. Remove the old carburetor and gasket.

At this point, you should see the intake port exposed on the engine.

2. Install the New Intake Adapter

  1. Place a new gasket onto the engine intake surface.
  2. Install the intake adapter using the provided bolts.
  3. Tighten evenly so the gasket seals properly.

Do not overtighten. You want a snug, even seal.

3. Install the Performance Carburetor

  1. Place the provided gasket between the intake adapter and carburetor.
  2. Slide the carburetor onto the mounting studs or bolts.
  3. Secure with nuts or bolts evenly.
  4. Reconnect the throttle linkage.
  5. Reattach the fuel line securely.

Make sure:

  1. The carb sits straight.
  2. The throttle moves freely.
  3. There 5 no fuel leaks.

4. Install the High-Flow Air Filter (Picture 2)

  1. Attach the air filter base plate to the carburetor.
  2. Install the filter element.
  3. Secure with screws or clamp provided.

This allows more air into the engine compared to the restrictive stock air box.

5.Install smaller air filter on OHV(over-head-valve) (picture 3)

  1. After removing stock components there is a hose coming out of a place labeled OHV. Connect the smaller air filter to this house.
  2. Mount the air filter to a secure location(mount it somewhere that won't get to hot and won't move) to prevent it from falling off.

6. Install the Performance Exhaust

  1. Remove the stock exhaust (2 bolts).
  2. Remove the old exhaust gasket.
  3. Install the new exhaust gasket.
  4. Mount the performance header pipe.
  5. Tighten evenly.

6. Install the new spark plug (picture 4)

  1. Usng a wrench take the old spark plug off.
  2. Attach the new one using a wrench in the same place.


7. Final Checks

Before starting the engine:

  1. Check all bolts are tight.
  2. Make sure throttle returns to original position when released.
  3. Ensure fuel line is secure.
  4. Turn fuel valve back on and check for leaks.

Start the engine and let it idle. Listen for:

  1. Smooth idle
  2. No air leaks
  3. No fuel leaks

Real life testing:

The new kit changed my top speed from 25 MPH to 27 MPH. The acceleration was about the same sitting at 0-20 in 5.4 seconds (still average of 3 runs).

Fixing the Brakes

IMG_0175.jpeg
IMG_0176.jpeg

After running the go kart for a while, I noticed the brake disc was rubbing against the pads all the time. This didn’t lock the brakes to prevent me from driving, but it caused a few problems:

  1. The kart slowed down too quickly when just rolling (without pressing the throttle)
  2. It was a little harder to quickly stop
  3. The brakes wear down faster

So I fixed it!!

What I Did

  1. Loosened the brake caliper so the disc had more clearance.
  2. moved the brake disc over so it didn't rub against the brake pads when not on the brake pedal.

I tested by rolling the kart without pressing the gas and now it rolls much further.

Why It Helps

Even though this didn’t make my go kart faster, it made it safer and reduced wear on the brakes. Also, smoother rolling lets you carry your momentum better, which is important when driving fast through turns.

Final Results

Screenshot 2026-03-10 11.07.35 PM.png

After testing each upgrade, to make it easier to see, I organized all the results into one table. All acceleration and speed tests were measured using my Arduino speedometer. Each acceleration time and top speed is the average of three runs.

Setup: Stock Go Kart (10T clutch, 11" tires)

Top Speed: 19 mph

Acceleration: 0–18 mph: 4.9 s

Hill speed: 19 mph

Extra Notes: During this the brake was rubbing slightly

Setup: 12 Tooth Clutch

Top Speed: 24 mph

Acceleration: 0–20 mph: 5.8 s

Hill speed: 20 mph

Extra Notes: Higher top speed but slightly slower acceleration

Setup: New 12" Tires

Top Speed: 25 mph

Acceleration: 0–20 mph: 5.3 s

Hill speed: about 20 mph

Extra Notes: Much better grip on turns

Setup: Stage 2 Carburetor Kit

Top Speed: 27 mph

Acceleration: 0–20 mph: 5.4 s

Hill speed: about 21 mph

Extra Notes: Stronger throttle response

Autodesk Fusion Design of Go Kart

image.png
image (1).png

I have a 3D design of the go kart in Autodesk Fusion 360. This helps me to visualize my go kart and understand how everything works. Also I think it will help other people trying to build a go kart. Therefore I included my design Here.

(Optional) Speedometer

IMG_0207.jpeg
IMG_0208.jpeg
IMG_0206.jpeg
IMG_0191.jpeg
IMG_0193.jpeg
IMG_0188.jpeg
IMG_0192.jpeg
IMG_0189.jpeg
IMG_0194.jpeg
IMG_0196.jpeg
IMG_0195.jpeg
IMG_0210.jpeg
IMG_0211.jpeg

This Arduino speedometer:

  1. Measures real-time speed using a hall effect sensor + magnet
  2. Displays large speed numbers on two different 128x64 OLEDs
  3. displays:
  4. Max speed
  5. Total distance
  6. Tire size (adjustable)
  7. MPH/KPH (able to change)
  8. Current speed
  9. Accerleration timer(0-20 MPH)

The speedometer Includes a built-in 0–20 MPH acceleration timer. You uses a joystick for full menu control and it saves settings in EEPROM(lets you store variables when Arduino is powered off) so they don’t reset when powered off.

Parts Required (links provided in supplies list)

  1. Arduino Uno
  2. 2x 128x64 SSD1306 OLED displays
  3. Linear Hall sensor
  4. Magnet
  5. Joystick (with button)
  6. Jumper wires
  7. Power source (9 volt battery + Clip for Uno)
  8. 3D printer + filament for enclosure (optional but recommended)

Wiring

Hall Effect Sensor

  1. VCC → 5V
  2. GND → GND
  3. Signal → Pin 2

Joystick

  1. VRx → A0
  2. VRy → A1
  3. SW → Pin 4
  4. VCC → 5V
  5. GND → GND

OLED #1 (Speed Screen)

  1. VCC → 5V
  2. GND → GND
  3. SDA → A4
  4. SCL → A5

OLED #2 (Stats and Menu Screen)

  1. VCC → 5V
  2. GND → GND
  3. SDA → Pin 9
  4. SCL → Pin 8

Upload Code:

Upload this code to your Arduino Uno.

#include <Arduino.h>
#include <U8g2lib.h>
#include <EEPROM.h>

const uint8_t HALL_PIN = 2;
const uint8_t JOY_X = A0;
const uint8_t JOY_Y = A1;
const uint8_t JOY_SW = 4;

U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled1(U8G2_R0, U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_1_SW_I2C oled2(U8G2_R0, 9, 8, U8X8_PIN_NONE);

const int EE_MAGIC_ADDR = 0;
const byte EE_MAGIC = 0xA5;
const int EE_DIAMETER_ADDR = 1;
const int EE_UNIT_ADDR = 5;

volatile unsigned long lastPulseMicros = 0;
volatile unsigned long pulseIntervalMicros = 0;
volatile bool havePulse = false;

float tireDiameter = 12.5f;
bool useMPH = true;

float filteredSpeed = 0.0f;
const float alpha = 0.35f;

float maxSpeed = 0.0f;
double distanceMiles = 0.0;
unsigned long revCount = 0;

const float MAX_REASONABLE_MPH = 60.0f;
const float MAX_SPEED_JUMP = 15.0f;

const unsigned long SPEED_TIMEOUT_US = 3000000UL;
const unsigned long DEBOUNCE_US = 8000UL;

bool showMenu = false;
int menuIndex = 0;
bool inEditDiameter = false;

bool zeroToTwentyMode = false;
bool testRunning = false;
unsigned long testStartMs = 0;
float testResultS = 0.0f;
unsigned long accelCooldownUntilMs = 0;

const int JOY_DEAD_LOW = 420;
const int JOY_DEAD_HIGH = 600;
unsigned long lastMoveMs = 0;
const unsigned long MOVE_THROTTLE_MS = 180;

void saveSettingsToEEPROM() {
EEPROM.update(EE_MAGIC_ADDR, EE_MAGIC);
EEPROM.put(EE_DIAMETER_ADDR, tireDiameter);
EEPROM.update(EE_UNIT_ADDR, useMPH ? 1 : 0);
}

void hallISR() {
unsigned long now = micros();
unsigned long interval = now - lastPulseMicros;
if (interval > DEBOUNCE_US) {
pulseIntervalMicros = interval;
lastPulseMicros = now;
havePulse = true;
}
}

int avgAnalog(uint8_t pin) {
int sum = 0;
for (int i = 0; i < 4; i++) {
sum += analogRead(pin);
delayMicroseconds(120);
}
return sum / 4;
}

void processPulseIfNeeded() {
if (!havePulse) return;

noInterrupts();
unsigned long interval = pulseIntervalMicros;
havePulse = false;
interrupts();

if (interval == 0) return;

float C = 3.14159265f * tireDiameter;
float ips = C / (interval / 1000000.0f);
float mph = ips * 0.0568181818f;

if (mph <= 0.05f || mph > MAX_REASONABLE_MPH) return;

if (filteredSpeed > 5.0f && abs(mph - filteredSpeed) > MAX_SPEED_JUMP) return;
if (filteredSpeed < 0.1f) filteredSpeed = mph;
else filteredSpeed = alpha * mph + (1.0f - alpha) * filteredSpeed;

if (filteredSpeed > maxSpeed) maxSpeed = filteredSpeed;

revCount++;
distanceMiles += (double)(C / 63360.0f);

if (zeroToTwentyMode) {
if (!testRunning) {
if (millis() >= accelCooldownUntilMs) {
testRunning = true;
testStartMs = millis();
testResultS = 0.0f;
}
} else {
float checkSpeed = useMPH ? filteredSpeed : filteredSpeed * 1.60934f;

if (checkSpeed >= 20.0f) {
testResultS = (millis() - testStartMs) / 1000.0f;

if (testResultS > 20.0f) {
testRunning = true;
testStartMs = millis();
testResultS = 0.0f;
} else {
testRunning = false;
accelCooldownUntilMs = millis() + 10000UL;
}
}
}
}
}

void handleButton() {
static bool lastState = HIGH;
bool current = digitalRead(JOY_SW);

if (lastState == HIGH && current == LOW) {

if (zeroToTwentyMode) {
zeroToTwentyMode = false;
testRunning = false;
return;
}

if (inEditDiameter) {
saveSettingsToEEPROM();
inEditDiameter = false;
showMenu = false;
return;
}

if (showMenu) {
if (menuIndex == 0) maxSpeed = 0;
else if (menuIndex == 1) {
distanceMiles = 0;
revCount = 0;
}
else if (menuIndex == 2) inEditDiameter = true;
else if (menuIndex == 3) {
useMPH = !useMPH;
EEPROM.update(EE_UNIT_ADDR, useMPH ? 1 : 0);
}
else if (menuIndex == 4) {
if (millis() >= accelCooldownUntilMs) {
zeroToTwentyMode = true;
testRunning = false;
testResultS = 0;
}
showMenu = false;
}

return;
}

showMenu = true;
}

lastState = current;
}

void handleMenuNavigation() {
if (!showMenu || inEditDiameter) return;

unsigned long now = millis();
if (now - lastMoveMs < MOVE_THROTTLE_MS) return;

int y = avgAnalog(JOY_Y);

if (y < JOY_DEAD_LOW) {
menuIndex++;
if (menuIndex > 4) menuIndex = 0;
lastMoveMs = now;
}
else if (y > JOY_DEAD_HIGH) {
if (menuIndex == 0) menuIndex = 4;
else menuIndex--;
lastMoveMs = now;
}
}

void handleTireEdit() {
if (!inEditDiameter) return;

unsigned long now = millis();
if (now - lastMoveMs < MOVE_THROTTLE_MS) return;

int x = avgAnalog(JOY_X);

if (x < JOY_DEAD_LOW) {
tireDiameter -= 0.1;
if (tireDiameter < 6) tireDiameter = 40;
lastMoveMs = now;
}
else if (x > JOY_DEAD_HIGH) {
tireDiameter += 0.1;
if (tireDiameter > 40) tireDiameter = 6;
lastMoveMs = now;
}
}

void handleSpeedTimeout() {
if ((micros() - lastPulseMicros) > SPEED_TIMEOUT_US) {
filteredSpeed = 0;
}
}

void drawDisplays() {

oled1.firstPage();
do {

oled1.setFont(u8g2_font_logisoso38_tr);

float dsp = useMPH ? filteredSpeed : filteredSpeed * 1.60934;

char spbuf[12];
dtostrf(dsp, 3, 0, spbuf);

int x = (128 - oled1.getStrWidth(spbuf)) / 2;
if (x < 0) x = 0;

oled1.setCursor(x, 48);
oled1.print(spbuf);

oled1.setFont(u8g2_font_6x10_tr);
oled1.setCursor(96, 12);
oled1.print(useMPH ? "MPH" : "KPH");

} while (oled1.nextPage());


oled2.firstPage();
do {

if (zeroToTwentyMode) {

oled2.setFont(u8g2_font_logisoso20_tr);

if (testRunning) {
oled2.setCursor(0, 30);
oled2.print("Run...");
} else {
char tb[12];
dtostrf(testResultS, 3, 2, tb);
oled2.setCursor(0, 30);
oled2.print(tb);
oled2.print(" s");
}

oled2.setFont(u8g2_font_6x10_tr);
oled2.setCursor(0, 60);
oled2.print("Press to exit");

}

else if (inEditDiameter) {

oled2.setFont(u8g2_font_6x10_tr);

oled2.setCursor(0, 12);
oled2.print("Tire:");

char tb[12];
dtostrf(tireDiameter, 4, 1, tb);

oled2.setCursor(0, 36);
oled2.print(tb);
oled2.print(" in");

oled2.setCursor(0, 60);
oled2.print("Press to save");

}

else if (showMenu) {

oled2.setFont(u8g2_font_6x10_tr);

oled2.setCursor(0, 10);
oled2.print(menuIndex == 0 ? "> Reset Max" : " Reset Max");

oled2.setCursor(0, 22);
oled2.print(menuIndex == 1 ? "> Reset Dist" : " Reset Dist");

oled2.setCursor(0, 34);
oled2.print(menuIndex == 2 ? "> Tire Size" : " Tire Size");

oled2.setCursor(0, 46);
oled2.print(menuIndex == 3 ? "> Units" : " Units");

oled2.setCursor(0, 58);
oled2.print(menuIndex == 4 ? "> Accel Test" : " Accel Test");

}

else {

oled2.setFont(u8g2_font_7x14_tr);

char tb[16];

dtostrf(maxSpeed, 4, 1, tb);
oled2.setCursor(0, 16);
oled2.print("Max:");
oled2.setCursor(48, 16);
oled2.print(tb);

dtostrf(distanceMiles, 6, 2, tb);
oled2.setCursor(0, 36);
oled2.print("Dist:");
oled2.setCursor(52, 36);
oled2.print(tb);
oled2.print(" mi");

dtostrf(tireDiameter, 4, 1, tb);
oled2.setCursor(0, 56);
oled2.print("Tire:");
oled2.setCursor(52, 56);
oled2.print(tb);
oled2.print(" in");

}

} while (oled2.nextPage());
}

void setup() {

pinMode(HALL_PIN, INPUT_PULLUP);
pinMode(JOY_SW, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(HALL_PIN), hallISR, FALLING);

oled1.begin();
oled2.begin();

if (EEPROM.read(EE_MAGIC_ADDR) == EE_MAGIC) {
EEPROM.get(EE_DIAMETER_ADDR, tireDiameter);
byte ub = EEPROM.read(EE_UNIT_ADDR);
useMPH = (ub != 0);
if (tireDiameter < 6 || tireDiameter > 40) tireDiameter = 18;
} else {
saveSettingsToEEPROM();
}

lastPulseMicros = micros();
}

void loop() {

processPulseIfNeeded();

handleButton();
handleMenuNavigation();
handleTireEdit();
handleSpeedTimeout();

static unsigned long lastDraw = 0;

if (millis() - lastDraw > 120) {
lastDraw = millis();
drawDisplays();
}
}

Installation

1. Print enclosure

Print this Autodesk Tinkercad design made by me.

  1. print shapes seperatly on "engineering" mode (Cura slicing software)

2. Mount the Magnet (While Enclosure is Printing)

  1. Attach the magnet securely to the wheel hub or sprocket.
  2. Make sure it rotates cleanly without hitting anything.
  3. Use strong glue or get a magnet with adhesive already on it. (picture 1)
  4. I put a couple pieces of velcro above it to take most of the force of the glue. I wrapped the velcro around the sprocket to hold it in place but made sure it did not hit anything including the Linear Hall sensor. (pictures 2 and 3)

2. Mount the Linear Hall Sensor

  1. Position the sensor close to the magnet path.
  2. Leave about 3–8mm gap.
  3. Make sure the sensor LED blinks each time the magnet passes.
  4. put something that is not conductive between the metal frame and the sensor. (I used a piece of foam)

3. Mount Joystick (When Print is Done)(pictures 2 and 3)

  1. Using bottom supports made for the joystick (my top ones broke off) place hot glue down. Slide joystick into place on the 3d print.
  2. Glue 50mm bar from the top of the joystick to the bottom of the print to strengthen the joystick when pressing it down.
  3. Try pressing on joystick once hot glue cools. Make sure it is sturdy.

4. Mount the Displays (picture 6,7, and 8)

  1. place both OLED screens in the given spaces (make sure they face the right way)
  2. use hot glue or tape to hold in place

5. Mount the Arduino (pictures 9 and 10)

  1. use nuts and bolts to mount
  2. put a spacer in between the Uno and the print.

6. Glue the top on (pictures 10 and 11)

  1. place the top into place.
  2. use hot glue or other glue to hold it on.
  3. slide the battery into the given space (I forgot to set the correct sizes for the battery so mine doesn't fit. I adjusted it so the current design fits a standard 9 volt battery)
  4. put a little glue to prevent the battery from falling out)

7. Attach the speedometer to the go kart(pictures 12 and 13)

  1. I put a platform to raise the speedometer because before I wasn't able to see the screens.
  2. Then I attached the 3d print to the platform.
  3. I used 3d pen and hot glue to attach components at first, but they didn't stick to the metal so I used a lot of duck tape to hold it.

How It Works

Every time the magnet passes the hall sensor:

  1. Arduino records the time between pulses.
  2. It calculates wheel speed using tire circumference.
  3. Distance is esimated base on the time and speeds.
  4. Max speed is displayed automatically.

Open Menu

Press joystick button once (In order for any clicks to register hold down button until screen changes. There is a slight delay.)

Navigate Menu

Move joystick up/down.

Select

Press once.

Menu Options

  1. Reset Max Speed
  2. Reset Distance
  3. Edit Tire Size
  4. Change Units (MPH/KPH)
  5. Acceleration Test

Tire Size Adjustment

  1. Select “Tire Size” form menu
  2. Move joystick left/right to adjust diameter in inches
  3. Press once to save and exit

The value saves permanently in EEPROM.

0–20 MPH Acceleration Test

Select “Accel” from the menu.

How it works:

  1. Test starts automatically when the kart begins moving.
  2. Timer stops when 20 MPH is reached.
  3. Result is displayed in seconds.
  4. It waits 10 seconds before starting another run so it doesn't immediately start while you are still moving.
  5. If time exceeds 20 seconds to get to 20 MPH, it automatically resets.

Press once to exit test mode.

Start Up

Measure your actual tire diameter:

  1. Measure from ground to top of tire.
  2. Change the tire size to that number (in inches) in the tire size menu.

Accurate tire size = accurate speed.

Performance Notes

  1. Works accurately up to 120 MPH.
  2. Automatically zeros speed after 3 seconds without wheel movement.
  3. filtering prevents speed jumping from false readings

Distance tracks in miles.

Have Fun

IMG_0245.jpeg
IMG_0246.jpeg
DIY 212cc go kart

Enjoy your go kart, and be safe. My video was to large to upload to instuctables so here is the link to my video.


What I Learned and Future Improvments

This project taught me that making things faster is not just about adding engine power. Changing gear ratios, reducing friction, and improving grip all affect performance. The clutch change gave the biggest speed increase, but the tire change improved turning the most. Testing each modification helped me understand how mechanical systems work together, and building the go kart taught me more about welding, and metal working.


In the future, I want to see how much faster the go kart could go using a torque converter. A torque converter is almost like an automatic transmission. It automatically changes the gear ratio based on engine speed. This lets the engine stay near its normal RPM for both the acceleration and when reaching higher top speeds. I will use a 14 tooth driver sproket becuase its predicted perfomance is a good balance between top speed and torque. The predicted top speed would be about 36 MPH, while still having a better launch then the 12t clutch.