Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Ненавязчивая автоматизация ректификационной установки

Форум самогонщиков Автоматика
1 ... 112 113 114 115 116 117 118 ... 132 115
OldBean Доцент Красноярск 1K 1.4K
Отв.2280  12 Дек. 21, 13:45
На самом деле вообще нисколько не напрягает, даже если она в 10 раз чаще опрашивать будет.ekochnev, 12 Дек. 21, 09:31
Вряд ли... Хотя, конечно, "напряжение" сильно зависит от того, чем малинке приходится заниматься в свободное от опросов время. Если просто "балду пинать", то, возможно...

Но, например, в одной из ранних версий данной системы, где использовалась редиска (БД) в сочетании с динамическим рисованием графиков (при помощи довольно "грузной" библиотеки matplotlib) пришлось даже увеличивать интервал между опросами до 5 секунд. А ведь кроме рисования графиков, есть гораздо более актуальные и достаточно ресурсоемкие задачи с плавающей арифметикой, связанные с обработкой данных: расчеты спиртуозности, более изощренные, чем пресловутый старт-стоп, алгоритмы регулирования отбора и т.п.
ekochnev Магистр Екатеринбург 207 54
Отв.2281  12 Дек. 21, 14:09, через 25 мин
Хотя, конечно, "напряжение" сильно зависит от того, чем малинке приходится заниматься в свободное от опросов времяOldBean, 12 Дек. 21, 13:45
Вот именно, нужно понимать, что ресурсы данного микрокомпьютера ограничены. Не нужно загружать его непрофильными задачами. А то, если во время перегонки еще на малинке и торрент-клиента запустить с одновременным просмотром фильма в UHD качесте (чтоб не скучно перегонять было), то и 5-секундного интервала не хватит :-)
Согласитесь, что эта версия с онлайн-графиком далеко не самая удачная была. Я для себя ее вообще к использованию даже не рассматривал, изначально написал для себя консольного клиента работающего из под ssh к которому Вы впоследствии пришли тоже. Обычно запускаю в первой консольной сессии tmux, из под него программу управления. А дальше число одновременных ssh-сессий уже не играет роли - везде на всех устройствах показывается одно и то же и управляется одновременно. Ресурсоемкий графический интерфейс малинки при этом можно не устанавливать совсем.
Просто определяя время цикла обращения нужно четко оценивать возможности процессора, чтобы все необходимые работы гарантированно укладывались в заданный временной интервал. Имхо малинка должна быть загружена исключительно задачами управления и ничем больше. Если нужны рюшечки в виде графиков и т.п., то все это должно быть вынесено на сетевого клиента.
sig Кандидат наук Ростов-на-Дону 304 138
Отв.2282  12 Дек. 21, 15:33
Если нужны рюшечки в виде графиков и т.п., то все это должно быть вынесено на сетевого клиента.ekochnev, 12 Дек. 21, 14:09
Причем этом сетевым клиентом может быть браузер на любом компьютере или телефоне. Т.е. малинка по запросу отсылает данные, а графики рисуются уже на стороне клиента в браузере. Для этого на малинке потребуется только встроенный www-сервер.
ekochnev Магистр Екатеринбург 207 54
Отв.2283  12 Дек. 21, 15:51, через 18 мин
sig, абсолютно точно, я именно это и имел в виду
OldBean Доцент Красноярск 1K 1.4K
Отв.2284  13 Дек. 21, 06:51
Полагаю, самое время напомнить основные концептуальные моменты (шаги развития) данной автоматики.

1. Первый шаг - избавить управляющий компьютер с "не real-time" операционной системой (в данном случае - малинку) от задач непосредственного управления "железом" в режиме real-time. Собственно, с этого шага и началась разработка автоматики. Завершением этого шага можно считать текущую версию варианта LITE.

2. Следующий, второй, шаг, который планируется сделать в следующей версии автоматики (вариант LEGO), - избавить управляющий компьютер (опять же, таки, с не RT ОС, т.е. ту же малинку) от очередной, почти real-time, рутины. Это - избавить ее от первичного сбора "сырых" данных с датчиков, которые, по сути, нужны только соответствующим контроллерам для управления своим железом.

Кто конкретно сбором данных будет заниматься - пока еще не определено. Мыслятся два основных варианта. Первый - первичные данные с нужных датчиков (как с серверов) будут собирать сами контроллеры. Хороший вариант. i2c допускает работы множества мастеров на одной шине. Второй вариант представляется менее "коллизионным". В нем сбором первичных данных, в режиме real-time, будет заниматься отдельный микроконтроллер. Правда здесь тоже есть бифуркация. Этот МК может работать, либо как "сервер данных" для контроллеров, либо тупо рассылать данные соответствующим контроллерам, которые непосредственно управляют железом, в режиме мастер-слейв. Ну, как не очень демократичный издатель :))). Отдельные моменты, так или иначе, уже были опробованы. Была "редиска-сервер" в отдельном потоке на малинке. Есть "более железный" пример: 1-Wire хаб, который можно рассматривать как некий прототип сервера данных, собирающего данный с разнородных датчиков, (или - "измерительного модуля" в терминологии коллеги makh). Так что пища для размышлений есть. Думаем потихоньку, экспериментируем...

3. Ну а доля малинки - это сложная обработка данных (говорят, что у SoC малинки есть сопроцессор для вещественной арифметики), протоколирование, общее управление процессами и, конечно же, - общение с пользователем. А будет ли это просто консоль, GUI или Web - дело совсем уже десятое ;).
ekochnev Магистр Екатеринбург 207 54
Отв.2285  13 Дек. 21, 07:11, через 20 мин
Если честно, вообще не представляю, какая может быть в нашем деле "сложная обработка данных", да еще и требующая сопроцессора... Посчитать спиртуозность в кубе исходя из показаний датчиков давления и температуры? Вычисляется элементарно по таблице Ш.Марийе... Сравнить две температуры на разных итерациях, посчитать дельту и понять ушла ли она от "полки"? Еще проще... Скорректировать мощность ТЭНа или скорость отбора - вообще не проблема, делается отправкой единственной команды соответствующему модулю. При наличии показаний с датчиков все алгоритмы простые как три рубля. А снятием показаний с датчиков у нас и так отдельные контроллеры занимаются.
makh Профессор Sаmara 2.1K 1.1K
Отв.2286  14 Дек. 21, 20:15
какая может быть в нашем деле "сложная обработка данных"ekochnev, 13 Дек. 21, 07:11
Еще как. Гуманоиду должно быть визуально и интуитивно )

Добавлено через 1ч. 18мин.:

Была "редиска-сервер" в отдельном потоке на малинке.OldBean, 13 Дек. 21, 06:51
По ходу, оно конечно не единственно правильный концепт, но очень близко.

Год назад с редиской построил-потестировал подсеть типа "умный дом самогонщика", со всеми этими флажками присутсвия/вменяемости оператора и прочим.. Езернет, понятное дело. Каждый девайс там был редискин клиент со своим адресом, регулярно отчитывающийся о состоянии прямо туда, и для каждого со стороны датабазы был поднят каждый подписывался на управляющий канал оттуда. Вот если бы сделать это все медью, да еще с управляемым POE -- только так, пожизненно. Но не вышло. Вафля (ESP) не радует стабильностью, проводов и васче девайсов хочется чем меньше. Но, конечно, на протоптанных стезях столько вкусного.. В смысле езернет, тисипи, и прочее консистентное и удобное.

Добавлено через 15мин.:

Cortex-M3 MCU with 2MB Flash and 128KB SRAM
sig Кандидат наук Ростов-на-Дону 304 138
Отв.2287  14 Дек. 21, 22:26
Гуманоиду должно быть визуально и интуитивно )makh, 14 Дек. 21, 20:15
Так это легко реализуется через WWW-сервер, но тяжесть графического интерфейса ложится на клиента. Не должен управляющий контроллер (малинка) одновременно являться графическим АРМом. Кроме излишней нагрузки - монитор, клавиатура и мышь являются источником ошибок - "ой, я что-то нажал и все повисло"! А у нас многочасовые процессы.
Тоже использую малинку только через ssh, запуская команды в screen.
makh Профессор Sаmara 2.1K 1.1K
Отв.2288  14 Дек. 21, 22:37, через 12 мин
реализуется через WWW-сервер, но тяжесть графического интерфейса ложится на клиентаsig, 14 Дек. 21, 22:26
И логи в бровзер складывать? Или оно будет ежесекундно запрашивать у сервера данные для рисования картинок? ,))
OldBean Доцент Красноярск 1K 1.4K
Отв.2289  16 Дек. 21, 10:31
4. Одноранговая (пиринговая) i2c-сеть. Работа малинки в режиме i2c-slave

4.1. Введение

Термин "одноранговая сеть" (пиринговая, от англ. peer-to-peer, P2P — равный к равному) обычно применяется к сетям персональных компьютеров, каждый из которых может выступать как в качестве клиента, так и сервера. Чтобы "не множить сущности" :), будем применять этот термин и к i2c-сетям устройств (датчиков и контроллеров), занимающихся автоматизацией процессов, ну, например, в домашней лаборатории. Выбор i2c обусловлен наличием адаптеров этой шины практически в любых микроконтроллерах и во многих датчиках. Кроме этого, данный протокол проводной (что обеспечивает надежность сети), есть адресация (т.е. не нужны линии выбора устройств) и достаточно шустрый. При наличии усилителей, протяженность шин i2c может достигать десятков метров, что вполне достаточно для применений в рамках лаборатории. Кстати, недавно опробовал в качестве усилителей чипы преобразователей логических уровней ISO1540 с емкостной развязкой. У них выходы высоковольной стороны выдают аж до 35мА, что даже больше, чем 30мА у P82B715. На 22 метрах i2c работает так же прекрасно! Удобно - в одном чипе и преобразователь уровня и усилитель.

"Одноранговость" i2c-сети означает, что каждое устройство в сети может работать как в роли мастера (ведущего), так и в роли слейва (ведомого). Роль мастера, главным образом, заключается в подаче на линию SDA сигналов start/stop и целевого адреса и, на линию SCL, синроимпульсов. Порты TWI (совместимые аналоги i2c в микроконтроллерах AVR) могут работать как в качестве master, так и в качестве slave. Благодаря популярности платформы Arduino, эти режимы подробнейшим образом описаны в ресурсах Сети. Что же касается Raspberry Pi, то ее работа в качестве мастера тоже хорошо представлена в Сети. В то же время, информации об использовании малинки в качестве slave-устройства очень мало, она разрознена и почти нет конкретных примеров. Данный топик предназначен, в какой-то (хотя бы небольшой) степени, это компенсировать.

4.1. Как организована работа малинки в качестве i2c-slave?

В SoC (система на кристалле) от Broadcom, из которых делают малинки, реализован интерфейс BSC при помощи которого можно работать либо с контроллером BSC (Broadcom Serial Controller), либо с контроллером SPI (Serial Peripheral Interface). Шина BSC - это проприетарная шина, соответствующая шине/интерфейсу I2C от Philips (в том числе, реализован и быстрый режим - 400 кбит/с), со следующими ограничениями:

1. Только ведомое устройство (slave).
2. Clock stretching не поддерживается.
3. Только 7-битная адресация.

К счастью, для наших задач эти ограничения несущественны. Нам как раз и нужен slave, а I2c-master итак у нас уже есть на гребенке GPIO. Поскольку, для инициирования прерывания в малинке, нам достаточно послать ей хотя бы один байт (т.е., по сути, MOSI), то отсутствие стречинга тоже не критично. Ну а больше сотни устройств в лабораторной i2c-сети нам вряд ли потребуется в обозримое время. На крайний случай - есть i2c-мультиплексоры :)))

Подробную документацию на перифирию BCM2835 можно найти здесь. В третьей малинке стоит BCM2837. На него документации в открытом виде нет, но, по утверждениям разработчиков, его периферия практически совпадает с BCM2835.
Документация на библиотеку pigpio можно смотреть здесь.

4.2. Пример практического использования малинки в качестве слейва

Для экспериментов понадобится 3-я малинка, две ардуинки (я использовал Arduino Nano) и двунаправленный преобразователь уровня логических сигналов 3.3V-5V (я использовал ISO1540). Нужно собрать макет по такой схеме:
01_scheme.png
01_scheme. Ненавязчивая автоматизация ректификационной установки. Автоматика.

У 3-й малинки линии BSC выведены на пины GPIO18 (SDA) и GPIO19 (SCL). Их необходимо подключить к соответствующим линиям низковольтной (3.3V) части общей шины i2c. В конце концов должно получиться что-то в этом роде:
02_prototype.JPG
02_prototype. Ненавязчивая автоматизация ректификационной установки. Автоматика.

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

Изначально ардуинки работают в режиме slave. Если нажать кнопочку около ардуинки, она мигнет встроенным светодиодиком, перейдет в режим master и отправит малике-слейву байт со своим адресом. По сути, для малинки это внешнее прерывание, по которому оно выведет соответствующую информацию на консоль.

Второй эксперимент - пример более сложного обмена. Малинка-мастер из интерпретатора питона отправляет сообщение ардуинке-слейву. Приняв это сообщение, ардуинка переходит в режим мастера и, мигнув светодиодиком, отправляет свой адрес малинке-слейву.

Вот как-то так это действо выглядит на скриншоте экрана малинки :)
03_screen.png
03_screen. Ненавязчивая автоматизация ректификационной установки. Автоматика.


Пошаговая инструкцияПодготовительные действия

1. Установить библиотеку pigpio и модули для python3
sudo apt install pigpio python3-pigpio

2. Чтобы демон pigpiod запускался при загрузке системы скажем так:
sudo systemctl enable pigpiod

3. Перезагрузить систему

4. После перезагрузки проверить статус демона:
sudo service pigpiod status

5. Установить, если не установлены утилиты i2c-tools и библиотеку smbus для
работы с шиной i2c из python:

sudo apt install i2c-tools
sudo apt install python3-smbus

6. Собрать тестовый стенд по схеме на рисунке 1 (файл 01_scheme.png)

7. Прошить две ардуинки скетчем master.ino
Естественно, адреса ардуинок (строка #define ADDR 0x33 в скетче) не должны совпадать !!!

8. На малинке в консоли запустить скрипт slave.py для инициирования работы малинки
в качестве i2c-slave
python3 slave.py

Простой эксперимент

9. Нажать кнопку, связанную с одной из ардуинок. В консоли, где запущен slave.py должно появиться сообщение с i2c адресом этой ардуинки.

Более сложный эксперимент

Малинка как master обращается к контроллеру (ардуинке) как slave с командой отправить, уже как master, свой адрес малинке, как slave-у.

10. Открыть еще одну консоль на малинке и запустить в ней интерпретатор питона:
python3

11. В интерпретаторе питона выполнить следующие инструкции:
import smbus # Импорт модуля smbus для работы с шиной i2c
bus = smbus.SMBus(1) # Создаем объект i2c-шины
bus.write_byte(0x33, 0) # Шлем какой-нибудь байт ардуинке с адресом 0x33 (у меня такой адрес)

На этой ардуинке мигнет светодиодик и в консоли, где запущен slave.py должно появиться сообщение с i2c адресом этой ардуинки (в данном случае - 0x33).

Если все так - поздравляю! Пиринговая i2c-сеть дышит!
Скетч для ардуинок
#include <Wire.h>

#define LED_PIN 13 // Светодиод на плате подключен к этому пину
#define ADDR 0x33  // Адрес контроллера в режиме slave

volatile boolean flag = false; // Флаг посылки сообщения малинке как slave
 
void setup() {
  Wire.begin(ADDR); // Изначально контроллер работает в режиме slave
  Wire.onReceive(receiveEvent); // Обработка принятого по i2c сообщения
  pinMode(LED_PIN, OUTPUT); // Пин для индикации светодиодом
  pinMode(2, INPUT_PULLUP); // Внешнее прерывание от кнопки и подтяжка пина к +5V
  attachInterrupt(0, bclick, FALLING); // Обработка нажатия кнопки
}

void bclick() { // Обработчик нажатия кнопки
  if(!flag) flag = true; // Установим флаг посылки сообщения малинке-слейву
}

void receiveEvent(int howMany) { 
  flag = true; // Установим флаг посылки сообщения малинке-слейву
  while (1 < Wire.available()) { // Выбираем все присланное
    char c = Wire.read();
  }
}

void loop() {
  if(flag) { // Получена команда связаться с малинкой
    Wire.begin(); // Переходим в режим master
    Wire.beginTransmission(0x30); // Подготавливаем передачу данных малинке-слейву
    Wire.write(ADDR); // Шлем малинке байт со своим адресом
    Wire.endTransmission(); // Завершаем передачу данных
    Wire.begin(ADDR); // Переходим в режим slave
    digitalWrite(LED_PIN, HIGH); // Мигнем светодиодиком на плате
    delay(200);              
    digitalWrite(LED_PIN, LOW);
    flag = false;
  }
}
скрипт для работы с малинкой-слейвом
# Тест на прием данных малинкой-слейвом
import time
import pigpio

addr = 0x30 # Адрес малинки как слейва на i2c шине

def i2c(id, tick): # Обработчик приема пакета контроллером BSC (=i2c) в режиме slave
  global pi
  s, b, d = pi.bsc_i2c(addr)
  if b:
    print(f'Прерывание от устройства с адресом 0x{d[0]:2x}')

pi = pigpio.pi()
if not pi.connected:
  exit()

e = pi.event_callback(pigpio.EVENT_BSC, i2c) # Установка обработчика событий BSC как slave
pi.bsc_i2c(addr) # Конфигурирование BSC как slave

try:
  while True:
    pass
except KeyboardInterrupt:
  print('Завершаем работу')
finally: # Дезактивируем BSC
  e.cancel()
  pi.bsc_i2c(0)
  pi.stop()


PS
Таким образом, тянуть отдельную линию INT по всей сети нет необходимости. Любой контроллер может инициировать прерывание малинки и передать ей свой адрес (для дальнейшего разбирательства) описанным в примере способом.

Добавлено через 5ч. 5мин.:

4.3. Важное дополнение, относительно четвертой малинки (Raspberry Pi 4)

Четвертая малинка выполнена на базе SoC BCM2711. Документацию на периферию BCM2711 можно найти здесь. Там много изменений, но для нас важно одно: в отличие от третьей, в четвертой малинке линии BSC выведены на GPIO10 (SDA) и на GPIO11 (SCL). В третьей малике это, соответственно, GPIO18 и GPIO19. Это нужно учесть при разводке платы расширения малинки. Для универсальности платы расширения, видмо, нужно предусмотреть какие-нибудь перемычки или переключатели.

Проверил работу i2c-slave на 4-й малинки. Вроде все нормально. Работает. Кстати - простейший стенд для тестирования выглядит совсем просто:
04_simplest_test_RPi4.JPG
04_simplest_test_RPi4. Ненавязчивая автоматизация ректификационной установки. Автоматика.

Т.е. просто линию SDA малинки-мастера замкнуть на линию SDA малинкис-слейва. И, соответственно, сделать то же самое с линиями SCL. Запустить скрипт slave.py в одной консоли, а из другой пусть малика-мастер общается с малинкой-слейвом по i2c. Так что малинка одновременно может работать и как мастер и как слейв! Главное, чтобы у нее не наступила шизофрения в виде раздвоения личности ;)))...

Пример такого общения показан на следующем скриншоте.
05_screen_RPi4.png
05_screen_RPi4. Ненавязчивая автоматизация ректификационной установки. Автоматика.
files.zip 1.7 Мб
Volume Кандидат наук Уфа 478 274
Отв.2290  20 Дек. 21, 05:41
двунаправленный преобразователь уровня логических сигналов 3.3V-5V (я использовал ISO1540)OldBean, 16 Дек. 21, 10:31
отличный выбор, намного лучше чем P82B715 при длинных линиях! Потому что это не преобразователь уровней, а опторазвязка, которая в сети из нескольких устройств с несколькими БП избавляет от проблемы токов нулевого провода + не пропустит на массовый провод МК электростатические помехи наведенные на длинных линиях
Также годится ADUM1250, тоже двунаправленный оптоизолятор I2C, ток до 30мА. Китайские браться предлагают за порядка 80руб/шт

Поправлюсь - конечно же не опто, а емкостная развязка в этих чипах. Тем не менее, 2,5кВ даташит гарантирует
Vittomin Доктор наук Минусинск 624 151
Отв.2291  20 Дек. 21, 07:24
Сильно не пинайте, задам вопрос: почему нет желания использовать для длинных линий Ethernet шилд, типа ENC28J60 или W5500?
В этом случае можно даже запустить питание типа пассив POE. На расстояниях 3-5 метров падение напряжения будет мизерным.
Более длинные расстояния даже не представлю, зачем нужны в самогонных делах.
ekochnev Магистр Екатеринбург 207 54
Отв.2292  20 Дек. 21, 07:31, через 7 мин
Vittomin, Вы посмотрите сколько у нас модулей с ардуинками задействовано и на цену предлагаемых Вами плат. Я в Чипе-Дипе ценники посмотрел... Если на каждый модуль ставить подобную платку, то золотая установка получится, можно вообще ничего не гнать, а отдыхать и каждый раз когда выпить захочется просто Хеннеси себе покупать...

Добавил чуть позже...
Посмотрел цены в других местах. Более гуманные. Это видимо Чип-Дип просто в конец оборзел - изначально когда у них увидел, просто шок.
Vittomin Доктор наук Минусинск 624 151
Отв.2293  20 Дек. 21, 09:43
видимо Чип-Дип просто в конец оборзелekochnev, 20 Дек. 21, 07:31
В Чипе-Дипе вообще ни разу не купил ничего - иногда даже и купил бы, но останавливает стоимость доставки. Почему то на Али бывает и бесплатная доставка и копеечная (если деталька копеечная, конечно). Поэтому пока только Али.
OldBean Доцент Красноярск 1K 1.4K
Отв.2294  20 Дек. 21, 11:04
почему нет желания использовать для длинных линий Ethernet шилдVittomin, 20 Дек. 21, 07:24
Для разработки распределенной (сетевой) автоматики рассматривалось три как бы "бытовых" :) варианта: USB, Ethernet и I2C. Выбор в пользу I2C был сделан потому, что этот протокол (или совместимый) реализован практически в каждом микроконтроллере и во многих датчиках. Даже в крошечных корпусах 3х3 мм. Для других протоколов пришлось бы ставить агрегаторы (хабы), что, в общем случае, заметно усложняет как железо, так и софт. Возможно, с развитием интернета вещей, ситуация изменится, но пока выбор "буфферированного" I2C вполне оправдан.
NBVV Специалист Новосибирск 124 2
Отв.2295  24 Дек. 21, 19:04
Уважаемые, подскажите, почему значение младшего байта фьюзов не изменилось?
2021-12-24-224909_1024x768_scrot.png
2021-12-24-224909_1024x768_scrot. Ненавязчивая автоматизация ректификационной установки. Автоматика.
ekochnev Магистр Екатеринбург 207 54
Отв.2296  24 Дек. 21, 19:14, через 10 мин
NBVV, а почему оно должно было измениться?
Было значение 0xE7, Вы записали из командной строки тоже 0xE7, соответственно и прочиталось потом тоже 0xE7
NBVV Специалист Новосибирск 124 2
Отв.2297  24 Дек. 21, 20:07, через 54 мин
Скажем так - я в этом большой "неспециалист". Я вижу вверху надпись Fuses OK (E:FF, H:D9, L:E7) и внизу такую же. А OldBean пишет: "При успешном выполнении этой команды, avrdude покажет информацию о фьюзах. Обратите
внимание, что содержимое младшего байта фьюзов изменилось на 0xE7."
ekochnev Магистр Екатеринбург 207 54
Отв.2298  24 Дек. 21, 20:13, через 6 мин
Так оно у вас уже и так было E7: Fuses OK (E:FF, H:D9, L:E7)
Командой вы это значение перезаписали тоже значением E7, т.е. Вы записали туда точно такое же значение, что там уже было записано, конечно в итоге ничего не изменилось.
NBVV Специалист Новосибирск 124 2
Отв.2299  30 Дек. 21, 00:08
Еще вопрос.Малинку к крейту еще не подключал. Пытаюсь запустить на ней модуль lite - ругается:
>>> from lite import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/pi/Desktop/Amrita/lite_0413/lite.py", line 1212, in <module>
bus = smbus.SMBus(1)
FileNotFoundError: [Errno 2] No such file or directory
Ругается потому что нет крейта? Или опечатка вкралась?