+3 голосов
У меня arduino UNO. После загрузки скетч начинает работать, но затем, когда я открываю монитор порта, всё начинается с начала. Почему так происходит, и возможно ли убрать перезагрузку?
(925 баллов) 42 74 103

2 Ответы

+1 голос
 
Лучший ответ

USB-serial контроллер Arduino перезагружает МК каждый раз, когда терминальная программа (в т.ч. Serial monitor, встроенный в ПО Arduino IDE) устанавливает соединение. Реализовано это следующим образом: у USB-serial контроллера вывод DTR (Data Terminal Ready) связан с выводом RESET. Если программа, работающая с виртуальным последовательным портом, использует DTR, то при установке соединения МК перезагружается. Сделано это для того, чтобы обеспечить  загрузку скетча из Arduino IDE - МК перезагружается перед загрузкой кода.
По скольку у Вас плата Ардуино UNO самым простым способом будет установка конденсатора между входами RST и GND емкостью 10 мкф.
Пример:

Шаг 1. Прошейте плату Ардуино UNO следующим скетчем:

// переменная счетчика
uint16_t i=0;

void setup() {
// открываем порт на скорости 9600 
Serial.begin(9600);
}

void loop() {
// печатаем значение счечика  
Serial.println(i,DEC);
// увеличиваем значение счечика
i++;
// пауза одна секунда
delay(1000);
}

Шаг 2. Отключите питание платы
Шаг 3. Установите конденсатор емкостью 10 мкф (не забывайте соблюдать полярность) между входами RST и GND


Шаг 4. Подключите плату к ПК
Шаг 5. Откройте монитор порта

Как мы видим переменная счетчика имеет ненулевое значение - т.е. плата не перезагрузилась после открытия монитора порта. Теперь использование терминала не приведет к перезагрузке платы.
Чтобы вновь появилась возможность заливать скетчи необходимо либо отключить конденсатор либо:
1. Нажать и удерживать кнопку RESET
2  Начать загрузку скетча 
3. Как только мигнул светодиод RX отпустить её
Про другие способы (в том числе связанные с переделкой платы) можно прочитать в этой статье
p.s: вариант с установкой резистора лично у меня не сработал

(1.2 тыс. баллов) 8 26 51
выбран
+1 голос
У преобразователя USB-UART вывод Dtr связан с выводом Reset. А монитор порта при подключении посылает этот сигнал и МК перезагружается. Это сделано для автоматической загрузки прошивок в МК сразу после их компиляции. Как сделать так, чтобы этого не происходило - использовать внешний преобразователь USB-UART (он же USB - TTL).
(2.7 тыс. баллов) 10 29 55
Дело в том, что монитор порта не выполняет загрузку прошивок, отсюда и вопрос, почему так происходит, ответ видимо прост - потому что так решили разработчики монитора порта.
Как оказалось всё намного глубже.
Монитору порта можно ограничить использование цепей управления DTR и RTS
Установив в настройках для соответствующей платы эти ограничения, например для уны:
uno.serial.disableDTR=true
uno.serial.disableRTS=true
Но всё равно это не спасает.
При открытии последовательного порта, пока скорость передачи и прочие параметры ещё не установлены и DTR ещё не устанавливался и не сбрасывался, вижу сброс на плате.
Либо это делает драйвер (дрыгает DTR-ом что мало вероятно) либо это делает прошивка та что в atmega8u2/atmega16u2.
Если на уне преобразователь usb-uart на CH340G запретив использование DTR возможно получится её не сбрасывать.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...