На самом деле вообще нисколько не напрягает, даже если она в 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) не радует стабильностью, проводов и васче девайсов хочется чем меньше. Но, конечно, на протоптанных стезях столько вкусного.. В смысле езернет, тисипи, и прочее консистентное и удобное.
Гуманоиду должно быть визуально и интуитивно )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). Нужно собрать макет по такой схеме:
У 3-й малинки линии BSC выведены на пины GPIO18 (SDA) и GPIO19 (SCL). Их необходимо подключить к соответствующим линиям низковольтной (3.3V) части общей шины i2c. В конце концов должно получиться что-то в этом роде:
Далее на малинке необходимо установить софт для работы с BSC, прошить ардуинки. Пошаговая инструкция, тексты скетчей и скриптов приведены ниже. В прилагаемом к топику архиве есть эти файлы. Все это нужно сделать и в завершении опробовать, как работает наша пиринговая i2c-сеть. Суть экспериментов такова:
Изначально ардуинки работают в режиме slave. Если нажать кнопочку около ардуинки, она мигнет встроенным светодиодиком, перейдет в режим master и отправит малике-слейву байт со своим адресом. По сути, для малинки это внешнее прерывание, по которому оно выведет соответствующую информацию на консоль.
Второй эксперимент - пример более сложного обмена. Малинка-мастер из интерпретатора питона отправляет сообщение ардуинке-слейву. Приняв это сообщение, ардуинка переходит в режим мастера и, мигнув светодиодиком, отправляет свой адрес малинке-слейву.
Вот как-то так это действо выглядит на скриншоте экрана малинки :)
Пошаговая инструкцияПодготовительные действия
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:
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-й малинки. Вроде все нормально. Работает. Кстати - простейший стенд для тестирования выглядит совсем просто:
Т.е. просто линию SDA малинки-мастера замкнуть на линию SDA малинкис-слейва. И, соответственно, сделать то же самое с линиями SCL. Запустить скрипт slave.py в одной консоли, а из другой пусть малика-мастер общается с малинкой-слейвом по i2c. Так что малинка одновременно может работать и как мастер и как слейв! Главное, чтобы у нее не наступила шизофрения в виде раздвоения личности ;)))...
Пример такого общения показан на следующем скриншоте.
двунаправленный преобразователь уровня логических сигналов 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
Уважаемые, подскажите, почему значение младшего байта фьюзов не изменилось?
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 Ругается потому что нет крейта? Или опечатка вкралась?