Как обеспечить отрицательный ток?
Я пытаюсь использовать плату ATMega328 для управления платой неисправного ИБП. Я заменил все внутренние части ИБП на нестандартные компоненты, поэтому остались только шасси и передняя плата.
На этой плате имеется пять кнопок и три светодиода.
Все эти компоненты подключены к земле, каждый через собственный резистор. Подключив разные контакты к земле и к аналоговым контактам платы ATMega328, я могу успешно определять нажатие кнопок.
Однако все становится сложнее, когда я хочу включить светодиоды. Анод у них подключен к земле (через резистор сопротивлением 47 Ом), а катод подключен к специальному контакту. Это означает, что если я подаю напряжение на этот контакт, светодиод остается выключенным.
Однако светодиод загорится, если я подключу землю к контакту 5 В на плате ATMega328, а катодный контакт - к земле платы ATMega328. Однако подключение земли к 5В делает невозможным считывание состояния кнопок (или надо их как-то специально подключить?)
Итак, как мне подать отрицательный ток с платы ATMega328?
Есть похожий вопрос по этой теме, но хотя автор хочет «понять основную электронику Arduino и микроконтроллеров в целом», я Вместо этого я просто хочу знать, как заставить это работать. Читая ответы на связанный вопрос, у меня сложилось впечатление, что это возможно, но они не объясняют, как это сделать.
2 ответа
Лучший ответ:
Если светодиоды загораются при подаче напряжения 5 В на землю, то то, что вы определили как GND на плате, на самом деле является VCC. Не существует такого понятия, как отрицательный ток: ток либо источник, либо потребитель, в зависимости от того, выходит он из узла или входит в него.
Диоды (светодиоды) представляют собой односторонние клапаны, поэтому у вас есть четкое направление тока: как только оно установлено, идентификация нажатия кнопки может работать либо при низком уровне сигнала, либо при высоком уровне, другими словами, это может быть легко повернуть вспять.
Если раньше вы обнаруживали нажатие кнопки с помощью digitalRead(BTN_PIN) == HIGH
, просто переключитесь на digitalRead(BTN_PIN) == LOW
, и у вас есть решение.
Ответ Роберто Ло Джакко был полезен, но мне все еще было трудно понять, что происходит и как мне правильно подключить платы. Поскольку другие могут столкнуться с подобными проблемами, я объясню решение своими словами.
Обратите внимание, что ответ на аналогичный вопрос мне тоже помог.
Когда цифровой вывод установлен на высокий уровень с помощью digitalWrite(LED_PIN, HIGH);
, это похоже (вероятно, не с электрической точки зрения, но, по крайней мере, с точки зрения интерфейса) на подключение к 5 В, что ранее был подключен к контакту.
Аналогично, digitalWrite(LED_PIN, LOW);
аналогично подключению к GND того, что ранее было подключено к контакту.
Это означает, что когда светодиод подключен как обычно, катод к GND, а анод (через резистор) к цифровому выводу:
digitalWrite(LED_PIN, HIGH);
включает светодиод и:digitalWrite(LED_PIN, LOW);
отключает его.
Теперь, если катод подключен к цифровому выводу, анод (через резистор) можно подключить к 5В. В этой ситуации:
digitalWrite(LED_PIN, HIGH);
выключает светодиод.digitalWrite(LED_PIN, LOW);
включает его.
На фото в моем вопросе черный провод подключен к GND. Вместо этого он должен быть подключен к 5В. Остальные провода остаются без изменений.
Что касается кнопок, то чтобы определить, нажата кнопка или нет, я делал следующее:
if (analogRead(ESC_PIN) == 0) {
// Кнопка ESC нажата.
}
Когда кнопка не была нажата, значения из analogRead
были совершенно случайными: от 50 до 250 или что-то в этом роде. Нулевое значение будет означать, что кнопка была нажата.
При новой проводке (5 В вместо GND) новые значения analogRead
варьируются от 350 до 900, когда кнопка не нажата. Когда кнопка нажата, значение становится 1023. Таким образом, новое условие просто:
if (analogRead(ESC_PIN) == 1023) {
// Кнопка ESC нажата.
}
Зачем использовать аналоговое чтение вместо цифрового чтения?!? Пожалуйста, учтите, что аналоговая выборка происходит намного медленнее, чем чтение цифрового значения... Вы сказали, что к кнопкам подключены резисторы: эти резисторы должны действовать как понижающие, заставляя ненажатые кнопки замыкаться на землю, чтобы при нажатии кнопки напряжение подскакивает до 5 В, в то время как резистор ограничивает протекающий ток., @Roberto Lo Giacco
@RobertoLoGiacco: потому что digitalRead всегда возвращает 1, независимо от того, нажата кнопка или нет., @Arseni Mourzenko
Тогда часть вопроса, в которой вы утверждаете, что все эти компоненты «подключены к земле через собственный резистор», была неверной: резисторов, включенных последовательно с кнопками, нет., @Roberto Lo Giacco
Интересный. Я обнаружил, что у каждого из них есть резистор, проверив плату мультиметром, но, учитывая мой небольшой опыт работы с электричеством, возможно, я допустил ошибку. У меня также сложилось впечатление, что если я не буду использовать резистор, я сожгу плату, если установлю для параметра pinMode значение INPUT вместо INPUT_PULLUP. Я рад, что это впечатление ошибочно (поскольку плата все еще жива)., @Arseni Mourzenko
- Обнаружение прерывания питания на NodeMCU
- Безопасно питать светодиодную ленту через ESP32 GPIO
- Контакты ввода-вывода на Arduino считывают ток или напряжение?
- Можете ли вы ограничить ток на выводах Arduino 101 GPIO?
- NodeMCU - Vin контакт как выход 5V?
- Использовать все контакты как цифровые входы/выходы
- Питание светодиодной ленты - Сколько ампер?
- Что такое ICSP pin (разъём)?
что такое «отрицательный ток»?, @jsotola
возможно, вы перепутали соединения 5 В и GND.... кнопки, вероятно, имеют подтягивающие, а не понижающие резисторы..... то же самое со светодиодами, @jsotola