#76 2025-04-18 17:35:55

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

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

jokeer пише:

Ну, я вам не вірю wink але якщо ваші датчики дійсно так працюють, як ви стверджуєте, беріть той кусок коду що я нашкрябав. Для другого датчика так само, але counter --
Я попередив, за кожний оберт спрацюють обидва датчики по черзі, і лічильник не поміняє значення.

mini_Skize.jpeg

Світловий бар'єр 1 - OUT 1
Світловий бар'єр 2 - OUT 2

Неактивний

#77 2025-04-18 17:56:34

jokeer
Гість

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

Датчики то фігня, а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..

#78 2025-04-18 18:14:26

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

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

jokeer пише:

Датчики то фігня, а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..

Цього я не знаю, як і багато іншого

Неактивний

#79 2025-04-18 18:19:32

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 160

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

Того  ніхто не знає (ц) wink
Вдалось прочитати повідомлення?

Неактивний

#80 2025-04-18 18:24:36

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

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

jokeR пише:

Того  ніхто не знає (ц) wink
Вдалось прочитати повідомлення?

так

Неактивний

#81 2025-04-18 20:32:29

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

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

jokeer пише:

а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..

Наскільки розумію, воно занадто рано створює посилання на нову сторінку стрічки (оті [ 1 2 3 4 ] вгорі біля теми), і при відповіді автоматично перекидає на ту неіснуючу сторінку. Якщо повернутись на попередню сторінку, то повідомлення стає видно.

Неактивний

#82 2025-04-18 21:10:51

jokeer
Гість

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

А ось деякі свої повідомлення я не бачу. Але якщо почну писати нове повідомлення, і натисну preview - тоді побачу wink

#83 2025-08-25 10:57:24

Bird
Учасник
Зареєстрований: 2025-08-14
Повідомлень: 2

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

Для реалізації лічильника обертів із моторчика CD-ROM і виводу на TM1637, спершу переконайся, що мотор дає чіткі імпульси — краще використовувати енкодер. Підключи його до цифрових пінів, наприклад D2 і D3, і відстежуй зміну станів для визначення напрямку. Лічильник має інкрементуватися або декрементуватися, переходити з 9999 на 0000 і навпаки. Для скидання — окрема кнопка на піні, яка обнуляє значення. Використовуй бібліотеки TM1637Display та Encoder.

Неактивний

#84 2025-08-26 18:01:49

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 18

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

Беремо оптопару з опто мишки
Принцип роботи: Кулко з прорізами обертається між ІЧ-випромінювачем та приймачем оптопари.
При кожному проходженні прорізу сигнал на піні змінюється (LOW - HIGH).
Вважаємо кількість імпульсів.
За замовчуванням: 1 імпульс = 1 проріз. Але нам потрібно: 1 оборот = N прорізів > калібрування.

Встанови через Arduino IDE > Скетч > Підключити бібліотеку > Керувати бібліотеками:
TM1637Display (автор: avishorp)
   
Як калібрувати:
Запусти пристрій. Повертай колесо рівно один оборот. Натисніть кнопку "Калібрування" - екран покаже "CAL". Зроби один повний оборот. Знову натисніть "Калібрування" - пристрій запам'ятає кількість імпульсів за оборот.

Або два датчики Холла, зсунуті по колу на 1/4 кроку між магнітами → вийде квадратурний сигнал.
Варіанти:
    Один магніт + два датчики - зміщені на 45-90 ° механічно

schet_20250826-1838.jpg


#include <TM1637Display.h>

// Пины
#define CLK 2
#define DIO 3
#define PIN_A 4
#define PIN_B 5
#define BTN_RESET 6
#define BTN_CAL 7

// TM1637 дисплей
TM1637Display display(CLK, DIO);

// Переменные
volatile long pulseCount = 0;        // счётчик импульсов
long revolutions = 0;                // количество оборотов
int pulsesPerRevolution = 24;        // калибровочное значение (по умолчанию 24 прорези на оборот)
bool calibrating = false;            // режим калибровки
unsigned long lastTime = 0;

// Предварительное объявление
void updateDisplay();
void ICACHE_RAM_ATTR onPulse();

void setup() {
  pinMode(PIN_A, INPUT_PULLUP);
  pinMode(PIN_B, INPUT_PULLUP);
  pinMode(BTN_RESET, INPUT_PULLUP);
  pinMode(BTN_CAL, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(PIN_A), onPulse, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_B), onPulse, CHANGE);

  display.setBrightness(0x0f); // максимальная яркость

  Serial.begin(9600);
}

void loop() {
  static unsigned long lastDebounce = 0;
  int readingReset = digitalRead(BTN_RESET);
  int readingCal = digitalRead(BTN_CAL);

  // Кнопка сброса
  if (readingReset == LOW && millis() - lastDebounce > 200) {
    pulseCount = 0;
    revolutions = 0;
    updateDisplay();
    lastDebounce = millis();
  }

  // Кнопка калибровки
  if (readingCal == LOW && millis() - lastDebounce > 200) {
    calibrating = !calibrating;
    if (calibrating) {
      // Выводим "CAL" на дисплей
      uint8_t data[] = {0b00111001, 0b00001110, 0b00111001, 0b00111001}; // "CAL"
      display.setSegments(data);
    } else {
      // Выход из калибровки — считаем, что 1 оборот = текущее значение |pulseCount|
      if (abs(pulseCount) > 0) {
        pulsesPerRevolution = abs(pulseCount);
      }
      pulseCount = 0;
      revolutions = 0;
    }
    delay(300); // антидребезг
    lastDebounce = millis();
  }

  // Обновляем обороты раз в 100 мс
  if (millis() - lastTime > 100) {
    if (!calibrating) {
      revolutions = pulseCount / pulsesPerRevolution;
    }
    updateDisplay();
    lastTime = millis();
  }
}

// Обработка изменения сигнала на A или B
void ICACHE_RAM_ATTR onPulse() {
  static uint8_t lastState = 0;
  uint8_t state = (digitalRead(PIN_A) << 1) | digitalRead(PIN_B);

  if (state != lastState) {
    // Квадратурный декодер
    switch (lastState) {
      case 0b00:
        if (state == 0b01) pulseCount--;
        else if (state == 0b10) pulseCount++;
        break;
      case 0b01:
        if (state == 0b11) pulseCount--;
        else if (state == 0b00) pulseCount++;
        break;
      case 0b11:
        if (state == 0b10) pulseCount--;
        else if (state == 0b01) pulseCount++;
        break;
      case 0b10:
        if (state == 0b00) pulseCount--;
        else if (state == 0b11) pulseCount++;
        break;
    }
    lastState = state;
  }
}

// Обновление дисплея
void updateDisplay() {
  if (calibrating) return;

  // Показываем обороты (с учётом знака)
  char str[5];
  sprintf(str, "%4ld", revolutions);
  display.showNumberDec(revolutions, false, 4, 0);
}

Остання редакція nickjust (2025-08-26 18:38:58)

Неактивний

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

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

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