Сохранить данные перед выключением
Я создаю позиционер и сохраняю текущую позицию в EEPROM, когда перемещение завершено. При запуске я хочу, чтобы позиционер вернулся в исходное положение. Я использую UNO с питанием от USB. Моя проблема в том, что если Arduino выключен, я хотел бы остановить движение и сохранить текущую позицию до того, как Arduino умрет.
Обратите внимание, что это также относится к таким устройствам, как термостаты, которые запоминают заданное значение при отключении электроэнергии.
ВОЗМОЖНЫЕ РЕШЕНИЯ
Сохранять позицию в EEPROM на каждом этапе. Нет, это изнашивает EEPROM.
Подключите большой конденсатор от +5 В к Gnd. Когда оно падает ниже установленного уровня, вызывается прерывание (ISR), которое останавливает движение и сохраняет текущую позицию в EEPROM.
ВОПРОСЫ
- Будет ли работать вариант 2 и как его запрограммировать?
- Есть ли какие-то другие идеи, которые я упустил?
@Prof Huster, 👍1
Обсуждение2 ответа
Термостаты сохранят заданное значение в eeprom один раз, когда заданное значение будет установлено пользователем. При запуске он просто считывал заданное значение.
Аналоговые выводы измеряются относительно VCC. Таким образом, если вы замкнете аналоговый вывод на VCC, результат останется максимальным даже при падении напряжения.
Вместо этого используйте диод, чтобы отделить точку измерения от источника питания.
Пока питание подается, вход gpio будет высоким. Как только питание будет отключено, на выводе gpio будет низкий уровень заряда, и конденсатору потребуется заряд, достаточный для сохранения позиции.
Но что произойдет, если манипулировать позиционером, когда Arduino выключен? У большинства устройств есть процедура калибровки, использующая определение конца пути или что-то подобное, которое они запускают при запуске, чтобы найти исходное положение.
Спасибо за все предложения. Сначала я хотел схему, как у @ratchet Freaks. Я хотел, чтобы механика и схемы были очень простыми, поскольку позиционер напечатан на 3D-принтере и использует для перемещения стандартный винт M3, что исключает концевые выключатели и энкодеры.
Я также понял, что типичное перемещение занимает не более 10 секунд, поэтому я мог просто сохранить заданную позицию, как предложил @CrossRoads. При вводе команды HOME
происходит возврат к 0.
Вот мой ответ:
- Сохраните адрес EEPROM постоянной информации в
EEPROM[0]
. - По этому адресу хранить постоянную информацию:
- Элемент 1:
EEPROM[EEPROM[0]]
Количество операций записи в этот адресный блок в виде двухбайтового целого числа без знака. - Элемент 2:
EEPROM[EEPROM[0]+2]
Заданная позиция в виде двухбайтового целого числа со знаком. - Когда число операций записи достигнет примерно 5000, увеличьте адрес данных в
EEPROM[0]
.
Таким образом я постепенно выжгу EEPROM Arduino, но это займет много лет!
@JRobert: С этой схемой EEPROM[0]
записывается каждые 5000 циклов., @Edgar Bonet
Адрес обновляется каждые 5000 циклов по 5000 операций записи, то есть около 25 миллионов обновлений позиций. Много для моего использования!, @Prof Huster
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- Как увеличить срок службы EEPROM?
- Использование EEPROM в цикле ()
- Запустить код один раз после программирования
- Сохранение EEPROM после программирования на Arduino uno
- Не получается читать из / писать в EEPROM
- Как прочитать данные, хранящиеся в EEPROM, хотя он выключен на основе простого кода, который я написал?
- Чтение и сравнение данных из Arduino Uno EEPROM
Вариант 3: сохранить положение только после 10 секунд отсутствия изменений. Вариант 4: иметь способ измерения абсолютного положения объекта вращения, поэтому нет необходимости запоминать его предыдущее положение. Вариант 5: Поскольку вы хотите вернуть его в исходное положение при повторном включении питания, вы можете добавить датчик, который определяет, когда он находится в исходном положении. Это то, что некоторые 3D-принтеры делают с концевыми выключателями. Они вращают двигатель до тех пор, пока не сработает концевой выключатель., @Gerben
Почему бы просто не сохранить заданную позицию? Если сила будет потеряна, вы можете отправить ее туда, где она была последней командой., @CrossRoads
@CrossRoads, это вариант 6? Тогда вариант 7: используйте фрейм https://www.adafruit.com/product/1895 и сохраняйте так часто, как хотите., @Jot
Да, FRAM тоже было бы здорово, практически бесконечное количество хранилищ (триллионы). Храните сто тысяч в день в течение 100 миллионов лет., @CrossRoads
Как я могу запрограммировать это в Arduino? @Prof Huster > 5. Когда количество операций записи достигнет примерно 5000, увеличьте адрес данных в EEPROM[0]., @santilococo