Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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

Изготвление устройства требует минимальных навыков работы с паяльником и програмирования ардуино.

Так же можно использовать любой Н канальный транзистор с похожими характеристиками. Но смотрите что бы совпадала цоколевка. Например я использовал 9013 , там перевернутое подключение

Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Arduino uno с кабелем http://ali.pub/22k7go

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

if (Serial.available() > 0)
{
val = Serial.read();
if (val == ‘H’)
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

delay (1000);

if (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:UsersminerDesktopreboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(«H»)
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

start PowerShell.exe -ExecutionPolicy ByPass -File «c:путь к вашему файлуваш файл.ps1»

Файл сохраняем с расширением *.bat и ставим его в автозагрузку.

Радуемся, теперь у нас все автоматизированно. Устройство испытано на своем ПК и польностью работает.

Подписывайтесь на Bitnovosti в telegram!

Делитесь вашим мнением об этой новости в комментариях под статьёй.

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

Целевой сервер на Gentoo используется мной в основном для экспериментов, однако на нём работает ряд сервисов, которые, по возможности, должны быть доступны без перебоев. К сожалению, последствия некоторых экспериментов приводят к kernel panic, 100% загрузке CPU и другим неприятностям в самый не подходящий момент. Так что идея добавить watchdog давно требовала внимания и наконец материализовалась в данное устройство.

После пристального осмотра того, что было в наличии и оценки доступного времени, оптимальным вариантом стал watchdog собранный на базе Arduino Nano. Примерно также появился и список требований:

  1. Запуск и останов демона, для работы с таймером, штатным средством ОС (OpenRC).
  2. Собственный watchdog на устройстве, в ATmega он есть, нужно использовать.
  3. Лог событий на устройстве для фиксации перезагрузки и срабатывания таймера.
  4. Синхронизация времени устройства с хостом для записи в лог корректного времени.
  5. Получение и отображение статуса устройства и записей его лога.
  6. Очистка лога и сброс устройства в исходное состояние.
Таким образом, «микроскоп» был найден, «гвоздь» обозначен… можно забивать.

Аппаратная часть

Основой устройства стал китайский клон Arduino Nano, выполненный на базе чипа CH340. Свежие Linux ядра (проверял начиная с 3.16) имеют подходящий драйвер, так что устройство легко обнаруживается как USB последовательный порт.

Нежелательная перезагрузка Arduino

При каждом подключение терминала, Arduino перезагружается. Причина в отправке терминалом сигнала DTR (Data Terminal Ready), который вызывает перезагрузку устройства. Таким образом Arduino IDE переводит устройсво в режим для загрузки скетчей.

Существует несколько вариантов решения проблемы, но рабочим оказался только один - необходимо установить электролит 10µF (C1 на схеме ниже) между контактами RST и GND. К сожалению, это также блокирует загрузку скетчей на устройство.

Как итог - схема получилась следующий:


Нарисовано с помощью KiCad

Пояснения к схеме

  • R1 - резистор для ограничения тока, рассчитывается согласно спецификации на оптопару PC817: (5V - 1.2V / 0.02A) = 190Ω , ближайшей стандартный номинал 180Ω.
  • U2 - оптопара для гальванической развязки Arduino и PC. Можно обойтись и транзистором, так как земля общая (через USB разъем), но лучше не нужно.
  • JP1 - джампер, в рабочем положении должен быть замкнут. Для загрузки скетча на устройство его необходимо разомкнуть.
  • С1 - конденсатор, блокирует перезагрузку устройства в ответ на сигнал DTR.
  • MB_RST , MB_GND - RESET активен при низком уровне сигнала, соответственно нужно замкнуть RST на землю (GND). В оптопаре используется транзистор, следовательно важно соблюсти полярность.
  • BTN_RST , BTN_GND - кнопка на корпусе, обычно это механический переключатель, следовательно, полярность не важна, но бывают исключения.

Boot-loop (циклическая перезагрузка) при работе с WDT

Микроконтроллеры ATmega имеют встроенный механизм перезагрузки по таймеру WDT (WatchDog Timer). Однако все попытки использовать данную функцию приводили к boot-loop, выйти из которого можно было только отключив питание.

Не долгие поиски выявили, что загрузчики большинства клонов Arduino не поддерживают WDT. К счастью, данная проблема была решена в альтернативном загрузчике Optiboot .

Для того, чтобы прошить загрузчик, необходим программатор умеющий работать по протоколу SPI, также желательно, чтобы Arduino IDE знала это устройство «в лицо». В данном случае идеально подойдёт ещё одна Arduino.

Если взять Arduino UNO, в качестве программатора, и последнию на данный момент версию Arduino IDE v1.6.5, то алгоритм будет следующий:

После этой процедуры, загружать скетчи в Arduino Nano нужно будет выбирая те-же настройки - Board : Optiboot on 32 pin cpus, Processor : ATmega328p, CPU Speed : 16MHz.

Пайка

Далее необходимо всё спаять, так чтобы выглядело одним куском.

Здесь USB штекер понадобился из-за того, что у меня mini-ITX мат.плата только с одним разъем на пару USB2.0, которые нужны на передней панели, а к контактной площадке USB3.0 нечем было подключиться. По возможности такие устройства нужно подключать прямо к мат.плате, чтобы провода наружу не торчали.

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

Как паять дорожки на макетной плате

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

Выглядеть должно примерно так:



Результат:

Здесь может показаться, что некоторые контакты плохо пропаяны, но это всего лишь флюс. Расход припоя на макетных платах достаточно большой, поэтому флюсом тут заляпано всё, что только можно. На самом деле, это хороший пример как не нужно оставлять изделие после пайки. Флюс необходимо смыть, иначе могут быть проблемы с коррозией соединений. Допишу и пойду отмывать… Вот так лучше:

Программная часть

Объективно говоря, код этого проекта особого интереса не представляет. Вводные далеко не экстремальные, а архитектура описывается одной фразой: отправить команду - подождать ответ. Для порядка опишу здесь основной функционал и кратко остановлюсь на самых интересных моментах, с моей точки зрения.

Подключение watchdog

При подключении watchdog создается файл устройства, содержащий порядковый номер. Если в системе есть другие ttyUSB устройства (в моём случае - модем), то возникает проблема с нумерацией. Чтобы однозначно идентифицировать устройство, необходимо создать симлинк с уникальным именем. Для этого предназначен udev, который наверняка уже есть в системе.

Для начала нужно визуально найти подключённый watchdog, например, подсмотрев в системный лог файл. Затем, заменив /dev/ttyUSB0 на нужное устройство, написать в терминале:

Udevadm info -a -p "$(udevadm info -q path -n /dev/ttyUSB0)"

Пример вывода

looking at device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0": KERNEL=="ttyUSB0" SUBSYSTEM=="tty" ... looking at parent device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0": KERNELS=="ttyUSB0" SUBSYSTEMS=="usb-serial" DRIVERS=="ch341-uart" ... looking at parent device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0": ... looking at parent device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4": SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{idVendor}=="1a86" ATTRS{idProduct}=="7523" ATTRS{product}=="USB2.0-Serial" ...


В данном случае, правило будет иметь следующий вид: ACTION=="add", KERNEL=="ttyUSB*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyrst-watchdog"

Разместить его нужно в отдельном файле в директории /etc/udev/rules.d , например 51-ttyrst-watchdog.rules и скомандовать udev перезагрузить правила: udevadm control --reload-rules

С этого момента, при подключении watchdog будет создаваться ссылка /dev/ttyrst-watchdog на нужное устройство, которая и будет использоваться далее.

Bash скрипт (ttyrst-watchdog.sh)

Общение с watchdog производится на скорости 9600 бод. Arduino без проблем работает с терминалами на больших скоростях, но команды для работы с текстом (cat, echo и т.п.), получают и отправляют только мусор. Не исключено, что это особенность только моего экземпляра Arduino Nano.

Для основного цикла перезапуска таймера и для функций командной строки, используется один скрипт. Причина в том, что оба компонента используют общий ресурс - файл устройства, и к нему необходимо обеспечить синхронный доступ.

Синхронизация по сути состоит цикла ожидания: while fuser ${DEVICE} >/dev/null 2>&1; do true; done и захвата устройства на необходимое время: cat <${DEVICE}

Очевидно, такая схема подвержена состоянию гонки (race condition). Бороться с этим можно по взрослому (например, организовать очередь сообщений), но в данном случае, достаточно грамотно расставить таймауты, чтобы гарантированно получать результат за приемлемое время. По сути весь скрипт и есть работа с таймаутами.

Демонизация (запуск в фоновом режиме) производится средствами пакета OpenRC. Предполагается, что данный скрипт находится в файле /usr/local/bin/ttyrst-watchdog.sh , а OpenRC скрипт в /etc/init.d/ttyrst-watchdog .

При остановке демона требуется корректная дезактивации watchdog. Для этого в скрипте устанавливается обработчик сигналов, требующих завершение работы: trap deactivate SIGINT SIGTERM И тут всплывает проблема - OpenRC не может остановить демон, точнее может, но не часто.

Дело в том, что команда kill, отправляет сигнал скрипту, а программа sleep, которая используется для приостановки работы скрипта, выполняется в другом процессе и сигнал не получает. В результате функция deactivate запускается только после завершения работы sleep, а это слишком долго.

Решение заключается в том, чтобы запустить sleep в фоне и ждать завершения процесса в скрипте: sleep ${SLEEP_TIME} & wait $! # переменная $! содержит ID последнего запущенного процесса

Основные константы:

WATCHDOG_ACTIVE - YES или NO, соответственно, отправлять сигнал на перезагрузку при срабатывании таймера или нет.
WATCHDOG_TIMER - время в секундах на которое устанавливается таймер.
SLEEP_TIME - время в секундах через которое необходимо перезапускать таймер. Должно быть много меньше, чем WATCHDOG_TIMER, но не сильно маленькое, что бы не создавать чрезмерную нагрузку на систему и устройство. При текущих таймаутах разумный минимум - примерно 5 секунд.
DEFAULT_LOG_LINES - число последних записей лога устройства, возвращаемых командой log по умолчанию.

Команды скрипта:

start - запуск основного цикла перезапуска таймера. В функцию is_alive можно добавить код дополнительных проверок, например проверить возможность подключения по ssh.
status - вывод статуса устройства.
reset - обнуление EEPROM (данных лога) и перезагрузка устройства для приведения watchdog в исходное состояние.
log <число записей> - вывод заданного числа последних записей лога.

Arduino скетч (ttyrst-watchdog.ino)

Для успешной компиляции скетча потребуется сторонняя библиотека Time , необходимая для синхронизации времени.

Скетч состоит из двух файлов. Это связанно с тем, что Arduino IDE не воспринимает структуры (struct) объявленные в основном файле, их необходимо выносить во внешней файл заголовков. Также для объявления структуры не обязательно ключевое слово typedef, вероятно даже вредно… проверив стандартные варианты, подобрать подходящий синтаксис у меня не получилось. В остальном это более или менее стандартный C++.

Функции wdt_enable и wdt_reset работают со встроенным в микроконтроллер watchdog. После инициализации WDT главное не забывать сбрасывать его в основном цикле и внутри циклов всех длительных операций.

Записи лога пишутся в энергонезависимую память EEPROM, доступный её размер можно указать в logrecord.h, в данном случае это число 1024. Лог выполнен в виде кольца, разделителем служит структура с нулевыми значениями. Максимальное число записей для 1 KiB EEPROM - 203.

  • wdt
  • bash
  • sketch
  • Добавить метки
    • Tutorial

    Речь пойдет о том, как держать Arduino всегда в работоспособном состоянии. Механизм watchdog встроен в контроллеры Atmega, но, к сожалению, не всякий загрузчик (bootloader) Arduino правильно обрабатывает эту функцию. Попробуем разобраться с этой проблемой.

    Итак, что такое watchdog? Простыми словами - это встроенный таймер на определенное время (до 8 сек в зависимости от чипа), который можно запустить программно. Как только таймер «дотикает» до нуля, контроллер подает правильный сигнал сброса (RESET) и всё устройство уходит в hard перезагрузку. Самое главное, что этот таймер можно сбрасывать в начальное состояние также программным способом.

    • Правильный сигнал сброса - достаточный по длительности для того, чтобы контроллер начал перегружаться. Иногда есть соблазн подключить к RST входу какой-либо цифровой выход Arduino и устанавливать его в 0 когда надо перегрузиться. Это плохой подход к решению проблемы, т.к. такого сигнала может быть недостаточно по времени, хотя и не исключено, что в некоторых случаях это тоже будет работать..
    • hard перезагрузка это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Дело в том, что есть еще понятие soft перезагрузки - это программный переход на 0-вой адрес. В принципе, это тоже полезная вещь, но с помощью нее невозможно перегрузить зависший контроллер Ethernet или взглюкнувший LCD.
    Короче говоря, встроенный watchdog это как раз то, что нужно и без дополнительных схем, пайки и соединений.

    Функции Watchdog

    Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку:
    #include
    Теперь нам доступны следующие три функции:

    1. Запуск таймера watchdog:
    wdt_enable(WDTO_8S); /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S */
    Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.

    2. Сброс таймера watchdog:
    wdt_reset();
    Думаю, понятно для чего нужна эта функция - пока вы вызываете ее, контроллер не сбросится. Как только система зависнет и эта функция вызываться перестанет, то по истечении заданного периода произойдет перезагрузка.

    3. Отключение watchdog:
    wdt_disable();
    Отключение таймера watchdog.

    Собственно, на этом можно было бы и закончить наше повествование о watchdog… но дело в том, что все это работает только в Arduino Uno, а на Arduino Mega, Mini и Nano все это работает ровно наоборот, т.е. не работает совсем:)

    Почему watchdog не работает на большинстве современных плат Arduino

    Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период , т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) - сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.

    Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший).

    Выглядит это все примерно так:


    Пути решения проблемы

    Если посмотреть на исходники стандартного загрузчика (они есть в поставке платформы), то код отключения watchdog есть (!), но этот код вынесен под условную компиляцию и, по всей видимости, стандартный загрузчик скомпилирован без поддержки watchdog. По крайней мере в пакете платформы версии 1.5.2 (последней на момент написание статьи) дело обстоит именно так.

    Для решения проблемы я даже прочитал man-ы самой платформы (:) и вроде бы там описана эта проблема и даже приведен код, который должен сделать всех счастливыми:

    Uint8_t mcusr_mirror __attribute__ ((section (".noinit"))); void get_mcusr(void) __attribute__((naked)) __attribute__((section(".init3"))); void get_mcusr(void){ mcusr_mirror = MCUSR; MCUSR = 0; wdt_disable(); }
    Здесь описывается функция get_mcusr(), которая должна вызываться сразу после сброса. Это достигается макросом "__attribute__((section(".init3")))". Я пробовал прописывать эту функцию во все секции, которые только возможно - да, она действительно запускается до функции setup() из скетча, но, к сожалению, гораздо позже 15ms (минимальная константа watchdog) после сброса…

    Короче говоря, как я ни рыл интернет в поисках легкого решения проблемы, так ничего найдено не было. Я нашел только один способ заставить watchdog работать - перепрошить загрузчик… чем мы сейчас и займемся.

    Проверка работоспособности watchdog

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

    Тестирование на watchdog

    #include void setup() { wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop Serial.begin(9600); Serial.println("Setup.."); Serial.println("Wait 5 sec.."); delay(5000); // Задержка, чтобы было время перепрошить устройство в случае bootloop wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек. Serial.println("Watchdog enabled."); } int timer = 0; void loop(){ // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(13, digitalRead(13)==1?0:1); delay(1); } // wdt_reset(); }


    После перезагрузки (или подключения монитора к порту) встроенный светодиод мигнет, сигнализируя о том, что запустился загрузчик. Далее в секции setup происходит включение watchdog с таймером на 8 сек. После этого светодиод отсчитает нам это время и должна произойти перезагрузка.

    Далее начинается самое интересное - если перезагрузка произошла и все повторяется в такой же последовательности, то вы имеете на руках Arduino, в которой загрузчик правильно обрабатывает watchdog. Если же после перезагрузки светодиод на 13-м пине начинает бесконечно мигать, то значит загрузчик не поддерживает watchdog. Здесь даже кнопка сброса не поможет. Для последующей прошивки нужно плату отключать от питания и после включения успеть прошить до первой перезагрузки.

    Я протестировал 4 вида плат и только загрузчик в Arduino Uno сработал так как надо:

    Результаты на мониторе

    Watchdog не поддерживается загрузчиком:

    Watchdog поддерживается загрузчиком:


    Как легче всего прошить новый загрузчик?

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

    Я не буду в этой статье описывать все премудрости создания программатора на основе Arduino, т.к. эта тема довольно . В качестве программатора я использовал Arduino Uno. Как известно, прошивка производится через отдельный разъем ICSP, который есть почти на всех платах. В случае прошивки Arduino Pro Mini, у которого нет IСSP, подключение производится непосредственно к выводам .

    Подключение для прошивки bootloader




    Где взять загрузчик, который поддерживает watchdog?

    Эта глава напоминает танцы с бубном и скорее всего можно сделать все как-то проще, но, увы, у меня по-другому не получилось.

    Рекомендуется использовать загрузчики из пакета optiboot. В принципе, эти загрузчики идут в инсталляции самой платформы Arduino, но лучше скачать и установить последнюю версию optiboot отсюда . Установка заключается в двух шагах (возможно, это можно сделать как-то по-другому):

    1. Папка bootloaders\optiboot перезаписывается в C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot
    2. Файл boards.txt дописывается к файлу C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
    Естественно, папка установки платформы Arduino у вас может быть другой.

    Далее перегружается среда разработки и в меню Сервис/Плата можно наблюдать новые платы с пометкой . К сожалению, при выборе этих плат происходят какие-то непонятные ошибки компиляции и появляются всякие другие странности… поэтому делаем еще проще. Открываем в любом текстовом редакторе файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt и меняем следующие строчки:

    Для Arduino Nano:
    menu.cpu.nano.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex

    Для Arduino Mini:
    menu.cpu.mini.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex

    Следующая проблема в том, что загрузчика optiboot для платы Arduino Mega не существует в природе, т.к. в Mega больше памяти и используется другой протокол. Поэтому мы используем стандартный, но модифицированный загрузчик, который качаем отсюда . Файл переименовываем в stk500boot_v2_mega2560_2.hex и записываем в папку C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\stk500v2.

    Не пугайтесь, что файл модифицированной прошивки для Mega в 2 раза меньше стандартного - так вроде бы должно быть.

    Процесс прошивки

    После всех изменений можно прошивать загрузчики, выбирая в меню плат обычные платы (не !). В этом случае прошиваться будут именно те файлы hex, которые мы указали в файле board.txt.
    Процесс прошивки может не стартовать и выдаваться ошибка:
    Для решения этой проблемы откройте скетч программатора и в секции setup выберите другую скорость последовательного порта.
    Во время заливки в Arduino Mega может появляться ошибка, которую следует игнорировать:
    avrdude: verification error, first mismatch at byte 0x3e000 0x0d != 0xff avrdude: verification error; content mismatch

    Заключительные манипуляции

    Загрузчики optiboot имеют еще одну особенность - они увеличивают скорость загрузки скетчей, поэтому при использовании плат с optiboot нужно внести соответствующие изменения в boards.txt:

    Для Arduino Nano:
    menu.cpu.nano.atmega328.upload.speed=115200
    Для Arduino Mini:
    menu.cpu.mini.atmega328.upload.speed=115200

    Предыдущую скорость порта лучше тоже запомнить, т.к. ее нужно будет использовать на платах со стандартными загрузчиками. Если такие изменения не сделать, то процессе заливки скетчей будет выдаваться ошибка, типа такой:
    avrdude: stk500_getsync(): not in sync: resp=0x00

    Ссылки, литература

    Пакет optiboot
    Прошивка bootloader
    Как прошить bootloader в Arduino Pro Mini

    Теги:

    • arduino
    • watchdog
    Добавить метки

    Что же такое Watchdog или сторожевой таймер?

    Сторожевой таймер (контрольный таймер , англ. Watchdog timer - букв. «сторожевой пёс») - аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер , который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же - перезагрузка происходит аппаратно (замыканием сигнального провода RST или подобного ему).

    Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

    В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки "Reset" компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.




    Вот и вся схема:

    Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
    После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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





    Изготвление устройства требует минимальных навыков работы с паяльником и програмирования ардуино.

    Так же можно использовать любой Н канальный транзистор с похожими характеристиками. Но смотрите что бы совпадала цоколевка. Например я использовал 9013 , там перевернутое подключение



    Компонентты для сборки я покупал на Алиэкспресс:

    Провода для макетной сборки http://ali.pub/22k78b

    Ардуино УНО (точно подходит) http://ali.pub/22k7dd

    Скетч Ардуино

    int LedPin = 13;
    int ResetPin = 12;
    int val = 0;
    int count = 0;
    void setup()
    {
    Serial.begin(9600);
    pinMode(LedPin,OUTPUT);

    //пауза на запуск 2 мин
    delay (120000);
    }

    void loop()
    {
    count++ ;

    If (Serial.available() > 0)
    {
    val = Serial.read();
    if (val == "H")
    {
    digitalWrite(LedPin,LOW);
    digitalWrite(ResetPin,LOW);
    count = 0;
    }
    else
    { count++ ;
    }
    }

    If (count > 10)
    {
    digitalWrite(LedPin,HIGH);
    digitalWrite(ResetPin,HIGH);
    }
    }

    Скрипт отправляющий в порт данные:

    (Get-Date).ToString("dd.MM.yyyy HH:mm") | Out-File c:\Users\miner\Desktop\reboot.txt -append

    while($TRUE){
    Start-Sleep -s 3
    $port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
    $port.open()
    $port.WriteLine("H")
    $port.Close()
    }

    Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.



    Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания: