Неожиданный HIGH на пине при ресете через USB

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

Накидайте возможных причин. 

Ардуино и Raspberry Pi 3B+ соединены пинами, а также по USB кабелю (на схеме не показан - сорри, на схеме много лишнего, не относящегося к вопросу. Пунктирные линии это GND). Сначала опишу логику:

1. Ардуино считывает сигнал с кнопки, и когда она размыкается, на пине 6 (сконфигурирован как INPUT_PULLUP) появляется HIGH, инициирует выключение RPi, а именно:

1а. На пин 8 выдаём HIGH, этот сигнал считывает RPi и начинает завершать работу операционной системы, на это уходит 20-30 секунд.

1б. Ждём, когда энергопотребление RPi упадёт низко и после подаём HIGH на пин 9, что, после инверсии при помощи транзистора (номиналы резисторов на схеме не поправлены), приводит к подтягиванию на RPi пина PEN к земле и фактически отрубанию её питания (падает до 1-2 мА).

На практике же возникает проблема:

2. Я отжимаю кнопку, PRi начинает завершать работу (видно в консоли).

2.1. Через пару секунд RPi вырубается, то есть на пин 9 было выдано HIGH (скетч невиноват, там delay на 60 секунд)

2.2. Одновременно с выключением RPi я вижу, что у ардуины выполняется код setup() - там у меня есть три мигания светодиодом.

Мои предположения:

1. Видимо, по мере завершения процессов операционная система PRi дёргает заново инициализацию USB и это приводит к сбросу ардуины и в самом начале сброса на пин 9 выдаётся HIGH на короткое время.

2. Эксперимент 1 - я отсоединил USB кабель, всё отработало как и должно быть в теории - завершение работы, значительное снижение электропотребления и через минуту отправка в сон. То есть при неподключеном USB шнурке проблема не возникает.

3. Эксперимент 2 - при работе в обычном режиме нажатие кнопки ресет на ардуине не приводит к выдаче HIGH на пин 9. То есть сам по себе сброс проблему не порождает, а только в связке и USB.

Вечером попробую посмотреть, действительно ли есть HIGH на пине 9 в момент сброса ардуины по USB кабелю. А пока жду других идей - может кто сталкивался и причина в неверной электрической схеме...

 

Схема https://raw.githubusercontent.com/ArtHome12/ha_arduino_sh/master/Readme_Sheme.png

Полный код тут https://github.com/ArtHome12/ha_arduino_sh/blob/master/ha_arduino_sh.ino

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

ArtHome пишет:

Вечером попробую посмотреть, действительно ли есть HIGH на пине 9 в момент сброса ардуины по USB кабелю. 

В вмысле осциллографом попробую увидеть этот HIGH. Он явно кратковременный, так как RPi не остаётся во сне, а начинает заново загружаться, то есть сигнал исчезает. А если стрелка осциллографа ничего не покажет, значит собака порылась где-то совсем в другом месте...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

   Инициализация сериал видимо выставляет сигнал Готовность терминала данных DTR, выпаять конденсатор в ардуине и проверить

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

Увидеть иглу на цифровом осциллографе с Али сама по себе задача - долго и муторно ловить момент. Предположим, что она есть - как с ней бороться?

Я так понимаю два пути - ставить второй МК, который будет ждать подтверждения сигнала или же поставить кондёр, который проглотит краткий сигнал. Как его рассчитать? Его ставить лучше на линию около ардуины, чтобы отфильтровать иглу от LOW на HIGH и обратно или же рядом с RPi, чтобы фильтровать кратковременный провал на GND? Время переключения неважно, хоть секунды, лишь бы накопленный заряд в дымок не ушёл в компании с соседними деталями.

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

Немного повозился и поймал нежелательный HIGH при ресете ардуины через USB - во вложении он во всей красе, 5,6V, а вот длительность не знаю, непонятно, какая горизонтальная шкала у осиллографа DSO138 (если 0,1 ms это на весь буфер, то на экране видно 12 делений плюс за экраном ещё два фрейма слева и справа, итого 1 деление это 0,1/36 миллисекунды или  3 микросекунды.

Нужна помощь сообщества:

1. Конденсатор с какими параметрами мне использовать для подавления данного безобразия (когда я сам устанавливаю HIGH для отправки малины в сон, то я делаю это это надолго и задержка до выхода на режим некритична, хоть секунды).

2. Куда лучше поставить конденсатор (схема в первом посте) - минусовую ногу я ставлю на землю, а плюсовую между пином D9 и резистором, между резистором и транзистором или куда-то ещё?

Фото осциллографа "что стало" обязуюсь выложить, если все компоненты, конечно доживут до успешной фотосессии. :)

Pyotr
Offline
Зарегистрирован: 12.03.2014

Не вникал очень в суть проблемы, но скажу. При подаче питания на ардуину с загрузчиком отрабатывается setup(), loop() гдето 0.2-0.3 с, затем загрузчик, затем снова сетап и луп. При нажатии ресет - загрузчик, сетап, луп. Это я заметил на своей уно. Может в этом причина.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

да выдерни ты конденсатор 100 нан на ресет от ch340 может проблема и уйдёт

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

ua6em пишет:

да выдерни ты конденсатор 100 нан на ресет от ch340 может проблема и уйдёт

По трём причинам опасаюсь это делать:

1. Разработчики его же с какой-то целью поставили. Я по USB удалённо перепрошиваю ардуину прямо с малины, то есть проблема не в том, чтобы она не ресетилась по USB при инициализации Serial, а в том, чтобы на одном из цифровых пинов не дёргала HIGH.

2. При необходимости замены деталей надо будет помнить, что ардуина нестандартная. А когда она год-два отработает в тёмном углу это уже будет проблемой. Я её сейчас специально через кроватку установил именно для возможных будущих ремонтов. То есть я хочу доработать схему под ардуину, а не в неё изменения вносить.

3. Мои умения пайки не очень хороши. Выпаивание SMD и припаивание его обратно - игра в русскую рулетку для ардуины)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не, не уйдёт, при инициализации порта она всегда будет дёргать сигнал ресет но при этом сам чип  CH340 не ресетится, то-есть, всё, что накоплено в буфере последовательного порта  прилетит в малину и эта информация отработает (весь это мусор)

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

ArtHome пишет:
Я по USB удалённо перепрошиваю ардуину прямо с малины, то есть проблема не в том, чтобы она не ресетилась по USB при инициализации Serial, а в том, чтобы на одном из цифровых пинов не дёргала HIGH. для ардуины)

Чем хорош usb для прошивки ардуины? Почему бы не воспользоваться для прошивки выведенным на гребенку uart-ом или spi?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ArtHome, сам МК не может дёргать в high 9 пин, если его на это не запрограммируют, т.к. состояние при старте - float.  Что бы обеспечить гарантированный LOW нужно использовать внешний резистор на землю, по "схеме" его не вижу.

svm
Offline
Зарегистрирован: 06.11.2016

dimax пишет:

ArtHome, сам МК не может дёргать в high 9 пин, если его на это не запрограммируют, т.к. состояние при старте - float.  Что бы обеспечить гарантированный LOW нужно использовать внешний резистор на землю, по "схеме" его не вижу.

Точно float?  Не описка?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

svm, ну да.  Оно по-разному называется, (высокоимендасное, HI-Z)

ArtHome, может ещё какая библиотека дёргает. Легко проверить переносом на другой пин, A0 например

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

Алексей. пишет:

Чем хорош usb для прошивки ардуины? Почему бы не воспользоваться для прошивки выведенным на гребенку uart-ом или spi?

Постараюсь развёрнуто ответить. У меня на малине (RPi) крутится Hassio, на мой взгляд самая продвинутая сейчас система умного дома (как пример - она обеспечивает удалённый доступ к себе всего лишь имея выход в инет через мобильного оператора с иммунитетом к brut force и DDOS атакам благодаря технологии tor onion), предоставляет сносный дашборд (интерфейс пользователя с графиками и переключателями), благодаря энтузиастам поддерживает много готовых Iot железок и позволяет легко интегрировать собственные. То есть на малине - интерфейс, а рулить устройствами нужна железка попроще, в качестве которой у меня ардуина. Так как у ардуины на борту нет своего вайфая, я подключаю её к малине по USB, что позволяет им обмениваться данными и командами, а также обновлять прямо через инет (я выкладываю на github новый hex, в браузере жму кнопку и ардуина перепрошивается, что в домашней сети, что через инет). Можно конечно задействовать для прошивки отдельную гребёнку, для обмена информацией пины I2C - но это усложнение программирования при одновременном снижении надёжности из-за пучка соплепроводов вместо USB кабеля.

dimax пишет:

ArtHome, сам МК не может дёргать в high 9 пин, если его на это не запрограммируют, т.к. состояние при старте - float.  Что бы обеспечить гарантированный LOW нужно использовать внешний резистор на землю, по "схеме" его не вижу.

Кажется это то, что надо, спасибо! Вечером попробую и отпишусь.

Касательно "сам МК не может дёргать в high 9 пин" то к сожалению такая недокументированная фича именно при сбросе через USB продемонстрирована на фото выше. При ресете кнопкой всё ок. Может это просто особенность моей дешёвой ардуины с неизвестной родословной (на ней все светодиоды красные и в Arduino IDE надо выбирать "старый загрузчик", а на самой первой жертве экспериментов, купленной задорого, были и зелёные). Но может конечно и библиотека какая, которой есть дело, как был выполнен reset...

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

ArtHome пишет:
То есть на малине - интерфейс, а рулить устройствами нужна железка попроще, в качестве которой у меня ардуина.
Это не просто железка попроще, это в отличии от малины, немножко реалтайм железка, малину, к сожалению, реалтаймом назвать нельзя.
ArtHome пишет:
я выкладываю на github новый hex, в браузере жму кнопку и ардуина перепрошивается
Используя spi вы можете не только обновлять прошивку, но и обновлять начальный загрузчик в ардуине.
Про spi и uart я спрашивал, только по тому, что с использованием usb возникли определенные сложности.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ArtHome пишет:

Алексей. пишет:

Чем хорош usb для прошивки ардуины? Почему бы не воспользоваться для прошивки выведенным на гребенку uart-ом или spi?

Постараюсь развёрнуто ответить. У меня на малине (RPi) крутится Hassio, на мой взгляд самая продвинутая сейчас система умного дома (как пример - она обеспечивает удалённый доступ к себе всего лишь имея выход в инет через мобильного оператора с иммунитетом к brut force и DDOS атакам благодаря технологии tor onion), предоставляет сносный дашборд (интерфейс пользователя с графиками и переключателями), благодаря энтузиастам поддерживает много готовых Iot железок и позволяет легко интегрировать собственные. То есть на малине - интерфейс, а рулить устройствами нужна железка попроще, в качестве которой у меня ардуина. Так как у ардуины на борту нет своего вайфая, я подключаю её к малине по USB, что позволяет им обмениваться данными и командами, а также обновлять прямо через инет (я выкладываю на github новый hex, в браузере жму кнопку и ардуина перепрошивается, что в домашней сети, что через инет). Можно конечно задействовать для прошивки отдельную гребёнку, для обмена информацией пины I2C - но это усложнение программирования при одновременном снижении надёжности из-за пучка соплепроводов вместо USB кабеля.

dimax пишет:

ArtHome, сам МК не может дёргать в high 9 пин, если его на это не запрограммируют, т.к. состояние при старте - float.  Что бы обеспечить гарантированный LOW нужно использовать внешний резистор на землю, по "схеме" его не вижу.

Кажется это то, что надо, спасибо! Вечером попробую и отпишусь.

Касательно "сам МК не может дёргать в high 9 пин" то к сожалению такая недокументированная фича именно при сбросе через USB продемонстрирована на фото выше. При ресете кнопкой всё ок. Может это просто особенность моей дешёвой ардуины с неизвестной родословной (на ней все светодиоды красные и в Arduino IDE надо выбирать "старый загрузчик", а на самой первой жертве экспериментов, купленной задорого, были и зелёные). Но может конечно и библиотека какая, которой есть дело, как был выполнен reset...

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

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

dimax пишет:

ArtHome, сам МК не может дёргать в high 9 пин, если его на это не запрограммируют, т.к. состояние при старте - float.  Что бы обеспечить гарантированный LOW нужно использовать внешний резистор на землю, по "схеме" его не вижу.

Как и обещал, докладываю о результатах.

Pulldown резистор наверняка бы помог, но мне не очень нравилось это решение, так как через него начал бы течь мизерный ток и как раз когда включен режим энергосбережения. На радиокоте мне посоветовали просто 0,1 мкф конденсатор повесить на базу-эмиттер транзистора, я попробовал и всё заработало, как надо. Схема, доступная по ссылке из первого поста, обновлена.

 

ua6em пишет:

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

Надеюсь, места для ложных срабатываний не осталось - при штатном режиме сама ардуина контролирует уровень, а в момент, когда она себя не контролирует, всё пожирает кондёр. Если наступлю на грабли в дальнейшем, отпишусь. :)