Разбираемся как сделать на основе Ардуино одометр для измерения количества оборотов колеса велосипеда.
О проекте
Мы научимся собирать устройство для вычисления расстояния с помощью герконового датчика. Таким образом, мы соберем одометр.
При помощи него может быть измерен пройденный транспортным средством путь.
Представляете, - первый одометр был изобретён Героном Александрийским, греческим математиком и механиком. Который жил очень давно, где-то во второй половине I века н. э., но это не точно.
Во многих автомобилях существуют устройства, которые вычисляют пройденный путь и необходимы для предоставления информации водителю.
Таким образом, с помощью этой информации можно контролировать пройденное расстояние между двумя точками, например, с помощью счетчика пробега транспортного средства.
Компоненты
Для этого проекта одометра Ардуино мы будем использовать следующие компоненты:
- Печатная плата PCBWay
- Arduino Uno
- Дисплей LCD 16x2
- Макетная плата
- Перемычки
- Ротационный потенциометр 10 кР
- UTSOURCE герконовый свитч
Также, конечно, нам понадобится IDE Arduino.
Давайте уже перейдем к сборке устройство для вычисления расстояния с помощью герконового датчика.
Теория
Мы предполагаем, что данное устройство изначально будет применяться в вело-тренажере. Мы сможем поставить обычный велосипед на помост и тренироваться дома, накручивая расстояние. Кроме того, мы создадим программу для Ардуино.
Этот проект имеет три функциональные возможности:
- Рассчитать расстояние, пройденное на велосипеде;
- Конфигурация радиуса;
- Адаптация к любому велосипеду.
Для доступа к этим функциям пользователь будет использовать три кнопки системы. Каждая кнопка имеет свою функциональность. В системе у нас будут следующие кнопки:
- Кнопка инкремента: будет использоваться для ввода в опцию настройки радиуса колес и увеличения значения радиуса;
- Кнопка декремента: будет использоваться для декремента опции настройки радиуса колес;
- Кнопка ввода: будет использоваться для вставки значения радиуса в систему.
Герконовый датчик
Как мы указали выше, мы будем использовать герконовый датчик. Он отвечает за определение того, когда колесо совершает полный оборот.
Для обнаружения этого, он должен быть установлен на магните на колесе.
Таким образом, каждый раз, когда магнит приближается к датчику, он приводит в действие герконовый переключатель. Процесс работает по следующему уравнению:
Расстояние в пути = 2 *π * радиус * Количество оборотов
Через это уравнение мы узнаем, какова пройденная дистанция, которую проделал велосипед. В уравнении радиус вставляется пользователем, а номер поворота рассчитывается по числу оборотов колеса.
А для определения вращений колеса необходимо установить магнит на колесо велосипеда и установить герконовый датчик рядом с колесом.
Печатная плата
Для упрощения процесса мы создадим печатную плату для подключения датчика герконового переключателя и трех кнопок. Печатная плата представлена ниже на рисунке.
Глядя на печатную плату, можно увидеть Ардуино. Он отвечает за управление всеми системами. Кроме того, у нас есть 5 разъемов JST.
Соединения
C1 до C4 разъемы используются для подключения трех кнопок и датчика герконового переключателя. Теперь разъем C5 используется для подключения ЖК-дисплея 16x2 I2C.
Соединительные пины кнопок и герконового датчика:
- 8 — Герконовый переключатель датчика
- 9 — Декремент
- 12 — Инкремент
- 11 — Ввод
Таким образом, с помощью этой системы вы сможете установить устройство на велосипед и получить значение пройденного расстояния.
Код проекта
Для нашего одометра Ардуино мы будем использовать код, представленный ниже.
Нам нужно подключить две дополнительные библиотеки: EEPROM (EEPROM.h
) и LiquidCrystal (LiquidCrystal.h
).
#include <EEPROM.h>
#include <LiquidCrystal.h>
#define MEMORIA 120
#define PosRaio 125
#define ReedSwitch 8
#define BotaoEnterOk 11
#define BotaoIncremento 12
#define BotaoDecremento 9
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
bool sensor = 0, estado_anterior = 0, Incremento = 0, Decremento = 0;
bool IncrementoAnterior = 0, DecrementoAnterior = 0, BotaoEnter = 0, EstadoAnteriorIncremento = 0;
byte cont = 0;
unsigned long int VoltaCompleta = 0;
unsigned long int tempo_atual = 0, ultimo_tempo = 0;
float DistKm = 0;
unsigned int raio = 0;
float Distancia = 0;
void setup()
{
Serial.begin(9600);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(12, INPUT);
lcd.begin(16,2);
// Область кода для установки радиуса колеса
if(EEPROM.read(MEMORIA) != 73)
{
ConfiguraRaio();
EEPROM.write(MEMORIA, 73);
}
lcd.setCursor(3,0);
lcd.print(“Distancia”);
lcd.setCursor(6,1);
lcd.print(Distancia);
lcd.setCursor(14,1);
lcd.print(“km”);
raio = EEPROM.read(PosRaio);
}
void loop()
{
// Область кода для считывания с кнопок и датчика
sensor = digitalRead(ReedSwitch);
Decremento = digitalRead(BotaoDecremento);
Incremento = digitalRead(BotaoIncremento);
// Область кода для суммирования пройденного расстояния
if(sensor == 0 && estado_anterior == 1)
{
VoltaCompleta++;
Distancia = (float)(2*3.14*raio*VoltaCompleta)/100000.0;
lcd.setCursor(0,1);
lcd.print(“ “);
lcd.setCursor(6,1);
lcd.print(Distancia);
lcd.setCursor(14,1);
lcd.print(“km”);
estado_anterior = 0;
}
if(sensor == 1 && estado_anterior == 0)
{
estado_anterior = 1;
}
// Область кода для установки радиуса
if(Incremento == 1 && EstadoAnteriorIncremento == 0)
{
EstadoAnteriorIncremento = 1;
}
if(Incremento == 0 && EstadoAnteriorIncremento == 1)
{
EstadoAnteriorIncremento = 0;
lcd.clear();
ConfiguraRaio();
}
}
void ConfiguraRaio()
{
byte RaioRoda = 0;
// Печать сообщения для ввода радиуса в см.
lcd.setCursor(0,0);
lcd.print(“Inserir Raio(cm)”);
do
{
lcd.setCursor(6,1);
Incremento = digitalRead(BotaoIncremento);
Decremento = digitalRead(BotaoDecremento);
BotaoEnter = digitalRead(BotaoEnterOk);
if(Incremento == 1 && IncrementoAnterior == 0)
{
RaioRoda = RaioRoda + 1;
IncrementoAnterior = 1;
}
if(Incremento == 0 && IncrementoAnterior == 1)
{
IncrementoAnterior = 0;
}
if(Decremento == 1 && DecrementoAnterior == 0)
{
RaioRoda = RaioRoda — 1;
DecrementoAnterior = 1;
}
if(Decremento == 0 && DecrementoAnterior == 1)
{
DecrementoAnterior = 0;
}
lcd.setCursor(6,1);
lcd.print(RaioRoda);
}while(BotaoEnter == 0);
lcd.clear();
EEPROM.write(PosRaio, RaioRoda);
return;
}
На этом всё. Хороших вам тренировок.