Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Ответить

спидометр для велосипеда на arduino

Пт май 01, 2020 15:01:41

Есть ардуино нано с экраном 1602 подключенное по I2C. Подскажите пожалуйста, куда можно подключить геркон и какой код можно написать чтобы он показывал скорость?

Re: спидометр для велосипеда на arduino

Пт май 01, 2020 17:07:48

какой сможешь, такой и пиши... :)

Re: спидометр для велосипеда на arduino

Вт май 05, 2020 00:03:23

нашёл такой код, но ничего не отображается

int val;
long last=0;
int stat=LOW;
int stat2;
int contar=0;
int displayrpm;
int sens=75; // this value indicates the limit reading between dark and light,
// it has to be tested as it may change acording on the
// distance the leds are placed.
int nPalas=1; // the number of blades of the propeller
int milisegundos=500; // the time it takes each reading
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
void setup()
{
Serial.begin(9600);

lcd.begin(16,2);
}
void loop()
{
val=analogRead(0);
if(val<sens)
stat=LOW;
else
stat=HIGH;
digitalWrite(13,stat); //as iR light is invisible for us, the led on pin 13
//indicate the state of the circuit.
if(stat2!=stat){ //counts when the state change, thats from (dark to light) or
//from (light to dark), remmember that IR light is invisible for us.
contar++;
stat2=stat;
}
if(millis()-last>=milisegundos){
double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos;
double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos);
displayrpm=rpm;
Serial.print((contar/2.0));Serial.print(" RPS ");Serial.print(rps);
Serial.print(" RPM");Serial.print(rpm);Serial.print(" VAL ");Serial.println(val);
contar=0;
last=millis();
Serial.print(" MPH ");
Serial.print(rpm*0.0080622311);

LCDPrint ();
}
}
void LCDPrint ()
{
lcd.clear ();
lcd.setCursor (0,0);
lcd.print("MPH");
lcd.setCursor (0,1);
lcd.print(displayrpm*0.0080622311 );
lcd.setCursor (8,0);
lcd.print("RPM");
lcd.setCursor (8,1);
lcd.print(displayrpm);
return;
}

Re: спидометр для велосипеда на arduino

Вт май 05, 2020 07:55:53

разбей задачу на 2 части - писать на экране и измерять скорость и реши их по-очереди.
1) правильно подключи дисплей, научись выводить текст и переменные (вроде в арду за это отвечают разные команды) в требуемом тебе виде
тогда уже переходи к задаче №2 - к измерению скорости, когда решишь её, можно добавить №3 - автоматическое включение-выключение...

Re: спидометр для велосипеда на arduino

Вт май 05, 2020 15:38:43

Ivanoff-iv,
Подключить, то я подключил и надписи выводил. А тут не знаю почему. Я то ардуино начал неделю назад заниматься

Re: спидометр для велосипеда на arduino

Вт май 05, 2020 16:06:32

все когдато начинали... я тоже с ардуины начинал, (из-за лсд дисплея, который был в комплекте с моей ардуиной и который сам без подсказок я запустить был не в состоянии)
так, текст уже выходит, хорошо, значит всё собрано правильно.
теперь изучай и выводи на дисплей переменные, как выведешь - пиши, не знаю, хватит ли точности миллис, попробуем находить скорость с помощью неё... (скорее всего повторим код написанный тобой выше, но, может и нет..., но даже если и повторим, то это будет осознанный код, а не простая копипаста).

Re: спидометр для велосипеда на arduino

Чт май 07, 2020 15:42:23

Помогите с кодом пожалуйста. 2 недели пытаюсь найти, уже ардуино с экраном сжег по случайности, не хочу еще один набор сжечь

Re: спидометр для велосипеда на arduino

Чт май 07, 2020 18:07:13

ка можно сжечь
ардуино с экраном сжег по случайности

непонятно в 230 засунул?

Re: спидометр для велосипеда на arduino

Чт май 07, 2020 18:46:22

musor,
Магнит случайно уронил на плату экрана, испортился не только экран. Проверял на новом экране

Добавлено after 18 minutes 1 second:
/*
Created 2016
by AlexGyver
AlexGyver Home Labs Inc.
*/


//----------
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
//--------дисплей-------

float w_length=2.050; //длина окружности колеса в метрах

void setup() {
Serial.begin(9600); //открыть порт
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин

//для дисплея цифры----------
LED_0F[0] = 0xC0; //0
LED_0F[1] = 0xF9; //1
LED_0F[2] = 0xA4; //2
LED_0F[3] = 0xB0; //3
LED_0F[4] = 0x99; //4
LED_0F[5] = 0x92; //5
LED_0F[6] = 0x82; //6
LED_0F[7] = 0xF8; //7
LED_0F[8] = 0x80; //8
LED_0F[9] = 0x90; //9

LED_0F[10] = 0b01000000; //.0
LED_0F[11] = 0b01111001; //.1
LED_0F[12] = 0b00100100; //.2
LED_0F[13] = 0b00110000; //.3
LED_0F[14] = 0b00011001; //.4
LED_0F[15] = 0b00010010; //.5
LED_0F[16] = 0b00000010; //.6
LED_0F[17] = 0b01111000; //.7
LED_0F[18] = 0b00000000; //.8
LED_0F[19] = 0b00010000; //.9
Timer1.initialize(1500); // set a timer of length 1500
Timer1.attachInterrupt(timerIsr); // attach the service routine here
//----------
}

void sens() {
if (millis()-lastturn > 80) { //защита от случайных измерений (основано на том, что велосипед не будет ехать быстрее 120 кмч)
SPEED=w_length/((float)(millis()-lastturn)/1000)*3.6; //расчет скорости, км/ч
lastturn=millis(); //запомнить время последнего оборота
DIST=DIST+w_length/1000; //прибавляем длину колеса к дистанции при каждом обороте оного
}
}

void loop() {
int cel_sp=floor(SPEED);
int sot_sp=(((float)cel_sp/1000)-floor((float)cel_sp/1000))*10;
int des_sp=(((float)cel_sp/100)-floor((float)cel_sp/100))*10;
int ed_sp=(((float)cel_sp/10)-floor((float)cel_sp/10))*10;
int dr_sp=(float)(SPEED-floor(SPEED))*10;

if (flag==0) {
//disp.set(LED_0F[sot_sp],3); //вывод сотен скорости (для велосипеда не нужно =)
disp.set(LED_0F[des_sp],2); //вывод десятков скорости
disp.set(LED_0F[ed_sp+10],1); //вывод единиц скорости, с точкой
disp.set(LED_0F[dr_sp],0); //вывод после точки
}

int cel_di=floor(DIST); //целые
int sot_di=(((float)cel_di/1000)-floor((float)cel_di/1000))*10; //сотни
int des_di=(((float)cel_di/100)-floor((float)cel_di/100))*10; //десятки
int ed_di=floor(((float)((float)cel_di/10)-floor((float)cel_di/10))*10); //единицы (с точкой)
int dr_di=(float)(DIST-floor(DIST))*10; //десятые части



if ((millis()-lastturn)>2000){ //если сигнала нет больше 2 секунды
SPEED=0; //считаем что SPEED 0
}

void timerIsr() //нужно для дисплея
{
disp.timerIsr();
}

Пытаюсь переделать этот код под себя, но не знаю что делать с выводом на экран

Re: спидометр для велосипеда на arduino

Чт май 07, 2020 20:58:57

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

Re: спидометр для велосипеда на arduino

Пт май 08, 2020 00:43:41

Спидометр на абдурине? И как в том ералаше — таскать за собой прицеп с батарейками... Ну или более простой вариант накачивать ноги: работать на генератор!

Re: спидометр для велосипеда на arduino

Пт май 08, 2020 10:11:04

Ivanoff-iv,
Когда я смог подключить дисплей, датчик холла стал считывать секунду(то есть ему нужна секунда чтоб увидеть магнит). Пытался найти в чем причина и решил попробовать другой переделать, но с новым кодом тоже проблемы

Re: спидометр для велосипеда на arduino

Сб окт 24, 2020 13:18:17

Вывалю свой набросок, отсюда, наверно почти лучший вариант что попалось.
В общем эта фигня не работает на таких скоростях.
Редкие импульсы оно показывает как 500, потом цифра вырастает раз в 5, потом ещё вдвое, сбрасывает на 0 и повторяется. Может можно посчитать какоето среднее, но чё контролер забивать такой фигнёй, ему и так работы валом.

В общем думаю прилепить чтото такое или такое.

Частоту не знаю, возможно 10гц, мои приборы такие короткие импульсы не видят.
Один из вариантов поставить удвоитель частоты на логике, не знаю на сколько оно сможет работать.

Спойлер
Код:
volatile int time = 0;
volatile int time_last = 0;
volatile float rev=0;
volatile int rpm;

//сетуп
setitr();
digitalWrite(2, HIGH);
//

void taho() {
  rev++;
}

void setitr(){
  attachInterrupt(0,taho,FALLING); //digitalPinToInterrupt(2)
}


//цикл
detachInterrupt(0);   

time = ( millis() - time_last);
rpm=(rev/time)*60000;
time_last = millis();
rev=0;

setitr();

//
Алгоритм я понял так.
Берётся цифра которая выросла за всё время до импульса и она показывается, ну и заодно прибавляется к другой цифре из которой и будет опять взята эта цифра. Этот трюк работает если эти цифры получать часто чтоб экран не успевал их убирать.
Этот код изначально казался сложным и примудрым, я думал реально есть какойто таймер который следит за участком времени, а оказалось тут вообще голимо.

----------

Как оказалось это работает если delay хотябы 250, а в идеале больше чем импульс. Но уже при такой на экране секунды начали не попадать. Так что такой измеритель и часы в одной коробке уже не получатся

Re: спидометр для велосипеда на arduino

Пн окт 26, 2020 11:00:50

У адуринки есть функция
pulseIn(pin, value)
которая
"Works on pulses from 10 microseconds to 3 minutes in length."
Интервал между сигналом датчика нам известен, длина окружности колеса (при давлении "по умолчанию") также.
Вот на основе этих данных и строим "веломер".
8)

Re: спидометр для велосипеда на arduino

Вт окт 27, 2020 00:38:32

В общем то прикинул и оказалось что при длине окружности малюсенького колеса 1.69м, частота получается 0.02 в секунду за 1км/ч.
Это всё полнейшая фигня. Надо или магнитов добавлять, или брать с внутреннего датчика с потерями, или умножать или замерять както ещё, как вариант отдельный МК который не будет занят экраном.

pulseIn()
Код:
const int pintaho = 2;
unsigned long duration;
 
void setup()

  pinMode(pintaho, INPUT);
  digitalWrite(pintaho, HIGH);
}
 
void loop()
{
  duration = pulseIn(pintaho , LOW);
}

Насчитывает 6, 8, 9. Если в последней строчке поставить HIGH, тогда вдвое меньше кажет. Ну можно резюк приколхозить вместо "digitalWrite(pintaho, HIGH);", но сомневаюсь что оно чтото даст.

Видимо мои старые подсчёты с ошибками, там говорится о 3 магнитах, да и окружность 1м видимо наугад. Там была вообще другая цель эстетическая, перевода в метры в минуту, поэтому о частоте и не думал.

---
С этим кодом контролер стартует не сразу, а секунды через 3

Re: спидометр для велосипеда на arduino

Вт окт 27, 2020 09:22:44

У старомеханического на оси втулки колеса стоял диск с пазами, которые шестернку крутили.
Уж не помню, сколько там пазов/зубьев было... А с шерстеренки тросик шел в головку со стрелкой(текущая скорость) и барабанным счетчиком(километраж).
Хоша... В принципе и один оборот тем pulseIn(pin, value) замерить можно, но потребуется и усреднение и масштабирование результата, да еще и отсечка "неполного оборота" при "пешем ходе" (или "обратном вращении).
Как вариант - два датчика со смещением и областью взаимоперекрытия - как у контактов энкодера.
8)

Re: спидометр для велосипеда на arduino

Вт окт 27, 2020 11:27:19

У механики был механизм, передающий на тросик вращение (передаточное число было около 3-4) но это совсем другая история...
74LS00, бешеная производительность... :facepalm: может в этом случае есть смысл слезть с ардуины? :dont_know:
(в смысле - платку оставить, а программу сменить? ИМХО для этой задачи заглаза тини2313 хватит... при нормальной программе)

Re: спидометр для велосипеда на arduino

Вт окт 27, 2020 12:25:49

Ну уж не так, чтоб и другая...
Допустим моторчик, выдающий ЭДС пропорционально скорости вращения вала.
И тот же вопрос на сколько "тиков" оборот колеса поделить...
Хотя ... я б таки два датчика с пластиной поставил - как у энкодера...
А к оному периодомер с пересчетом...
:roll:

Re: спидометр для велосипеда на arduino

Вт окт 27, 2020 12:53:20

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

Re: спидометр для велосипеда на arduino

Вт окт 27, 2020 14:12:12

Герконы конечно можно (надежное народное средство)...
Однако есть и поинтереснее:
A3141-2-3-4.pdf
(735.22 KiB) Скачиваний: 266

AH3503.pdf
(205.21 KiB) Скачиваний: 242

что тот,что другой сейчас у торговцев абдуринкой продаются...
:roll:
Ответить