Arduino Mega сохраняет состояния после перепрограммирования

На основе:

https://forum.arduino.cc/index.php?topic=440978.0

И некоторый предыдущий опыт работы с ардуино. Что я хотел бы сделать здесь, так это то, что у меня есть 8-канальная релейная плата с реле в разных состояниях. Arduino подключен к RaspberryPI через USB.

Первая проблема хорошо известна, это автоматический сброс Arduino, о котором можно позаботиться с помощью резистора или выпаивания контакта на плате Mega, чтобы вы могли повторно подключать Arduino столько раз, сколько пожелаете (при работе на внешнем источник питания +5 В) к Raspberry, и он никогда не перезагрузится.

Однако я также помню, что это сделает платы невозможными для программирования, потому что они не могут сбрасываться в конце, когда скетч загружается.

Я думаю об обходном пути:

1. Создайте команду программирования на Arduino, которая, когда она будет получена от RPI, соединит этот отрезанный контакт с реле, что снова сделает возможным сброс

2. Сохраните все состояния реле в EEPROM

3. После сброса Arduino всегда проверяет этот флаг программирования в своей EEPROM, и если он присутствует, он либо не касается реле, либо устанавливает их в одно и то же положение ВКЛ/ВЫКЛ в зависимости от значения, которое он считывает из EEPROM

Последний парень утверждает, что: когда Arduino находится в состоянии сброса, все контакты ведут себя так, как будто они ни к чему не подключены. Если у вас есть выход, который должен находиться в определенном состоянии в течение этого периода, вы должны добавить внешний резистор, чтобы подтягивать его вверх или вниз по мере необходимости.

Есть ли другое решение этой проблемы? Как использовать более новую плату Arduino, которая может сохранять состояния выводов при перепрограммировании?

ardu

, 👍2


3 ответа


1

Мне пришлось решить аналогичную проблему для системы на основе ESP32. Решение, которое я придумал, заключалось в использовании внешних защелок D-типа (триггеров) для хранения состояния независимо от Arduino.

Arduino должен активно загружать новое состояние реле в защелку, чтобы реле могло изменить состояние, и это состояние сохраняется независимо от того, что делает Arduino.

Выходы защелок также могут быть подключены к другим входным контактам, чтобы Arduino могла определять текущее состояние реле во время загрузки.

схема

Arduino отслеживает, какими должны быть выходные данные (считывая текущее состояние при загрузке), а затем при необходимости изменяет состояние. Затем он загружает все состояния на выходные контакты и подает на контакт LOAD (CLK на микросхеме) высокий уровень, чтобы загрузить эти состояния в защелки.

Для этого я использовал микросхему 74HC374, поскольку она содержит 8 защелок, привязанных к одному выводу CLK.

,

1

В основном у вас есть две разные проблемы. Проблема с автоматическим включением/отключением сброса с USB и проблема с сохранением реле в их заданных состояниях при перепрограммировании.

  • Включить/отключить сброс: Самый простой способ — использовать перемычку, которую вы отсоединяете каждый раз, когда хотите запрограммировать плату. Если вы хотите сделать это удаленно, вы уже описали правильный способ, хотя я думаю, что вам для этого не нужно реле. Для этого должно быть достаточно транзистора или полевого МОП-транзистора.

  • Сохранять состояния реле:

    Например, использовать более новую плату Arduino, которая может сохранять состояния выводов при перепрограммировании?

    Не думаю, что что-то подобное существует. Для микроконтроллеров общего назначения это не имеет смысла; все они начинаются с чистого состояния. Поэтому вам нужно сохранить состояние реле вне Arduino. Какой тип устройства вы хотите использовать для этого, зависит от вас. Маженко упомянул триггеры, которые дают вам самые основные функции для этого. Вы также можете использовать устройства, которые представляют собой последовательные интерфейсы, такие как сдвиговые регистры или даже расширители портов. Использование триггеров будет самым простым способом, так как программирование не сильно меняется. В Интернете есть множество примеров использования каждого из этих устройств с Arduino.

,

0

Я использую для этой цели (модель железнодорожных коммутационных стрелок/сигналов с реле и катушками) простое и экономящее контакты решение.
Защитный экран/модуль шины I2C с 16 портами ввода/вывода (с возможностью последовательного подключения — до 64 модулей теоретически, 16 практически из-за контактов кодирования адресов)
16-канальный модуль расширения ввода/вывода PCA9685/PCF8574 стоит около 4-5 евро и требует кроме GND/VCC всего два контакта данных (SDA и SCL) для управления модулем. Заголовок I2C имеет дополнительные подтягивающие резисторы 10K, а на плате модуля находится типичный внутренний генератор с частотой 25 МГц.

Поэтому после сброса я сначала считываю значения EEPROM/SPIFFS/SD и на основе этого сохраненного набора я работаю. Модуль(и) имеет(ют) отдельный источник питания, на который не влияет сброс контроллера Arduino, управляющего ими. Рабочий диапазон от 2,3 В до 5,5 В позволяет питать модуль от различных источников питания, а также использовать его с устройствами на 3,3 В.
Зеленая клеммная колодка на рисунке предназначена для использования с сервоприводами — подключается дополнительный источник питания. к заголовку I2C (но общий с Arduino).

Конечно, вы должны использовать библиотеку (или, как я, написать нужные вам функции), но как только вы ее освоите, ее легко использовать, а также использовать для других сценариев (светодиоды, ШИМ-генератор, сервоприводы).

PCA9685 — это «автономный» ШИМ-контроллер. Скажи ему, что делать, и он будет продолжать делать это, пока вы не скажете ему сделать что-то еще. Если вы хотели установить реле в определенное состояние и сохранить их там вы можете отключить Arduino, пока не захотите, чтобы реле сделать что-нибудь другое.

,