Ви не увійшли.
Світловий бар'єр 1 - OUT 1
Світловий бар'єр 2 - OUT 2
Неактивний
Датчики то фігня, а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..
Датчики то фігня, а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..
Цього я не знаю, як і багато іншого
Неактивний
Того ніхто не знає (ц)
Вдалось прочитати повідомлення?
так
Неактивний
а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..
Наскільки розумію, воно занадто рано створює посилання на нову сторінку стрічки (оті [ 1 2 3 4 ] вгорі біля теми), і при відповіді автоматично перекидає на ту неіснуючу сторінку. Якщо повернутись на попередню сторінку, то повідомлення стає видно.
Неактивний
А ось деякі свої повідомлення я не бачу. Але якщо почну писати нове повідомлення, і натисну preview - тоді побачу
Для реалізації лічильника обертів із моторчика CD-ROM і виводу на TM1637, спершу переконайся, що мотор дає чіткі імпульси — краще використовувати енкодер. Підключи його до цифрових пінів, наприклад D2 і D3, і відстежуй зміну станів для визначення напрямку. Лічильник має інкрементуватися або декрементуватися, переходити з 9999 на 0000 і навпаки. Для скидання — окрема кнопка на піні, яка обнуляє значення. Використовуй бібліотеки TM1637Display та Encoder.
Неактивний
Беремо оптопару з опто мишки
Принцип роботи: Кулко з прорізами обертається між ІЧ-випромінювачем та приймачем оптопари.
При кожному проходженні прорізу сигнал на піні змінюється (LOW - HIGH).
Вважаємо кількість імпульсів.
За замовчуванням: 1 імпульс = 1 проріз. Але нам потрібно: 1 оборот = N прорізів > калібрування.
Встанови через Arduino IDE > Скетч > Підключити бібліотеку > Керувати бібліотеками:
TM1637Display (автор: avishorp)
Як калібрувати:
Запусти пристрій. Повертай колесо рівно один оборот. Натисніть кнопку "Калібрування" - екран покаже "CAL". Зроби один повний оборот. Знову натисніть "Калібрування" - пристрій запам'ятає кількість імпульсів за оборот.
Або два датчики Холла, зсунуті по колу на 1/4 кроку між магнітами → вийде квадратурний сигнал.
Варіанти:
Один магніт + два датчики - зміщені на 45-90 ° механічно
#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)
Неактивний