Ви не увійшли.
На CH1 (S21) така ж картина?
Якщо мета - розібратись як обробляти натискання кнопки і асинхронно блимати світлодіодом, не заморочуючись на оптимізації споживання, то пропоную такий варіант:
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);
1. нажимать кнопку нужно специфически немного удерживая чтобы все работало правильно. это ужасно бесит((
У вашій програмі затримки по 150 мс і більше. В цей час процесор не опитує стан кнопки. Для придушення брязкоту контактів у більшості випадків достатньо кількох міллісекунд. А щоб не реагувати на утримання кнопки як на натиснення, потрібно перевіряти зміну стану кнопки з LOW в HIGH.
Для виміру проміжків часу асинхронно бібліотека ардуіно надає функцію millis(). Але нею теж потрібно правильно користуватись, щоб уникнути багів з переповненням.
analogWrite(ledPin, brightness); // а от тут зовсім не зрозумів чому analog, ну і встановлюэмо яскравість лед на 255
Яскравість регулюється широтно-імпульсною модуляцією. analogWrite() реалізує програмну ШІМ.
// for (int i = 0; i <= 99999999; i++) {
Розмір int в AVR gcc - 16 біт, максимальне значення - 32767.
if (digitalRead(buttonPin) == HIGH) { goto bailout;
Для дострокового виходу з циклу достатньо break.
Помогите пожалуйста доработать код правильно. Это мне поможет двигаться далее.
Спочатку реалізуйте просте увімкнення/вимкнення світлодіода по натисненню, щоб воно працювало стабільно. Потім уже додавайте режими, яскравість і т.д.
У вас два логічних потоки: обробка натиснення кнопки і виміри проміжків часу, тому це простіше реалізувати за допомогою скінченного автомата. Ваш switch(mode) / case по суті ним і є, тільки прибрати довгі delay(), а час вимірювати за допомогою millis().
І деякі загальні міркування.
Atmega328 сама по собі в активному режимі на частоті 16 МГц при живленні 5 В споживає близько 10 мА. У вашій програмі процесор постійно активний. У вимкненому стані при ємності джерела живлення в 2500 мА*год воно розрядиться за час порядка 250 годин.
Для мінімізації споживання у вимкненому стані процессор має бути в режимі PowerDown, а натиснення кнопки викликатиме зовнішне переривання. В увімкненому стані потрібно використовувати апаратну ШІМ, а процесор переводити в Idle. Також відключити всю непотрібну периферію, таку як ADC, а тактову частоту знизити. 16 МГц для обробки натиснення кнопки - це перебор.
Також цікаво, як ви збираєтесь реалізувати апаратну частину, особливо в плані живлення. Два Li-Ion аккумулятора? На платі ардуіно лінійний стабілізатор, при живленні 7.5 вольт ККД буде лише 66%. Якщо світлодіод яскравий, його потрібно живити напряму, і бажано через драйвер, щоб напруга живлення не впливала на яскравість.
Ось така схема має працювати:
Номінали 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 мкс. Але якщо захочете регулювати потужність, то це посилить обмеження на частоту ШІМ.
Так, схема плати така. В такому випадку яку потрібно використати схему підключення(оптопара-мосфет-мотор)?
Потрібно щоб двигун міг працювати в обидва напрямки.
Реверсивний рух на цій платі зробити не вдастся. На ній витоки всіх транзиторів обʼєднані, а для повного моста потрібні роздільні. Не кажучи вже про те, що 48 вольт (а тим більше заявлені 100) пробʼють затвори транзисторів. Для IRF540 допустимо не більше 20 вольт.
Якщо там оця схема:
то мосфети і оптопару випаяти, а плату викинути
Ніякий. Це 4 окремих транзистора з опторозв’язкою
Тоді тим більше потрібна схема. Бо у кожної оптопари два входа: анод і катод. А на малюнці три: "S", "+" і "-". Входи оптопар вже з послідовними резисторами чи передбачаються зовнішні? Чи є там резистори і стабілітрони між затворами і витоками? Куди підключені "+" і "-" на вихідних клемах каналів, напряму до стока і витока? Навіщо тоді "+" і "-" POWER?
Є схема плати, чи хоча б назва? Або інформація, який драйвер на ній використовується? (на картинці не розібрати)
H-міст передбачає використання 4 ключових елементів.
Як ми можемо щось підказати, коли не знаємо, що у вас за файли, і що в них?
Навіть модель дисплея не вказано. Тільки по назві відео можна здогадуватись, що підключено до "Arduino mega".
Напрямок однієї з координат дисплея не співпадає з напрямком відповідної координати тач сенсора.
Для таких дача мені підійде Arduino Nano?
Вирішити такі задачі на Arduino Nano можна. Звісно, з певними припущеннями і обмеженнями. Інше питання - скільки часу вам на це знадобиться, які зовнішні компоненти, і чи достатньою виявиться швидкодія.
А чи влаштує той чи інший варіант - вирішувати вам.
Саме по камері невеликого розміру робити аналіз піксерів (HDTV)
Дивлячись який у камери інтерфейс і що вона вміє. І що саме означає "якесь світло чи зміну якогось кольору" в алгоритмічному сенсі.
Все ж таки на крутив преобразуй на 10В і подав це живлення на VIN і поставив туди конденсатор. Блютуз та серво підключив від піна 5 і туди також поставив конденсатор.
Регулятор LM1117 в корпусі DCY на ардуіні при зовнішній температурі 25 °C може розсіювати максимум (150-25)/62 = 2 Вт, нагріваючись при цьому до 150 °C. У вас при подачі 10 В на ньому падатиме 5 В, тобто максимально допустимий струм: 2 Вт / 5 В = 0.4 А. Якщо серво разом із блютузом і ардуіно споживає більше, то регулятор довго не пропрацює. А краще забезпечити хоча б двократний запас.
А з прошивкою все нормально? Не може бути так, що наприклад D3 сконфігурований на вихід і виставлений в HIGH, і при натисканні на кнопку КЗ.
Я міряю напругу після перетворювача. Просадки немає.
Просадка може бути короткочасна. Мультиметром її може бути не видно, тільки осциллографом.
Якщо просто кондьори не допомагають, спробуйте через діод Шотткі:
Vin через діод з’єднаний з usb
Vin іде відразу на стаб. Діод з USB на 5V.
Коли подаю напругу на VIN воно також все світиться, але при нажиманні кнопки сервак тошки сіпнеться і все.
Можливо напруга просаджується і ардуіно уходить в ребут. Що за перетворювач, які в нього можливості по струму? Може бути що потужності вистачає, але не вистачає швидкості реакції на пусковий струм серви.
Поставте два-три електролітичних конденсатора побільше (1000-2200 мкФ) на живлення поближче до ардуіно.
Для перевірки спробуйте заживити серво від окремого джерела.
Заміряв струм. 3,6мА всього. Тобто я так зрозумів що можно навіть резистор в цеп колектора не ставити.
Але я на всяк випадок буду ставити 2-10 ом, що під руку попадеться
Значить там десь уже стоїть резистор (а інакше при замиканні кнопкою і не може бути). Якщо лінія 12-вольтова, то 3.3 кОм. Плюс-мінус десяток Ом абсолютно ні на що не вплине.
Якби ж я знав як тут вставити картинку...
Внизу під полем редагування є "Завантаження". Завантажуєте свою картинку, потім вставляєте в повідомлення тегом img, як будь-яку іншу.
По-перше, на цих "сенсорах" є позначення: Vcc, GND, S, "+", "-". У вас на картинці цих позначень нема, що куди підключене - зовсім незрозуміло.
Якщо вірити вашій "схемі", то як мінімум ліва АКБ замкнена накоротко.
По-друге, як ви зібрались міряти напругу на кожній АКБ відносно землі окремо, коли вони зʼєднані послідовно? Намалюйте просту зрозумілу схему.
Ви можете поміряти напругу на одній ("нижній", мінус которої на землі) і сумарну напругу на обох. Напругу на "верхній" обчисліть відніманням.
По-третє, цей "сенсор" - банальний резистивний дільник напруги з коефіцієнтом 5. 24 В / 5 = 4.8 В. Ви впевнені, що на вхід контроллера з живленням 3.3 В можна подавати 4.8 В?
Схиляюся , що то якісь електромагнітні поля , які створює котел,
, так впливають на роботу контролера.
Контролер спонтанно зависає? Перезавантажується? Якщо ні, то з контроллером все нормально. Завади впливають на спілкування між контроллером і датчиками.
Для експерименту підʼєднайте один датчик безпосередньо до плати контроллера якомога коротшими проводами.
Датчики живляться по окремій лінії.
З вихода +5V плати ардуіно, так?
А можете написати про конденсатори? Який би то мав бути номінал?
0.1 мкФ має бути достатньо. Керамічний, між Vdd і GND біля самого датчика.
Осцилографа не маю, не вмію.
Хочеться вірити, що є просте рішення.
Без аналізу конкретної ситуації можемо тільки вгадувати типові проблеми і пропонувати типові рішення.
Це ви у Ореста запитайте
Вибачте, помилився при цитуванні.
Блоки 12-вольтові, то датчики мабуть же живляться зі стабілізатора ардуіно. Але по фотографії не зрозуміло. З лівого блока видно провода на реле і далі наче теж на блок комутації датчиків.
Доречі, програма на ардуіно не перевіряє CRC відповідей? -127 - це всі одиниці, тобто датчик просто не відповідає, лінія в одиниці. CRC не має бути коректним.
Ардуіно і плата реле живляться окремими блоками на 12в.
Навіщо? Одного там вистачить із запасом.
Якщо датчики з окремим живленням, сподіваюсь, воно від того ж блока, що і ардуіно?
Можете в двох словах роз'яснити що відбудеться?
Ймовірно, на шину наводяться електромагнітні перешкоди, і датчики не завжди розпізнають команду читання. Зменшення номіналу має збільшити стійкість до перешкод і зменшити вплив ємності самої лінії передачі.
Подивитись би з боку датчиків осцилографом, в якому вигляді до них доходять запити.
Пробував різні провода - сигнальні, вита пара, екрановані
Щоб екран працював, його потрібно правильно "заземлити". Але тоді ємність лінії ще збільшиться. Вита пара добре підходить для передачі диференційних сигналів, а 1-Wire асиметричний, не диференційний.
Датчики живляться паразитно з шини чи по окремій лінії? Якщо по окремій, з боку датчиків стоять блокуючі конденсатори?
Резистори 4,7 кОм.
Спробуйте зменшити до 1 кОм.
Яким номіналом резистора підтягнуті шини?