Как стать автором
Обновить

Каденс на ардуино

Время на прочтение 4 мин
Количество просмотров 14K

Всех неистово приветствую!

Периодически я довольно активно накручиваю педали по местным паркам. И тут до меня снизошло, что, возможно, я не очень правильно их накручиваю. Стал изучать вопрос. Велопедия утверждает, что частота педалирования в среднем должна быть от 80 до 110 об/мин. Ок. Значит нужен велокомп с датчиком каденса. Китай брать не хотелось. Нарыл Sigma 16.12 STS + Cadence за 2900руб. Цена не копеечная, а на дворе крЫзис и сам я, так-сказать, безработный B-) Прикинул и решил… По сути роль велокомпа у меня выполняет связка из айфона, программы Циклометр и часов Casio STB-1000 — и эта связка меня вполне устраивает. Да и показания каденса нужны лишь некоторое время. Затем тело привыкает и постоянно его отслеживать смысла нет. Одним словом пришло понимание, что надо собрать временную лабуду из говна и палок из ардуино и запасов.

Идея: на руль помещаем два светодиода — зелёный и красный. Зелёный — каденс в норме. Красный, соответственно, нет. Затем пришёл к идее, что красный будет гореть только когда обороты выше нормы. Так и батарейки меньше жрать будет.

Реализация:
— на «перо» геркон из соседнего радио-магазина, на «шатун» неодимовый магнит
— светодиоды запихну в валяющийся китайский габарит
— роль контроллера исполнит Arduino Pro Mini 3.3V 8MHz

Собрал всё это дело на макетке с UNO (легче шить и дебажить). Заместо геркона тактовая кнопка.


И залил скетч с выводом данных в порт.
Тестовый скетч:
int cadInt = 0;  // задаём вывод геркона 0=pin2
int ledGreen = 10;  // вывод зелёного светодиода
int ledRed = 11;  // вывод красного светодиода

int count = 0;  // счётчик оборотов
int lastCount;  // переменная хранящая последнее значение счётчика оборотов
int count4period;  // количество оборотов совершённое за период

// ниже переменные чисто для дебага и доп инфо в сериал порте:
long time;  // переменная которой присваивается значение внутреннего счётчика времени
long lastTime;  // переменная хранящая последнее значение счётчика времени
int period;  // период времени отработки

void setup() {
  pinMode (cadInt, INPUT);  // пин датчика (геркона) на вход
  pinMode (ledGreen, OUTPUT);  // пин светодиода на выход
  pinMode (ledRed, OUTPUT);  // второго тоже
  
  attachInterrupt(cadInt, swap, RISING);
  
  lastTime = millis();  // после дебага удалить или закоментить
  
  Serial.begin(9600);  // после дебага удалить или закоментить
}

void swap() {
  count = count+1;
}

void loop() {
  delay(5000);
  
  count4period = count - lastCount;
  
  time = millis();  // после дебага удалить или закоментить 
  period = time - lastTime;  // после дебага удалить или закоментить 
 
  Serial.println(period);  // после дебага удалить или закоментить
  Serial.println(count4period);  // после дебага удалить или закоментить
  
  if (count4period >= 6 && count4period <= 9)
  {
    Serial.println ("Green");  // после дебага удалить или закоментить
    digitalWrite(ledGreen, HIGH);
    digitalWrite(ledRed, LOW);
    } else {
        if(count4period > 9){
        Serial.println ("Red");  // после дебага удалить или закоментить
        digitalWrite(ledGreen, LOW);
        digitalWrite(ledRed, HIGH);
        } else {
          Serial.println ("LOW CADENCE");  // после дебага удалить или закоментить
          digitalWrite(ledGreen, LOW);
          digitalWrite(ledRed, LOW);
        }
     }
      
  lastTime = time;  // после дебага удалить или закоментить
  lastCount = count;  
}


Всё норм. Всё работает.


Затем всё это пересобрал на макетке и воткнул миньку.


Кстати, вот схема:

Вот только батареек у меня три, ибо двух будет мало, а Фритз три не показывает.

А вот как выглядит китайский велогабарит:


В разборе и процессе перепайки:

Перепаять пришлось только один светик, тк второй прозрачный на самом деле красный.

Вот так он выглядел по окончанию операции:

В процессе продумывания проекта надумалось, что вместо зелёного и красного светодиодов — можно воткнуть два RGB, но в ближайшем электро-шопе таких не оказалось, потому имеем что имеем.

Ну, а геркон я засунул в какую-то полиэтиленовую трубочку и загерметизировал сопледавом клеевым пистолетом.


И так, что по затратам… Потратиться пришлось лишь на геркон (15р.), три элемента питания АА (86р.) и неодимовые магниты (их сцуко дорого купил ибо искать было впадлу, а с Али ждать не готов (160р.)). Остальное всё валялось по коробочкам и ждало применения. Вот даже провод мажорный от сдохшей кулермастеровской мышки применил:


Естчё фото кому мало...







Внимание! Буду рад увидеть буханку с рогами в комментариях ;) Но давайте серьёзно. На самом деле можно было спокойно вместо целой ардуины применить Atmega8L и отказаться от двух резюков на светики, а управлять ими ШИМом. Но, в загашнике у меня только обычная и нет держателя под аккум 18650 чтобы это дело питать. Может быть позже…

… Финальный скетч. (Не бейте «программиста» он пишет как может):
Cadence_1.0
int cadInt = 0;  // задаём вывод геркона 0=pin2
int ledGreen = 10;  // вывод зелёного светодиода
int ledRed = 11;  // вывод красного светодиода

int count = 0;  // счётчик оборотов
int lastCount = 0;  // переменная хранящая последнее значение счётчика оборотов
int count4period = 0;  // количество оборотов совершонное за период

void setup() {
  pinMode (cadInt, INPUT);  // пин датчика (геркона) на вход
  pinMode (ledGreen, OUTPUT);  // пин светодиода на выход
  pinMode (ledRed, OUTPUT);  // второго тоже
  
  attachInterrupt(cadInt, swap, RISING);
}

void swap() {
  count = count+1;
}

void loop() {
  delay(5000);
  
  count4period = count - lastCount;
  
  if (count4period >= 6 && count4period <= 9) {
    digitalWrite(ledGreen, HIGH);
    digitalWrite(ledRed, LOW);
    } else {
        if(count4period > 9){
        digitalWrite(ledGreen, LOW);
        digitalWrite(ledRed, HIGH);
        } else {
          digitalWrite(ledGreen, LOW);
          digitalWrite(ledRed, LOW);
        }
    }
      
  lastCount = count;  
}



Фото на объекте:




… и во весь рост


На закуску видео:


PS Статью перепечатывать без спроса нельзя — типа ©. Проект улучшать и перерабатывать можно. Всем плодотворной рабочей недели! А я — кататься на велике!

PPS Сегодня сделал тестовый заезд. Выводы:
— Всё отлично работает. Сбой был замечен лишь один раз. Видимо, проскочил дребезг.
— Стоит применять RGB светодиоды — на ярком солнце будет наглядней.
Теги:
Хабы:
+10
Комментарии 73
Комментарии Комментарии 73

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн