Спидометр для велосипеда на Arduino
Хотите отследить скорость на велосипедной прогулке? Тогда эта инструкция для вас!
В проекте используется магнитный выключатель (геркон) для измерения скорости вращения колеса велосипеда. Arduino, в свою очередь, рассчитывает скорость перемещения в милях/час и передает эту информацию на LCD дисплей. Установить данную систему вы можете на любой велосипед/колесо. Для этого достаточно указать радиус колеса для правильного расчета.
Необходимые элементы
- 1 плата Arduino
- 1 геркон
- 1 резистор на 10 кОм, 1/4 ватта
- 1 Батарея на 9 вольт
- 1 Провод
- 1 Макетная плата для распайки
- 1 LCD дисплей
- 2 Переключателя
- Дополнительные материалы:
- Фанера, винты и т.п.
- Программа для Arduino Arduino IDE

Электросхема
Электросхема проекта приведена ниже.
Она состоит из трех переключателей:
1. Один подключен к питанию 9 вольт
2. Второй переключатель - к LCD экрану для его включения/выключения
3. Магнитный выключателя (геркон), который замыкает цепь каждый раз, когда колесо совершает полный оборот.
LCD монитор Parallax, который используется в проекте, подключается к Arduino по трем пинам. Один идет к 5 В, один к земле, третий - к серийному выходу (TX) на плате Arduino на цифровом пине 1.
Резисторы на 10 кОм подключены к переключателям и подсветке монитора, чтобы избежать превышения допустимой силы тока между 5 В и землей (ни в коем случае не подключайте 5 В и землю напрямую к Arduino).

Распайка шилда спидометра
Установите три ряда коннекторов на макетной плате таким образом, чтобы они сели на плату, как это показано ниже.
![]() |
![]() |
---|
Геркон
Геркон состоит из двух частей, выключателя и магнита. С самого выключателя (собственно, там и расположен геркон), выходит два провода. В момент, когда магнит располагается неподалеку, небольшой механический элемента внутри геркона перемещается и замыкает цепь.
Установите токоограничивающий резистор на 10 кОм между пином A0 и землей на вашей макетной плате. Концы провода подключите к пину A0 и 5V. Этот провод вы протянете в дальнейшем вдоль всего велосипеда к переключателям.
![]() |
![]() |
---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Установка геркона на велосипед
Для установки геркона и магнита на колесо велосипеда, используйте изоленту. На рисунке сверху показано, что магнит устанавливается на одну их спиц, а геркон - на раму велосипеда. Таким образом, магнит проходит мимо геркона после каждого полного оборота колеса. Подключите провода от геркона к кабелям с распаянной вами платы (как именно подключать - неважно, так как это просто переключатель).
Для проверки работоспособности вашего переключателя, используйте код, приведенный ниже. В момент, когда магнит проходит мимо геркона, Arduino должна выдать ~ 1023, в ином случае будет отображаться 0. Откройте серийный монитор (Tools - Serial Monitor) в оболочке Arduino IDE и запустите проверку. Если магнит не генерирует сигнал на герконе, измените его положение или используете более сильный магнит.
//arduino спидометр для велосипеда
#define reed A0//пин, который подключен к геркону
//переменная для хранения данных
int reedVal;
void setup(){
Serial.begin(9600);
}
void loop(){
reedVal = analogRead(reed);//получаем значение с A0
Serial.println(reedVal);
delay(10);
}
![]() |
![]() |
---|---|
![]() |
![]() |
Проверка работоспособности
Загрузите код, приведенный ниже на плату Arduino. Активируйте серийный монитор. У вас должно отбражаться число 0.00. Начните крутить колесо велосипеда. Каждую секунду долгы отображаться данные текущей скорости в милях/час.
// расчеты
// радиус колеса ~ 13.5 дюймов
// расстояние = pi*2*r =~85 дюймов
// максимальная скорость 35 миль/час =~ 616 дюймов/сек
// максимальная угловая скорость =~7.25
#define reed A0// пин, который подключен к геркону
//переменные
int reedVal;
long timer;// время между одним полным оборотом (в мс)
float mph;
float radius = 13.5;// радиус колеса (в дюймах)
float circumference;
int maxReedCounter = 100;// минимальное время (в мс) одного оборота
int reedCounter;
void setup(){
reedCounter = maxReedCounter;
circumference = 2*3.14*radius;
pinMode(reed, INPUT);
// НАСТРОЙКА ТАЙМЕРА - таймер позволяет точно отслеживать время между сигналами геркона
cli();// остановка прерываний
// устанавливаем прерывания timer1 с частотой 1кГц
TCCR1A = 0;// устанавливаем внутренний TCCR1A регистр на 0
TCCR1B = 0;// то же самое для TCCR1B
TCNT1 = 0;
// устанавливаем инкремент счетчика времени на 1 кГц
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
// активируем режим CTC
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11);
// сравниваем прервания таймера
TIMSK1 |= (1 << OCIE1A);
sei();// разрешаем прерывания
// ЗАВЕРШАЕМ НАСТРОЙКУ ТАЙМЕРА
Serial.begin(9600);
}
ISR(TIMER1_COMPA_vect) {// Прерывания с частотой 1 кГц для измерений герконом
reedVal = digitalRead(reed);// получаем значения A0
if (reedVal){// если геркон замкнут
if (reedCounter == 0){// минимальное время между импульсами прошло
mph = (56.8*float(circumference))/float(timer);// рассчитываем мили в час
timer = 0;// перезапуск таймера
reedCounter = maxReedCounter;// перезапуск reedCounter
}
else{
if (reedCounter > 0){// не даем reedCounter принять отрицательные значения
reedCounter -= 1;// декремент reedCounter
}
}
}
else{//if reed switch is open
if (reedCounter > 0){// не даем reedCounter принять негативные значения
reedCounter -= 1;// декремент reedCounter
}
}
if (timer > 2000){
mph = 0;// если новые с геркона не поступают новые импульсы, значит колесо не вращется, значит скорость равна 0 м/час
}
else{
timer += 1;// инкремент таймера
}
}
void displayMPH(){
Serial.println(mph);
}
void loop(){
// отображаем мили в час раз в секунду
displayMPH();
delay(1000);
}

LCD дисплей
Для установки дисплея вам понадобится дополнительный шилд. Припаяйте рельсу с контактами мама на выходе на protoshield. Три контакта будут использлваться для для подключения жидкокристаллического дисплея. LCD экран должен плотно установиться на рельсах.
![]() |
![]() |
---|---|
![]() |
![]() |
![]() |
Установка LCD
Подключите Arduino 5V, Ground, и TX (Arduino цифровой пин 1) к LCD сокету. Не забудьте проверить правильность установки экрана на основании меток на плате дисплея.
На задней части экрана Parallax LCD есть два переключателя и потенциометр. Потенциометр используется для ручной регулировки контраста дисплея. Переключатели надо установить в положения, которые приведены на фото ниже.
![]() |
![]() |
---|---|
![]() |
Проверка LCD для спидометра
Проверьте код, который приведен ниже. Лично у меня при первом запуске на экране появились совершенно невразумительные, хаотичные символы. Пришлось снять монитор, перезалить скетч и установить экран заново. Со второго раза все заработало. Возможно, проблема была в некорректной прошивке Arduino.
На LCD экране должна отобразиться надпись "Hello World".
//Проверка Parallax 2x16 lcd
//Результат выполнения данного скетча - надпись "Hello World" на вашем LCD экране. Свитч подсветки должен быть подключен к цифровому пину 2
//Serial.write(13);// новая строка
void setup() {
Serial.begin(9600);
pinMode(1,OUTPUT);// tx
Serial.write(12);// очищаем
Serial.write("Hello World");
}
void loop() {
}

Тумблер подсветки спидометра
Тумблер подсветки
Подключите тумблер как это показано на рисунке ниже. Не забудьте соединить резистор на 10 кОм с черным и зеленым проводами. Потом эти провода подключаются к одному из контактов переключателя. Ко второму контакту подключаем красный провод.
Красный провод подключаем к Arduino 5V, вторую сторону резистора к земле, зеленый провод - к D2.
![]() |
![]() |
---|---|
![]() |
Окончательная программа для спидометра
Загрузите приведенный код на Arduino. Проверьте работу переключателя подсветки и насколько корректно отображается скорость.
Уточните радиус вашего коле в дюймах и вставьте это значение в строку: float radius = ''''';
В этой части кода я использовал прерывания, чтобы переменная "timer" увеличивала свое значение с частотой 1 кГц.
//Спидометр для велосипеда с использованием геркона
//скорость велосипеда отображается на LCD экране
//расчеты
//радиус колеса ~ 13.5 дюймов
//расстояние = pi*2*r =~85 дюймов
//максимальная скорость 35 миль/час =~ 616 дюймов/секунду
//максимальная угловая скорость =~7.25
#define reed A0// пин, к которому подключен геркон
// переменные
float radius = 13.5;// радиус колеса (в дюймах)- измените это для своем велосипеде
int reedVal;
long timer = 0;// время одного полного оборота (в милисекундах)
float mph = 0.00;
float circumference;
boolean backlight;
int maxReedCounter = 100;// минимальное время (в милисекундах) одного оборота
int reedCounter;
void setup(){
reedCounter = maxReedCounter;
circumference = 2*3.14*radius;
pinMode(1,OUTPUT);// tx
pinMode(2,OUTPUT);// свич подсветки
pinMode(reed, INPUT);
checkBacklight();
Serial.write(12);// очищение
cli();// остановка прерываний
// устанавливаем прерывание timer1 на частоте 1 кГц
TCCR1A = 0;// устанавливаем внутренний регистр TCCR1A в 0
TCCR1B = 0;// то же самое для TCCR1B
TCNT1 = 0;
// устанавливаем инкремент для счетчика 1 кГц
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
// активируем режим CTC
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11);
// таймер сравнивает прерывание
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
// Конец настройки таймера
Serial.begin(9600);
}
void checkBacklight(){
backlight = digitalRead(2);
if (backlight){
Serial.write(17);// включаем подсветку
}
else{
Serial.write(18);// выключаем подсветку
}
}
ISR(TIMER1_COMPA_vect) {// Прерывание с частотой 1 кГц для измерений герконом
reedVal = digitalRead(reed);// получаем значение A0
if (reedVal){// если геркон замкнул контакт
if (reedCounter == 0){// минимальное время между импульсяами прошло
mph = (56.8*float(circumference))/float(timer);// расчет миль в час
timer = 0;// перезагрузка таймера
reedCounter = maxReedCounter;// перезагрузка reedCounter
}
else{
if (reedCounter > 0){// не позволяем reedCounter принять негативное значение
reedCounter -= 1;// декремент reedCounter
}
}
}
else{// если геркон не замкнут
if (reedCounter > 0){// не позволяем reedCounter принять негативное значение
reedCounter -= 1;// декремент reedCounter
}
}
if (timer > 2000){
mph = 0;// если не поступают импульсы от геркона, значит скорость равна 0
}
else{
timer += 1;// инкремент таймера
}
}
void displayMPH(){
Serial.write(12);// очищаем
Serial.write("Speed =");
Serial.write(13);// начинаем новую строку
Serial.print(mph);
Serial.write(" MPH ");
//Serial.write("0.00 MPH ");
}
void loop(){
// отображаем mph раз в секунду
displayMPH();
delay(1000);
checkBacklight();
}
Питание
Подключите последовательно коннектор для батареи и переключать как это показано на первом рисунке ниже. Красный провод от переключателя подключите к контакту Vin на Arduino, а черный контакт от коннектора для батареи - к земле на Arduino.
![]() |
![]() |
---|
Корпус для спидометра на Arduino
Бокс для спидометра был вырезан из фанеры толщиной 1/4". Использовалась лазерная резка мощностью 120 Ватт. Размеры бокса - 3.5"x4"x2". Бокс был спроектирован в AutoCAD. Для генерации файлов для лазерной резки использовался софт Autodesk 123D Make. Потом были добавлены два отверстия для переключателей и прямоугольное отверстие для LCD экрана. Кроме того, были добавлены отверстия на нижней части бокса, чтобы проще осуществить крепеж к велосипеду.
Стенки бокса крепятся между собой на клей. Углы надо зачистить наждачкой. Можно использовать какое-то покрытие для фанеры, чтобы придать боксу надлежащий вид и защитить от влаги.
Скачать необходимые детали для бокса можно по ссылкам ниже:
![]() |
![]() |
---|---|
![]() |
![]() |
Установка Arduino и обвязки в бокс
Переключатели фиксируются в корпусе с помощью гаек. LCD экран садится на клей или с фиксируется с помощью винтов на передней панели бокса. Arduino и Protoboard устанавливаются рядом с бетарейкой. Опять-таки, можно использовать клей для фиксации или предусмотреть крепеж на винтах.
![]() |
![]() |
---|---|
![]() |
Устанавливаем спидометр на велосипед
Бокс со спидометром на Arduino устанавливаем на руль велосипеда. Можно использовать пластиковые стяжки и sugru для фиксации. Провода, которые идут от платы к геркону надо пустить таким образом, чтобы они не мешали вам при поездке и при этом была возможность поворачивать руль.
![]() |
![]() |
---|---|
![]() |
![]() |
Велосипед со спидометром на дороге!
Не забывайте про правила поведения велосипедистов на дороге! Несмотря на ваш прекрасный Arduino спидометр, следите за транспортом и людьми!

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!