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

morskoiboy
Offline
Зарегистрирован: 07.04.2012

   Здравствуйте! Стоит задача приделать к велотренажеру огромный спидометр с аналоговой шкалой. Конструкция предположительно будет использоваться в телевикторине и зрителям должны быть хорошо видны показания этого прибора. На маховике тренажера стоит геркон, который замыкается один раз в оборот на 360 градусов, планирую подключить его как кнопку в аналоговый вход. Стрелку спидометра планирую отклонять сервоприводом. Т.е. необходимо перевести частоту срабатывания геркона в угол отклонения сервы. Понимаю, что зависимость прямая, но ума не приложу как грамотно написать скетч, т.к. в программировании не силён. Как поступить? Считать время от срабатывания до срабатывания геркона или считать кол-во срабатываний за период времени? Как округлить получившуюся величину и перевести её в угол отклонения сервы? В благодарность за помощь и толковые советы готов проставиться (питер, работаю барменом), кинуть денюжку на телефон или послать лучиков добра.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

подцепите датчик на прерывание

вместо геркона лучше магнит и датчик холла

сервопривод лучше взять покачественее чтобы не дергался как судорожный

 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Так геркон и есть магнитоуправляемый контакт. Чем датчик холла лучше в данной ситуации? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нет подвижных частей у датчика холла и неизвестный срок жизни у геркона. но это лично мое мнение

да и еще геркон инертен. хотя наверно у вас не будет таких скоростей

Maverik
Offline
Зарегистрирован: 12.09.2012

геркон лучше

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Датчик Холла тоже хорош.

morskoiboy
Offline
Зарегистрирован: 07.04.2012

На велотренажере уже стоит родной геркон. Если будет плохо работать, то поменяю на любой другой датчик - не проблема. Загвоздка в программной части проекта

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а детальки то уже есть?

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Есть ардуино UNO R3, сервы тоже разные есть. Если родной геркон не подойдёт, то есть ещё вот такой датчик - http://www.electronshik.ru/pdf/pdf/d/dfr0033.pdf

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

должно быть вроде этого. там ряд настраиваемых параметров которые нужно задать. я задал приблизительно

#include <Servo.h> 
Servo myservo;

volatile unsigned long time = 0;        //Время срабатывания датчика
volatile int skorost = 0;    
const float radius = 0.2;               //радиус диска
const float pi_n = 3.1415;
volatile float okruznost;
int angle = 0;                          //угол поворота сервы
int min_speed_time = 1000;              //время больше которого значения будут обнулятся
int max_speed = 50;                     //максимальная скорость на которую будет рассчитан прибор


void Start(){
  skorost = (okruznost)/(millis()-time);
  time=millis();
}

  
void setup(){
  attachInterrupt(0, Start, FALLING);     //Прерывание по спадающему фронту на D2
  okruznost = 2*pi_n*radius*1000;
  myservo.attach(5);                      //для сервы
}

void loop(){
  if (millis()-time > min_speed_time) skorost = 0;
  angle = map(skorost, 0,  max_speed, 0, 179);
  myservo.write(angle);
}

 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Спасибо! С утра доберусь до мастерской и проверю как работает

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверяйте. жаль не в питере живу. посидели бы и потестили вместе

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Покрутили :) .

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот эту строчку

angle = map(skorost, 0,  max_speed, 0, 179);

лучше заменить на эту. чтобы плавнее двигался сервопривод

angle = map(skorost*10, 0,  max_speed*10, 0, 179);

а для еще более правного движения лучше применить другую библиотеку

VarSpeedServo

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Блин, мне всё до мастерской не доехать. Не тестил ещё. Завтра отпишу как чего

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Ваш код работает замечательно! Методом тыка подобрал числа с которыми процесс более-менее плавно происходит

Спасибо большое! Как я могу вас отблагодарить? (я если что в Москве сейчас)

А ещё не подскажите, чего надо дописать, чтобы серва после запуска и после превышения min_speed_time оказывалась в минимальном угле отклонения, а не в рандомном?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

jeka_tm@mail.ru

напишите обговорим

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

а также дайте код с цифрами что вы подправили. я его и подправлю

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Я понял в чём дело. Вот эта строчка не работает

if (millis()-time > min_speed_time) skorost = 0;

Все значения без изменений. Серва двигается даже если крутить педали ооочень медленно. Изменение параметра min_speed_time ничего не даёт.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

возможно компилятор хочет скобки дополнительные 

if ((millis()-time) > min_speed_time) skorost = 0;