это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2017/05/04.html
Вчерашний пост http://lleo.me/dnevnik/2017/05/03.html про управление мотором собрал множество комментариев - реально горжусь вами, что вы у меня такие умные. Советов оказалось множество, и буквально в пятом комменте некто Лжедмитрий Малобуков дал ссылку на математический алгоритм:
https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362#22640362 Который сильно подкупал анимированной гифкой, иллюстрирующей матаппарат. Язык алгоритма правда был незнакомый. Да и математику я, оказывается, сильно подзабыл - средние отклонения там всякие, Мю... Но с помощью PHP я алгоритм воссоздал, и он заработал у меня на тестовом массиве. А Чук, неожиданно заинтересовавшийся проблемой, параллельно накидал его на C. Я его код потом пару раз переписал, в итоге получилось вообще несколько строчек, ниочем, как говорится:
[ ТЕКСТ ПОД КАТОМ: Доступен только в оригинальной заметке на сайте ]
Вопреки сомнениям скептиков, этот код исправно работал. Ниже на картинке пара пробегов двухоборотного замка туда и обратно от заедания до заедания:
Эту картинку передает по WiFI чип 8266 в браузер, по аяксу график плавно плывет и достраивается. Красные эпюры - ток мотора, как мы помним. Синяя линия - результат математической оценки по анализу текущего момента: всплески и провалы. Нас, собственно, интересуют всплески. Зеленая линия - идеал: моменты, когда двигается щеколда замка. Как видим, даже малозаметные всплески в нужных местах исправно отмечаются всплесками синей линии, совпадающей с зеленой. Вы наверно спросите, откуда она взялась, зеленая? Ну, честно говоря, у меня в замке все-таки есть кнопка состояния. Она размыкается в момент, когда приподняты железяки, запирающие защелку, и соответственно, идет её движение - выдвигание или убирание (сорри, не помню правильную слесарную терминологию):
Короче, кнопка-то есть. По крайней мере, иногда. Я ее сперва поставил, потом снял, когда понял, что можно мерять токи мотора, сейчас поставил опять, чтобы на графике отображать эталон. Но кнопка мне не нравится, потому что это неспортивно. Ну правда же, на дворе 21 век, все предыдущие века толпы седых математиков думали, карандаши грызли, в безумие впадали, и всё для чего? Чтобы теперь, в век, когда мощный компьютер умещается в чипе ESP8266 размером с ноготь, припаивать в замок лишние кнопки? Не хочется :)
Однако, и скептики в комментариях были тоже совершенно правы. Система работает практически без ошибок, но в ситуации полной пробежки: мы включили замок, и вот он пошел вращаться два своих оборота и далее до упора. Потом обратно. И там все очень хорошо работает. Но в реальности задача немного иная: надо быстро защелкнуть замок (например, на один оборот, потом можно подождать с полчасика и еще на один). А потом на этот оборот надо быстро повернуть обратно и открыть. Понятно, что при закрытии замка мотор должен остановиться как можно раньше после выполнения работы - чтобы, вернувшись, человек не ждал, пока мотор будет долгие секунды подъезжать обратно, чтобы отщелкнуть замок. И вот тут возникает проблема. Потому что при старте мотора сам собой вылезает огромный ток старта - оно и понятно, система инерционная, на мотор большая нагрузка, пока не раскрутит все шестерни. Ну, пик старта я просто отсекаю - не измеряю пару секунд после старта. А дальше подъезжает пик поворота защелки. И его система зачастую не видит, потому что не успевает набрать статистику ровного хода для своих дисперсий и прочих вычислений:
На этой трагической ноте я мог бы закончить этот пост, и подытожить, что, увы, без кнопки не обойтись. Но я только что для прикола поставил значение размера буфера FLT_lag равным 5 вместо 10, и вообще всё заработало идеально:
Не знаю, надолго ли, будем наблюдать. Но на данный момент математика победила. Слава математике! Спасибо всем за советы и сомнения!
PS: Кому интересно, вот полный скетч для Ардуины-8266 - добавить к вышеупомянутому chuk.c/chuk.h, и можете повторить эксперимент с замком сами ;)
[ ТЕКСТ ПОД КАТОМ: Доступен только в оригинальной заметке на сайте ]
это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2017/05/04.html