Велокомпьютер своими руками

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 18:45

всю процедуру расчета расстояния))) Было лень изначально правильно делать, поэтому там считается что за 500 оборотов колеса велосипед проезжает ровно 1 км
1200 км
Аватар пользователя
Alex
 
Сообщений: 764
Зарегистрирован:
03 июн 2011, 10:46
Откуда: Bad Neustadt a.d. Saale
Мой байк: BULLS King Boa Disk/ KHS alite 350
Баллы репутации: 76

Сообщение 04 июн 2013, 18:49

Не могли бы расписать под колесо 1.9м?

---------- Добавлено через 9 минут 34 секунды -------------------------------------------------------
Алексей,верьте формулам. Сейчас замерил, проведя велосипед так у меня длина окружности получилась 184см, а по формуле 190. Так что разброс небольшой
qwerty999
 
Сообщений: 40
Зарегистрирован:
31 май 2013, 11:28
Мой байк: forward
Баллы репутации: 0

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 19:04

разброс то небольшой, но теперь прикиньте какая будет погрешность на одном км!
Попробую сегодня подправить код.
Подправил, теперь при длине колеса 184см погрешность на один километр составляет 88см или 88 метров на 100км 8-)

http://www.ex.ua/view_storage/362936146643 подправленная прошивка
с магнитом разобрались?
Последний раз редактировалось Alex 04 июн 2013, 20:28, всего редактировалось 1 раз.
1200 км
Аватар пользователя
Alex
 
Сообщений: 764
Зарегистрирован:
03 июн 2011, 10:46
Откуда: Bad Neustadt a.d. Saale
Мой байк: BULLS King Boa Disk/ KHS alite 350
Баллы репутации: 76

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:24

Поставил свой датчик, щас попробую

---------- Добавлено через 21 минуту 33 секунды -------------------------------------------------------
А исходник где?
Прошил. Не понимаю, при поднесении датчика все равно глюки, бываются скачки за 70-90 и только потом показывается реальная скорость. Надо делать антидребезг(delay_ms(50))контактов геркона в прерывании INT0, т.к. тут явно проявляются ложные срабатывания.
qwerty999
 
Сообщений: 40
Зарегистрирован:
31 май 2013, 11:28
Мой байк: forward
Баллы репутации: 0

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:48

Я тут решил прикинуть сколько комп от четырех NiMh аккумов (1,2Вх4=4,8В) по 2000мАч протянет
чисто микроконтроллер без индикатора тянет 6мА то есть он сможет проработать (теоретически) около 13 дней
микроконтроллер с постоянно включенным индикатором (а он по документации тянет 75мВТ) проработает 12 часов :D
Цель на будущее: оптимизация потребления энергии *yes*
1200 км
Аватар пользователя
Alex
 
Сообщений: 764
Зарегистрирован:
03 июн 2011, 10:46
Откуда: Bad Neustadt a.d. Saale
Мой байк: BULLS King Boa Disk/ KHS alite 350
Баллы репутации: 76

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:50

У меня при всех индикаторах и мк потребление 128ма.
Исходник плиз.
Последний раз редактировалось qwerty999 31 май 2014, 13:40, всего редактировалось 1 раз.
qwerty999
 
Сообщений: 40
Зарегистрирован:
31 май 2013, 11:28
Мой байк: forward
Баллы репутации: 0

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:51

Замененная после 1000 км родная батарейка велокомпа, таблетка шо-то там 13, держится 6й год, насчитала более 20 тыс. километров.
Alex писал(а):Цель на будущее: оптимизация потребления энергии

У тебя еще всё впереди :)
Больше всего люди обижаются на вас за то, что вы упрямо и нахально не хотите соответствовать их личным ожиданиям.
Аватар пользователя
gregory
Администратор
 
Сообщений: 10017
Зарегистрирован:
08 фев 2011, 23:05
Откуда: Мариуполь
Мой байк: подвес
Баллы репутации: 449

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:52

Хм, дребезг, точно! я вроде тоже с ним воевал, я кажется конденсатор параллельно геркону ставил. Хотя может и программно фильтровал, надо глянуть прошивку моего второго компа...

исходник текущей прошивки
Оффтоп
#include <tiny2313.h>
#include <delay.h>

eeprom unsigned char Total, on; //переменная в eeprom
char Dig[10],t;
char Disp1, Disp2, Disp3,Disp4,k,j; // В этих переменных хранятся цифры, которые нужно отобразить
unsigned char Num1, Num2,Num3, Num4,startFlag;
unsigned int timeC=0,time=0; // переменная хранящая значение таймера при срабатывании геркона
unsigned int speed=0;
long int i;
int distance=0 ,MODE=1,TD;





// Timer 0 interrupt
// таймер для подсчета времени оборота колеса
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
time++;
}




// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{


if (startFlag==1){
timeC=time; // время между прерываниями
time=0;
};


if (startFlag==0){
time=0;
startFlag=1;
}
else {
startFlag=2;
};
}















void Display ( unsigned int Number) // Функция выделяет цифры из четырехзначного числа
{
Num1=Num2=Num3=Num4=0;
while (Number >=1000){
Number-=1000;
Num1++;
};

while (Number >= 100)
{
Number -= 100;
Num2++;
}
while (Number >= 10)
{
Number -= 10;
Num3++;
}
Num4 = Number;
Disp1 = Dig[Num1];
Disp2 = Dig[Num2];
Disp3 = Dig[Num3];
Disp4 = Dig[Num4];
};

void Dig_init() //кодировка цифр для индикатора
{
/*
Dig[0] =63; //(a+b+c+d+e+f); // для схемы с общим катодом
Dig[1] =6; // (b+c);
Dig[2] =91; // (a+b+g+e+d);
Dig[3] =79; // (a+b+g+c+d);
Dig[4] =102; // (f+g+b+c);
Dig[5] =109; // (a+f+g+c+d);
Dig[6] =125; // (a+f+g+c+d+e);
Dig[7] =7; //(a+b+c);
Dig[8] =127; // (a+b+c+d+e+f+g);
Dig[9] =111; // (a+b+c+d+f+g);
*/
Dig[0] =255-63; //(a+b+c+d+e+f); // для схемы с общим анодом
Dig[1] =255-6; // (b+c);
Dig[2] =255-91; // (a+b+g+e+d);
Dig[3] =255-79; // (a+b+g+c+d);
Dig[4] =255-102; // (f+g+b+c);
Dig[5] =255-109; // (a+f+g+c+d);
Dig[6] =255-125; // (a+f+g+c+d+e);
Dig[7] =255-7; //(a+b+c);
Dig[8] =255-127; // (a+b+c+d+e+f+g);
Dig[9] =255-111; // (a+b+c+d+f+g);
}






void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port D initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State6=0 State5=0 State4=0 State3=0 State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x78;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x03;
EIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// Global enable interrupts
#asm("sei")
Dig_init();
OCR0A=255;
PORTD.1=0;
//OCR1A=255;

//********************************************//
delay_ms(100);
if (on==0){ //сброс общего пробега
Total=0; //после перепрошивки
}; //срабатывает только один раз
on=1;
//*******************************************//

TD=Total; // запись общего пробега из EEPROM при подаче питания



while (1)
{

if (startFlag==2){ //предотвращает вывод на экран числа до первого вычисления скорости
speed=281250/timeC; //((1000000/256)*2/1000*36000)/timeC
startFlag=1; //((Гц/256)*длина колеса/1000м*3600сек*10)/timeC
i=i+184; //увеличиваем показания пробега на длину колеса
//в данном случае на 184см
};



if ((i>=100000)&&(distance<=999)){
distance++; //расстояние суточное в километрах
i=0;
TD++; // увеличиваем на 1км показания общего километража
Total=TD; //обновляем значение в EEPROM
}

if (distance==1000) {
distance=0;
};


//*************кнопка с длительным нажатием MODE*****************///
if (PIND.0==1) {
while ((PIND.0==1) && (t<=60)) { //ждем определения длительного нажатия
delay_ms(10);
t++;

PORTD.3=1; //выводим четыре прочерка
PORTD.4=1;
PORTD.5=1;
PORTD.6=1;
PORTB=191;
};

if (t<=60) { // если нажатие короткое
MODE++;
if (MODE>3) {
MODE=1;
};
while (PIND.0==1) {}; // ждем пока кнопка MODE будет отпущена
}

else { //если нажатие длинное
if (MODE==2){ //сброс суточного пробега
distance=0;
while (PIND.0==1) { // ждем пока кнопка MODE будет отпущена
PORTD.3=0;
PORTD.4=1; // и выводим три нуля
PORTD.5=1;
PORTD.6=1;
PORTB=192;
};
};
if ((MODE==1)&&(PIND.1==1)){ // вкл/выкл фонаря
//PORTD.1^=1;
PORTD.1=0;

PORTD.3=0;
PORTD.4=0; // выводим ноль
PORTD.5=0;
PORTD.6=1;
PORTB=192;
}
else {
PORTD.1=1;

PORTD.3=0;
PORTD.4=0; //выводим 1
PORTD.5=0;
PORTD.6=1;
PORTB=249;
};
while (PIND.0==1) {}; // ждем пока кнопка MODE будет отпущена
};


t=0;
};

///*****************************************************//






//********выбор режима отображения************************///
switch(MODE){
case 1: //выводим текущую скорость
Display(speed*10);
//Display(timeC);
Disp4=198; //символ "С"
break;

case 2: //выводим суточный пробег
Display(distance);
Disp1=161; //символ "d"
break;

case 3: //выводим общий пробег
Display(TD);
break;

};

//****************************************************///



if ((time>8000)&&(MODE==1)){ // обнуление скорости
speed=0; //если велик стоит
timeC=0;
startFlag=0;
if (time>20000){ //если велик стоит более 5сек
TCCR0B=0x00; //отключается дисплей
PORTB=255;
};
}
else {
TCCR0B=0x02;
};







for (j = 0; j <= 100; j++){} // Задержка для отображения цифры

if (k>=3) {
k=0;
}
else {
k++;
};

PORTB = 255; //Очистка PC7, PC6, PC5
for (j = 0; j<=10; j++){} // Задержка для выключения транзистора

switch (k) //вывод чисел на индикатор
{

case 0:
PORTD.3=0;
PORTD.4=0;
PORTD.5=0;
PORTD.6=1; // Единицы

PORTB =Disp4;
if (MODE==1){
PORTB.7=0;
};

break;
case 1: PORTD.3=0;
PORTD.4=0;
PORTD.5=1;// десятки
PORTD.6=0;

PORTB =Disp3;
//if (MODE==1){
// PORTB.7=0;
// };
break;

case 2: PORTD.3=0;
PORTD.4=1; // сотни
PORTD.5=0;
PORTD.6=0;

PORTB =Disp2;
break;

case 3: PORTD.3=1; // тысячи
PORTD.4=0;
PORTD.5=0;
PORTD.6=0;

PORTB =Disp1;
break;

};
};
};
1200 км
Аватар пользователя
Alex
 
Сообщений: 764
Зарегистрирован:
03 июн 2011, 10:46
Откуда: Bad Neustadt a.d. Saale
Мой байк: BULLS King Boa Disk/ KHS alite 350
Баллы репутации: 76

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:54

Это под меня прошивка?
Код: выделить все
nterrupt [EXT_INT0] void ext_int0_isr(void)
{


if (startFlag==1){
timeC=time; // время между прерываниями
time=0;
delay_ms(50);//и все пучком
};
qwerty999
 
Сообщений: 40
Зарегистрирован:
31 май 2013, 11:28
Мой байк: forward
Баллы репутации: 0

Re: Велокомпьютер своими руками

Сообщение 04 июн 2013, 20:56

Точно, программно фильтровал. Делей я бы лучше не использовал. Вот такое решение есть:

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{


if ((startFlag==1)&&(time>=290)){
timeC=time;
time=0;
};


if (startFlag==0){
time=0;
startFlag=1;
}
else {
startFlag=2;
};
}
Последний раз редактировалось Alex 04 июн 2013, 21:19, всего редактировалось 1 раз.
1200 км
Аватар пользователя
Alex
 
Сообщений: 764
Зарегистрирован:
03 июн 2011, 10:46
Откуда: Bad Neustadt a.d. Saale
Мой байк: BULLS King Boa Disk/ KHS alite 350
Баллы репутации: 76

Пред.След.

Вернуться в Комментарии к материалам сайта

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1