tonik38, я порылся в архивах - версия скриптов от 180607, которую я прикреплял к предыдущему посту, нормально работала с прошивками от 17.04.10. Т.е. - как и у Вас. Вроде бы должна работать. Может быть это опять вылезла та самая проблема со стречем (растягивание паузы в i2c), когда пропадает старший бит? Сможете посмотреть сигналы на шине i2c? Эта проблема толком так и не была решена. Сейчас нелегко вспомнить, но, кажется, простым решением был следующий "костыль": вычитать некоторое число из RMS, чтобы посылаемый код был меньше 128, а потом, в "приемной части" восстанавливать правильное значение.
Скажите, а какую версию малинки и Raspbian используете?
tonik38
Новичок
Иркутск
6
Отв.1741 18 Нояб. 19, 08:11
Скажите, а какую версию малинки и Raspbian используете?OldBean, 18 Нояб. 19, 03:45
Raspberry pi 3B+ rev1.3 Raspbian GNU/Linux 10(buster)
Добавлено через 6мин.:
Смотреть сигналы на шине пока не могу, нет анализатора и осциллографа(((
Я не понимаю, почему sens.py видит правильные показания (и 230в видит, и 140в), а nna.py после импорта из sens уже их не видит?
Добавлено через 50мин.:
Часть вопроса разрешил сам(мой косяк был). Калибровку RMS изначально сделал без ЛАТРа, т.е.сделал совсем маленький диапазон в районе 230В. Ну очень хотелось включить... Поэтому все, что не попадало в этот диапазон, вероятно, и было причиной считывания низкого напряжения. Сейчас подключил ЛАТР, выставил диапазон 140В(334единицы)-250В(625ед)в скетче, прошил. Скрипт nna_38 заработал, видит правильное напряжение при импорте. Но при напряжении выше 230В снова начинает ругаться на низкое напряжение. При 236В пишет <109В, при 244В пишет <116В и отключает нагрев.
Добавлено через 4мин.:
Радует то, что теперь есть возможность понять, кто такие биты))) Особенно старший
OldBean
Доцент
Красноярск
1K 1.4K
Отв.1742 18 Нояб. 19, 09:49
При 236В пишет <109В, при 244В пишет <116В и отключает нагрев.tonik38, 18 Нояб. 19, 08:11
Да. Старший бит все-таки теряется из-за некорректного малинкиного стреча.
Радует то, что теперь есть возможность понять, кто такие биты))) Особенно старшийtonik38, 18 Нояб. 19, 08:11
Понятно. Вечером посмотрю исходники, вспомню все, расскажу подробнее что происходит и как сделать "костыль".
dee
Научный сотрудник
Минск
6.9K 1.8K
Отв.1743 18 Нояб. 19, 15:18
такой простой датчик скорости отбора действительно отлично работаетOldBean, 15 Нояб. 19, 18:25
это не только датчик отбора, это еще и электронный спиртометр, поскольку объем фиксированный и его вес каждый раз измеряется, не обязательно ставить весь прибор на тензодатчик, можно подвесить внутри емкость определенный объем
Понял. Спасибо. Хорошая идея! Плотность жидкости мы можем оценить, когда малый объем полностью утонул, а в остальные моменты времени (пока большой объем заполняется и малый погружен лишь частично) мы можем измерять скорость отбора. Если плотность (спиртуозность) за один цикл изменяется слабо (а так можно сделать), то все будет работать. To tonik38
Про проблему со старшим битом можете в деталях посмотреть здесь
В варианте LITE я запрещаю прерывания по шине i2c на время цикла преобразований всех датчиков, поэтому проблем с "растяжкой" не возникает. Запрос на чтение по шине i2c будет только тогда, когда МК закончит измерения и освободится. Но в старой версии системы этого не было сделано. Кстати, датчик RMS - наиболее уязвим по отношению к этой проблеме, т.к. он постоянно занят измерением и накоплением напряжения сети. Поэтому, если снижением скорости обмена проблема не снимается, то поставьте "костыль" по такой пошаговой инструкции:
1. Выполнить калибровку датчика RMS, как описано здесь. 2. Далее нужно оценить минимальный диапазон, в котором будет "болтаться" напряжение сети в процессе работы. Нужно чтобы весь диапазон не превышал 127 вольт. Иначе не получится работать в 7-битном формате (т.е. - игнорировать старший бит). Ну, допустим мы ограничили рабочий диапазон пределами 160-260 В. Пусть минимальное значение допустимого напряжения сети будет Umin (это нижний предел рабочего диапазона, в нашем примере - 160). 3. Открываем в редакторе IDE скетч датчика RMS. В конце скетча в функции void sendData() нужно найти строчку:
Wire.write((uint8_t)(rms - 100));
и заменить число 100 на значение, которое мы выше обозначили как Umin (для нашего примера - 160). Сохраняем скетч и прошиваем ардуинку. 4. Теперь в модуле sence.py в самом конце описания класса RMS нужно найти строчку
return self._bus.read_byte(self._addr) + 100
и тоже заменить число 100 на Umin (для нашего примера - те же 160).
После этих изменений, если напряжение будет оставаться в пределах нашего диапазона, все должно заработать правильно. Удачи!
tonik38
Новичок
Иркутск
6
Отв.1745 18 Нояб. 19, 17:31, через 46 мин
После этих изменений, если напряжение будет оставаться в пределах нашего диапазона, все должно заработать правильно. Удачи!OldBean, 18 Нояб. 19, 16:46
Круто!!! Все так и оказалось! Работает в пределах моего диапазона 180-260, все измеряет правильно. Спасибо огромное за помощь. И за мое приобщение к такому приятному делу через ваш проект)))
OldBean
Доцент
Красноярск
1K 1.4K
Отв.1746 19 Нояб. 19, 06:58
17.7.6. Текущее состояние "железа" варианта LITE и софта v. 0.3.0.1
В процессе разработки варианта LITE постоянно накапливаются какие-то доработки. Как в "железе", так и в софте. Тема разрослась, в ней стало трудно ориентироваться даже мне. Поэтому в этом топике я кратко опишу состояние железа и софта варианта LITE на текущий момент. Вариант, который здесь будет описан, отлажен и полностью рабочий. Идет уже второй десяток ректификаций, которые я провожу при помощи этой автоматики. Софт эволюционирует, но архитектура железа уже в основном устоялась.
1. Крейт
Исходный вариант крейта был описан здесь. К настоящему времени он претерпел ряд изменений. Во-первых, убран контактор. Он действительно оказался не очень нужным элементом. Контроллер контактора я "перепрошил" в ШИМ-контроллер для третьего клапана отбора. Это для фракционирования. Само фракционирование еще не реализовано, но все детали уже собраны. Во-вторых, одна из земляных линий перепрофилирована в линию RES для аппаратного сброса всех микроконтроллеров, находящихся на общей шине крейта. Это очень удобно при экспериментировании, когда велика вероятность "зависания" каких-нибудь модулей. В-третьих, датчик RMS теперь непосредственно подключен к питающей сети, а дифавтомат стоит уже за ним. Был сделан еще ряд изменений, но они не "прижились", поэтому о них упоминать не буду. Блок-схема крейта теперь выглядит следующим образом: Ненавязчивая автоматизация ректификационной установки. Автоматика. В общем-то само "железо" варианта LITE устроено довольно просто и единообразно. Основой является крейт, на котором разведена общая сигнальная шина и силовые шины 220v. Общая шина содержит линии питания (+3.3v, +5v), несколько земляных линий, линии SDA и SCL шины i2c, линию аппаратного сброса всех модулей на шине (RES), линия импульсов нуля напряжения сети и линия аварийного прерывания INT. К общей шине подключен управляющий микрокомпьютер Raspberry Pi и набор модулей, реализующих конкретный функционал автоматики. Благодаря архитектуре крейта и общей шины, набор модулей может легко изменяться в зависимости от решаемой задачи.
В основе каждого модуля лежит микроконтроллер ATMega328P, который обеспечивает 1) связь с управляющим микрокомпьютером и 2) работу конкретной периферии модуля (исполнительных устройств и датчиков). Т.е. интерфейсная часть всех модулей одинакова, а "специализация" модуля заключается в конкретной "обвязке" микроконтроллера и его прошивке. Схема подключения Raspberry Pi и модулей (показана только интерфейсная часть модуля) к общей шине изображена на следующем рисунке: Ненавязчивая автоматизация ректификационной установки. Автоматика. Как и раньше, автоматика реализована в виде открытого стенда, с которым легко экспериментировать и изменять ее конфигурацию. Вид особенно не изменился и представлен на следующем снимке: Ненавязчивая автоматизация ректификационной установки. Автоматика. Набор модулей, находящихся в данный момент в крейте, представляет собой минимальную конфигурацию, необходимую для "комфортного" проведения кубовой ректификации с насадочной колонной и одним узлом отбора в дефлегматоре. На общей шине находятся: датчик RMS, датчик атмосферного давления BMP180, контроллер ТЭНа (PDM), контроллер клапана отбора (PWM) и один хаб 1-Wire для подключения нескольких датчиков температуры DS18B20 и датчика кубового давления на MPX5010DP.
Исходный вариант описан здесь, а дополнительные подробности здесь. Кроме отмеченной выше корреции (линия RES) никаких изменений нет.
2.2. Силовые модули
Исходный вариант - здесь. Никаких других (кроме RES) корреций не было.
2.3. 1-Wire хаб
Исходный вариант модуля хаба подробно описан здесь. Но, после того, я как пару раз воткнул DS-ку неправильно (к счастью без последствий), я "переразвел" плату под другие разъемы (телефонные разъемы RJ11 6P6C). Получилось хорошо, удобно, безопасно и совместимо с DS-овским USB-1-Wire "свистком". Схема осталась прежней, а разводку, кажется, я не публиковал. Поэтому положу ее сюда (в приложение к данному топику, файл Hub_1-Wire_RJ11.zip). Ну а вид этой платы со стороны монтажа на следующем снимке: Ненавязчивая автоматизация ректификационной установки. Автоматика. Корреция (для линии RES) была сделана уже после разводки и изготовления платы.
3. Датчики с интерфейсом 1-Wire
Эти устройства подключаются к 1-Wire хабу. Они не имеют адреса, поэтому на каждой 1-Wire шине может быть только одно устройство. Протокол совпадает с протоколом, используемым для датчиков температуры DS18B20. Это дает возможность хабу одновременно управлять (запускать и считывать данные) 8-ю устройствами.
3.1. 10-разрядный АЦП с 1-Wire интерфейсом
Описан здесь. Предназначен для подключения аналоговых датчиков, когда не требуется высокая точность (достаточно 10 двоичных разрядов). В частности используется для датчика кубового давления MPX5010DP (см.ниже)
3.2. Датчик кубового давления на основе MPX5010DP с 1-Wire интерфейсомАЦП
Датчик кубового давления описан здесь (схема, разводка, и фотография готового модуля). К настоящему времени ничего не изменилось. Есть особенность - иногда (редко) теряется калибровочный коэффициент (coef). Причина пока не выяснена.
4. Софт
Предыдущая версия 0.3.0.0 была описана в этом топике. Версия 0.3.0.1 прилагается к данному топику. Изменений немного. Они касаются в основном пользовательских скриптов. В частности, в скрипт, которым я пользуюсь при ректификации, добавлена 1) корреция уставки старт-стопа на изменения атмосферного давления и коррекция задаваемой мощности нагрева в зависимости от напряжения сети. Последнее - для стабилизации мощности нагрева ТЭНа. Стоит обратить внимание, как просто все это делается в пользовательском скрипте. Стабилизация мощности нагрева - добавлено всего три строчки:
... if U0 > 100: # Какая-то сеть все-таки есть :) coefw = 220.0/U0 # Корректирующий коэффициент w0 = modes[mode].w0*coefw*coefw # Коррекция устанавливаемой мощности ...
а коррекция уставки на изменение атмосферного давления - ненамного больше: при изменении уставки оператором, фиксируется значение самой уставки и текущее атмосферное давление (это будут базовые значения для последующих коррекций):
... chTset = False # Флаг изменения уставки ... elif ch == ord('g'): # В качестве уставки возьмем температурe в царге Tset = float(rdb.lindex('T1', -1)); chTset = True elif ch in [ord('-'), ord('_')]: # Уменьшить уставку на квант DS-ки Tset -= 0.0625; chTset = True elif ch in [ord('+'), ord('=')]: # Увеличить уставку на квант DS-ки Tset += 0.0625; chTset = True ... if chTset: # Запомним базовое значение уставки и давления Tsb = Tset; Pb = P0 ...
а затем, на каждом такте синхронизатора, выполняется всего лишь одна строчка кода
Tset = Tsb + 0.033*(P0 - Pb) # Коррекция уставки старт-стопа на атм. давление
Другие моменты, если будет интересно, можно прочитать в комментариях к пользовательскому скрипту (файл uscript.py). Весь софт версии 0.3.0.1 (в том числе и прошивки, они не изменялись по сравнению с 0.3.0.0) упакован в единый архив soft_0301.zip и находится в приложении к данному топику. Предыдущий топикВернуться к оглавлениюСледующий топик
Главное, чтобы сифонная трубка была стеклянной.OldBean, 17 Нояб. 19, 17:26
Все же в домашних условиях наверное проще будет с медью работать. Вот нашел на алиэкспресс трубочку - наружный диаметр 3мм, внутренний - 2мм. https://ru.aliexpress.com/...rchweb201603_55
в домашних условиях наверное проще будет с медью работать.ZagAl, 19 Нояб. 19, 21:45
Возможно. Тем не менее, стОит обратить внимание на вариант, предлагаемый коллегой dee чуть выше. Во-первых, он должен быть гораздо менее чувствительным к качеству и материалу сифона и во-вторых, позволяет периодически оценивать плотность (спиртуозность) жидкости. Второе (т.е. спиртуозность) для ректификации не очень актуальна. Но взвешивание частично погруженного цилиндрика, вместо взвешивания самого сифона - явно лучшее решение для датчика скорости отбора.
PS Нужно на досуге порыться по попугаям на разных форумах. Наверняка народ на эту тему много чего уже напридумывал :)
BogAD
Кандидат наук
Красногорск - Белово
403 184
Отв.1749 20 Нояб. 19, 11:48
стОит обратить внимание на вариант, предлагаемый коллегой dee чуть выше.OldBean, 20 Нояб. 19, 03:58
Попробую своё виденье сказать. О чем говорил уважаемый dee, метод называется "Определение относительной плотности жидкости методом гидростатического взвешивания". Если не ошибаюсь, весы Мора... Попробую найти в своей библиотеке хороший талмуд по этим весам с таблицами. Можно попробовать адаптировать этот метод под современные реалии и попробовать с тензодатчиками на 100гр. Надо подумать...
Но есть мЫсля попробовать мерить давление столба жидкости в фиксированном объеме и по разности давления вычислять её плотность. Тем более на рынке есть достойные и дешевые датчики. К примеру можно использовать датчик диф.давления MPXV7002DP который способен мерить до +-2КПа, тем более Сергей уже создал модуль под 1-Wire. https://www.tme.eu/...90/mpxv7002.pdf Подкупает, то что этот метод измерения плотности без использования поплавков и тензодатчиков. Возможно же?
Подкупает, то что этот метод измерения плотности без использования поплавков и тензодатчиков.BogAD, 20 Нояб. 19, 11:48
Не подкупайтесь! :) По сути, это один и тот же метод - взвешивание столба жидкости. Что взвешивание самой пробирки с сифоном, что измерение гидростатического давления в такой же пробирке с сифоном. Да и сенсором в мембранных датчиках являются все те же тензорезисторы. Мне кажется датчик давления больше шуметь будет, чем тензодатчик весов. Это, конечно, проверить нужно, но ведь тоненькая же мембрана...
По поводу предложения коллеги dee.
Главное отличие того, что он предлагает, от обычных гидростатических весов в том, что используется цилиндрический поплавок, который погружен в жидкость лишь частично. А не полностью. Ну я так понял. Изменение уровня погружения (и, следовательно, веса поплавка) будет пропорционально скорости отбора. А вот когда поплавок полностью утонет (уровень сифона должен позволять это делать), тут мы как раз и приходим к конфигурации обычных гидростатических весов (или весов Мора, как кому привычней). Вот в эти моменты времени, пока сифон не сбросит спирт, мы и можем использовать эти весы как весы Мора. По прямому назначению - измерять плотность жидкости. Но здесь измерение плотности - это просто бесплатный "бонус" к датчику скорости отбора. Ну зачем в ректификации измерять спиртуозность? Она и так всегда известна. Спирт он и есть спирт :)
BogAD
Кандидат наук
Красногорск - Белово
403 184
Отв.1751 20 Нояб. 19, 14:55
а и сенсором в мембранных датчиках являются все те же тензорезисторы.OldBean, 20 Нояб. 19, 13:37
Согласен. Я имел ввиду, что отдельно городить спарку тензовесы+АЦП на HX711
Ну зачем в ректификации измерять спиртуозность? Она и так всегда известна. Спирт он и есть спирт OldBean, 20 Нояб. 19, 13:37
Сергей, используя твое толкование, напрашивается вопрос: зачем вообще чего-то взвешивать, когда спиртуозность одна и та же, а сифон сбрасывает периодически один и тот же объем? Если то и то примем за const, то и весы не нужно! Так? Подсчитывай количество сбросов и будет тебе суммарный объем. Сергей, я знаю, что будешь возражать, но и я тоже против такого подхода. Теряется "изюминка" универсальности подхода. Думаю не нужно зацикливаться только на ректификацию. Я бы хотел попробовать, к примеру НБК.
По поводу замера давления - вернемся к твоему топику
20.2. Простой датчик скорости отбораOldBean, 15 Нояб. 19, 18:25
Убираем тензовесы, ставим диф.датчик давления (прикрепил рисунок). По сигналам в диаграмме должно получиться - высота зуба определит плотность раствора, величина периодов сброса - определит расход. Константа одна будет - это объем, который зависит от бюретки и сифона. Далее математика и поправочные коэффициенты если потребуются...
ps Не указал замер температуры, думаю это и так понятно, что надо...
зачем вообще чего-то взвешивать, когда спиртуозность одна и та же, а сифон сбрасывает периодически один и тот же объем?BogAD, 20 Нояб. 19, 14:55
Саша, тут все немножко сложнее. Причин для непрерывного взвешивания пробирки несколько. Но две просто "лежат на поверхности": 1. Время получения данных с датчика. Пусть объем (до срабатывания сифона) равен 5 мл. Если скорость отбора равна 50 мл/час (головы), то время наполнения емкости будет 1/10 часа = 6 мин. Т.е. информацию о скорости отбора мы будем получать раз в 6 мин. Вообще-то, это много. 2. Погрешность измерений. Сифон сбрасывает не все, не одинаково и не мгновенно. Во время сброса определенное количество жидкости продолжает поступать в пробирку. Эти погрешности нелегко учесть, если работать "от сброса до сброса". Обе эти проблемы легко снимаются если пробирку взвешивать непрерывно (например, 1 раз в сек) и соответствующим образом обрабатывать получаемые данные. Скользящая линейная регрессия по 10 отсчетам дает отличный незашумленный сигнал скорости отбора с задержкой всего 10 сек.
Но еще раз подчеркну, что вариант коллеги dee должен работать еще лучше. На практике не пробовал, но теоретически - должен. Т.к. ряд факторов вышеприведенного пункта 2 становятся несущественными.
Честно говоря я так и не понял чем диф.датчик давления лучше весов. Вроде и АЦП для него тоже нужно городить. Видимо, просто весы почему-то не нравятся :) Ну а на это трудно что-то возразить... Если сделаете - расскажите как оно заработает. Интересно.
при нагревании воздух расшириться и выйдет пузырьками, при охлаждении воздух сожмется, вода втянется и нарушит измерения
U-M
Магистр
MSK
210 39
Отв.1754 21 Нояб. 19, 19:20
Есть вопрос по исходникам прошивок - пытаюсь "ковыряться", и вот что получается:
RMS, relay, PWM, PDM, servo компилируются без ошибок.
HUB компилируется, но есть предупреждение на 24 и 84 строки. Так понимаю, не так объявлена переменная owReset
owADC, owMPX5010DP ошибки множественные и одинаковые в обоих файлах:
7 строка почему-то ругается на #include <avr/io.h> 40 строка ругается что не объявлена PSR0 135 строка ругается и на GIMSK и на PCIE 136 строка ругается на PCMSK
OldBean
Доцент
Красноярск
1K 1.4K
Отв.1755 22 Нояб. 19, 02:39
owADC, owMPX5010DP ошибки множественные и одинаковые в обоих файлах:U-M, 21 Нояб. 19, 19:20
В устройствах 1-Wire применяются МК ATtiny85, а не ATMega328P. Вероятно, Вы не сказали об этом компилятору. Если для компиляции и прошивки используете Geany, то можно воспользоваться инструкцией, которая описана здесь (пункты 12.3.3 и 12.3.4). Как раз для тиньки. Для справки:
Команды сборки (первая строчка - в опции "Компилировать", вторая - "Прошить МК"): ATMega328P:
Для меги в строке компилятора добавлены некоторые дополнительные опции. Сравните их со своими.
U-M
Магистр
MSK
210 39
Отв.1756 22 Нояб. 19, 10:11
Елки-палки, проблема крылась действительно в том, что не указан attiny85... С верным МК ошибки пропали. (Компиляция под Windows с помощью winavr и toolchain).
Применительно к файлу HUB в строках 24 и 84 вместо
void owReset();
поправил на
void owReset(void);
предупреждение компилятора пропало.
Добавлено через 3дн. 5ч. 7мин.:
Есть академический вопрос, скорее рассуждение - концепция автоматики в настоящий момент крейт со слотами. На крейте шина и несколько вспомогательных сигналов. Как часто бывает, разработка требует корпус... Система с крейтом конечно может быть модернизирована так, чтобы в какой-то подходящий корпус влезть.
Однако смотрел в сторону ганитовских корпусов-конструкторов на DIN-рейку. В этом ключе можно реализовать модули автоматики в разных копусах и собрать в обычном электрощите. Но тут собственно сам вопрос - помехоустойчивочть шины IIC. По сути ее длина наврят-ли превысит 30-40 см. Если взять емкость этой шины и добавить емкость устройств, то по грубой прикидке за 400 пФ не выходим. Какие есть мысли на эту тему? Реализация самой шины видится в виде летнточного кабеля, который гирляндой тянется от модуля к модулю, а шина питания идет отдельно. Возможно шина доп.сигналов (сброс, Int ....) также должна идти отдельным шлейфом.
OldBean
Доцент
Красноярск
1K 1.4K
Отв.1757 26 Нояб. 19, 07:09
Как часто бывает, разработка требует корпус...U-M, 22 Нояб. 19, 10:11
Система с самого начала задумывалась как открытый стенд для экспериментов, требующих периодических (и иногда, радикальных) изменений конфигурации "железа". По сути - это "конструктор". Поэтому, честно говоря, я никогда и не думал про всякие коробочки...
Конструктив модульный, но сосредоточенный в одном месте. Провода от датчиков и исполнительных устройств сводятся к этому месту, а с Сетью взаимодействует только малинка. По Wi-Fi или Ethernet. Отсюда - и крейт, и общая шина, включающая в себя и силовые и сигнальные линии (в том числе и i2c). Ничто не мешает повесить все это хозяйство на дин-рейку, в каком-нибудь щитко-подобном корпусе с общей шиной. Переключения силовых модулей (PDM И PWM) производятся в "мягком" режиме. Поэтому уровень наводок невелик и проблем с такой компоновкой не должно возникнуть.
gol_avto
Доцент
Москва-Серпухов-Анапа
1.4K 473
Отв.1758 12 Дек. 19, 21:53
Итак, запускаем на малинке в консоли синхронизатор lsync.py:OldBean, 10 Нояб. 19, 18:14
Модули прошиты софтом 3.0.1. Предварительно все предустановки сделаны, однако не работает, висит это окно. Бьюсь несколько часов и ничего не понимаю. Ненавязчивая автоматизация ректификационной установки. Автоматика.
...однако не работает,...gol_avto, 12 Дек. 19, 21:53
Посмотрите файл err в той же директории, что и все. Там должна быть подсказка.
Судя по скриншоту - отсутствуют калибровочные данные в БД. Вечером доберусь до установки - попробую смоделировать первый запуск системы на "чистой" малинке и выловить проблемы, с этим связанные.