Например TDA7294

Форум РадиоКот :: Просмотр темы - спидометр для велосипеда на arduino
Форум РадиоКот
https://radiokot.ru/forum/

спидометр для велосипеда на arduino
https://radiokot.ru/forum/viewtopic.php?f=43&t=170459
Страница 1 из 3

Автор:  Timur86 [ Пт май 01, 2020 15:01:41 ]
Заголовок сообщения:  спидометр для велосипеда на arduino

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

Автор:  1en2 [ Пт май 01, 2020 17:07:48 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Timur86 [ Вт май 05, 2020 00:03:23 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

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;
}

Автор:  Ivanoff-iv [ Вт май 05, 2020 07:55:53 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Timur86 [ Вт май 05, 2020 15:38:43 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Ivanoff-iv [ Вт май 05, 2020 16:06:32 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Timur86 [ Чт май 07, 2020 15:42:23 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  musor [ Чт май 07, 2020 18:07:13 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

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

Автор:  Timur86 [ Чт май 07, 2020 18:46:22 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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();
}

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

Автор:  Ivanoff-iv [ Чт май 07, 2020 20:58:57 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Eddy_Em [ Пт май 08, 2020 00:43:41 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Timur86 [ Пт май 08, 2020 10:11:04 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  74LS00 [ Сб окт 24, 2020 13:18:17 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

Вывалю свой набросок, отсюда, наверно почти лучший вариант что попалось.
В общем эта фигня не работает на таких скоростях.
Редкие импульсы оно показывает как 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, а в идеале больше чем импульс. Но уже при такой на экране секунды начали не попадать. Так что такой измеритель и часы в одной коробке уже не получатся

Автор:  BOB51 [ Пн окт 26, 2020 11:00:50 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  74LS00 [ Вт окт 27, 2020 00:38:32 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

В общем то прикинул и оказалось что при длине окружности малюсенького колеса 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

Автор:  BOB51 [ Вт окт 27, 2020 09:22:44 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Ivanoff-iv [ Вт окт 27, 2020 11:27:19 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  BOB51 [ Вт окт 27, 2020 12:25:49 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  Ivanoff-iv [ Вт окт 27, 2020 12:53:20 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Автор:  BOB51 [ Вт окт 27, 2020 14:12:12 ]
Заголовок сообщения:  Re: спидометр для велосипеда на arduino

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

Вложение:
AH3503.pdf [205.21 KiB]
Скачиваний: 285

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

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/