Спидометр для велосипеда на Arduino

Хотите отследить скорость на велосипедной прогулке? Тогда эта инструкция для вас!

В проекте используется магнитный выключатель (геркон) для измерения скорости вращения колеса велосипеда. Arduino, в свою очередь, рассчитывает скорость перемещения в милях/час и передает эту информацию на LCD дисплей. Установить данную систему вы можете на любой велосипед/колесо. Для этого достаточно указать радиус колеса для правильного расчета.

Необходимые элементы

  • 1 плата Arduino
  • 1 геркон
  • 1 резистор на 10 кОм, 1/4 ватта
  • 1 Батарея на 9 вольт
  • 1 Провод
  • 1 Макетная плата для распайки
  • 1 LCD дисплей
  • 2 Переключателя
  • Дополнительные материалы:
  • Фанера, винты и т.п.
  • Программа для Arduino Arduino IDE
Спидометр на Arduino

Электросхема

Электросхема проекта приведена ниже.

Она состоит из трех переключателей:

1. Один подключен к питанию 9 вольт

2. Второй переключатель - к LCD экрану для его включения/выключения

3. Магнитный выключателя (геркон), который замыкает цепь каждый раз, когда колесо совершает полный оборот.

LCD монитор Parallax, который используется в проекте, подключается к Arduino по трем пинам. Один идет к 5 В, один к земле, третий - к серийному выходу (TX) на плате Arduino на цифровом пине 1.

Резисторы на 10 кОм подключены к переключателям и подсветке монитора, чтобы избежать превышения допустимой силы тока между 5 В и землей (ни в коем случае не подключайте 5 В и землю напрямую к Arduino).

Распайка шилда спидометра

Распайка шилда спидометра

Установите три ряда коннекторов на макетной плате таким образом, чтобы они сели на плату, как это показано ниже.

Электроника 1 Электроника 2

Геркон

Геркон состоит из двух частей, выключателя и магнита. С самого выключателя (собственно, там и расположен геркон), выходит два провода. В момент, когда магнит располагается неподалеку, небольшой механический элемента внутри геркона перемещается и замыкает цепь.

Установите токоограничивающий резистор на 10 кОм между пином A0 и землей на вашей макетной плате. Концы провода подключите к пину A0 и 5V. Этот провод вы протянете в дальнейшем вдоль всего велосипеда к переключателям.

Геркон 1 Геркон 2
Геркон 3 Геркон 4
Геркон 5 Геркон 6
Геркон 7 Геркон 8

Установка геркона на велосипед

Для установки геркона и магнита на колесо велосипеда, используйте изоленту. На рисунке сверху показано, что магнит устанавливается на одну их спиц, а геркон - на раму велосипеда. Таким образом, магнит проходит мимо геркона после каждого полного оборота колеса. Подключите провода от геркона к кабелям с распаянной вами платы (как именно подключать - неважно, так как это просто переключатель).

Для проверки работоспособности вашего переключателя, используйте код, приведенный ниже. В момент, когда магнит проходит мимо геркона, 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);

}

Установка геркона на велосипед 1 Установка геркона на велосипед 2
Установка геркона на велосипед 3 Установка геркона на велосипед 4

Проверка работоспособности

Загрузите код, приведенный ниже на плату 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 дисплей 1 LCD дисплей 2
LCD дисплей 3 LCD дисплей 4
LCD дисплей 5

Установка LCD

Подключите Arduino 5V, Ground, и TX (Arduino цифровой пин 1) к LCD сокету. Не забудьте проверить правильность установки экрана на основании меток на плате дисплея.

На задней части экрана Parallax LCD есть два переключателя и потенциометр. Потенциометр используется для ручной регулировки контраста дисплея. Переключатели надо установить в положения, которые приведены на фото ниже.

Установка LCD 1 Установка LCD 2
LCD дисплей 3

Проверка 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() {

}

Проверка LCD для спидометра

Тумблер подсветки спидометра

Тумблер подсветки

Подключите тумблер как это показано на рисунке ниже. Не забудьте соединить резистор на 10 кОм с черным и зеленым проводами. Потом эти провода подключаются к одному из контактов переключателя. Ко второму контакту подключаем красный провод.

Красный провод подключаем к Arduino 5V, вторую сторону резистора к земле, зеленый провод - к D2.

Тумблер подсветки спидометра 1 Тумблер подсветки спидометра 2
Тумблер подсветки спидометра 3

Окончательная программа для спидометра

Загрузите приведенный код на 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.

Питание спидометра 1 Питание спидометра 2

Корпус для спидометра на Arduino

Бокс для спидометра был вырезан из фанеры толщиной 1/4". Использовалась лазерная резка мощностью 120 Ватт. Размеры бокса - 3.5"x4"x2". Бокс был спроектирован в AutoCAD. Для генерации файлов для лазерной резки использовался софт Autodesk 123D Make. Потом были добавлены два отверстия для переключателей и прямоугольное отверстие для LCD экрана. Кроме того, были добавлены отверстия на нижней части бокса, чтобы проще осуществить крепеж к велосипеду.

Стенки бокса крепятся между собой на клей. Углы надо зачистить наждачкой. Можно использовать какое-то покрытие для фанеры, чтобы придать боксу надлежащий вид и защитить от влаги.

Скачать необходимые детали для бокса можно по ссылкам ниже:

enclosure.stl

enclosure.dwg

enclosure.cdr

Корпус для спидометра 1 Корпус для спидометра 2
Корпус для спидометра 3 Корпус для спидометра 4

Установка Arduino и обвязки в бокс

Переключатели фиксируются в корпусе с помощью гаек. LCD экран садится на клей или с фиксируется с помощью винтов на передней панели бокса. Arduino и Protoboard устанавливаются рядом с бетарейкой. Опять-таки, можно использовать клей для фиксации или предусмотреть крепеж на винтах.

Установка Arduino в корпус 1 Установка Arduino в корпус 2
Установка Arduino в корпус 3

Устанавливаем спидометр на велосипед

Бокс со спидометром на Arduino устанавливаем на руль велосипеда. Можно использовать пластиковые стяжки и sugru для фиксации. Провода, которые идут от платы к геркону надо пустить таким образом, чтобы они не мешали вам при поездке и при этом была возможность поворачивать руль.

Спидометр на велосипеде 1 Спидометр на велосипеде 2
Спидометр на велосипеде 3 Спидометр на велосипеде 4

Велосипед со спидометром на дороге!

Не забывайте про правила поведения велосипедистов на дороге! Несмотря на ваш прекрасный Arduino спидометр, следите за транспортом и людьми!

Велосипед со спидометром на Arduino

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