#452 Re: Програмування Arduino » Нужна помощь начинающему!!! 3-х режимный фонарик » 2024-02-09 15:14:44

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

constexpr byte PIN_LED = 11;
constexpr byte PIN_BUTTON = 8;

constexpr byte DEBOUNCE_MS = 20;
constexpr byte DIM_BRIGHTNESS = 64;

constexpr unsigned int DIT_MS = 180;
constexpr unsigned int DAH_MS = DIT_MS * 3;
constexpr unsigned int WORD_SEP_MS = DIT_MS * 7;

const unsigned int sos_pattern[] = {
  DIT_MS, DIT_MS, DIT_MS, DIT_MS, DIT_MS, DIT_MS,
  DAH_MS, DIT_MS, DAH_MS, DIT_MS, DAH_MS, DIT_MS,
  DIT_MS, DIT_MS, DIT_MS, DIT_MS, DIT_MS, WORD_SEP_MS
};

void setup()
{
  pinMode(PIN_BUTTON, INPUT_PULLUP);
  pinMode(PIN_LED, OUTPUT);
}

static inline bool buttonPressed()
{
  return digitalRead(PIN_BUTTON) == LOW; // active low
}

static inline void ledOn(bool on)
{
  digitalWrite(PIN_LED, on); // active high
}

void loop()
{
  static struct {
    bool pressed { false };
    bool debounce { false };
    unsigned long last_press { 0 };
  } button;

  static struct state {
    enum mode {
      OFF = 0,
      ON,
      DIM,
      SOS,
      INVALID
    };
    mode active { mode::OFF };
    bool changed { true };
  } state;

  if (button.debounce) {
    if (millis() - button.last_press >= DEBOUNCE_MS) {
      button.debounce = false;
    }
  }

  bool button_state = buttonPressed();

  if ((button_state != button.pressed) && !button.debounce) {
    button.last_press = millis();
    button.debounce = true;
    button.pressed = button_state;

    if (button_state) {
      state.active = static_cast<state::mode>(state.active + 1);
      if (state.active >= state::mode::INVALID) {
        state.active = state::mode::OFF;
      }

      state.changed = true;
    }
  }

  static struct {
    unsigned long last_change;
    unsigned int pause;
    byte idx;
    bool led;
  } sos;

  if (state.changed) {
    switch (state.active) {
      case state::mode::OFF:
        ledOn(false);
        break;
      case state::mode::ON:
        ledOn(true);
        break;
      case state::mode::DIM:
        analogWrite(PIN_LED, DIM_BRIGHTNESS);
        break;
      case state::mode::SOS:
        sos.led = false;
        ledOn(sos.led);
        sos.idx = 0;
        sos.pause = 100;  // pause before start
        sos.last_change = millis();
        break;
      default: break;
    }
    state.changed = false;
  }

  if (state.active == state::mode::SOS) {
    unsigned long now = millis();
    if (now - sos.last_change >= sos.pause) {
      sos.led = !sos.led;
      ledOn(sos.led);
      sos.pause = sos_pattern[sos.idx++];
      if (sos.idx >= sizeof(sos_pattern) / sizeof(*sos_pattern)) {
        sos.idx = 0;
      }
      sos.last_change = now;
    }
  }
}

Тут кнопка active low, тобто пін підтягнутий до живлення внутрішнім pull-up і замикається кнопкою на землю.
Якщо у вас навпаки, пін 8 підтягнутий зовнішнім резистором до землі і замикається на живлення, замініть вміст buttonPressed() на

return digitalRead(PIN_BUTTON) == HIGH;

і в setup() INPUT_PULLUP замініть на INPUT:

  pinMode(PIN_BUTTON, INPUT);

#453 Re: Програмування Arduino » Нужна помощь начинающему!!! 3-х режимный фонарик » 2024-02-08 13:02:51

sxstalker пише:

1. нажимать кнопку нужно специфически немного удерживая чтобы все работало правильно. это ужасно бесит((

У вашій програмі затримки по 150 мс і більше. В цей час процесор не опитує стан кнопки. Для придушення брязкоту контактів у більшості випадків достатньо кількох міллісекунд. А щоб не реагувати на утримання кнопки як на натиснення, потрібно перевіряти зміну стану кнопки з LOW в HIGH.

Для виміру проміжків часу асинхронно бібліотека ардуіно надає функцію millis(). Але нею теж потрібно правильно користуватись, щоб уникнути багів з переповненням.

sxstalker пише:
          analogWrite(ledPin, brightness); // а от тут зовсім не зрозумів чому analog, ну і встановлюэмо яскравість лед на 255

Яскравість регулюється широтно-імпульсною модуляцією. analogWrite() реалізує програмну ШІМ.

sxstalker пише:
  // for (int i = 0; i <= 99999999; i++) { 

Розмір int в AVR gcc - 16 біт, максимальне значення - 32767.

sxstalker пише:
    if (digitalRead(buttonPin) == HIGH) {
      goto bailout;

Для дострокового виходу з циклу достатньо break.

sxstalker пише:

Помогите пожалуйста доработать код правильно. Это мне поможет двигаться далее.

Спочатку реалізуйте просте увімкнення/вимкнення світлодіода по натисненню, щоб воно працювало стабільно. Потім уже додавайте режими, яскравість і т.д.

У вас два логічних потоки: обробка натиснення кнопки і виміри проміжків часу, тому це простіше реалізувати за допомогою скінченного автомата. Ваш switch(mode) / case по суті ним і є, тільки прибрати довгі delay(), а час вимірювати за допомогою millis().

І деякі загальні міркування.
Atmega328 сама по собі в активному режимі на частоті 16 МГц при живленні 5 В споживає близько 10 мА. У вашій програмі процесор постійно активний. У вимкненому стані при ємності джерела живлення в 2500 мА*год воно розрядиться за час порядка 250 годин.

Для мінімізації споживання у вимкненому стані процессор має бути в режимі PowerDown, а натиснення кнопки викликатиме зовнішне переривання. В увімкненому стані потрібно використовувати апаратну ШІМ, а процесор переводити в Idle. Також відключити всю непотрібну периферію, таку як ADC, а тактову частоту знизити. 16 МГц для обробки натиснення кнопки - це перебор.

Також цікаво, як ви збираєтесь реалізувати апаратну частину, особливо в плані живлення. Два Li-Ion аккумулятора? На платі ардуіно лінійний стабілізатор, при живленні 7.5 вольт ККД буде лише 66%. Якщо світлодіод яскравий, його потрібно живити напряму, і бажано через драйвер, щоб напруга живлення не впливала на яскравість.

#454 Re: Апаратні питання » Підключення двигуна 48VDC до Arduino » 2024-02-05 14:33:40

Ось така схема має працювати:
H-bridge.png

Номінали R1-R8 перерахував для 48 вольт, але на практиці з таким живленням не перевіряв.

A1 A2 B1 B2 │ режим
────────────┼────────────
 0  0  0  0 │ вимкнено
 1  0  0  1 │ вперед
 0  1  1  0 │ назад
 1  0  1  0 │ гальмування
 0  1  0  1 │ гальмування

В прошивці потрібно бути дуже уважним, щоб НІКОЛИ на пару A1 і A2 одночасно не подавалась одиниця. Те саме стосується пари B1 і B2.
Також між перемиканням A1 з 1 в 0, а A2 з 0 в 1 і навпаки необхідна пауза (dead time). Те ж саме для B1 і B2. При приведених номіналах теоретично 10 мкс має бути достатньо.

UPD: При вказаних номіналах резистори R1-R4 - мінімум 0.25 Вт, R5-R8 - мінімум 0.5 Вт. Краще в 2 рази більше: 0.5 і 1 Вт відповідно.
Можна пропорційно збільшити номінали, наприклад R1-R4 - 10 кОм, R5-R8 - 22 кОм. Тоді підійдуть звичайні 0.125 Вт, але швидкість відкривання/закривання зменшиться. В режимі on/off це ніяк не завадить, тільки dead time теж бажано збільшити пропорційно, десь до 100 мкс. Але якщо захочете регулювати потужність, то це посилить обмеження на частоту ШІМ.

#455 Re: Апаратні питання » Підключення двигуна 48VDC до Arduino » 2024-02-05 12:32:06

dialectric пише:

Так, схема плати така. В такому випадку яку потрібно використати схему підключення(оптопара-мосфет-мотор)?
Потрібно щоб двигун міг працювати в обидва напрямки.

Реверсивний рух на цій платі зробити не вдастся. На ній витоки всіх транзиторів обʼєднані, а для повного моста потрібні роздільні. Не кажучи вже про те, що 48 вольт (а тим більше заявлені 100) пробʼють затвори транзисторів. Для IRF540 допустимо не більше 20 вольт.

#456 Re: Апаратні питання » Підключення двигуна 48VDC до Arduino » 2024-02-05 00:39:01

Якщо там оця схема:
IRF540-MOD-013.jpg
то мосфети і оптопару випаяти, а плату викинути  hmm

#457 Re: Апаратні питання » Підключення двигуна 48VDC до Arduino » 2024-02-05 00:12:07

г0cть пише:

Ніякий. Це 4 окремих транзистора з опторозв’язкою

Тоді тим більше потрібна схема. Бо у кожної оптопари два входа: анод і катод. А на малюнці три: "S", "+" і "-". Входи оптопар вже з послідовними резисторами чи передбачаються зовнішні? Чи є там резистори і стабілітрони між затворами і витоками? Куди підключені "+" і "-" на вихідних клемах каналів, напряму до стока і витока? Навіщо тоді "+" і "-" POWER?

#458 Re: Апаратні питання » Підключення двигуна 48VDC до Arduino » 2024-02-04 21:59:18

Є схема плати, чи хоча б назва? Або інформація, який драйвер на ній використовується? (на картинці не розібрати)
H-міст передбачає використання 4 ключових елементів.

#459 Re: Програмування Arduino » Допоможіть знайти помилку » 2024-02-02 18:17:55

Як ми можемо щось підказати, коли не знаємо, що у вас за файли, і що в них?
Навіть модель дисплея не вказано. Тільки по назві відео можна здогадуватись, що підключено до "Arduino mega".

#460 Re: Програмування Arduino » Допоможіть знайти помилку » 2024-02-02 12:38:25

Напрямок однієї з координат дисплея не співпадає з напрямком відповідної координати тач сенсора.

#461 Re: Програмування Arduino » Цікаві задачі? Підкажіть рішення » 2024-01-29 20:47:38

theDrabec пише:

Для таких дача мені підійде Arduino Nano?

Вирішити такі задачі на Arduino Nano можна. Звісно, з певними припущеннями і обмеженнями. Інше питання - скільки часу вам на це знадобиться, які зовнішні компоненти, і чи достатньою виявиться швидкодія.
А чи влаштує той чи інший варіант - вирішувати вам.

theDrabec пише:

Саме по камері невеликого розміру робити аналіз піксерів (HDTV)

Дивлячись який у камери інтерфейс і що вона вміє. І що саме означає "якесь світло чи зміну якогось кольору" в алгоритмічному сенсі.

#462 Re: Апаратні питання » Збій в роботі » 2024-01-23 12:33:44

tankist0168 пише:

Все ж таки на крутив преобразуй на 10В і подав це живлення на VIN і поставив туди конденсатор. Блютуз та серво підключив від піна 5 і туди також поставив конденсатор.

Регулятор LM1117 в корпусі DCY на ардуіні при зовнішній температурі 25 °C може розсіювати максимум (150-25)/62 = 2 Вт, нагріваючись при цьому до 150 °C. У вас при подачі 10 В на ньому падатиме 5 В, тобто максимально допустимий струм: 2 Вт / 5 В = 0.4 А. Якщо серво разом із блютузом і ардуіно споживає більше, то регулятор довго не пропрацює. А краще забезпечити хоча б двократний запас.

#463 Re: Апаратні питання » Збій в роботі » 2024-01-23 00:43:33

А з прошивкою все нормально? Не може бути так, що наприклад D3 сконфігурований на вихід і виставлений в HIGH, і при натисканні на кнопку КЗ.

#464 Re: Апаратні питання » Збій в роботі » 2024-01-23 00:39:49

tankist0168 пише:

Я міряю напругу після перетворювача. Просадки немає.

Просадка може бути короткочасна. Мультиметром її може бути не видно, тільки осциллографом.

Якщо просто кондьори не допомагають, спробуйте через діод Шотткі:
pow.png

г0cть пише:

Vin через діод з’єднаний з usb

Vin іде відразу на стаб. Діод з USB на 5V.

#465 Re: Апаратні питання » Збій в роботі » 2024-01-23 00:02:40

tankist0168 пише:

Коли подаю напругу на VIN воно також все світиться, але при нажиманні кнопки сервак тошки сіпнеться і  все.

Можливо напруга просаджується і ардуіно уходить в ребут. Що за перетворювач, які в нього можливості по струму? Може бути що потужності вистачає, але не вистачає швидкості реакції на пусковий струм серви.

Поставте два-три електролітичних конденсатора побільше (1000-2200 мкФ) на живлення поближче до ардуіно.

Для перевірки спробуйте заживити серво від окремого джерела.

#466 Re: Апаратні питання » Прошу уточнення по оптрону » 2024-01-22 21:54:11

Shaman2 пише:

Заміряв струм. 3,6мА всього. Тобто я так зрозумів що можно навіть резистор в цеп колектора не ставити.
Але я на всяк випадок буду ставити 2-10 ом, що під руку попадеться

Значить там десь уже стоїть резистор (а інакше при замиканні кнопкою і не може бути). Якщо лінія 12-вольтова, то 3.3 кОм. Плюс-мінус десяток Ом абсолютно ні на що не вплине.

#467 Re: Апаратні питання » Збій в роботі » 2024-01-22 19:55:20

tankist0168 пише:

Якби  ж я знав як тут вставити картинку...

Внизу під полем редагування є "Завантаження". Завантажуєте свою картинку, потім вставляєте в повідомлення тегом img, як будь-яку іншу.

#468 Re: Апаратні питання » Nodemcu ESP827 та voltage sensor для 2х12в АКБ » 2024-01-22 01:29:25

По-перше, на цих "сенсорах" є позначення: Vcc, GND, S, "+", "-". У вас на картинці цих позначень нема, що куди підключене - зовсім незрозуміло.
Якщо вірити вашій "схемі", то як мінімум ліва АКБ замкнена накоротко.

По-друге, як ви зібрались міряти напругу на кожній АКБ відносно землі окремо, коли вони зʼєднані послідовно? Намалюйте просту зрозумілу схему.
Ви можете поміряти напругу на одній ("нижній", мінус которої на землі) і сумарну напругу на обох. Напругу на "верхній" обчисліть відніманням.

По-третє, цей "сенсор" - банальний резистивний дільник напруги з коефіцієнтом 5. 24 В / 5 = 4.8 В. Ви впевнені, що на вхід контроллера з живленням 3.3 В можна подавати 4.8 В?

#469 Re: Апаратні питання » Періодичний збій роботи Ардуіно » 2024-01-21 22:51:12

Orest1 пише:

Схиляюся , що то якісь електромагнітні поля , які створює котел, yikes , так впливають на роботу контролера.

Контролер спонтанно зависає? Перезавантажується? Якщо ні, то з контроллером все нормально. Завади впливають на спілкування між контроллером і датчиками.

Для експерименту підʼєднайте один датчик безпосередньо до плати контроллера якомога коротшими проводами.

#470 Re: Апаратні питання » Періодичний збій роботи Ардуіно » 2024-01-21 22:46:06

Orest1 пише:

Датчики живляться по окремій лінії.

З вихода +5V плати ардуіно, так?

Orest1 пише:

А можете написати про конденсатори? Який би то мав бути номінал?

0.1 мкФ має бути достатньо. Керамічний, між Vdd і GND біля самого датчика.

Orest1 пише:

Осцилографа не маю, не вмію.
Хочеться вірити, що є просте рішення.

Без аналізу конкретної ситуації можемо тільки вгадувати типові проблеми і пропонувати типові рішення.

#471 Re: Апаратні питання » Періодичний збій роботи Ардуіно » 2024-01-20 22:39:56

г0cть пише:

Це ви у Ореста запитайте

Вибачте, помилився при цитуванні.

Блоки 12-вольтові, то датчики мабуть же живляться зі стабілізатора ардуіно. Але по фотографії не зрозуміло. З лівого блока видно провода на реле і далі наче теж на блок комутації датчиків.

Доречі, програма на ардуіно не перевіряє CRC відповідей? -127 - це всі одиниці, тобто датчик просто не відповідає, лінія в одиниці. CRC не має бути коректним.

#472 Re: Апаратні питання » Періодичний збій роботи Ардуіно » 2024-01-20 21:17:53

г0cть пише:

Ардуіно і плата реле живляться окремими блоками на 12в.

Навіщо? Одного там вистачить із запасом.
Якщо датчики з окремим живленням, сподіваюсь, воно від того ж блока, що і ардуіно?

#473 Re: Апаратні питання » Періодичний збій роботи Ардуіно » 2024-01-20 21:05:23

Orest1 пише:

Можете в двох словах роз'яснити що відбудеться?

Ймовірно, на шину наводяться електромагнітні перешкоди, і датчики не завжди розпізнають команду читання. Зменшення номіналу має збільшити стійкість до перешкод і зменшити вплив ємності самої лінії передачі.

Подивитись би з боку датчиків осцилографом, в якому вигляді до них доходять запити.

Orest1 пише:

Пробував різні провода - сигнальні, вита пара,  екрановані

Щоб екран працював, його потрібно правильно "заземлити". Але тоді ємність лінії ще збільшиться. Вита пара добре підходить для передачі диференційних сигналів, а 1-Wire асиметричний, не диференційний.

Датчики живляться паразитно з шини чи по окремій лінії? Якщо по окремій, з боку датчиків стоять блокуючі конденсатори?

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