#1 2025-04-12 20:52:29

АлександрK
Учасник
Зареєстрований: 2025-04-12
Повідомлень: 9

Лічильник оборотів на моторчику від CD

Добрый день.Пытаюсь написать скетч для счётчика оборотов при помощи моторчика от CD.Вывод информации идёт на ТМ1637.Моторчик подключен к А1 и А0.На ТМ1637 вывел " 0000 ".Это всё, что получилось.Затем стал пытатся подключить моторчик, но не могу правильно написать скеч.Счёт оборотов в обе стороны.При достижении 9999 переход в 0000 и при отнимании до 0000, переход в 9999 и дальше в минус.Отдельно нужна кнопка сброса на 0000.
Чи зможете це допомогти? І скільки це буде коштувати?

Неактивний

#2 2025-04-12 21:05:00

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

Хотів написати іскрометний комент , але стримався wink
Як ви собі уявляєте відповідь, коли в запитанні ні рядку кода ні малюнка одна жалоба на життя? wink

#3 2025-04-12 23:07:52

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

jokeer пише:

Хотів написати іскрометний комент , але стримався wink
Як ви собі уявляєте відповідь, коли в запитанні ні рядку кода ні малюнка одна жалоба на життя? wink

Це те, що я зміг написати. Але зробив багато помилок, які сам знайти не можу

#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};   
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value){
  t[3]=((value/1000)%10);
  t[2]=((value/100)%10);
  t[1]=((value/10)%10);
  t[0]=((value/1)%10);
  }
void setup()
{
  tm1637.init();
  pinMode(AN0,OUTPUT);
  pinMode(AN1,OUTPUT);
  pinMode(A0,INPUT)

  tm1637.set(2);
  tm1637.point(false);
  tm1637.display(DispMSG);
  delay(1000);
}
void loop()
{
if (digitalRead(MINUS)==LOW) ctr=0;

pinMode(A1,OUTPUT);
digitalWrite(A1,LOW);
a=analogRead(A0);
if (a>0) ctr+=1+a/9;

pinMode(A0,OUTPUT);
digitalWrite(A0,LOW);
a=analogRead(A1);
if (a>0) ctr-=1+a/9;

updateDisplay(1);
decimal(ctr/10);

num (i);
  tm1637.display(0,t[3]);
  tm1637.display(1,t[2]);
  tm1637.display(2,t[1]);
  tm1637.display(3,t[0]);
  delay(1000);
  i++;
  if(i>=9999);{
    i=0;
    }
  delay(1000);
}

#4 2025-04-12 23:09:45

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

АлександрК пише:
jokeer пише:

Хотів написати іскрометний комент , але стримався wink
Як ви собі уявляєте відповідь, коли в запитанні ні рядку кода ні малюнка одна жалоба на життя? wink

Це те, що я зміг написати. Але зробив багато помилок, які сам знайти не можу

#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};   
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value){
  t[3]=((value/1000)%10);
  t[2]=((value/100)%10);
  t[1]=((value/10)%10);
  t[0]=((value/1)%10);
  }
void setup()
{
  tm1637.init();
  pinMode(AN0,OUTPUT);
  pinMode(AN1,OUTPUT);
  pinMode(A0,INPUT)

  tm1637.set(2);
  tm1637.point(false);
  tm1637.display(DispMSG);
  delay(1000);
}
void loop()
{
if (digitalRead(MINUS)==LOW) ctr=0;

pinMode(A1,OUTPUT);
digitalWrite(A1,LOW);
a=analogRead(A0);
if (a>0) ctr+=1+a/9;

pinMode(A0,OUTPUT);
digitalWrite(A0,LOW);
a=analogRead(A1);
if (a>0) ctr-=1+a/9;

updateDisplay(1);
decimal(ctr/10);

num (i);
  tm1637.display(0,t[3]);
  tm1637.display(1,t[2]);
  tm1637.display(2,t[1]);
  tm1637.display(3,t[0]);
  delay(1000);
  i++;
  if(i>=9999);{
    i=0;
    }
  delay(1000);
}


Ось такий Траур.Готую гроші.

#5 2025-04-13 00:03:03

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 377

Re: Лічильник оборотів на моторчику від CD

АлександрК пише:
#include "TM1637.h"

Перш за все давайте посилання на бібліотеки, які використовуєте.

АлександрК пише:
  pinMode(AN0,OUTPUT);
  pinMode(AN1,OUTPUT);

Що за AN0 і AN1? Яка у вас платформа взагалі?

АлександрК пише:
void setup()
{
...
  delay(1000);
}

Ну от навіщо в setup() ця затримка в одну секунду?

АлександрК пише:
if (digitalRead(MINUS)==LOW) ctr=0; 
...
updateDisplay(1);
...
decimal(ctr/10);
...
num (i);

Де обʼявлені ці ctr, updateDisplay, decimal, num? Цей код взагалі не має компілюватись.

Неактивний

#6 2025-04-13 07:07:33

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

Ще б хто пояснив, що за моторчик і звідки в ньому лічильник обертів.  І цей кусок коду..  Ви прикалуєтесь, ага? wink

#7 2025-04-13 09:28:15

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

dimich пише:
АлександрК пише:
#include "TM1637.h"

Перш за все давайте посилання на бібліотеки, які використовуєте.

librariesGrove_4-Digit_DisplayTM1637.h

АлександрК пише:
  pinMode(AN0,OUTPUT);
  pinMode(AN1,OUTPUT);

Що за AN0 і AN1? Яка у вас платформа взагалі?

Моя помилка, має бути А0 та А1

АлександрК пише:
void setup()
{
...
  delay(1000);
}

Ну от навіщо в setup() ця затримка в одну секунду?

Навіть не знаю навіщо. Так запропонували написати. Прибрати зовсім, щоб не заважала.

АлександрК пише:
if (digitalRead(MINUS)==LOW) ctr=0; 
...
updateDisplay(1);
...
decimal(ctr/10);
...
num (i);

Де обʼявлені ці ctr, updateDisplay, decimal, num? Цей код взагалі не має компілюватись.

я розумію, що написав нісенітницю. Хочу зробити правильно, але не знаю як.

#8 2025-04-13 10:10:17

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

Почніть з постановки задачі. Ви хочете запустити мотор в режимі лічильника обертів? Чи крутити мотор і рахувати оберти?
Якщо це щось за мотивами чогось існуючого, непогано б показати. Якщо це авторська задумка - тим більше треба її роз'яснити.

#9 2025-04-13 10:21:40

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

jokeer пише:

Почніть з постановки задачі. Ви хочете запустити мотор в режимі лічильника обертів? Чи крутити мотор і рахувати оберти?
Якщо це щось за мотивами чогось існуючого, непогано б показати. Якщо це авторська задумка - тим більше треба її роз'яснити.

Необхідно вважати обороти при різній швидкості обертання як в одну сторону, так і в іншу. Використовуючи моторчик, як генератор. Не можу виставити фото, пробував, не вийшло.

#10 2025-04-13 11:08:49

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

Ну, припустимо. чому не взяти готовий датчик, оптичний чи магнітний? Чи вам цікаво саме свій моторчик задіяти?
Якщо є референс - показуйте, якщо це авторська задумка - ви самі зможете пояснити, за рахунок чого і як воно працює. Бо я здогадуюсь, але в мене є сумніви.

#11 2025-04-13 11:50:00

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 377

Re: Лічильник оборотів на моторчику від CD

Ви так і не написали, що у вас за платформа. AN0/AN1 схоже на PIC.

АлександрК пише:

Необхідно вважати обороти при різній швидкості обертання як в одну сторону, так і в іншу. Використовуючи моторчик, як генератор.

Який у вас моторчик? Той, що крутить диск? Там зазвичай BLDC моторчик з двома проводами. Теоретично, в певному діапазоні швидкостей можна виділяти пульсації за допомогою алгоритмів DSP і дуже приблизно рахувати кількість обертів. Ви ж розумієте, що при повільному обертанні напруга з нього мізерна, може бути нижче рівня чутливості, а при досить великій швидкості напруга може перевищувати допустиму для ADC? До того ж, щоб працювало в обидві сторони, потрібно або додавати позитивне зміщення ззовні, або двополярний ADC.

Схоже на якесь збочення. Чому не застосувати який-небудь оптичний енкодер?

АлександрК пише:

Не можу виставити фото, пробував, не вийшло.

Внизу вікна редагування є "Завантаження".

Неактивний

#12 2025-04-13 12:14:46

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

Без пояснень автора незрозуміло. Може, похибка його влаштовує. Може в нього аналогова частина все рішає wink
Я б приклеїв на вал 2 магніти і розмістив поруч 2 датчика Холла.  А мотор використав в роль мотора.

#13 2025-04-13 12:17:13

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

jokeer пише:

Ну, припустимо. чому не взяти готовий датчик, оптичний чи магнітний? Чи вам цікаво саме свій моторчик задіяти?
Якщо є референс - показуйте, якщо це авторська задумка - ви самі зможете пояснити, за рахунок чого і як воно працює. Бо я здогадуюсь, але в мене є сумніви.

Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві. По годинниковій плюс, а проти мінус. Коліщатко від мишки на швидкості моторчика не витримає.

#14 2025-04-13 12:24:41

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

>> Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві

2 датчика, під кутом.

Мотор на малих обертах даватиме малу ерс, на великих ви можете не встигнете оцифрувати. Або потрібна нормальна аналогова частина, або більш детальне пояснення.

#15 2025-04-13 12:26:49

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

dimich пише:

Ви так і не написали, що у вас за платформа. AN0/AN1 схоже на PIC.

АлександрК пише:

Необхідно вважати обороти при різній швидкості обертання як в одну сторону, так і в іншу. Використовуючи моторчик, як генератор.

Який у вас моторчик? Той, що крутить диск? Там зазвичай BLDC моторчик з двома проводами. Теоретично, в певному діапазоні швидкостей можна виділяти пульсації за допомогою алгоритмів DSP і дуже приблизно рахувати кількість обертів. Ви ж розумієте, що при повільному обертанні напруга з нього мізерна, може бути нижче рівня чутливості, а при досить великій швидкості напруга може перевищувати допустиму для ADC? До того ж, щоб працювало в обидві сторони, потрібно або додавати позитивне зміщення ззовні, або двополярний ADC.

Схоже на якесь збочення. Чому не застосувати який-небудь оптичний енкодер?

Можливо, ви маєте рацію і мені потрібно переглянути ідею. Я робив виміри на обертання. При мінімальному моторчику дає 0,7 V, при махімальному близько 5 V.
Якщо знайти оптику, яка працює в обидві сторони, то це, звичайно, краще.

АлександрК пише:

Не можу виставити фото, пробував, не вийшло.

Внизу вікна редагування є "Завантаження".

#16 2025-04-13 12:32:44

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

jokeer пише:

Без пояснень автора незрозуміло. Може, похибка його влаштовує. Може в нього аналогова частина все рішає wink
Я б приклеїв на вал 2 магніти і розмістив поруч 2 датчика Холла.  А мотор використав в роль мотора.

А як визначити обертання? За годинниковою чи проти?

#17 2025-04-13 12:36:32

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 377

Re: Лічильник оборотів на моторчику від CD

АлександрК пише:

Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві.

Квадратурний покаже в обидві сторони.

АлександрК пише:

Коліщатко від мишки на швидкості моторчика не витримає.

Тобто задача зводиться до вибору підходящого енкодера з необхідними механічними параметрами.

Неактивний

#18 2025-04-13 12:37:22

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

jokeer пише:

>> Оптичний або магнітний датчик вважає в один бік, а мені потрібно в обидві

2 датчика, під кутом.

Мотор на малих обертах даватиме малу ерс, на великих ви можете не встигнете оцифрувати. Або потрібна нормальна аналогова частина, або більш детальне пояснення.

Потрібно спробувати.
Але все одно скетч писати треба, а в мене по скетчу знань із Гулькін

#19 2025-04-13 12:38:50

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

за фазою імпульсів.
Звичайно, якщо крутити вал хитрим способом, то такий г***о-датчик можна обманути. Якщо це критично, треба йти до токаря, хай робить нормальний багатополюсний датчик.

#20 2025-04-13 12:44:54

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

>> Але все одно скетч писати треба, а в мене по скетчу знань із Гулькін

Якщо це хоббі - проект, то нормально. Заодно і вивчите.
Якщо бізнес.. Ідея датчиків з г***на і сірників мені не подобається. Нормально проектуйте, нормально робіть.

#21 2025-04-13 13:34:34

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

jokeer пише:

>> Але все одно скетч писати треба, а в мене по скетчу знань із Гулькін

Якщо це хоббі - проект, то нормально. Заодно і вивчите.
Якщо бізнес.. Ідея датчиків з г***на і сірників мені не подобається. Нормально проектуйте, нормально робіть.

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

#22 2025-04-13 13:43:17

АлександрК
Гість

Re: Лічильник оборотів на моторчику від CD

Тоді це буде скетч для дисплея і потрібно додати два входи для оптодатчиків та один для скидання на 0


#include "TM1637.h"
int8_t DispMSG[] = {1, 2, 3, 4};   
#define CLK 3
#define DIO 2
TM1637 tm1637(CLK, DIO);
int i=0;
int t[4]={0,0,0,0};
void num(unsigned int value){
  t[3]=((value/1000)%10);
  t[2]=((value/100)%10);
  t[1]=((value/10)%10);
  t[0]=((value/1)%10);
  }
void setup()
{
  tm1637.init();

  tm1637.set(2);
  tm1637.point(false);
  tm1637.display(DispMSG);

}
void loop()
{
num (i);
  tm1637.display(0,t[3]);
  tm1637.display(1,t[2]);
  tm1637.display(2,t[1]);
  tm1637.display(3,t[0]);
  delay(1000);
  i++;
  if(i>=9999);{
    i=0;
    }

#23 2025-04-13 15:12:23

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 377

Re: Лічильник оборотів на моторчику від CD

АлександрК пише:

Тоді це буде скетч для дисплея і потрібно додати два входи для оптодатчиків та один для скидання на 0

Ось ця бібліотека використовується?

uint8_t DispMSG[] = {1, 2, 3, 4};   

display() приймає масив uint8_t. int8_t тут теж працюватиме, але краще одразу писати правильно.

int t[4]={0,0,0,0};

Навіщо ще один масив, тим більше int? Можна ж

void num(unsigned int value)
{
  DispMSG[0]=((value/1000)%10);
  DispMSG[1]=((value/100)%10);
  DispMSG[2]=((value/10)%10);
  DispMSG[3]=((value/1)%10);
}

Або краще так:

void num(unsigned int value)
{
    for (int8_t i = 3; i>=0; i--) {
        DispMSG[i] = value % 10;
        value /= 10;
    }
}

І замість цього

АлександрК пише:
  tm1637.display(0,t[3]);
  tm1637.display(1,t[2]);
  tm1637.display(2,t[1]);
  tm1637.display(3,t[0]);

просто

tm1637.display(DispMSG);

Хоча я б взагалі зберігав лічильник в BCD, там його ж і модифікував, наприклад так:

void inc()
{
    for (int8_t i = 3; i>=0; i--) {
        if (DispMSG[i] == 9) {
            DispMSG[i] = 0;
        } else {
            DispMSG[i]++;
            break;
        }
    }
}

void dec()
{
    for (int8_t i = 3; i>=0; i--) {
        if (DispMSG[i] == 0) {
            DispMSG[i] = 9;
        } else {
            DispMSG[i]--;
            break;
        }
    }
}

За потреби значення в unsigned int береться з нього елементарно.

Остання редакція dimich (2025-04-13 15:16:57)

Неактивний

#24 2025-04-13 15:13:52

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

Ок. Це демка до індикатора. Тепер зробіть щоб функції delay () там не було wink А також змінну з лічильником назвіть якось осмислено. Глобальна змінна І це лютий крінж.

#25 2025-04-13 15:23:32

jokeer
Гість

Re: Лічильник оборотів на моторчику від CD

А взагалі беріть олівець, малюйте схему, які сигнали в який момент звідки беруться і як їх потрібно обробляти. Спочатку складіть алгоритм, а закодити його нескладно. Якщо спочатку писати код, а потім намагатись зрозуміти що там не так - нічого толкового не вийде.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму