# How to Make a Small Measuring Wheel

7,370

27

8

## Introduction: How to Make a Small Measuring Wheel

Open Google map, input starting point and destination then the distance will display in your screen. Compared to traditional maps, the current electronic maps are of vast information and better distance calculation. However, how could it counts the distance? Is it uses satellite, tape or other tools? Satellite can explore topography and land resource but lack of precision; tape is inflexible and distance limited. Except these tools, is there anything else? Couple of days before, I was suddenly to find a man who holds a wheel rolling along the road. I was incontinent of curiosity, I came to talk with the man and knew he is a map worker and used the wheel to measure distance then draw routes. The distance measure wheel is convenient to take, flexible and precise. How could I resist its temptation to make a measuring wheel?

### Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

## Step 1: Hardware

In this project, I would love to choose DFRduino UNO R3 that fully compatible with Arduino UNO R3 as a main board. It adopts ENIG (emersion gold) technique, cost effective and more delicate. Moreover, we need another powerful component which is an encoder to count distance.

Incremental Photoelectric Rotary Encoder - 400P/R

Gravity: I2C 16x2 Arduino LCD with RGB Backlight Display

Cable Adapter Module 4

Gravity: IO Expansion Shield for Arduino V7.1

Digital Push Button (.NET Gadgeteer Compatible)

7.4V Lipo 2500mAh Battery (Arduino Power Jack)

D80mm Silicone Wheel For TT Motor

## Step 3: Rendering

Reset: you could clear up data and make a restart measurement more convenient in this mode.

Detection: You can measure distance freely, up to down, right to left in this mode. Slipping to left, the value is positive; slipping to right, the result is negative (when the value is a positive one, rolling right and the result is decreasing).

## Step 4: Lock

when the measurement finished, you need to keep data. In this mode, all data is locked and would not change that helps you record results. It works with simply three presses.

## Step 5: Print the Crust

I have print a crust by 3D printer to make it convenient to take and more beautiful. Is it looks a little unnatural? The crust is too square. I am sorry but I have tried my best. I believe your ideas must better than mine. The 3D printing file is in the end page.*Caution: I have make a 80mm hub with 3D printer to suit the wheel.Tires of quality enviromentally friendly D80mm Silicone Wheel For TT Motor is still in use.

## Step 6: Code

```#include #include "DFRobot_RGBLCD.h"DFRobot_RGBLCD lcd(0x7c >> 1, 0xc0 >> 1, 16, 2);//rgb_lcd lcd;#define A 3
#define B 4
#define Key  12//key#define D 79 //Diameter 79mmfloat C = 0; //perimeter
unsigned int Distance;
int VA = 0;
int VB = 0;
unsigned long Count = 0;//count
unsigned int Count_1 = 0; //Negative count
unsigned char flag = 1, Mark = 0;
unsigned long lasttime = 0, Modetime = 0;//Length measurement range is ± 6 M
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.setRGB(255, 255,0);
lcd.setCursor(2, 0 );
lcd.print("M:");
lcd.setCursor(2, 1 );
lcd.print("D:");
lcd.setCursor(12, 1 );
lcd.print("cm");
pinMode(A, INPUT_PULLUP); //Pull-up input
pinMode(B, INPUT_PULLUP);
pinMode(Key, INPUT);
attachInterrupt(1, interrupt, RISING);
C = D * PI;
}void loop()
{
if (millis() - 150 > lasttime)//Detect keys once every 150ms
{
if (digitalRead(Key) == HIGH)
if (digitalRead(Key) == HIGH)
Mark += 1;
if (Mark > 2)
Mark = 0;    while (digitalRead(Key) == HIGH);
lasttime = millis();
}  if (millis() - 100 > Modetime)//Refresh the data every 100ms
{
if (Mark == 0) //Cleared
{
lcd.setCursor(6, 0 );
lcd.print("Reset    ");
Distance = C * Count / 40;
flag = 3;
lcd.setCursor(11, 0 );
lcd.print("     ");
}    if (Mark == 1) //Calculate the measured value
{
lcd.setCursor(6, 0 );
lcd.print("Detection");//
lcd.setCursor(4, 1 );
if (Count > 0 && Count < 0xffff)//Determine whether the length is positive
{
lcd.print('-');//The length is negative
Distance = C * Count / 40;
}      else if (Count == 0 && Count_1 == 0 )//Determine whether the length is zero
{
lcd.setCursor(4, 1 );
lcd.print(' ');
Distance = C * Count / 40;
}      else//Length is positive
{
lcd.print('+');
Distance = Count_1 * C  / 40;
}
}    else if (Mark == 2) //lock
{
lcd.setCursor(6, 0 );
lcd.print("Lock     ");
Count = 0;
Count_1 = 0;
}    Modetime = millis();
}  lcd.setCursor(5, 1 );//Displays the value of Distance
lcd.print(Distance / 10000);
lcd.print((Distance / 1000) % 10);
lcd.print((Distance / 100) % 10);
lcd.print('.');
lcd.print((Distance / 10) % 10);
lcd.print(Distance % 10);
}void interrupt()//Interrupt handler
{
if (Mark == 1)//Detects whether the current mode is a measurement
{
if (VB == 1)//To determine whether the positive measurement
{
flag = 1;

if (Count > 0xffff)
{
Count_1 -= 1;
}      Count += 1;
}

else//Reverse measurement
{
flag = 0;
Count -= 1;

if (Count > 0xFFFF)
{
Count_1 += 1;
}
}

//Count is cleared over the range
if (Count < 0xFFFF && Count > 0x294A)
Count = 0;    else if (Count < 0xFFFFD6B5 && Count > 0xFFFF)
Count = 0;
}
}```

43 4.0K
28 3.2K
164 9.9K

## 8 Discussions

Hi, pi means π

Why there is a 6m length limitation?

change distance in long

I'm a beginner in programming.
I've done this project:and it's good. I want to get the result in the seirial port

How much diameter size from your wheel ?

it is written in the code: 79mm

Why this line?
Distance = C * Count / 40;

Is the encoder making 40 ticks per turn? From the datasheet I am reading 400 pulses/round