Форум программистов, компьютерный форум, киберфорум
Наши страницы
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.72/151: Рейтинг темы: голосов - 151, средняя оценка - 4.72
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
#1

ВелоКаденсоМетр - ВКМ-01

21.06.2010, 03:20. Просмотров 27187. Ответов 42
Метки нет (Все метки)

Да здравствуют все велосипедисты Украины и Мира!!!! ( и России, и других стран)!!!

В данный момент я ЗАДУМАЛ сделать, ВелоКАДЕНСоМетр + !!!
То-есть измеритель Каденса для велосипедиста.

Каденс - частота вращения педалей

Сразу предупрежу - он (изготавливаемый прибор) будет заточен под Мои требования.
Т.е. велокомп AS-820 - есть, бортовой аккум - есть, Фара - есть;
И будет изготовлен на PIC16F676 (из обломком старого прибора "Страж-40"). Питание: +5 Вольт. Две кнопки, Три LED цифры.

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

Вкратце- Каденс, в нашем приборе, измеряется подсчётом периода оборота, совершаемых [левой] педалью с помощью датчика-геркона, устанавливаемого на раме, и нигнита, фиксируемого на шатуне, с помощью одного из таймеров пика (timer1) по специальной формуле.
Стандартный каденс для велосипедиста-любителя (независимо от типа велосипеда) 60–90 оборотов в минуту. Спортсмены-шоссейники способны держать каденс 120 - 180 об/мин. Многие предпочитают крутить педали пореже, но помощнее. (Каденс ниже 80 оборотов в минуту опасен для здоровья — повышается нагрузка на коленные суставы, что может привести к артриту.)

Так как в названии присутствует ПЛЮС то наш прибор будет измерять ещё кое-что... (Surprise)

- Timer0 - динамическая индикация + опорос двух кнопок.
- Пройденное расстояние сохраняется в EEPROM пика каждые сто метров.
- Схема - будет, Исходники будут...

Прошу наше уважаемое сообщество не нас****ь в этой теме. Писать буду по мере появления материала... please woyt...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2010, 03:20
Ответы с готовыми решениями:

А/С Веко модель ВКМ-12Н, замена фреона
Чем можно заменить фреон мобильного кондиционера 407С если под рукой R22. R410A. R134. R134A. R600....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
21.06.2010, 21:27 #21
Я себе каданс добавил в штатный велокомп путем запайки перемычек в нем. В результате дешевая модель велокомпа сразу поумнела и поднялась в топ серию :)
0
Moksoff
0 / 0 / 0
Регистрация: 29.05.2010
Сообщений: 191
21.06.2010, 21:54 #22
Цитата Сообщение от DY HOTT
Я себе каданс добавил в штатный велокомп путем запайки перемычек в нем. В результате дешевая модель велокомпа сразу поумнела и поднялась в топ серию :)
Хорошо, когда такой велокомпьютер заранее нафаршированный.
Но я всё-таки считаю, что каденс лучше показывать отдельно, и светодиодной линейкой. Так гораздо нагляднее и легче воспринимается на ходу в любое время.
Цитата Сообщение от Mykysoft
задатчик каданса. причем адаптивный, а не тупой метроном...
А какой алгоритм предлагаете? Мне думается, слишком нереально угадать, с каким каденсом надо крутить педали. Если только добавить ещё линейку равномерности каденса -- чем точнее в ритм крутим, тем больше показывает.
0
hordikor
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
21.06.2010, 23:09 #23
Алгоритм простой - каденс должен быть постоянен, за этим и следить. А управлять переключением скоростей.
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
21.06.2010, 23:38 #24
hordikor + 5 !

Всем спасибо за конструктивную критику и дельные предложения.
Есть стоящие вещи: + Уменьшение яркости ночью;
- Не понял преимущества светодиодной линейки над 3x-LED-индикатором;
+ Пока будет геркон (а там посмотрим, как поведёт в реале);
- Интересная идея с задатчиком каденса - хотелось бы узнать поподробней его смысл??

А пока суть да дело, пытаюсь запустить модель в протеусе и начать кодить. Кое что уже есть. Но глючный протеус заставляет извращаться :-))). Мой протеус, в данной модели МК, не принимает ни внешнего прерывания /INT, ни прерывания по изменению уровня на RA1...
0
hordikor
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
21.06.2010, 23:51 #25
Каденс — частота вращения педалей велосипеда. Нормальным считается каденс 80-110 оборотов в минуту. Спортсмены могут длительное время работать с каденсом 160—180 оборотов в минуту. Каденс ниже 80 оборотов в минуту опасен для здоровья (повышается нагрузка на коленные суставы, что может привести к артриту).
здесь еще пишут http://www.velowiki.org/wiki/%D0%9A%D0% ... 0%BD%D1%81
0
Moksoff
0 / 0 / 0
Регистрация: 29.05.2010
Сообщений: 191
21.06.2010, 23:55 #26
Цитата Сообщение от hordikor
А управлять переключением скоростей.
- а разве каденс не должен быть более-менее постоянен при любой установки скорости? Раз уж так, то лучше смотреть гироскопом на наклонность ландшафта, акселерометром на состояние дороги, спидометром на скорость, и советовать выбрать именно скорость. Помнится, был концепт с автоматическими шестеренками, которые хитрым способом вычисляли нагрузку и переключали передачи.
Цитата Сообщение от zomzy
Не понял преимущества светодиодной линейки над 3x-LED-индикатором
Светодиодную линейку видно беглым взглядом при любой скорости при любых условиях, наглядно можно определить свой уровень каденсирования. Цифры в любом случае требуют более длительно считывания. Светодиодная шкала -- это как псевдоаналогавая линейка в цифровых мультиметрах, может быстро и наглядно отобразить сиюсекундные значения.

Тем более на линейке можно разноцветными светодиодами наглядно отображать опасные регионы (ниже 80).
0
hordikor
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
22.06.2010, 00:04 #27
Цитата Сообщение от Moksoff
Цитата Сообщение от hordikor
А управлять переключением скоростей.
- а разве каденс не должен быть более-менее постоянен при любой установки скорости?
Конечно постоянен. Только чтобы держать его постоянным приходится переключать скорости в зависимости от желания велосипедиста и изменения ландшафта.
Т.е. если я начинаю разгонятся -> каденс повышается -> переключаем скорость(уменьшаем передаточный коэффициент) для снижения каденса до приемлимой величины.
Если я заезжаю в горку -> каденс понижается -> переключаем скорость(увеличиваем передаточный коэффициент) для повышения каденса до приемлимой величины.
Вот такая регулировка.
0
Moksoff
0 / 0 / 0
Регистрация: 29.05.2010
Сообщений: 191
22.06.2010, 00:08 #28
Теперь понял, что Вы имели ввиду, спасибо. И за ссылку на веловики отдельное спасибо.
0
Mykisoft
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 903
22.06.2010, 13:10 #29
Задатчик - в смысле пикалки/мигалки, настраиваемый под нужный каданс (а лучше еще контролировать и ЧСС). Адаптивность в этом смыле нужна, чтобы не тупо пищать с периодом 0,75 секунды, а немного обгонять/подтормаживать каданс, приводя его к нужному за 7-10 оборотов каретки.
0
Dirspywok
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 833
22.06.2010, 13:48 #30
Я похоже вообще ничего не понимаю в езде на велосипеде, но зачем нужен задатчик каденса? Имхо достаточно просто с измерителем поездить недельку, выработается память и все будет понятно без всяких пищалок. Зачем из полезного прибора делать шарманку?
0
Mittid Mitot
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 2,550
22.06.2010, 14:02 #31
http://www.chip-dip.ru/product0/32786.aspx
0
Mykisoft
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 903
22.06.2010, 16:58 #32
Цитата Сообщение от Dirspywok
Я похоже вообще ничего не понимаю в езде на велосипеде, но зачем нужен задатчик каденса? Имхо достаточно просто с измерителем поездить недельку, выработается память и все будет понятно без всяких пищалок. Зачем из полезного прибора делать шарманку?
По идее, чтобы регулировать нагрузку на мышцы и ССС.
0
Dirspywok
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 833
22.06.2010, 17:18 #33
По идее, чтобы регулировать нагрузку на мышцы и ССС.
Похоже я не точно выразился. Каденс измерять конечно нужно, без него колени легко убить. Мне не понятно зачем нужна пищалка. Когда у меня появился измеритель каденса, я сначала тоже постоянно смотрел на экран и сверялся. Где то через пару недель это было уже ни к чему, потому что было и так понятно с какой частотой кручу, 80 90 или 60. Если уж есть время на создание подобных штук, имхо лучше на измерение ЧСС упор сделать.
0
pspost
0 / 0 / 0
Регистрация: 17.02.2010
Сообщений: 192
22.06.2010, 19:47 #34
Хех, и у меня тоже есть идея забадяжить свой велокомп)
Вот тут все пишут про функции, про примочки, а про корпус, внешний вид, и как всё это будет выглядеть на руле ни слова. Лично я бы себе в ТЗ так и написал: если выйдет "кирпич на руле", если глаз не будет радовать - выкинуть всё к чёрту. По-моему, для велокомпа никакой функционал не оправдает убогий внешний вид, лучше уж купить готовый.
Также он должен быть достаточно прочный и влагозащищённый. Рабочая идея пока: формовка (литьё) из какого-либо пластмассоподобного вещества.

На счёт питания. Питать велокомп от акка, основная задача которого питать фару, - нонсенс. Велокомпу нужно автономное питание. И тут встаёт вопрос, на сколько этого питания хватит.
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
23.06.2010, 00:34 #35
1. Внешний вид изделия ВКМ-01 БУДЕТ размерами не более 45x60x20 мм. Крепится справа от середины руля (так как слева всё занято) на него же (интерфейсный разъём сзади-сверху корпуса изделия). Изготовлен из черного пластика (как раз удалось подобрать подходящий размер, от импульсного БП Juyn 12V/5A). Он(внешний вид) меня УЖЕ радует :-))).

-далее - никакого "нонсенса": --
2. Бортовой вело-аккумулятор, рабочим напряжением 11,1 v / 4,8 A*h, питает ВСЁ эл.оборудование велика- Фару, Задний фонарь, может питать электро-сигнал (со встроенным аккумом от мобилки) (в дальнейшем думаю установить динамо машину на(в) переднюю втулку- для подзарядки акки), питает ВКМ-01, и возможное другое эл.об...
Аккум расположен(помещён) под сидением, буквально на заднем крыле. Имеет свой кожаный корпус;

3. Так как по принципиальной схеме рац-предложений нет, то начинаю ваять плату, и ЕЩЁ плотнее кодить...кодить...кодить...

...скоро будет софт...

И не забывайте, имеем дело с МК PIC16F676: 1024-words программной памяти, 64-байта sram , 128-байт eeprom, 12-линий I/O, 10-битный АЦП, по одному 8- и 16- разрядный таймеры. ОДИН вектор прерываний.
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
23.06.2010, 01:05 #36
Таблица Сигналов

0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
23.06.2010, 01:14 #37
Цитата Сообщение от zomzy
И не забывайте, имеем дело с МК PIC16F676: 1024-words программной памяти, 64-байта sram , 128-байт eeprom, 12-линий I/O, 10-битный АЦП, по одному 8- и 16- разрядный таймеры. ОДИН вектор прерываний.
Ужасно. Хотел было сказать - а как же мега169 с прямым подключением к ЖКИ, потом посмотрел, что она вчетверо дороже...
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
04.07.2010, 01:18 #38
Программа, обильно комментирована. Компилятор MicroC PRO-v3.2.

Определяем различные дефиниции...:
Код
#defyme A0  RA0_bit      // Порт A0 = вход от делителя напряжения
#defyme A1  RA1_bit      // Порт A1 = вход Прерывания по Изм.RA1
#defyme A2  RA2_bit      // Порт A2 = вход Внешнего Прерывания
#defyme A3  RA3_bit      // Порт A3 =  -- RESIT МК --
#defyme A4  RA4_bit      // Порт A4 = выход коррекции 1MHz;  -резерв-
#defyme A5  RA5_bit      // Порт A5 = Вход от Кнопок
#defyme C0  RC0_bit      // Порт C0 = Знак 1 + Кнопка Левая
#defyme C1  RC1_bit      // Порт C1 = Знак 2 + Кнопка Правая
#defyme C2  RC2_bit      // Порт C2 = Знак 3
#defyme C3  RC3_bit      // Порт C3 = вых=0,  -резерв-
#defyme C4  RC4_bit      // Порт C4 = выход Data на bu4094
#defyme C5  RC5_bit      // Порт C5 = выход Clk  на bu4094
#defyme ZNAK1 1          // Порт C0 = ЗНАКОМЕСТО 1 = 0-светится  1-погашен
#defyme ZNAK2 2          // Порт C1 = ЗНАКОМЕСТО 2 = 0-светится  1-погашен
#defyme ZNAK3 4          // Порт C2 = ЗНАКОМЕСТО 3 = 0-светится  1-погашен
#defyme DATA 16          // Порт C4 = DATA =
#defyme CLK  32          // Порт C5 = CLK =
#defyme Knopka PORTA.B5  // Вход от кнопок
... и Глобальные переменные...
Код
unsykned int port_A=0;    // переменная порта A  // для правильной работы в протеусе //
unsykned int port_C=0;    // переменная порта C  //   --//--

unsykned int  chislo=0;        // значение(Число) выводимое на индикатор (0...999) в прерываниях Timer_0
unsykned char tek_znak=0;      // текущий отображаемый знак в прерывании (timer_0)
unsykned int  Num1=0;          // временная переменная для разбивки числа на разряды (Timer_0)
unsykned char Num2=0, Num3=0;  // цифры для вывода в соотв.разряды индикатора
unsykned int  ob_min=0;        // кол-во оборотов в минуту
unsykned char kpt=0;           // кол-во Прерываний Timer1; +флаг счета каденса
unsykned char mode=12;         // режим текущего отображения: 2-Каденс(CA), 4-заряд(Ур), 6-коррекция 1MHz(Cr), 12-начальная заставка (CAd).
unsykned char zast=150;        // флаг (>0) и время отображения (TIMER0) текущ.символа измерения
unsykned int  ADC=0;           // для измерения уровня напряжения акккумы

bit  f1;      // флаг разрешения 6-го режима - устан. если при включении нажата левая кнопка
bit  fkl;     // флаг (=1) нажатия левой кнопки. сбрасуется в main()
...и парочку прототипов функций:
Код
unsykned short int My_Eeprom_Read(unsykned short int);  // ф-я чтения из EEPROM по адресу a
void bu4094(unsykned short int);                        // отправить байт в регистр BU4094
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
04.07.2010, 01:28 #39
Наличие следующей п/п необходимо в связи с необъяснимым глюком: в некоторых местах программы библиотечные функции компилятора отказывались компилироваться...
Код
unsykned short int My_Eeprom_Read(unsykned short int a)    // чтение из EEPROM по адресу a
{
EEADR=a;
EECON1.RD=1;
return EEDATA;
}
...далее фактически вывод одного знака на LED. Код знака хранится в EEPROM, в ячейках с 0 по 16
Код
void bu4094(unsykned short int s)  // ####  записать байт в регист BU4094  ####
{
unsykned char i;        // цикл
unsykned short int a;   // значение
a = EEPROM_Read(s);     // чтения из EEPROM (библиотечная ф-я)

port_C |= 0x07;         // погасить ВСЕ знакоместа
PORTC = port_C;

for(i=0;i<8; i++)
{
if (a & 0x80) port_C |= DATA; // формируем сигнал DATA
else port_C &= ~DATA;
PORTC=port_C;
port_C |= CLK;        // тактируем
PORTC=port_C;
a=a<<1;               // сдвигаем байт
port_C &= ~CLK;
PORTC=port_C;
}
}
void interrupt() { // Обработка ВСЕХ прерывания

Динамическая индикация, опрос кнопок,
Код
  if (INTCON.T0IF)    // прерывание от TIMER_0
{
//        port_C |= 0x07;           // погасить ВСЕ знакоместа
//        PORTC = port_C;
if (++tek_znak==1)     // подготовка всех переменных ...и вывод первого разряда
{
Num1=chislo;
Num2=0; Num3=0;
while (Num1 >= 100)   // вычисляем третий разряд
{
Num1 -= 100;
Num3++;
}
while (Num1 >= 10)    // вычисляем второй разряд
{
Num1 -= 10;
Num2++;
}                // Num1 = первый разряд

if (Num3==0)     // проверка на пустое место знакоместа (третее и/или второе)
{  Num3=10;
if (Num2==0) Num2=10;
}

if (zast)   // если заставка то выводим её
{
zast--;                //   инкимент времени заставки
switch (mode)          // отображение 1 знака
{
case 2 : Num1=12; briok;  // буква A
case 4 : Num1=14; briok;  // буква P
case 6 : Num1=1;  briok;  // цифра 1
case 12: Num1=15; briok;  // буква d
}
}
bu4094(Num1);          // отправить соотв. байт в первый разряд
port_C &= ~ZNAK1;      // включить ПЕРВОЕ знакоместо
PORTC = port_C;
}

if (tek_znak==2)       // вывод ВТОРОГО разряда
{
if (zast)          // если заставка то выводим её
{
switch (mode)
{
case 2 : Num2=11; briok;  // буква C
case 4 : Num2=13; briok;  // буква У
case 6 : Num2=14; briok;  // буква P
case 12: Num2=12; briok;  // буква A
}
}
bu4094(Num2);          // отправить соотв. байт в первый разряд
port_C &= ~ZNAK2;      // включить ВТОРОЕ знакоместо
PORTC = port_C;

///// опрос Левой_Кнопки- .... //////     // анализ нажатия ЛЕВОЙ кнопки
if (!Knopka)  fkl=1;       // ..код драйвера левой кнопки
}

if (tek_znak==3)       // вывод ТРЕТЕГО разряда
{
if (zast)   // если заставка то выводим её
{
chislo=0;
if (mode==12  ) Num3=11;  // буква C
else Num3=10;             // иначе пусто
}
bu4094(Num3);          // отправить соотв. байт в первый разряд
port_C &= ~ZNAK3;      // включить ТРЕТЬЕ знакоместо
PORTC = port_C;
tek_znak=0;         // сброс

///// опрос Правой кнопки - Режима работы //////
if (!Knopka && mode==2) mode=3;  // анализ Нажатия ПРАВОЙ кнопки
else if (Knopka && mode==3)           // анализ Отпускания ПРАВОЙ кнопки
{ mode=4; zast=_Zast_Time; }     // вкл. mode=4 -Уровень Заряда-
else if (!Knopka && mode==4)          // анализ нажатия ПРАВОЙ кнопки и флага f1
{
if (f1) mode=5;                 // вкл. mode=6
else    mode=7;                 // вкл. mode=10
}
else if (Knopka && mode==5)           // анализ отпускания ПРАВОЙ кнопки
{ mode=6; zast=_Zast_Time; }     // вкл. mode=6 -Коррекция 1MHz-
else if (!Knopka && mode==6) mode=7;  // а.Н. ПРАВОЙ кнопки
else if (Knopka && mode==7)           // анализ отпускания ПРАВОЙ кнопки
{ mode=2; zast=_Zast_Time; }     // вкл. mode=2 -Каденс-
}
INTCON.T0IF= 0;     // сброс флага прерывания Timer_0
}
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
04.07.2010, 01:30 #40
...Тут считаем каденс....
ob_min=( (TMR1H+((--kpt)*256)) * 2); // вычисл. периода, в милисекундах
получаем период оборота в секунду, в миллисекундах, что очень удобно для программы.
Далее, в main просто исполняем: chislo=60000/ob_min получая число оборотов в минуту.

Код
  if (INTCON.INTF)      // произошло прерывания INT (от геркона педалей)
{
if (!kpt)           // проверка флага запуска счета каденса // если kpt==0 то kpt=1, сбрасуем таймер1 и запускаем его
{
TMR1L=0;          // обнуление Timer_1 (и автоматически прескалера)
TMR1H=0;
T1CON= 0x31;      // настройка и ВКЛ Timer 1
PIE1.TMR1IE=1;    // Разрешение прерывания по переполнению TMR1
kpt=1;
}
else         // если f1==1 то останавливаем T1, считуем его показания, вычисляем обороты, запускаем T1
{
T1CON= 0x30;      // остановка Timer 1
ob_min=TMR1H;     // промежуточное запоминание значения таймера-1.H
TMR1L=0;          // обнуление Timer_1 (и автоматически прескалера)
TMR1H=0;
T1CON= 0x31;      // запуск Timer 1
ob_min=( (ob_min+((--kpt)*256)) * 2);  // вычисл. периода, в милисекундах
// тут почти готовое об/мин - перенос в main()
kpt=1;            // сброс kpt1 в 1- включаем новый счёт
}
INTCON.INTF= 0;        // сброс флага прерывания INT
}

if (PIR1.TMR1IF)   // переполнение TIMER_1
{
kpt++;           // Количество Прерываний Timer1 ++
if (kpt>=5)      // если T1 переполнился более 4 раз, то
{
ob_min=0;       // сброс в 0 значения ob/min
kpt=0;          // обнуление kpt
T1CON= 0x30;    // остановка Timer 1
}
PIR1.TMR1IF=0;   // сброс флага прерывания TMR1
}
0
04.07.2010, 01:30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru