Raspberry Pi Pico: инструкция, программирование на MicroPython / C++ и документация

 Arduino  Комментарии к записи Raspberry Pi Pico: инструкция, программирование на MicroPython / C++ и документация отключены
Янв 232022
 

http://wiki.amperka.ru/products:raspberry-pi-pico#%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA%D0%B0

Как зайти по внешнему IP-адресу из локальной сети для MikroTik

 Arduino  Комментарии к записи Как зайти по внешнему IP-адресу из локальной сети для MikroTik отключены
Ноя 032021
 

Как зайти по внешнему IP-адресу из локальной сети для MikroTik


VkontakteOdnoklassnikiFacebookTwitterMail.ruЕще…

В моем случае есть несколько сервисов для работы которых нужно было пробросить порты из интернета в локальную сеть что бы я мог ими пользоваться откуда угодно.

Скажем если я нахожусь дома, то я могу стучать к серверу умного дома на прямую по 192.168.88.229, но из мира это будет например 1.1.1.1. Но если я из локальной сети обращусь по внешнему IP роутер отбросит мой запрос.

  • Роутер с внешним IP (WAN IP) 1.1.1.1.
  • Компьютер с локальным адресом 192.168.88.229, и запущенным на нем сервером, приложением и т. д. для доступа из внешней сети. В нашем случае для соединения используется порт 8080.
  • Компьютер в локальной сети с адресом 192.168.88.110.

У нас уже проброшен порт 8080:


Но оно не будет срабатывать при обращении из локалки, так как настройки ориентированы на пакеты из внешней сети, через WAN-порт. Поэтому нам нужно прописать дополнительно еще 2 правила.

содержание [показать]

Настройка доступа из локальной сети по внешнему IP-адресу

1. СОЗДАЕМ ПРАВИЛО ДЛЯ ПЕРЕНАПРАВЛЕНИЯ ОБРАЩЕНИЙ ПО ВНЕШНЕМУ IP ИЗ ЛОКАЛЬНОЙ СЕТИ.

Вкладка General:

  • Chain — dstnat.
  • Src. Address — пишем здесь локальный адрес компьютера, с которого будем заходить по внешнему IP, или диапазон адресов, если такой доступ нужно предоставить нескольким компьютерам сети.
  • Dst. Address — указываем внешний адрес компьютера/ сервера и т. п., по которому будет осуществляться доступ из локалки.
  • Protocol, Dst. Port — здесь прописываем параметры порта и протокола, которые соответствуют нашему соединению (те же, что и в пробросе портов).

Вкладка Action

  • To Addresses — указываем локальный адрес нашего сервера, компьютера, на который мы заходим по внешнему IP-адресу.
  • To Ports — порт тот же самый, что на предыдущей вкладке, поэтому здесь можно ничего не указывать.

Теперь на компьютер 192.168.88.229 можно зайти из локальной сети по внешнему IP-адресу 1.1.1.1.

Но при попытке какого-то взаимодействия с ним ничего не получится. Почему? Посмотрим, что происходит.

  • Наш компьютер (192.168.88.110) посылает пакет на внешний адрес сервера, который является и адресом роутера, соответственно — 1.1.1.1.
  • Роутер добросовестно перенаправляет его по нашему правилу dst-nat на компьютер с адресом 192.168.88.229
  • Тот его принимает и отправляет ответ. Но так как он видит в качестве адреса источника локальный IP-адрес (ведь пакет поступил от компьютера в локальной сети), он отправляет ответ не на маршрутизатор, а напрямую получателю
  • Получатель же (192.168.88.10) отправляя данные по внешнему IP, и ответ также ожидает от внешнего IP. Получив пакет от локального 192.168.88.229, он его просто сбрасывает, как ненужный

Поэтому нам нужно еще одно правило, которое будет подменять локальный адрес источника при отправке пакета на внешний IP.

ПОДМЕНЯЕМ ЛОКАЛЬНЫЙ АДРЕС КОМПЬЮТЕРА НА ВНЕШНИЙ IP-АДРЕС

На вкладке Action выставляем маскарадинг (masquerade), т. е. подмену адреса источника на локальный адрес маршрутизатора.
На вкладке General прописываем правила, при которых он будет применяться:

  • Chain — srcnat, т. е. при запросах из локальной сети.
  • Src. Address — пишем здесь локальный адрес компьютера, или диапазон адресов, с которых будут отправляться пакеты.
  • Dst. Address — здесь конкретизируем «адрес получателя», т. е. правило будет применяться только для пакетов, адресованных нашему серверу.
  • Protocol, Dst. Port — здесь прописываем те же параметры порта и протокола.


Теперь, получив пакет из локальной сети, адресованный на внешний IP 1.1.1.1, маршрутизатор не только перенаправит его на 192.168.88.229 (по первому правилу), но и заменит в пакете адрес источника (192.168.88.110) на свой локальный адрес.

Ответ от сервера поэтому отправится не напрямую в локальную сеть, а на маршрутизатор, который, в свою очередь направит его источнику.

Второй способ Hairpin NAT MikroTik: 2 правила вместо 3

Можно сделать еще проще, заменив правило проброса портов первым правилом Hairpin NAT. В этом случае в настройках не нужно указывать In. Interface и Src Address, но нужно прописать адрес назначения.

Доступ на внешний IP адрес вашего сервера или компьютера с приложением будет открыт как для обращений извне, так и из локальной сети, с любых адресов, но только для пакетов с адресом назначения 1.1.1.1:80.

Теперь добавляете описанное выше правило srcnat, и все. Можно добавить дополнительную фильтрацию, прописав в out-interface тот интерфейс, с которого будут осуществляться отправки пакетов, если есть такая необходимость.

Недостатком Hairpin NAT является только то, что нагрузка на роутер возрастает, ведь те обращения, что раньше проходили через локальную сеть непосредственно между компьютерами, теперь будут идти через маршрутизатор.

Второй способ проще, но, в зависимости от конфигурации вашей сети, может использоваться и первый.

Статья скопирована на 95% и используется как заметка. Источник: https://lantorg.com/article/kak-zajti-po-vneshnemu-ip-adresu-iz-lokalnoj-seti-dlya-mikrotik © LanTorg.com

Micropython на GSM+GPS модуле A9G

 Arduino  Комментарии к записи Micropython на GSM+GPS модуле A9G отключены
Ноя 032021
 

В этот раз я задумался о том, чтобы спрятать в велосипед GPS-трэкер в качестве меры предосторожности. На рынке есть масса автономных устройств для слежения за автомобилями, грузом, велосипедами, багажом, детьми и животными. Подавляющее большинство из них взаимодействуют с пользователем с помощью СМС. Более дорогие варианты предоставляют функциональность Find my phone, но привязаны к конкретному онлайн-сервису.
В идеале хотелось бы иметь полный контроль над трекером: использовать его в удобном режиме без СМС и регистрации. Поверхностное гугление вывело меня на пару модулей из поднебесной, один из которых, A9G pudding board, я и заказал (~15$).

Модуль

Эта статья о том, как я заставил работать python на этом модуле.

Если A9G — аналог ESP (производитель, кстати, один и тот же), то сам pudding board является аналогом платы NodeMCU за исключением того, что на pudding board нет встроенного конвертера USB-UART. Зато есть много другого интересного. Спецификации от производителя:

  • ядро 32 bit (RISC), до 312MHz
  • 29x GPIO (все распаяны, в это число включены все интерфейсы)
  • часы и watchdog
  • 1x интерфейс USB 1.1 (я его там не нашел, но копирую с офсайта) и microUSB для питания
  • 2x UART (+1 сервисный)
  • 2x SPI (не пробовал)
  • 3x I2C (не пробовал)
  • 1x SDMMC (с физическим слотом)
  • 2x аналоговых входа (10 бит, возможно, один из них используется контроллеров литиевых аккумуляторов)
  • 4Mb flash
  • 4Mb PSRAM
  • ADC (микрофон, физически существует на плате) и DAC (динамик, отсутствует)
  • контроллер заряда аккумулятора (самого аккумулятора нет)
  • собственно, GSM (800, 900, 1800, 1900 MHz) с SMS, голосом и GPRS
  • GPS, подключенный через UART2 (есть модуль «A9» без него)
  • слот для SIM (nanoSIM)
  • две кнопки (одна reset, другая — включение и программируемая функция)
  • два светодиода

Рабочее напряжение 3.3В, входное напряжение — 5-3.8В (в зависимости от подключения). Вообще, модуль имеет всё необходимое железо для того, чтобы собрать из него простенький кнопочный мобильный аппарат. Но из примеров создаётся впечатление, что китайцы его покупают для продажи из автоматов или автоматов с азартными играми или что-то вроде этого. Альтернативами модулю являются довольно популярные модули SIM800, у которых, к сожалению, нет SDK в свободном доступе (т.е. модули продаются как AT модемы).

SDK

К модулю прилагается SDK на удовлетворительном английском. Устанавливается под Ubuntu, но предпочтительными являются Windows и контейнеры. Всё работает через тыкание в GUI: ESPtool для этого модуля только предстоит зареверсить. Сама прошивка собирается Makefile-ом. Дебаггер наличествует: прежде чем зависнуть, модуль вываливает stack trace в сервисный порт. Но лично я так и не смог перевести адреса в строчки кода (gdb сообщает, что адреса ничему не соответствуют). Вполне возможно, что это связано с плохой поддержкой Linux как такового. Соответственно, если хотите повозиться с модулем — попробуйте это сделать под Windows (и отписаться на github). В противном случае вот инструкция для Linux. После установки нужно проверить правильность путей в .bashrc и удалить (переименовать) все файлы CSDTK/lib/libQt*: иначе, прошивальщик (он же дебаггер) просто не запустится из-за конфликта с, вероятно, установленным libQt.

Прошивальщик

К прошивальщику идёт инструкция.

Подключение

Тут всё сложнее, чем, на NodeMCU. Модули выглядят похоже, но на pudding board нет USB-TTY чипа и microUSB используется только для питания. Соответственно, вам понадобится USB-TTY на 3.3V. А лучше — два: один для дебаг порта и ещё один для UART1: первый используется для заливки прошивки а второй вы сможете использовать как обычный терминал. Чтобы не тащить все эти сопли к компьютеру я дополнительно приобрел USB разветвитель на 4 порта с двухметровым проводом и внешним блоком питания (обязателен). Суммарная стоимость этого набора с самим модулем составит 25-30$ (без блока питания: используйте от телефона).

Прошивка

Модуль приходит с AT прошивкой: можно подключить к 3.3В ардуине и использовать в качестве модема через UART1. Свои прошивки пишутся на C. make создает два файла прошивки: один шьётся около минуты, другой — достаточно быстро. Шить можно только один из этих файлов: первый раз — большой, последующие разы — маленький. Суммарно, у меня в процессе разработки на рабочем столе открыта китайская SDK (coolwatcher) для управления модулем, miniterm в качестве stdio и редактор кода.

API

Содержание API отражает список наверху и напоминает ESP8266 в свои ранние дни: у меня ушло часа 3 на то, чтобы запустить HelloWorld. К сожалению, набор функций, доступных пользователю, весьма ограничен: к примеру, нет доступа к телефонной книге на SIM-карте, низкоуровневой информации о подключении к сотовой сети и тому прочее. Документация по API ещё менее полная, поэтому опираться приходится на примеры (которых два десятка) и include-файлы. Тем не менее, модуль может очень многое вплоть до SSL-подключений: очевидно, производитель сфокусировался на наиболее приоритетных функциях.

Впрочем, программирование китайских микроконтроллеров посредством китайского API надо любить. Для всех остальных производитель начал портировать micropython на этот модуль. Я решил попробовать себя в open-source проекте и продолжить это доброе дело (ссылка в конце статьи).

micropython

logo

Micropython — это open-source проект портирующий cPython на микроконтроллеры. Разработка ведётся в двух направлениях. Первое — это поддержка и развитие общих для всех микроконтроллеров core-библиотек, описывающих работу с основными типами данных в python: объекты, функции, классы, строки, атомарные типы и тому прочее. Второе — это, собственно, порты: для каждого микроконтроллера необходимо «научить» библиотеку работать с UART для ввода-вывода, выделить стэк под виртуальную машину, указать набор оптимизаций. Опционально, описывается работа с железом: GPIO, питание, беспроводная связь, файловая система.
Всё это пишется на чистых С с макросами: у micropython есть набор рекомендованных рецептов начиная с объявления строк в ROM до написания модулей. В дополнение к этому, полностью поддерживаются самописные модули на питоне (главное — не забывать об объёме памяти). Кураторы проекта ставят целью возможность запустить джангу (картинка с буханкой хлеба). В качестве рекламы: проект продаёт собственную плату для студентов pyboard, но также популярны порты для модулей ESP8266 и ESP32.

Когда прошивка готова и залита — вы просто подключаетесь к микроконтроллеру через UART и попадаете в питонский REPL.

$ miniterm.py /dev/ttyUSB1 115200 --raw MicroPython cd2f742 on 2017-11-29; unicorn with Cortex-M3 Type "help()" for more information. >>> print("hello") hello

После этого можно начинать писать на почти обычном python3, не забывая об ограничениях памяти.

Модуль A9G не поддерживается официально (список официально поддерживаемых модулей доступен в micropython/ports, их около десятка). Тем не менее, производитель железа форкнул micropython и создал окружение для порта A9G: micropython/ports/gprs_a9, за что ему большое спасибо. На момент, когда я заинтересовался этим вопросом, порт успешно компилировался и микроконтроллер приветствовал меня REPL. Но, к сожалению, из сторонних модулей присутствовала только работа с файловой системой и GPIO: ничего, связанного с беспроводной сетью и GPS доступно не было. Я решил исправить эту недоработку и поставил себе цель портировать все функции, необходимые для GPS-трекера. Официальная документация на этот случай излишне лаконична: поэтому, пришлось ковыряться в коде.

С чего начать

Первым делом идём в micropython/ports и копируем micropython/ports/minimal в новую папку, в которой будет находится порт. Затем, редактируем main.c под вашу платформу. Имейте ввиду, что вся вкуснятина находится в функции main, где нужно вызвать инициализатор mp_init(), предварительно подготовив для него настройки микроконтроллера и стэк. Потом, для event-driven API, необходимо вызвать pyexec_event_repl_init() и скармливать вводимые через UART символы в функцию pyexec_event_repl_process_char(char). Это и обеспечит взаимодействие через REPL. Второй файл — micropython/ports/minimal/uart_core.c описывает блокирующий ввод и вывод в UART. Привожу оригинальный код для STM32 для тех, кому лень искать.

main.c

int main(int argc, char **argv) { int stack_dummy; stack_top = (char*)&stack_dummy; #if MICROPY_ENABLE_GC gc_init(heap, heap + sizeof(heap)); #endif mp_init(); #if MICROPY_ENABLE_COMPILER #if MICROPY_REPL_EVENT_DRIVEN pyexec_event_repl_init(); for (;;) { int c = mp_hal_stdin_rx_chr(); if (pyexec_event_repl_process_char(c)) { break; } } #else pyexec_friendly_repl(); #endif //do_str("print('hello world!', list(x+1 for x in range(10)), end='eol\\n')", MP_PARSE_SINGLE_INPUT); //do_str("for i in range(10):\r\n print(i)", MP_PARSE_FILE_INPUT); #else pyexec_frozen_module("frozentest.py"); #endif mp_deinit(); return 0; }

uart_core.c

// Receive single character int mp_hal_stdin_rx_chr(void) { unsigned char c = 0; #if MICROPY_MIN_USE_STDOUT int r = read(0, &c, 1); (void)r; #elif MICROPY_MIN_USE_STM32_MCU // wait for RXNE while ((USART1->SR & (1 << 5)) == 0) { } c = USART1->DR; #endif return c; } // Send string of given length void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) { #if MICROPY_MIN_USE_STDOUT int r = write(1, str, len); (void)r; #elif MICROPY_MIN_USE_STM32_MCU while (len--) { // wait for TXE while ((USART1->SR & (1 << 7)) == 0) { } USART1->DR = *str++; } #endif }

После этого нужно переписать Makefile используя рекомендации / компилятор от производителя: тут всё индивидуально. Всё, этого в идеале должно хватить: собираем, заливаем прошивку и видим REPL в UART.
После оживления micropython необходимо позаботиться о его хорошем самочувствии: настроить сборщик мусора, правильную реакцию на Ctrl-D (soft reset) и некоторые другие вещи, на которых я не буду останавливаться: см. файл mpconfigport.h.

Создаём модуль

Самое интересное — написание собственных модулей. Итак, модуль (не обязательно, но желательно) начинается с собственного файла mod[имя].c, который добавляется Makefile (переменная SRC_C если следовать конвенции). Пустой модуль выглядит следующим образом:

// nlr - non-local return: в C исключений нет, и чтобы их имитировать используется goto-магия и ассемблер. // Функция nlr_raise прерывает исполнение кода в точке вызова и вызывает ближайший по стэку обработчик ошибок. #include "py/nlr.h" // Основные питонские типы. К примеру, структура mp_map_elem_t, статичный словарь, объявлен именно там. #include "py/obj.h" // Высокоуровневое управление рантаймом. mp_raise_ValueError(char* msg) и mp_raise_OSError(int errorcode) находятся именно здесь. // В дополнение, набор функций mp_call_function_* используется для вызова питонских Callable (полезно для callback-логики). #include "py/runtime.h" #include "py/binary.h" // Общий header для всех модулей: тут как хотите так и организовывайте #include "portmodules.h" // Словарь со списком всех-всех-всех атрибутов модуля. Имена задаются через макрос MP_QSTR_[имя атрибута]. MP_OBJ_NEW_QSTR делает питонскую обертку. // В этих двух макросах используются всевозможные оптимизации чтобы не хранить строку в RAM. // Единственная запись на текущий момент - имя модуля в магическом поле __name__ STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, }; // Питонская обёртка вокруг словаря сверху STATIC MP_DEFINE_CONST_DICT (mp_module_mymodule_globals, mymodule_globals_table); // Объявление самого модуля: объект нашего модуля наследует объект базового модуля и содержит список атрибутов сверху const mp_obj_module_t mp_module_mymodule = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t*)&mp_module_mymodule_globals, };

Конечно, порт сам по себе не узнает о константе mp_module_mymodule: её необходимо добавить в переменную MICROPY_PORT_BUILTIN_MODULES в настройках порта mpconfigport.h. Кстати, нескучные обои имя чипа и название порта меняются тоже там. После всех этих изменений можно попытаться скомпилировать модуль и импортировать его из REPL. У модуля будет доступен только один атрибут __name__ с именем модуля (отличный случай для проверки автодополнения в REPL через Tab).

>>> import mymodule >>> mymodule.__name__ 'mymodule'

Константы

Следующий этап по сложности — добавление констант. Константы часто необходимы для настроек (INPUT, OUTPUT, HIGH, LOW и т.п.) Тут всё достаточно просто. Вот, к примеру, константа magic_number = 10:

STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_magic_number), MP_OBJ_NEW_SMALL_INT(10) }, };

Тестируем:

>>> import mymodule >>> mymodule.magic_number 10

Функции

Добавление функции в модуль следует общему принципу: объявить, обернуть, добавить (привожу чуть более сложный пример, чем в документации).

// Объявляем STATIC mp_obj_t conditional_add_one(mp_obj_t value) { // Получаем целое int. Если передали строку или любой другой несовместимый объект - нет проблем: исключение вывалится автоматически. int value_int = mp_obj_get_int(value); value_int ++; if (value_int == 10) { // Возврат None return mp_const_none; } // Возврат питонского int return mp_obj_new_int(value); } // Оборачиваем функцию одного аргумента. Для заинтересованных предлагаю посмотреть // runtime.h относительно других вариантов. STATIC MP_DEFINE_CONST_FUN_OBJ_1(conditional_add_one_obj, conditional_add_one); // Добавляем STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_magic_number), MP_OBJ_NEW_SMALL_INT(10) }, { MP_OBJ_NEW_QSTR(MP_QSTR_conditional_add_one), (mp_obj_t)&conditional_add_one_obj }, };

Тестим:

>>> import mymodule >>> mymodule.conditional_add_one(3) 4 >>> mymodule.conditional_add_one(9) >>> 

Классы (типы)

С классами (типами) всё тоже относительно просто. Вот пример из документации (ну почти):

// Пустая таблица атрибутов класса STATIC const mp_map_elem_t mymodule_hello_locals_dict_table[] = {}; // Словарная обёртка STATIC MP_DEFINE_CONST_DICT(mymodule_hello_locals_dict, mymodule_hello_locals_dict_table); // Структура, определяющая объект, являющийся типом const mp_obj_type_t mymodule_helloObj_type = { // Наследуем базовый тип { &mp_type_type }, // Имя: helloObj .name = MP_QSTR_helloObj, // Атрибуты .locals_dict = (mp_obj_dict_t*)&mymodule_hello_locals_dict, }; // Добавляем в модуль STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_magic_number), MP_OBJ_NEW_SMALL_INT(10) }, { MP_OBJ_NEW_QSTR(MP_QSTR_conditional_add_one), (mp_obj_t)&conditional_add_one_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_conditional_add_one), (mp_obj_t)&mymodule_helloObj_type }, };

Тестим:

>>> mymodule.helloObj <type 'helloObj'>

Получившийся тип можно наследовать, сравнивать, но у него нет ни конструктора ни каких-либо ассоциированных данных. Данные добавляются «рядом» с конструктором: предлагается создать отдельную структуру, в которой будет хранится отдельно питонский тип и отдельно — произвольный набор данных.

// Произвольная над-структура. Да, с именами путаница typedef struct _mymodule_hello_obj_t { // Питонский тип mp_obj_base_t base; // Какие-то данные uint8_t hello_number; } mymodule_hello_obj_t;

Как взаимодействовать с этими данными? Один из самых сложных способов — через конструктор.

// Функция-конструктор, принимающая тип (который, вполне возможно, отличается от mymodule_helloObj_type // по той причине, что тип был наследован чем-то другим), количество аргументов (args и kwargs) и // указатель на сами аргументы в том же порядке: args, kwargs STATIC mp_obj_t mymodule_hello_make_new( const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args ) { // Проверить количество аргументов mp_arg_check_num(n_args, n_kw, 1, 1, true); // Создать экземпляр mymodule_hello_obj_t *self = m_new_obj(mymodule_hello_obj_t); // Положить тип куда надо self->base.type = &mymodule_hello_type; // Присвоить данные self->hello_number = mp_obj_get_int(args[0]) // Вернуть экземпляр return MP_OBJ_FROM_PTR(self); // Второй аргумент в __init__, видимо, проигнорировали } // Конструктор должен сидеть в поле make_new const mp_obj_type_t mymodule_helloObj_type = { { &mp_type_type }, .name = MP_QSTR_helloObj, .locals_dict = (mp_obj_dict_t*)&mymodule_hello_locals_dict, // Конструктор .make_new = mymodule_hello_make_new, };

Из других полей есть ещё .print, и, полагаю, вся остальная магия Python3.

Но make_new вовсе не обязателен для получения экземпляра объекта: инициализацию можно производить в произвольной функции. Вот неплохой пример из micropython/ports/esp32/modsocket.c:

// Другая сигнатура функции: количество аргументов и указатель на аргументы STATIC mp_obj_t get_socket(size_t n_args, const mp_obj_t *args) { socket_obj_t *sock = m_new_obj_with_finaliser(socket_obj_t); sock->base.type = &socket_type; sock->domain = AF_INET; sock->type = SOCK_STREAM; sock->proto = 0; sock->peer_closed = false; if (n_args > 0) { sock->domain = mp_obj_get_int(args[0]); if (n_args > 1) { sock->type = mp_obj_get_int(args[1]); if (n_args > 2) { sock->proto = mp_obj_get_int(args[2]); } } } sock->fd = lwip_socket(sock->domain, sock->type, sock->proto); if (sock->fd < 0) { exception_from_errno(errno); } _socket_settimeout(sock, UINT64_MAX); return MP_OBJ_FROM_PTR(sock); } // Обёртка для функции с 0-3 аргументами STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_socket_obj, 0, 3, get_socket);

Привязанные методы (bound methods)

Следующий этап — добавление привязанных методов. Впрочем, это мало чем отличается от всех остальных методов. Возвращаемся к примеру из документации:

// Ещё один пример сигнатуры: количество аргументов строго равно 1 (self) STATIC mp_obj_t mymodule_hello_increment(mp_obj_t self_in) { mymodule_hello_obj_t *self = MP_OBJ_TO_PTR(self_in); self->hello_number += 1; return mp_const_none; } // Обёртка функции одной переменной MP_DEFINE_CONST_FUN_OBJ_1(mymodule_hello_increment_obj, mymodule_hello_increment); // Добавляем в аттрибуты под именем 'inc' STATIC const mp_map_elem_t mymodule_hello_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_inc), (mp_obj_t)&mymodule_hello_increment_obj }, }

Всё!

>>> x = mymodule.helloObj(12) >>> x.inc()

Все остальные атрибуты: getattr, setattr

Как насчёт добавления не-функций, использования @property и вообще собственного __getattr__? Пожалуйста: это делается вручную в обход mymodule_hello_locals_dict_table.

// Функция со специфической сигнатурой ... STATIC void mymodule_hello_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { mymodule_hello_obj_t *self = MP_OBJ_TO_PTR(self_in); if (dest[0] != MP_OBJ_NULL) { // __setattr__ if (attr == MP_QSTR_val) { self->val = dest[1]; dest[0] = MP_OBJ_NULL; } } else { // __getattr__ if (attr == MP_QSTR_val) { dest[0] = self->val; } } } // ... идёт прямиком в магический attr const mp_obj_type_t mymodule_helloObj_type = { { &mp_type_type }, .name = MP_QSTR_helloObj, // Словарь больше не используется //.locals_dict = (mp_obj_dict_t*)&mymodule_hello_locals_dict, .make_new = mymodule_hello_make_new, // Вместо него - attr .attr = mymodule_hello_attr, }; 

Что-то больно лаконичный attr получился, скажете вы. Где же все эти mp_raise_AttributeError (прим: такая функция не существует)? На самом деле, AttributeError будет вызван автоматически. Секрет в том, что dest — это массив из двух элементов. Первый элемент имеет смысл «вывода», write-only: он принимает значение MP_OBJ_SENTINEL если значение необходимо записать и MP_OBJ_NULL если его нужно прочитать. Соответственно, на выходе из функции ожидается MP_OBJ_NULL в первом случае и что-то mp_obj_t во втором. Второй элемент — «ввод», read-only: принимает значение объекта для записи, если значение необходимо записать и MP_OBJ_NULL, если его необходимо прочитать. Менять его не надо.

Вот и всё, можно проверять:

>>> x = mymodule.helloObj(12) >>> x.val = 3 >>> x.val 3

Самое интересное — что автодополнение по Таb в REPL по-прежнему работает и предлагает .val! Я, если честно, никак не эксперт в C, поэтому могу только предполагать как это происходит (переопределением оператора ‘==’).

Порт

Возвращаясь к модулю A9G, я описал поддержку всех основных функций, а именно, SMS, GPRS (usockets), GPS, управление питанием. Теперь можно залить что-то вроде этого на модуль и оно будет работать:

import cellular as c import usocket as sock import time import gps import machine # Ожидаем сеть print("Waiting network registration ...") while not c.is_network_registered(): time.sleep(1) time.sleep(2) # Включаем GPRS print("Activating ...") c.gprs_activate("internet", "", "") print("Local IP:", sock.get_local_ip()) # Включаем GPS gps.on() # Отдаём данные на thingspeak host = "api.thingspeak.com" api_key = "some-api-key" fields = ('latitude', 'longitude', 'battery', 'sat_visible', 'sat_tracked') # Какая прелесть, что эта мешанина работает на микроконтроллере! fields = dict(zip(fields, map(lambda x: "field{}".format(x+1), range(len(fields))) )) x, y = gps.get_location() level = machine.get_input_voltage()[1] sats_vis, sats_tracked = gps.get_satellites() s = sock.socket() print("Connecting ...") s.connect((host, 80)) print("Sending ...") # Пока что сокеты мало что поддерживают, поэтому запрос через сырой HTTP. В будущем можно будет использовать библиотеки на чистом питоне для HTTP, SSL и прочего print("Sent:", s.send("GET /update?api_key={}&{latitude}={:f}&{longitude}={:f}&{battery}={:f}&{sat_visible}={:d}&{sat_tracked}={:d} HTTP/1.1\r\nHost: {}\r\nConnection: close\r\n\r\n".format( api_key, x, y, level, sats_vis, sats_tracked, host, **fields ))) print("Receiving ...") print("Received:", s.recv(128)) s.close()

Аудиопроцессор (DSP) в авто, собираем сами!

 Arduino  Комментарии к записи Аудиопроцессор (DSP) в авто, собираем сами! отключены
Ноя 022021
 

Всем здравствуйте! В этом я обзоре я немного погружусь в автозвуковую тему, расскажу и покажу как за 2900р. (всего 2900 р.!!!) можно реализовать проект по изготовлению отдельного аудиопроцессора (DSP) в автомобиль.
Здесь не будет разработки каких-либо жутких схем, изготовления или заказа каких-то страшных плат. Нет, тут будет всё просто, будем собирать устройство из доступных и дешевых покупных комплектующих с интернет-магазинов, сами отлаживать и настраивать, 100%-ая повторяемость.
В результате получим свой аудиопроцессор, с серьезными возможностями для настройки компонентов и корректировки АЧХ, и постараемся решить проблемы звучания аудиосистемы в авто, с которыми сложно и дорого справиться «непроцессорными» способами.

ВВЕДЕНИЕ.

Сразу хочу сказать, что я совсем не болен автозвуковой темой, она меня немного задела, но относительно быстро отпустила. Я глубоко погрузился в эту тему где-то в 2010г. и уже в 2013г. я понял, что добился цели в плане построения своей системы.
Автомобильные аудиофилы отличаются от домашних аудиофилов тем, что первые, для получения системы своей мечты, постоянно заняты сменой компонентов: динамиков, сабвуферов, усилителей, головных устройств, межблоков и кабелей, без перерыва устанавливая и переустанавливая их разными способами в авто, при чем делают это наверное раз в 5 чаще, чем домашние энтузиасты.
Это какой-то абсолютно бесконечных процесс, для многих это серьезное хобби, но могу сказать, что очень дорогое, так как требования и аппетиты быстро растут, стоимость компонентов и время на установку тоже постоянно увеличивается, а отдача и разница в результате всё меньше и меньше. А еще и машина постоянно разобрана и в пучках проводов.

Я в этом процессе достаточно быстро остановился, прошел все пути новичка, наступил на все возможные грабли, и в итоге нашел необходимый приемлемый вариант, на которым я принял решение, что мне хватит, и больше мне не нужно.

Итак, в ходе непродолжительных поисков была собранная следующая система:

Стоимость этих компонентов сейчас немного настораживает (80-90т.р.), но тогда это стоило как минимум в два раза дешевле, курс Евро в те годы был совсем другой. Усилители брал вообще 2-3 месяца БУ, в состоянии новых, но на 30% дешевле, опять последствия того постоянного перебора компонентов у «глубоко увлеченных» автозвуком, но мне только в плюс)).

dd6ffe.png

Для фронта было задействовано поканальное усиление и использованы встроенные развитые фильтры и гейны усилителя E.O.S. AE-475 LE Bi-amping для разделения полос широкополосника SO55neo и мида.
Для разделения полос сабвуфера и мида был использован кроссовер в ГУ. Также в ГУ JVC KW-R900BT были задействованы функции временной задержки каналов для согласования всех источников.

У всей этой системы был один минус – отсутствие точной настройки (фильтры ВЧ/НЧ приходилось крутить отверткой) и полное отсутствие возможностей корректировки АЧХ. Если общий провал в СЧ (из-за размещения мида в дверях в ногах) решился установкой широкополосного динамика ВЧ/СЧ, то отдельные пики и выстрелы АЧХ от массы переотражений в салоне авто решить с помощью ГУ было не возможно, функции эквалайзера ГУ очень бедные, считай их нет.

Тут была необходима установка аудиопроцессора (DSP) для решения основных проблем, но я уже не был готов выложить от 15 до 40 т.р. за решения от HELIX, AUDISON, Alpine и прочих брендов, появились другие приоритеты, поэтому я ездил и слушал так.
Пока я не натолкнулся на решения на базе DSP чипа ADAU1701. На данную тему я писал в своем предыдущем обзоре по внедрению DSP в домашний усилитель. Там же я писал, что буду готовить свой вариант аудиопроцессора в авто.
Подобрав компоненты и схему их подключения, было проработано следующее устройство.

КОМПЛЕКТУЮЩИЕ:

1. Модуль DSP ADAU1701 RDC2-0027v1

В качестве основной платы DSP была выбран модуль от CHIPDIP RDC2-0027v1 на базе чипа ADAU1701 (datasheet) (RDC2-0027v1, SigmaDSP ADAU1701. Модуль цифровой обработки звука. V1)

e58f1c.jpg

Модуль имеет два входа АЦП, 4 выхода ЦАП. Данный модуль обладает диапазонам питающего напряжения 5В — 36В, что хорошо подходит для авто. На самой плате, правда, отсутствует EEPROM, а лишь посадочное место под память в корпусах DIP или SOIC, которую надо приобрести отдельно, что я и сделал при заказе модуля:

24LC64-I/P, Последовательная энергонезависимая память, 64K, 24LC64 [DIP-8]

2. I2S DAC PCM5102

ADAU1701 обладает только 4-мя отдельными аналоговыми выходами ЦАП, что в моем случае уйдет только на поканальный фронт ВЧ/НЧ. Для подключения сабвуфера необходим, как минимум, еще один канал. Для этой цели можно задействовать I2S интерфейс ADAU1701 для подключения дополнительного I2S ЦАП. Я уже опробовал на домашнем усилителе ЦАП на чипе PCM5122, и он меня вполне устроил, поэтому сейчас решил использовать его «младшего брата» PCM5102.
Была приобретена следующая плата:

PCM5102 DAC Decoder I2S Player Assembled Board 32Bit 384K Beyond ES9023 PCM1794 For Raspberry Pi

520e69.jpg

Имеется стерео выход, для подключения по I2S на плате необходимо поставить дополнительно джампер на выводах I2S/LJ, которого в комплекте почему-то не положили.

3. Разъемы RCA

Для подключения аналоговых выходов от DSP и I2C DAC я приобрел недорогие RCA разъемы для изготовления межблочных кабелей. Разъемы мне понравились, вполне качественные, цанговый зажим кабеля, не хуже пресловутых NEUTRIK.

2Pcs/1Pair Gold Plated RCA Connector RCA male plug adapter Video/Audio Wire Connector Support 6mm Cable black&red

5ab633.jpg

4. DC-DC преобразователь для питания PCM5102 DAC

Так как плате DAC PCM5102 требуется питание от 5 до 7 В, то было принято решение поставить маленький DC-DC преобразователь на MP1584, c выставленным напряжением питания 5,2В.
1PCS Great IT power module Adjustable MP1584EN DC DC 3A power step-down descending output module 12 v9v5v3 LM2596 24V

a232fd.jpg

5. Корпус аудиопроцессора

Так как это устройство планировалось как первый прототип (но скорее всего останется на продолжительное использование в текущем автомобиле), то корпус решил сделать простой и быстрый. Долго искал подходящую коробку, пока в электротехническом магазине не нашел интересную клеммную коробку с гладкими стенками DKS:

Коробка ответвит. с гладкими стенками, IP56, 120х80х50мм

58ad2f.jpg
726520.jpg
f448c4.jpg
f9f4a5.jpg

Коробка вообще очень понравилась, прочные плотные стенки, приятный на ощупь пластик, прямо “soft touch”. Я их в руках много разных держал, но эта реально отличная.

6. Сальниковые вводы корпуса

Так как я решил ставить аудипроцессор прямо рядом с усилителем для фронтальных динамиков, то подумал, что было бы глупо ставить RCA гнезда, делать межблочные кабели по 50 см, куча разъемов.
Я решил, что с одной стороны межблочного кабеля я поставлю RCA разъемы для подключения к усилителю, а ответные концы кабелей заведу непосредственно через корпус на выводы модуля DSP. Для сабвуфера всё-таки придется сделать полноценный межблочный кабель, для подключения к RCA выводам I2S DAC. Для ввода кабелей в корпус решил использовать латунные сальниковые вводы:

166273.jpg

7. Плата CY7C68013A

Для подключения, настройки в реальном времени через программный комплекс Sigmastudio и заливки программы в EEPROM модуля DSP ADAU1701 будем использовать плату на чипе CY7C68013A. Брал здесь:
EZ-USB FX2LP CY7C68013A USB logic analyzer core board+Source Code

17caf0.jpg

О данной плате я подробно расписывал в своем предыдущем обзоре, поэтому я размещу информацию из того обзоре здесь под спойлер, чтобы всё было в одном месте:
Настройка и подключение платы CY7C68013A
Плата на базе микросхемы CY7C68013A от Cypress Semiconductor умеет «прикидываться» стандартным интерфейсом USBi от AD для подключения к DSP по USB, c возможностью внесение изменений в on-line режиме и записи проекта в EEPROM, для последующей загрузки при запуска DSP.

На Youtube канале CHIPDIP есть видео по использованию данной микросхемы в работе (ссылка на видео), но плата, которую можно у них приобрести стоит около 1000 р., еще и подключается как-то странно.
На просторах Aliexpress я нашел вот такую плату на микроcхеме CY7C68013A (EZ-USB FX2LP CY7C68013A USB logic analyzer core board+Source Code):

В отзывах есть информация по удачному подключению к ADAU1701, поэтому я решил её взять.
Вот так плата выглядит в живую:

e88b41.jpg
8d64c3.jpg
00d14b.jpg

Подключение к ПК через кабель MiniUSB, при подключении загорается красный светодиод:

f5e2b7.jpg

У платы несколько режимов работы, которые меняются путем снятия установленных на выводах джамперов, и я думал что мне придется искать необходимую комбинацию, чтобы подобрать нужный режим, но всё заработало, как говорится, «из коробки». Не снимая никакие джамперы всё определилось как надо с первого раза.

Для всего этого набора была подготовлена следующая схема подключения.
Компоненты, которые расположены непосредственно в корпусе, очерчены черным квадратом на схеме:

cc3dad.png

Подготовка корпуса и сборка устройства:

Корпус был задуман очень простой, без придумывания себе дополнительных проблем, но в то же время, всё надо было сделать надежно, так как постоянные вибрации, просто так на термоклей не посадишь.)

На дно нашей клеммной коробки готовим основание из оргстекла для крепления плат внутри корпуса:

8cbe88.jpg
36b23b.jpg
d30b3d.jpg
f4d68a.jpg

Делаем отверстия в полученном основании для крепления его ко дну корпуса на саморезы:

c62b9f.jpg
3e5e49.jpg

Примеряем плату DSP в корпус, такое ощущение, что клеммную коробку делали прямо для данной платы )), намечаем отверстия для крепления платы к основанию. Ставить платы будем на винты и гайки М3, как я делал для домашнего усилителя.

f8cc6b.jpg

Примеряем и сверлим отверстия для установки платы PCM5102 DAC:

a93d74.jpg
bc6754.jpg
3c6051.jpg
bb8743.jpg
1f28b9.jpg
033b39.jpg
4c0050.jpg

Размечаем и сверлим отверстия в корпусе под сальниковые вводы межблочных кабелей:

5244c3.jpg
7d8068.jpg
e425de.jpg
456bd0.jpg

Для подключения платы CY7C68013A к модулю ADAU1701 RDC2-0027v1 я использую простой штекер и гнездо 3.5 Jack, так как нужно всего три провода для подключения. У меня не было панельного гнезда, и размещение его в фронтальной части среди высоких сальниковых вводов тоже было не лучшим решением.
Зато у меня нашлось отдельно гнездо 3.5 Jack на кабель, и я придумал вот такое новое составное гнездо из еще одного сальникового ввода:

12d0a0.jpg
f3748e.jpg
201bb5.jpg
d4fc0f.jpg

Крепить аудиопроцессор я решил прямо сверху усилителя под водительским сиденьем, и решил его зафиксировать на добротные полоски 3М скотча. Так как адгезия скотча к такому пластику клеммной коробки не очень, да и дно коробки всё в ребрах, я решил сделать отдельные монтажные полосы из алюминиевой пластины:

bbadc2.jpg
bd23e1.jpg
7d5200.jpg
3378e7.jpg
3980c8.jpg

Корпус готов, все отверстия сделаны, можно отправить в покраску, так как белый цвет будет совсем странно выглядеть в черном салоне автомобиля:

79435a.jpg
a19695.jpg
9c4f96.jpg

Начинаем собирать. Размечаем DC-DC преобразователь на дно корпуса всей площадью на 3М скотч, и закрываем сверху нашим основанием:

9f8f0e.jpg
98b02e.jpg

Размещаем все платы, вводим кабели. Ответные концы межблочных кабелей решил непосредственно припаять к выводам гребенок, все соединения изолировать термоусадкой:

00fe75.jpg

Паяем коннекторы и делаем межблоки. В качестве кабеля используется МКЭШ 3 х 0,35 мм2:

513a63.jpg
08faec.jpg

Собираем устройство, соединение платы DSP и PCM5102 DAC делал перемычками:

85a511.jpg
6c74a4.jpg

На кабель питания на плюсовой проводник впаял в разрыв предохранитель 1 А:

8a14c2.jpg

УСТАНОВКА В АВТО:

Оба усилителя у меня живут под передними сиденьями, там ниша оказалась глубокая, и они туда отлично влезли. Наш аудиопроцессор будем ставить сверху усилителя фронтальной акустики, разместим так, чтобы он не мешал при продольном перемещении кресла блоку обогрева сиденья и блоку подушки безопасности:

02394d.jpg
9531e3.jpg
733a39.jpg

Предварительно всё подключаем и пробуем, что всё работает:

24c1bd.jpg

После успешного запуска можно окончательно монтировать и подключать:

040212.jpg
1bc971.jpg
6e3df2.jpg
f54239.jpg

Подключаем отдельным межблочным кабелем усилитель сабвуфера:

6cab3e.jpg

НАСТРОЙКА И ЗАПИСЬ ПРОЕКТА:

Настройка и заливка программы проекта в EEPROM платы осуществляется в программном комплексе SigmaStudio. Подробную инструкцию по установке программного обеспечения, драйверов и активизации платы CY7C68013A в качестве интерфейса USBi, для внесения изменений и корректировок в реальном времени в проекте в SigmaStudio, я давал в своем предыдущем обзоре, и размещу ту информацию опять здесь ниже под спойлер:
Софт и драйверы

К указанной под спойлером инструкции для нашего устройтсва необходимо сделать еще пару следующих манипуляции в проекте, для того, чтобы у нас заработал внешний DAC PCM5102 по шине I2S:

В SigmaStudio на вкладке «Hardware Configuration» и нижней вкладке «IC 1-170x\140x Register Control» необходимо выставить и проверить следующие пункты как на скриншоте ниже:

— в блоке «Serial Output 1 (channels 0-7)» поставить галочку на Master Mode, и проверить LRCLK polarity и BCLK polarity
— в блоке «GPIO» выставить:
MP6 — Output Sdata_out0;
MP10 — In Lrclk_out;
MP11 — In Bclk_out

64d26c.png

Для разруливания всего нашего комплекта в авто необходимо было подготовить проект DSP в SigmaStudio. Можно было сделать всё с чистого листа, но я наткнулся на один готовый проект от ребят из MADBIT (http://madbitdsp.com).
Их ранний процессор MadBit DSP 5 был спроектирован по схожей схеме, и также необходимо было использовать SigmaStudio для подготовки проекта и настройки.
Я взял их готовый проект для данного аудиопроцессора, но он был иерархически раскидан по вкладкам, плюс меня не устраивали некоторые используемые модули.

b46dee.png
56f314.png
a1c754.png
2e9001.png
06a96a.png
dc9c45.png

В итоге собрав основные элементы на одной рабочей области, сделав дополнительные обозначения и удобное размещения для быстрой настройки уже сидя в авто, у меня получился следующий проект:

90a45d.png
282d1a.png
1db2c8.png
31d15c.png

У каждого динамика есть свой отдельный параметрический эквалайзер, регулятор уровня, переключатель MUTE, а также есть дополнительный побортный переключатель MUTE (левая/правая сторона, для удобства замеров и настройки), а также блоки задержки сигнала.

Файл проекта у меня получился в двух вариантах, и различается они только способом задания задержки сигнала для канала сабвуфера.

Дело в том, что после замера расстояния до каждого динамика из точки прослушивания, у меня получилось, что правый мид находится дальше (145 см), чем сабвуфер (125см). Во многих статьях говорится, что указывается фактическое расстояние до катушки, и не важно в какую сторону развернут динамик. В соответствии с этим я сделал проект следующим образом (car_dsp_sub_close.dspproj):

7882f8.png

В ходе настройки и тестирования оказалось, что такой задержки, рассчитанной из фактического расстояния, не хватает для «вытягивания» сабвуфера из багажника седана. Скорее всего это связанно с закрытым объемом багажника седана, и более сложным путем НЧ волны, поэтому пришлось вернуть обратно в прежний вид, с первоначальной задержкой всех динамиков фронта относительно сабвуфера (car_dsp_sub_far.dspproj):

05ca1b.png

Задержки в SigmaStudio задаются сэмплами, я сначала для себя, а затем и для Вас, подготовил таблицу для перевода расстояния до динамиков из точки прослушивания в сэмплы, которые вносятся в соответствующие блоки для каждого излучателя. В таблице сделал соответствующие комментарии по выбору проектов.

5ca61c.png

Для непосредственной настройки в авто я использовал в принципе тот же комплект, что и в обзоре про DSP для домашнего усилителя:

— Измерительный микрофон;
— USB звуковая карта;
— Room EQ Wizard;
— Плата CY7C68013A c кабелем USB и трехпроводным кабелем для подключения к аудиопроцессору;

Правда в этот раз мне было удобнее разделить на два комплекта, так как очень неудобно работать в SigmaStudio, и одновременно смотреть в окно RTA в REW. Для этих целей пришлось достать с полки старый ноутбук с Windows. (кстати, чуть больше чем за 6 месяцев SSD Plextor куда-то потерял файлы на носителе, система отказалась грузиться, ссылаясь на отсутствие нужных системных файлов, а лег отдыхать он в нормальном рабочем состоянии):

d3576b.jpgea734a.jpg

Для настройки системы в авто я наткнулся на интересный мануал на сайта конторы Audiofrog

Они продают в США аудио оборудование для авто, а также измерительный комплект для настройки аудиосистемы.
У них на странице измерительного комплекта есть мануалы по использованию его с Room EQ Wizard, а также очень добротный документ по настройке аудиосистемы в автомобиле. Очень хороший материал, доступным языком от инженера для простого человека. Очень советую, правда на англ. языке, но на русском языке я таких материалов честно не встречал.

A Straightforward Stereo Tuning Process and Some Notes About Why it Works

Audiofrog UMI-1 Setup Instructions for REW

Также полезный раздел их форума:

www.audiofrog.com/community/tech-tips/

Настройку производил на розовом шуме, побортно, корректировки вносил в реальном времени.
Для более стабильного отражения кривой АЧХ в окне RTA в Room Eq Wizard я использовал не просто розовый шум, а доступный в REW «периодический розовый шум» (Pink Periodic).
В REW, в окне “Generator” выбираем “Pink Periodic”, выставляем “Sequence length” в 16k и указываем настройки формата сохранения WAV файла на выходе. Мне было проще создать WAV файл и запускать его непосредственно с ГУ, чем запускать его с ноутбука через AUX ГУ или на вход аудиопроцессора.

44fa30.png

В настройках окна RTA также выставляем FFT в 16k, и теперь наш график в реальном времени не требует усреднения, а почти статичен, и все изменения, которые мы вносим, мы видим четко и без прыжков и колебаний графика. Очень удобно.

8eb2e6.png

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

b030fa.png
c2169f.png
7dc692.png
e0e1ff.png
afa401.png
ccb4db.png

Провалы АЧХ править бесполезно, сколько дБ не вливай, зачастую толку мало. Попытки жесткой эквализации основной части диапазона вниз до уровня провальных участков АЧХ приводят к жуткому эффекту: на графике с микрофона вроде всё красиво, но слушать трудно, потому что присутствует сильная расфазированность, как будто все динамики подключили в противофазе. Фильтры крутят фазу, а когда их очень много – то получается какая-то «фазовая каша», убедился лично.

Задержку сабвуфера пришлось настроить уже почти на слух, у меня с этим был опыт на ГУ, так что значения задержки в семплах были получены опытным путем. Благо это делается буквально на глазах, просто вбиваем разные значения в ячейке в модуле, жмем Enter и сразу слышим изменения даже без прерывания сигнала.

Теперь о текущих проблемах:

— Питание: в общий сигнал с аудиопроцессора добавился «приятный» звук генератора. Его хорошо слышно на малых громкостях, или когда воспроизведения на ГУ на MUTE или на паузе. Такой звук был в игрушке в “Need For Speed”, когда покупаешь своей машине комплект Turbo )). Подключил аудипроцессор от внешнего AC-DC преобразователя – всё норм, никакого мусора. Нужна гальванически развязанное питание. Заказал изолированный DC-DC преобразователь B1212S 2W (1pcs/lot module authentic B1212S B1212S-2W DIP-4 In Stock, должен помочь;
— Хлопок при выключении: хлопок небольшой, иногда еле заметный, но он есть. Планирую поставить параллельно питанию электролит на 1000-2000 мкФ, c диодом, чтобы ADAU1701 выключался позже усилителей, тем самым избегая хлопка;

— Небольшой шум АЦП: его слышно когда нет сигнала, и естественно его слышно только когда машина заглушена, крутим стартер, и шум уже сливается с другими шумами авто. У меня редко можно встретить ситуации, когда машина заглушена, работает ГУ, но сигнала нет.
Но я все равно воспользовался советом из статьи инженера AD по решению подобных проблем в автомобиле (Minimizing Noise and Power Consumption in Automotive Audio Systems with SigmaDSP), и добавил модуль компрессора для снижения уровня АЦП при отсутствии уровня сигнала. Возможно следует добавить I2S АЦП получше, но меня пока всё устраивает.

6bd278.png

БЮДЖЕТ ПРОЕКТА:

DSP ADAU1701 RDC2-0027v1 – 1100р.
I2S DAC PCM5102 – 255р.
DC-DC преобразователь – 50р.
Разъемы RCA – 460р.
Корпус аудиопроцессора – 120 р.
Сальниковые вводы корпуса, гнезда – 300р.
Плата CY7C68013A – 280р.
Прочее – 300р.

Итого: 2865 р.

И это за полностью рабочий аудиопроцессор в авто!

Владельцы DSP устройств от HELIX, AUDISON и прочих, конечно, закидают меня сейчас тухлыми помидорами, рассказывая, что их процессоры, по ряду параметров (THD, SNR и т.д.) уделает этот бедный ADAU1701. Но спрашивается, зачем всё эти сказочные параметры в автомобиле, с работающим двигателем, вентилятором кондиционера или отопителя, а если еще в движении… В тишине, в гараже, возможно да, но мне кажется, что тогда лучше уж дома. Да и всё равно, если взять новую плату у CHIPDIP на базе ADAU1452 (RDC3-0027v1, SigmaDSP ADAU1452. Модуль цифровой обработки звука. V1) за 1200р., а также прикупить к ней I2S АЦП и пару-тройку I2S ЦАП на Ali и прочих, то HELIX и AUDISON вообще погрустнеют с их ценой, но схожими параметрами.

Планы по доработке:

Сделаю отдельную плату, размещу на ней диод, конденсатор, DC-DC преобразователь и клеммники для подключения, размещу вне аудиопроцессора. По-хорошему, разместить всё это внутри корпуса, но это уже в следующем устройстве.

Заказал потенциометры 10 кОм, и кнопки с фиксацией. ADAU1701 имеет GPIO для подключения кнопок, энкодеров и потенциометров для выполнения различных регулировок. Хочу сделать кнопку отключения блоков задержек, когда еду с семьей, сделать кнопку включения тонкомпенсации на низких уровнях громкости, а также на потенциометрах сделать фильтры Low Shelf до 100 Гц и High Shelf от 14 кГц, для корректировки по необходимости.

Low Shelf фильтр очень актуален для радио, которое работает, когда едем вместе с семьей (кроме сына никто не разделяет моих музыкальных предпочтений). Они на радио так любят компрессировать диапазон, что сабвуфер начинает играть гораздо бодрее, и скатывается больше в бубнеж. Сейчас у меня стоит штатный регулятор уровня (Gain) усилителя сабвуфера E.O.S. AE-500.1, пользуюсь им, но крутить гейн усилителя — это не совсем правильно.

Сделаю отдельный пульт для вышеперечисленных регулировок, размещу на центральной консоли, как сейчас расположен текущий пульт. Придется внести изменения в проект в SigmaStudio, добавить соответствующие модули и конфигурацию, подготовлю небольшой обзор по доработкам, думаю будет не менее интересно.

Сразу прошу прощения за возможные неточности в терминологии и обозначениях, это не та тема, где я силен, но очень интересуюсь и пытаюсь разобраться.

Пока всё. Есть, наверное, еще много, что дописать, что забыл указать, но и так много, объемные тексты не всегда просто воспринимать. Думаю, дополнительно можно будет разобраться в комментариях.

Материалы и файлы для скачивания:

1. SigmaStudio (дистрибутив);
2. Драйверы для платы Cypress CY7C68013A
3. Программное обеспечение для платы Cypress CY7C68013A (CySuite / CyConsole)
4. Файлы проектов в SigmaStudio для аудиопроцессора, с XLS файлом расчета временных задержек (в архиве два варианта проекта)
5. Файл проекта в SigmaStudio для аудиопроцессора от MadBit DSP 5
6. Схема подключения аудиопроцессора
7. A Straightforward Stereo Tuning Process and Some Notes About Why it Works
8. Audiofrog UMI-1 Setup Instructions for REW

Многополосный усилитель с цифровым DSP и i2S усилит ельными модулями.

 Arduino  Комментарии к записи Многополосный усилитель с цифровым DSP и i2S усилит ельными модулями. отключены
Ноя 022021
 

Это вторая часть марлезонского балета про двухполосный полочник. Но в отличии от первого акта, этот проект может повторить любой страждущий.

До недавнего времени, использовал в системе ЦАП на AD1853 и ламповый однотактник на 6CA7. Акустические системы Kenwood LS-11EX на Davis KVK 130 под настроение и в целом делал акустику другим. Дома слушать было не когда, да и заниматься творчеством возможности не было тоже.
Но вот снова зачесались руки по паяльнику и микрофону и понеслось)))). Идея создать многополосный усилитель с коррекцией, да еще на современной элементной базе тормозилась очень плохенькими параметрами усилителей Д класса и очень хилых доступных чипов DSP Цифровых сигнальных процессоров.

Первый опыт использования DSP у меня случился при настройке модного трехполосного проекта с использованием процессора Berringer DCX2496. Внутри берринЖера стоит DSP процессор AMD Shark и очень устаревший модуль управления через COM порт RS-232, старенькие ЦАП и АЦП ну и импульсный блок питания не очень высокого качества. Вот там же я понял и проблемные места таких процессоров и их супер преимущества. Основные проблемы – хиленький АЦП на входе и шипение в звуке.
Самый популярный процессор для самодельщиков это ADAU1701. ссылка

Он самый простой в использовании. Я не использовал этот чип по причине интеграции в него простеньких ADC и DAC и малого запаса по вычислительной мощности выраженной в количестве команд на сэмпл.
ссылка
И если современный источник цифровой, то зачем делать сложный путь Цифроаналогового преобразователя в звуковой карте или ЦАП… далее аналогово цифрового преобразования на входе ДСП… далее цифровой обработки в процессоре и очередного цифроаналогового преобразования на выходе ДСП.

С выпуском серии Analog Devices микрочипов DSP ADAU14XX ссылка и микрочипов усилителя SSM3582A ссылка все изменилось. ADAU1452 и ADAU1467 это полностью цифровые процессоры очень мощные с очень большим функционалом. Вычислительная мощность зависит от частоты, на который заточен ДСП в проекте. Но на 48килогерц кажется 1701 имеет 1000 команд на сэмпл, а 1467 имеет 6000 команд на сэмпл. А SSM3582 первое интегрированное решение, где и Дельта сигма ЦАП и усилитель класса Д с дельтасигма модуляцией в одном чипе с КПД 93 процента. ДА еще и небольшой DSP внутри. И на выходе нет огромного дроссельного фильтра и искажения на уровне 0.004%.
Было решено сделать усилитель на таком наборе от Российского производителя Чип и Дип. Ассортимент у них огромный, но поддержка «Рассейская». «Ваши проблемы – это ваши проблемы, у нас все отлично» но об этом позже.
Общая концептуальная схема системы следующая:

1.
Входной преобразователь USB – i2S первоначально был ЧипДип Суперпрайм. НО У меня не получилось его запустить нормально. Выставляю в драйверах Windows 10 64 bit 48 килогерц и получаю на АЧХ дикий срез как фильтром. Выставляю тут же 44.1 и получаю нормальную АЧХ.

ЧипДип отказались комментировать ситуацию и по английски покинули чат. Говорят, все работает нормально. Я естественно подумал что виноват Windows так как используются его стандартные дрова для USB устройства. Накатил сверху ASIO for ALL и пустил через них, да еще с обязательной передискретизацией в 48 попробовал. Работает одинаково криво. Собрал комп с windows 7 64bit та же песня. Забил на такую поддержку и поставил SA9023 – все заработало с полпинка как надо. Два варианта XMOS преобразователей тоже играют все без проблем.этот тоже работает отлично без проблем. Поэтому будьте внимательны – у вас тоже может так криво заработать и помощи ждать не откуда. У меня кучка преобразователей –взял и забыл проблему.

2. DSPO link— удобная платка соединения i2s — соединитель с собственным генератором на 12.288мГц кварце с буферизацией и собственным питанием 5Вольт. Если нет питания 3.3 вольта в гребенке на входе i2s то подает свой клок а если есть – то проводит то что приходит с USB. С USB должно при 48 килогерцах приходить 12.288 мегагерц по моим настройкам сигмастудии (это блок настроек MasterClock). По сути, ДСП переключается на использование собственного генератора а не берет мастерклок с i2s входа, это задается в Сигмастудии.
Сердцем системы является модуль цифровой обработки сигнала ADAU1467.

ссылка

Цифровые входы (I2S) – 4
Цифровые выходы (I2S) – 4
Есть еще кучка программируемых GPIO если вдруг 4 стандартных i2s будет маловато
Максимальная частота дискретизации — 192 кГц
Точность входов/выходов – 32 бит
Вспомогательных каналов АЦП AUX — 8
Стереофонические вход и выход S/PDIF
Интерфейсы управления I2C и SPI (ведущий или ведомый)
Особенности работы данного процессора:
1. Процессор работает на фиксированной частоте проекта, то есть если выставлено в проекте 48 килогерц – значит все. Переключиться в 96 гипотетически можно, но надо менять прошивку контроллером и по идее тактовый генератор тоже перенастраивать. В блоке есть модуль ASRC и входной аудио поток аудио данных можно ресемплировать в частоту DSP на лету. НО MCLK должен оставаться один, ибо он же, по сути, тактовый генератор для ДСП. Либо ставить кварц на плату и тактировать все с него.
2. На плате Чип-Дип отсутствует регулятор напряжения для удешевления, а DSP работает от 3.3 вольт. Китайские платы имеют на борту LDO стабы. Поэтому пришлось докупать RDC1-0028, Двойной DC-DC. Жрет DSP порядка ампера постоянно.
3. Информация на Русском по настройке системы в Сигмастудии оооочень скудная и если не обладать английским без словаря – то врубиться очень сложно. А настроек внутри очень много.

Процессор программируется в Сигмастудии ссылка и в ней можно сделать очень много. Рассмотрим мой проект:
Схема проекта:

1. Модуль ASRC – ресэмплинг всего входящего в 48 килогерц, на частоту работы проекта.
2. Модуль селектора входов переключается одной кнопкой на универсальном пине ввода вывода GPIO16/
3. Модуль автоэквалайзера — автоматическое выравнивание АЧХ по кривой измерения микрофоном в формате MLSSA.
4. Регулятор громкости на резисторе – вход ADC на данном пине вычисляет уровень напряжения на переменном резисторе от 0 до 3.3 вольт и производит регулировку уровня входного сигнала. В таблице модуля вводится шаг изменения и максимальный уровень.
5. Кроссовер двухполосный – здесь задаем количество полос, частоты раздела, различие в уровне полос и тип и крутизну фильтра среза.
6. Коррекция АЧХ на фильтрах для каждой полосы. Вот тут очень приятно настраивать каждую полосу по микрофону «на ходу» не записывая в флешку – просто на лету измерять, вставлять фильтр и все выравнивать. Есть модуль автоматической коррекции по файлу MLSSA. Но руками оказалось гораздо точнее все сделать. Если сильно попотеть, то можно настроить коррекцию на FIR фильтрах, которые не крутят фазу. Это видимо будет отдельная эпопея.
7. Модуль задержки для ВЧ канала. Два динамика играют одни частоты в зоне раздела. И если по фазе у них есть сдвиг, на на ФЧХ будет всплеск и на слух ничего хорошего в этой зоне совместного звучания не будет. Все по микрофону опять же выставляется и видно.
7. Направление на выход i2S.

4
Усилительные модули.
Отдельно расскажу о SSM3582A/

ссылка

SSM3582A — это полностью интегрированный, высокоэффективный стерео усилитель звука класса D с цифровым входом. Cхема модуляции Σ-Δ с расширенным спектром обеспечивает прямое подключение к динамику (без необходимости ставить дроссель для фильтрации остатков ШИМ)и обеспечивает современные аналоговые характеристики, снижая при этом EMI излучения по сравнению с другими архитектурами класса D.

Аудио передается на усилитель в цифровом виде, сводя к минимуму возможность искажения сигнала в цифровой среде. Усилитель обеспечивает выдающиеся аналоговые характеристики с отношением сигнал / шум 106 дБ и низким общим гармоническим искажением + шум (THD + N) 0,004%. При этом нет значительного ухудшения параметров с ростом частоты как у большинства усилителей Д класса с классическим шим модулятором.

Это еще не все. В микросхеме заложена возможность управлять частотой, битностью, громкостью и лимиттером по I2C. НО полноценно использовать модули в моно режиме тоже можно только в TDM. Это вполне реализуемо с использованием модулей ЧИП-ДИП usb-i2s Superprime одной перемычкой, а вот 1467 как показала практика настроить TDM сложнее.

Частота, вернее частотный диапазон усилителя выставляется перемычками. Это несколько ограничивает возможности мультиформатности, но в диапазоне 32-48 вполне реализуемо и юзабельно без перестроек.

Усилитель обладает некоторыми особенностями.

1. Внутри усилителя есть DSP и его так же можно подстраивать в сигмастудии.
Внутри есть переключатель коэффициента усиления. И по дефолту это 19дб. Ибо по дефолту все рассчитано на питание 12 вольт. И чтобы он раскрылся на максимум по мощности ему нужно на вход сделать в ADAU1467 +3 дб а не 0db как минимум. Там же можно настроить тип фильтра на выходе ЦАП.

2. При стандартном использовании, после 12 ватт на канал начинается рост искажений. Но усилитель можно переключить в моно режим и это усилит выходной каскад по току. Роста искажений при этом нет до максимума.

3. Усилитель питать можно 16 вольт. При его КПД на 8ми омную акустику 93 процента это даст ну примерно 27 ватт при условии +3дб усиления от 0 уровня или переключения процессором чипа в 21 дб усиления. Для 4омной акустики КПД около 90 процентов и в итоге получим на выходе порядка 50 ватт.

4. В моно усилитель работает не в i2s а TDM режиме, где в пачке по одним проводам ну как i2s можно цеплять несколько устройств и задавать каждому индекс. При этом задается и ширина окна ТДМ. Вот тут засада. Если с платы СуперПрайм все работало нормально, там перемычкой ставится TDM, то заставить нормально выдавать 1467 TDM на 2 и 3 выход i2s я не смог. Все вроде настраиваю как в даташите, а не АЛЕ. ЧИПовцы честно пытались помочь мне настроить 1467 в TDM, но мы так и не смогли. В итоге забил на ТДМ и выставил на два канала i2s два усилителя в моно режиме. Так оказалось проще и работает.

5. MCLK усилителям внешний c i2s не нужен. МЦЛК в данном проекте используется только для тактирования чипа ДСП.

6. Усилители в моно режиме берут сигнал исключительно левого канала если сигнал просто i2s. Поэтому я занял два канала i2s из четырех. Зачем моно.
Вот из даташита.


7. SSM3582 требует три питания. Силовое 15 вольт, аналоговое и цифровое 5 вольт. Чип Дип поставили все конденсаторы минимальные керамику. По идее надо довесить, даже по даташиту на ldo надо весить порядка 200 микрофарад а не 10. Но это решаемо в данном варианте. Хотя, я видел китайские платы ssm3582– там есть кондеры в питании.
Блеск и нищета экономии.

ссылка

Все это было реализовано в макете.

сразу извиняюсь за фотку — это рабочий макет. Я и не планировал ничего публиковать. Там видно и конденсаторы и дорогие импульсные источники Tapco 3.3 и 5 вольт для отдельного чистого питания ДСП, генератора и аналоговых цепей усилителей.

В макете добавил еще один канал на PCM5102 для экспериментов, ибо был свободный порт i2s. Провода i2S после некоторых испытаний сделал минимально короткими — не длиннее 10см. Корпус тоже ждет своего часа.
Первым усилителем Д класса, который сломал мои стереотипы был клон Ncore Юрия с Украины.
Теперь SSM добавляет теплоты в звуке))) ничего не добавляет вернее.
В рунете уже появились появились полностью цифровые усилители без классической системы ЦАП — Д выход. На ssm3582a делает свои усилители в какой то версии APPLE. Это тенденция — а значит скоро будет такой уход от аналогового АВ массово как в свое время массово соскочили с ламп на транзисторы и ушли от кинескопных ЭЛТ на LCD.

Объединение двух офисов по VPN на Mikrotik

 Arduino  Комментарии к записи Объединение двух офисов по VPN на Mikrotik отключены
Ноя 022021
 

Задача стоит “подключить два удаленных офиса между собой по VPN”.
В обоих офисах стоят маршрутизаторы Mikrotik.

Адресация офисов.

Адресация Офиса 1 (MSK), который будет у нас VPN-сервером:
WAN 88.53.44.1
LAN 192.168.10.0/24
VPN 192.168.60.1
Адресация Офиса 2(SPB), который будет VPN-клиентом:
WAN 88.53.55.2
LAN 192.168.20.0/24
VPN 192.168.60.2

Настройка VPN-server.

1. Первый маршрутизатор в офисе MSK.
Включаем VPN-Server.

/interface l2tp-server server set authentication=mschap2 enabled=yes

L2TP-Server-Enable

2. Создаем пользователя, который к нам будет подключаться.

/ppp secret add local-address=192.168.60.1 name=User password=11225555 profile=default-encryption remote-address=192.168.60.2 service=l2tp

3. Добавляем интерфейс сервера.

/interface l2tp-server add name=l2tp-in2 user=User

L2TP-Serv

L2TP-Serv2

Настройка VPN-клиента.

Второй маршрутизатор в офисе SPB, создаем клиентское подключение к головному офисе в Москве. Пользователь с именем User, пароль 1225555

/interface l2tp-client add allow=mschap2 connect-to-88.53.44.1 disabled=no name="SBP-MSK" password=1225555 user=User

L2tp-client

L2TP-client-general

L2TP-dial-out

Маршрутизация офисов.

Теперь, после создания подключений на маршрутизаторах, нам нужно прописать статически маршруты в локальные сети через VPN на Mikrotik в обоих офисах.

Начнем с первого офиса в MSK:
dst-address – указываем локальную сеть офиса в SPB, к которой будем подключаться.
gateway – шлюз через который будем подключаться к сети, ip VPN клиента.
pref. source – указываем свою локальную сеть, с которой будем выходить.

/ip route add comment="route MSK-SPB VPN" dst-address=192.168.20.0/24 gateway=192.168.60.2 pref-src=192.168.10.1

MskToSpb

Второй офис в SPB:

/ip route add comment="route SPB-MSK VPN" dst-address=192.168.10.0/24 gateway=192.168.60.1 pref-src=192.168.20.1

Route SpbtoMsk

Заключение

Таким образом мы объединили два офиса между собой позволив пользователям чувствовать себя в одной сети и использовать внутренние общие ресурсы.

Если вы не видите общие ресурсы компьютеры офисов между собой или не проходит ping – отключите на обоих машинах firewall и проверьте открытость UDP порта 1701.

Как дать шифровальщикам потопить компанию

 Arduino  Комментарии к записи Как дать шифровальщикам потопить компанию отключены
Ноя 022021
 

Блог компании Сервер Молл Системное администрирование *Антивирусная защита *IT-инфраструктура *Восстановление данных *

image alt text

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

В зависимости от мировоззрения и настроения написанное можно воспринимать как буквально, так и творчески.

Вектор атаки и защита периметра

Чаще всего шифровальщики попадают в инфраструктуру двумя путями – через электронную почту, или снаружи, через RDP. С почтой все понятно: письма «из налоговой» и «из банка» доходят до своих получателей даже через спам-фильтры (лучше их, конечно, отключить вовсе). А вот на втором способе я остановлюсь подробнее.

Для начала нужно открыть RDP наружу – так будет проще работать сотрудникам, без всяких там неудобных VPN. Если шеф требует усилить информационную безопасность, просто повесьте внешний порт RDP на другой. Сканерам это не помешает, а начальник может и успокоится.

image alt text

Брутфорс при включенном аудите неудачных попыток входа

Вирус будет пытаться попасть на ваш сервер с помощью перебора пароля. Чтобы максимально упросить ему эту задачу, проведите следующий «тюнинг»:

  • На терминальном сервере отключите блокировку учетных записей, которая срабатывает после нескольких неудачных попыток входа;
  • Если на сервере терминала работает аналог fail2ban, например, Ts_block, EvlWatcher или RdpGuard, то удалите его немедленно. Такой сервис обеспечит вам блокировку на фаерволе IP–адреса после неудачных попыток подключения. Вы же не хотите мешать взлому, верно?
  • Пароли пользователей и администраторов должны быть максимально короткими и простыми – в идеале, состоять только из цифр. Если вдруг руководство прикажет принять меры, то включите требования к сложности пароля. Это никак не помешает шифровальщику, если не ставить ограничение по длине. Без ограничений по длине пользователи будут использовать словарные пароли, ведь они удобнее сложных комбинаций и проще для подбора.

Когда RDP открыт наружу, у всех пользователей заданы простые пароли, а письма со ссылками на архивы регулярно приходят на почту, то вирус себя ждать не заставит. Следующая задача администратора – облегчить вновь прибывшему достойное кормление в инфраструктуре.

Оптимизируем инфраструктуру

Когда шифровальщик «постучится» к вам в виде письма от «прокуратуры», то система может и насторожиться. Вот пользователь скачал архив, запустил исполняемый файл, но при запуске возникает сообщение:

image alt text

Это означает, что в системе включена политика ограниченного использования программ (SRP – Software Restriction Policies). Эта технология появилась во времена Windows XP и ее принцип работы очень прост: при настроенной политике ни один из исполняемых файлов, кроме разрешенных, не будет запущен. И действительно опасными для системы останутся только эксплойты.

К счастью для шифровальщиков редкие администраторы включают эту политику. Если вашей системе «не повезло» и защита работает, то нужно изменить доменную или локальную групповую политику, поставив по умолчанию уровень безопасности «неограниченный»:

image alt text

Но руководство может обратить внимание на отключение политики. В таком случае для вируса можно открыть другую лазейку. Обычно при настройке SRP разрешается запуск исполняемых файлов из системных папок, но остается без внимания один нюанс: в системных папках есть подпапки, в которых у пользователя есть права на создание файлов. Например, путь C:\Windows\Temp:

image alt text

В параметрах безопасности разрешите создание файлов и их выполнение

Полный список занятных подпапок в системных каталогах можно получить с помощью Powershell или через утилиты вроде DumpSec.

Get–ChildItem C:\Windows\ –recurse | Get–Acl | export–csv filename.csv

Шифровальщикам, попавшим в систему через почту, это, конечно, не поможет. Но если автор вируса получил непривилегированный доступ к серверу, то он сможет закинуть в эти папки исполняемые файлы и зашифровать все, что угодно. Опытный «хозяин» шифровальщика сможет получить также и хэши паролей (особенно, если система использует NTLM), а через них вскрыть хэш перебором и открыть для себя уже привилегированный доступ. Чтобы вместо безопасного Kerberos работал NTLM, достаточно заходить на сетевые ресурсы не по имени, а по IP-адресу.

Права администратора на компьютерах тоже помогают в получении хэшей. Поэтому если пользователю понадобится доступ к специфическим приложениям, то не стоит выделять его компьютер в отдельный VLAN. Оптимально вместе с правами локального администратора сразу выдать и доменного.

Если политика ограниченного использования программ отключена, то антивирус можно оставить: все равно шифровальщика, который использует установленный архиватор, антивирус сможет поймать только по сигнатурам. При этом UAC нужно отключить.

Теперь вирус гарантированно сможет проникнуть в инфраструктуру и зашифровать полезные данные. Однако для окончательного триумфа этого недостаточно: ведь у вас останутся резервные копии, которые быстро восстановят работоспособность. Поэтому что? Правильно, корректируем настройки резервного копирования – чтобы не мешали…

Настраиваем резервное копирование

Не стоит отключать резервное копирование целиком – это вызовет массу вопросов даже у не очень подкованных сотрудников, когда вы вдруг не сможете восстановить по их просьбе удаленный файл.

Есть более изящные способы сделать так, чтобы восстановление системы после атаки шифровальщика стало невозможным:

  • Бэкапы должны быть на одном сервере: шифровальщик их зашифрует, а имеющиеся теневые копии – удалит;
  • Файлы нужно архивировать с расширением .zip или .bak. Упаси биллгейтс, будут файлы .exe или вовсе без расширения – наш «зверек» может их пропустить!
  • Нежелательно делать резервное копирование в облако или на сетевой ресурс, подключаемый по отдельному имени пользователя – так вирусу будет сложно до них добраться;
    Другой хороший вариант – настроить резервное копирование в расшаренную папку с правами «Все — полный доступ».
  • Не следует хранить бэкапы за определенный период: лучше ежедневно создавать резервные копии, затирая предыдущие. И не нужно включать для бэкапа настройки копирования по собственному протоколу в свой репозиторий;
  • Еще один момент, про который не стоит забывать – встроенное средство архивации Windows может делать резервные копии на жесткий диск, невидимый в системе. Это неудобно и вам, и шифровальщику.

Теперь после атаки шифровальщика можно грустно, но уверенно говорить, что резервных копий нет. Это победа!

image alt text

Spora ransomware удаляет теневые копии с помощью команды vssadmin.exe и отключает восстановление в загрузчике. UAC мог бы остановить это действие.

Хотя нет – вы можете сделать завершающий аккорд и стать посредником между организацией и авторами шифровальщиков. Для этого скажите начальнику, что вымогателям платить не надо, но есть компании, занимающиеся расшифровкой. После этого возьмите у него сумму, равную той, которую просят вымогатели плюс накиньте свой процент – и вуаля, к моральному удовольствию прибавилась еще и тихая денежная радость. Можно смело считать себя богом системных интриг и… лучше уволиться.

А теперь серьезно

На написание этой статьи сподвигло одиннадцатое за последние полгода обращение от организаций, пострадавших от действий шифровальщика. При расследованиях вектора атаки встречались дивные вещи вроде открытого наружу RDP для пользователя «1» с паролем «1», открытых вложений из писем «от банка», и исследователя, перепутавшего изолированный компьютер-песочницу с доменной машиной.

Обидно, что простейшая настройка SRP и закрытый чуть более серьезно периметр позволили бы избежать грустных последствий. Надеюсь, материал поможет кому-то организовать защиту предприятия более разумно или хотя бы задуматься об этом.

Как организовать защищённый доступ при помощи VPN

 Arduino  Комментарии к записи Как организовать защищённый доступ при помощи VPN отключены
Ноя 022021
 

Блог компании «Актив» Децентрализованные сети IT-инфраструктура *Сетевые технологии *

4e38179c0dff4802a7046693544d3bd0.jpeg

Кому нужен VPN?

На март 2017 г. доля вакансий о работе с удаленным доступом, размещенных на hh.ru составляла 1,5% или 13 339 вакансий. За год их число удвоилось. В 2014 г. численность удаленных сотрудников оценивалась в 600 тыс. чел или 1% от экономически-активного населения (15–69 лет). J’son & Partners Consulting прогнозирует, что к 2018 г. около 20% всех занятых россиян будут работать удаленно. Например, до конца 2017 г. Билайн планирует перевести на удаленное сотрудничество от 50% до 70% персонала.

Зачем компании переводят сотрудников на удаленку:

  • Сокращение затрат компании на аренду и содержание рабочих мест.
  • Отсутствие привязки к одной локации дает возможность собирать команду
    проекта, которую никогда нельзя было бы собрать в пределах одного города. Дополнительный плюс – возможность использования более дешевой рабочей силы.
  • Удовлетворение потребности сотрудников в связи с их семейными обстоятельствами.

Мы для себя открыли потребность в VPN более 10 лет назад. Для нас мотиватором предоставления VPN доступа сотрудникам была возможность оперативного доступа в корпоративную сеть из любой точки мира и в любое время дня и ночи.

Путь выбора идеального VPN решения

Вариантов решений достаточно много. Зачастую решение стоит принимать исходя из того, какое оборудование и софт уже используются в компании, навыком настройки какого ПО обладает системный администратор. Начну с того от чего мы отказались сразу, а затем расскажу что мы попробовали в на чем мы в итоге остановились.

VPN в роутерах

Так называемых “китайских решений” на рынке много. Практически любой роутер имеет функциональность встроенного VPN сервера. Обычно это простое вкл/выкл функционала и добавление логинов паролей для пользователей, иногда интеграция с Radius сервером. Почему мы не стали рассматривать подобное решение? Мы прежде всего думаем о своей безопасности и непрерывности работе сервиса. Подобные же железки не могут похвастаться ни надежной защитой (прошивки выходят обычно очень редко, или не выходят в принципе), да и надежность работы оставляет желать лучшего.

VPN Enterprise класса

Если посмотреть на квадрат Гартнера то на VPN рынке уже давно лидирующие позиции занимают компании, которые производят сетевое оборудование. Juniper, Cisco, Check Point: все они имеют комплексные решения решения, в составе которых есть и VPN сервис.

5118a76a28bc42ecb2e6b85f5d4116ec.png

Минусов у подобных решений, пожалуй, два. Первый и главный — высокая стоимость. Второй — скорость закрытия уязвимостей оставляет желать лучшего, а если не платить ежегодные взносы за поддержку, то обновлений безопасности ждать не стоит. Не так давно появился и третий момент — закладки, встроенные в ПО крупных сетевых вендоров.

Microsoft VPN

10 лет назад мы были компанией, ориентированной прежде всего на Windows. Microsoft предлагает бесплатное решение для тех, у кого вся инфраструктура построена на их базе. В простых случаях настройка не вызывает сложностей даже у начинающего системного администратора. В нашем случае мы хотели выжать из VPN все с точки зрения безопасности, соответственно, использование паролей было исключено. Мы естественно хотели использовать сертификаты вместо паролей и для хранения ключевой пары использовать свой продукт Рутокен ЭЦП. Для реализации проекта нам нужно было: контроллер домена, радиус сервер и правильно поднятая и настроенная инфраструктура PKI. Подробно на настройке я останавливаться не буду, в интернете есть достаточно много информации по данным вопросам, а правильная настройка PKI вообще может потянуть на десяток статей. Первым протоколом, который мы использовали у себя, был протокол PPTP. Долгое время данный вариант VPN нас устраивал, но в конечном итоге нам пришлось отказаться от него по двум причинам: PPTP работал далеко не везде и мы начинали пользоваться не только Windows, но и другими операционными системами. Поэтому мы стали искать альтернативы. Замечу, что поддержка PPTP не так давно была прекращена apple. Для начала мы решили посмотреть, что еще из протоколов может предложить на Microsoft. SSTP/L2TP. SSTP нас устраивал всем, за исключением того, что он работал только на Windows. L2TP данным недостатком не обладал, но его настройка и поддержание его в работе показались нам достаточно затратными и мы решили попробовать альтернативы. Хотелось более простого решения, как для пользователей, так и для администраторов.

OpenVPN

Мы в компании “Актив” искренне любим open source. Выбирая замену Microsoft VPN мы не могли обойти стороной решение OpenVPN. Основным плюсом для нас было то, что решение «из коробки» работает на всех платформах. Поднять сервер в простом случае достаточно просто. Сейчас, используя docker и, к примеру готовый образ, это можно сделать за несколько минут. Но нам хотелось большего. Нам хотелось добавить в проект интеграцию с Microsoft CA, для того, чтобы использовать выданные ранее сертификаты. Нам хотелось добавить поддержку используемых нами токенов. Как настраивать связку OpenVPN и токены описано к примеру вот в этой статье. Сложнее было настроить интеграцию Microsoft CA и OpenVPN, но в целом тоже вполне реализуемо. Получившимся решением мы пользовались около трех лет, но все это время продолжали искать более удобные варианты. Главной возможностью, которую мы получили, перейдя на OpenVPN, был доступ из любой ОС. Но остались еще две претензии: сотрудникам компании нужно пройти 7 кругов ада Microsoft CA для выписывания сертификата, а администраторам по-прежнему приходилось поддерживать достаточно сложную инфраструктуру VPN.

Рутокен VPN

У нас есть знание, как использовать токены в любых операционных системах, у нас есть понимание, как правильно готовить инфраструктуру PKI, мы умеем настраивать разные версии OpenVPN и мы имеем технологии, которые позволяют управлять всем этим удобным для пользователя образом из окна браузера. Так возникла идея нового продукта.

5dd18ce4b5a848a380f750aa795a8e87.jpg

Настройка Рутокен VPN

Мы действительно постарались сделать настройку простой и понятной. Вся настройка занимает всего несколько минут и реализована как мастер начальной настройки. На первом шаге нужно настроить сетевые настройки устройства, думаю комментарии здесь будут лишними.

70efa20510084a57a785c02da8827acd.JPG

На втором шаге нужно ввести название компании и подождать несколько минут, пока устройство произведет настройку встроенного центра сертификации.

65bb8dd480de4809a9d1acb38ba80c08.png

773a94ffe6a643b0a8407227860b4d93.png

Третьим шагом необходимо настроить сам VPN сервис. Указать внешний IP, на который будет происходить подключение. Выбрать тип шифрования и адресацию сети.

370a8e9073cd4ff3b7ffc4ba5bcd2264.png

Четвертым шагом настройки мы создаем локальных пользователей, или добавляем их из AD

a5e9546ead4c4ac7a355ab3e0b7ccce1.png

На этом настройку можно считать завершенной, все остальные действия может произвести сам сотрудник (хотя все может сделать и администратор).

Личный кабинет сотрудника

После того, как администратор добавил пользователей, сотрудник может воспользоваться порталом самообслуживания.

dfd8a77319de4ffbab71171abc485e76.png

В зависимости от операционной системы и браузера сотрудника, понадобится установить плагин и расширение для браузера, которые необходимы для работы с токенами.

c07098491e38485b97b9cc500ce690f7.png

После установки плагина/расширения нам остается лишь сгенерировать сертификат себе на Рутокен ЭЦП.

11fc934f578e44d6a620298f2c451b24.png

8f6a082846f04b18a6b893931b9533a5.png

И установить клиент под нужную операционную систему:

a5987431460d451aba698062fc84d961.png

Как все это работает?

Немного об аппаратной части. Изначально мы долго думали, какую “базу” использовать для нашего решения, так как нужно было соблюдать баланс между стоимостью, удобством, производительностью. После исследований, что предлагается на рынке, мы остановились на двух вариантах реализации и дальнейшего распространения решения:

  • x86 (Enterprise) – программное решение, которое предоставляется конечному потребителю в виде образа виртуальной машины, который можно развернуть в рамках своей ит-инфраструктуры.
  • Raspberry Pi – уже достаточно известный микрокомпьютер, который обладает вполне неплохой производительностью при не самой высокой стоимости и который можно начать использовать как VPN-сервер уже через 10 минут после того, как его в прямом смысле вынули из коробки.

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

Но изначально, нам все же нужно осуществить настройку сервисов, которые требуются для корректной работы продукта. Настройка сервисов осуществляется на текущий момент специалистами нашей компании в полуавтоматическом режиме. Это значит, что автоматизирован процесс деплоя программного обеспечения и первичных настроек, но инициализация данного процесса пока остается привилегией человека. Во время первичной настройки устанавливаются системные пакеты, python, django, OpenVPN, supervisor, OpenSSL и пр.

А что же дальше? Далее необходимо настроить всю инфраструктуру, которая собственно и отвечает в целом за безопасность. А именно: CA (центр сертификации), PKI (инфраструктура открытых ключей), выписать необходимые ключи и сертификаты.

Создание PKI и CA, а также формирование файла конфигурации OpenVPN-сервера, генерация ключей и выписывание сертификатов осуществляется уже после передачи продукта клиенту. Но это не значит, что для этого необходимо иметь какие-то специфические знания и прямой доступ к операционной системе. Все реализовано в бизнес-логике бэкенда системы администрирования, доступ к которой предоставляется через Web-интерфейс. От клиента требуется только ввести минимальный набор атрибутов (описано выше), после чего стартует процесс инициализации PKI и создания СА. Описывать конкретные вызовы системных команд смысла особого нет, так как уже давно все описано и разжевано до нас. Главное, что мы сделали — это автоматизировали данный процесс, избавив пользователя от необходимости обладать специфическими знаниями в администрировании.

Для работы с ключами и сертификатами мы решили не изобретать велосипед (хотя очень хотелось и до сих пор вынашиваем мысль его изобрести исходя из наших дальнейших планов развития продукта) и используем easy-rsa.

Самый долгий процесс при настройке инфраструктуры – это генерация файла Diffie-Hellman. Мы долго экспериментировали с параметрами и пришли к балансу “качество-производительность”. Хотя были мысли вообще избавиться от данного шага, нагенерировать таких файлов заранее, используя наши серверные мощности и просто “раздавать” их во время первичной инициализации. Тем более, что данные, содержащиеся в этом файле не являются приватными. Но пока мы оставили эти мысли для дальнейших “изысканий”.

Далее необходимо предоставить конечному пользователю механизм самостоятельного создания ключевых пар, формирования запросов на выписку сертификата в CA и собственно получение данного сертификата с записью на токен. А так же необходим клиент, позволяющий установить VPN-соединение с предварительной аутентификацией на токене.

Первую задачу мы решили благодаря нашему плагину который реализует функциональность электронной подписи, шифрования и двухфакторной аутентификации для Web- и SaaS-сервисов. Для того, чтобы выписать сертификат и записать его на токен, пользователь должен установить данный плагин, перейти по ссылке чтобы попасть в личный кабинет сервиса RutokenVPN, предварительно подключив токен к компьютеру (подробнее о плагине можно прочитать на нашем ресурсе )

При инициализации процесса выписывания сертификата, осуществляется запрос на токен для генерации ключевой пары а также запрос на выписку сертификата в CA. Приватный ключ записывается на токен, а запрос на выписку сертификата отправляется в СА, который в свою очередь осуществляет его выписывание и возвращает в ответе. После чего сертификат так же записывается на токен.

Почти все готово для установления VPN-соединения. Не хватает клиента, который “знает”, как работать с сервером и нашими токенами.

0f5b2f292d7f45a1a87926ef52f139bb.jpg

Наш клиент реализован на Electron. Кто не в курсе, что это за зверь, то если совсем кратко – возможность реализовать десктопное приложение, используя js, css и html. Не вдаваясь в подробности, клиент является неким “враппером” над OpenVPN-клиентом, позволяющим осуществлять его вызовы с нужными параметрами. Почему именно так? На самом деле нам было так удобней, хотя выбранное решение и накладывает определенные ограничения.

Так как мы используем токен как носитель ключевой информации, необходимой для аутентификации при установлении VPN-сессии, то нам нужно сконфигурировать OpenVPN-клиент для работы с ним. Провайдером PKCS#11 является библиотека собственной разработки для работы с нашими токенами, путь к которой и прописывается в настройках OpenVPN клиента. Подробнее о ней можно почитать здесь.

При запросе на установку VPN-соединения, запрашивается PIN-код ключа, при корректном вводе извлекается сертификат для аутентификации клиента, осуществляется хэндшейк клиента с сервером и устанавливается VPN-соединение. Знающие люди могут возразить, что не все так просто, но целью данного описания не является рассказать все тонкости работы OpenVPN, а только осветить основные моменты нашей реализации.

Немного о наших планах. Основное, над чем сейчас мы работаем — это реализация ГОСТ-шифрования. Уже пройден достаточно большой путь исследований, позволивший нам максимально приблизиться к ее реализации. В ближайшее время сможем удовлетворить интерес потенциальных клиентов в данной функциональности.

Перехватываем цифровые радиопереговоры, или куд а едут экипажи в 5 утра

 Arduino  Комментарии к записи Перехватываем цифровые радиопереговоры, или куд а едут экипажи в 5 утра отключены
Ноя 022021
 

Давным-давно, в далекой-далекой заднице мира…

Шел апрель 2020 года, ковидная пандемия набирала обороты. Мы с женой, пользуясь тем, что оба стали работать целиком и полностью удаленно, временно улетели из Санкт-Петербурга в свой родной город, чтобы быть рядом с родителями, которым была нужна помощь в эти непростые времена. Местные власти объявили «карантин», и от скуки сидения дома в один из дней мне пришла в голову мысль разобрать завалы хлама в старой квартире. В одной из коробок мне попался ноунеймовый USB DVB-тюнер на чипе RTL2832U с Алиэкспресса, который я когда-то давно заказал за 10$, и тут я призадумался. Вспомнилось, что много-много лет назад я игрался с ним, и в эфире можно было услышать много интересного. «А почему бы не поиграться еще раз?» — возникла в голове мысль, которая и положила начало этой истории.

eb2d2a661551b8d826580d8381cad80e.jpg

Железо

В качестве станции наблюдения был использован старенький ноутбук Lenovo G430, который нашелся в том же шкафу и старенький монитор ViewSonic оттуда же (на самом деле, я не перестаю удивляться, что же только можно найти в этом самом шкафу, но это уже отдельная история). Жесткий диск у машинки сдох окончательно и бесповоротно, поэтому в качестве системного носителя была использована обычная USB-флешка на 32 гигабайта, с которой его родная Windows 8.1 работала вполне себе сносно.

В качестве антенны была использована обычная телевизионная антенна, тут все банально. С одной стороны, не самая лучшая штука по тактико-техническим характеристикам и чувствительности, с другой стороны — покупается за 200 рублей в любом магазине электроники или находится бесплатно в том же шкафу, а частотный диапазон у таких антенн довольно широкий, от 80 до 800 МГц, что уже дает определенный простор для экспериментов.

Антенна и RTL-SDR-свисток с алиэкспрессаАнтенна и RTL-SDR-свисток с алиэкспресса

«Круглая часть» антенны (на фото), предназначенная, по логике, для дециметровых волн, как выяснилось после разборки антенны, была на деле чисто декоративной — к ней не было припаяно вообще никакого провода. Зато «усы» действительно работали, в том числе в дециметровом диапазоне, и регулирование их на размер, равный половине рассчитанной длины волны давало еще немного децибел в нужном диапазоне на анализаторе спектра.

RTL-SDR-свисток у меня был на старом тюнере Elonics E4000, что тоже внесло небольшой отпечаток на происходящее, но об этом позже.

Софт и начало работы

В качестве SDR-тулы был выбран SDR# (сейчас у них появилась версия для .Net Core, не знаю, совместима ли она со старыми плагинами, но ссылка на версию для .Net 4.x там тоже есть). Началось все с установки софта и базовой настройки и проверки. Установка драйверов для свистка делалась по стандартной инструкции с помощью прилагаемой утилитки Zadig и никаких проблем не вызвала.

7c9cac6755a4a45f09f773350dd7b9b1.png

Проверка работоспособности свистка (многие люди говорят, что эти свистки легко умирают из-за статических разрядов со стороны антенны) свелась к простому: что у нас вещает всегда, на известных частотах, и с хорошим уровнем сигнала? FM-радиостанции! Поэтому накрутив шкалу на нужный диапазон, я ткнул в самый сильный сигнал на спектрометре, и в течение полуминуты пришлось слушать, как какой-то мужик с хриплым голосом пел трагичную историю про некоего социально безответственного типа, которому «светила звезда Магадана». Убедившись, что все работает как надо, я отправился исследовать радиоэфир родного города.

В авиадиапазоне не нашлось ничего интересного, то ли потому что я был далековато от аэропорта, то ли просто самолетов в этот момент мимо не пролетало (глянуть на Flightradar24 я как-то не догадался). Послушав немного охранников торгового центра неподалеку, я отправился рыскать по эфиру дальше. И вот, в одном частотном диапазоне, я услышал что-то похожее на звук модема, однако характер передачи (короткими отрезками по 3-10 секунд с длинными паузами) говорил о том, что это, скорее всего, голосовая связь, только с цифровым кодированием. А значит, нужно попробовать ее декодировать, чем мы и займемся.

ce1729953897de1dac7782f312f81b57.png

Декодируем

Для декодирования цифровых форматов передачи существует программа DSDPlus. Существует она в разных инкарнациях: публичная версия 1.101, которая была выпущена в 2015 году и с тех пор не обновлялась, а ее более новые версии распространяются только среди владельцев платной подписки (10 долларов в год, 25 долларов навсегда), хотя одну из относительно свежих версий можно спокойной скачать из раздела загрузок с известного сайта радиолюбителей, правда, вопрос моральной и юридической стороны такого дела остается открытым.

DSDPlus может интегрироваться с SDR# двумя способами.

Первый способ классический: в Windows устанавливается так называемый Virtual Audio Cable, регистрирующий в системе дополнительное мультимедийное устройство для записи и воспроизведения звука и создающий «бридж» между ними. SDR# выводит звук радиоэфира на VAC, а DSDPlus с другой стороны VAC слушает звук и декодирует его.
Я тестировал два вида VAC-софта, первый c https://vb-audio.com/Cable/ и второй c https://vac.muzychenko.net/, оба работают вообще без проблем.

Второй способ: обходимся без велосипедов, SDR# будет лить поток сразу в DSDPlus на localhost через TCP.

Так вот… Публичная версия 1.101 вполне себе хорошо работает с TCP, в более новых версиях протокол поменялся, и автор DSDPlus не поделился его описанием с разработчиком SDR#-плагина, поэтому если вы используете более новую версию DSDPlus, то это получится делать только через виртуальный аудиокабель. А жаль.

Итак, если мы используем DSDPlus через аудиоустройство, то будет удобно использовать DSD Interface плагин для SDR# (инструкция есть тут). Если мы работаем через TCP, то плагин уже точно необходим, и называется он DSDTcp.
Устанавливаются плагины киданием их в папку SDR# и прописыванием DLL’ки в файл Plugins.xml. Сам DSDPlus должен лежать тоже где-нибудь неподалеку.

Плагин предоставляет интерфейс конфигурирования DSDPlus, который выглядит примерно так:

d222cd6cef058f87f28910f738d6393c.png

Первым делом задается путь до экзешника DSDPlus. Если вы работаете через виртуальный кабель, то задаются индексы (порядковые номера) аудиоустройств для входа и выхода. Вы их, скорее всего, не знаете, поэтому достаточно просто запустить DSDPlus вручную и посмотреть, что он пишет в консоль — там будет список системных аудиоустройств с их номерами, это поможет задать правильные настройки:

631549bc81741888761e3004f8b7791c.png

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

4280126e619cac27128dd7b3df24b77b.png

Не забываем обязательно нажать на «Create command line», иначе ничего не сохранится. Если DSDPlus при старте ругается на нераспознанные аргументы командной строки, то просто удаляем их. Мне помогло, ничего не сломалось 🙂

После этого запускаем DSDPlus кнопкой из плагина, и если все сделано правильно, то как только начнется передача и SDR# начнет принимать радиосигнал, в окошке DSDPlus побегут логи, а из колонок мы услышим декодированный звук:

d1a95f77eb810e2714f24c8b097bbdda.png

Казалось бы, хэппи энд? Нет, не совсем. Очень скоро я заметил, что переговоры «прыгали» по частотам. Несколько секунд на одной частоте, спустя пол минуты следущий сеанс связи — на другой, и так далее, и таких частот набирался чуть ли не десяток. Знающие люди, наверное, прочитав это, поняли, в чем дело, но я в тот момент понял, что мне нужен сканер частот.

Сканируем

И такой плагин для SDR# был. Точнее, есть два плагина. Первый — менеджер частот со сканером: вы забиваете интересующие вас частоты в список, и он поочередно перебирает их, проверяя, ведется ли передача на какой-либо. Второй — именно сканер с поиском частот, он наблюдает за широким спектром, и как только на какой-то из частот появляется сигнал выше определенного уровня на определенное время, он переключается на эту частоту, и заодно ведет статистику времени передачи по разным частотам. Именно им я и воспользовался. Ширина полосы моего RTL-SDR позволила мне встать как раз «в середину» нужного диапазона, чтобы была возможность охватить все интересующие частоты без перестройки тюнера.

Выглядит интерфейс сканера примерно так:

46d73c8c895f8d6c5149b894923c9d06.png

Кнопками вверх-вниз можно установить уровень срабатывания сканера — если сигнал на какой-то частоте выше этого уровня, сканер встанет на эту частоту. Всё что ниже заданного уровня считается шумом. Двойным кликом мыши по полоске частоты можно также занести ее в список игнорируемых.

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

9a809d10cd9287cd5d1e386281d44940.png

Запись

Я не нахожусь за компьютером круглосуточно, но было весьма интересно знать, о чем говорили в эфире в мое отсутствие. Соответственно, встал вопрос записи. Первая идея была проста: устанавливаем еще один виртуальный аудиокабель и перенаправляем вывод звука DSDPlus на какую-нибудь программу-рекордер. Правда, как оказалось, очень нелегко стабильно найти программу-рекордер, которая бы соответствовала простому набору требований: умела записывать сразу в mp3 или ogg и умела автоматически разделять запись на файлы при паузах в звуке длиннее заданного количества секунд. Хорошо подошел MP3 Recorder Studio, если бы не одно НО — он shareware, бесплатная версия ограничена записью в 30 секунд, и когда переговоры длились более 30 секунд без пауз, программа выплевывала окошко с предложением купить платную версию и запись останавливалась, было необходимо ее перезапускать вручную, что, само собой, было неприемлемо. От покупки полной версии меня остановил тот факт, что на сайте разработчика можно было купить не одну программу, а только целый пакет из кучи утилит за 60$, и тут меня, прямо скажем, задушила жаба.

А потом в голову пришло очевидное: у DSDPlus есть встроенная функция записи. Но и тут все не так уж и гладко. Публичная версия DSDPlus 1.101 имеет весьма странный баг при записи в MP3: запись как будто ведется с ускорением в 2 раза. И это не неправильная частота дискретизации, а именно ускорение: частота дискретизации для самого файла — 8000 герц, и когда в аудиоредакторе ты изменяешь скорость файла на нормальную, фактически происходит срез частот еще в два раза — речь хоть и все еще разборчива, но слушать такое очень неприятно. В непубличной версии DSDPlus этот баг исправлен.

А для пользователей публичной версии есть простой выход: записывать эфир в несжатые WAV-файлы и настроить периодический запуск .bat- или powershell-скрипта, который будет натравливать на них LAME или OGG энкодер и удалять оригиналы.

DSDPlus так же умеет разбивать запись на файлы чтобы не превышать определенную длительность, и писать в отдельный файл таймкоды о том, в какое именно время и откуда именно была произведена запись. Правда, форматом файла почему-то был выбран .srt — в таком формате, например, часто хранятся субтитры к фильмам и сериалам. Для меня это было не очень удобно, поэтому я за один вечер набросал небольшую утилику, которая конвертит эти .srt-файлы от DSDPlus в обычные CUE Sheets, группируя записи по длине пауз между ними, и в результате записанный длинный wav/mp3 файл можно легко разбить на отдельные файлы какой-нибудь программой для split’а аудио, например, mp3splt.

Утилитку можно стащить с моего Github: https://github.com/uprt/srt2cue
Писалось, как я уже сказал, за один вечер и чисто для себя, поэтому код местами кривоват, но работает. Ставьте звездочки, присылайте пулл-реквесты, ага.

А как было правильно?

На самом деле, то, на что я наткнулся — это не просто цифровая, а еще и транкинговая связь. Если говорить очень упрощенно, то в эфире кроме ряда голосовых каналов есть специальный служебный канал, и когда кто-то выходит на связь, там передается информация о том, на какой частоте производится передача. Я, по сути дела, на это забил, просто прикрутив к SDR# сканер частот, но если вы хотите узнать, как же это сделать правильно, то читайте дальше.

Для работы с транкинговой цифровой связью существует специальный софт: UniTrunker. Он как раз умеет слушать и декодировать служебный канал и понимать, на какую частоту нужно перенастроиться в конкретный момент времени. Подробный мануал можно найти вот тут.

Работать он может по-разному:

  1. У вас 2 RTL-SDR приемника, один слушает служебный канал, другой настраивается на нужную частоту для приема.
  2. И служебный, и голосовые каналы влезают в принимаемую полосу вашего приемника — тогда можно обойтись только одним RTL-SDR-свистком.

    Выход точно так же можно направить на DSDPlus, хотя я встречал упоминания, что новые версии юнитранкера умеют декодировать голос сами (но могу ошибаться).

Почему я этим не воспользовался? У меня был тюнер на старом чипе Elonics E4000, а UniTrunker умеет работать только с более новыми приемниками на базе R820T.

Впрочем, решение все равно было. Например, мне попалась на глаза схема, когда
— или запускается сразу два SDR# с двумя тюнерами, один из которых слушает служебный канал, а второй настраивается на голос;
— или когда запускается один SDR# но со специальным плагином, позволяющему ему настраиваться сразу на две частоты в пределах полосы тюнера, выводя оба сигнала на разные аудиоустройства и передавая звук с одной частоты через виртуальный аудикабель в UniTrunker, а звук с другой в DSDPlus.
В этих схемах UniTrunker должен каким-то образом сообщать SDR#, на какую именно частоту надо перенастроиться, и для этого есть специальный плагин для него. Сайт плагина давно уже умер, но хвала web.archive.org (ссылка раз, ссылка два). А сам плагин остался на github’е: https://github.com/walczakp/serial-controller. Для коммуникации между UniTrunker и SDR# разработчик почему-то выбрал виртуальный COM-порт. Я, конечно, не очень понимаю, зачем (что мешало обойтись тем же tcp-сокетом?), но, видимо, так захотелось 🙂

Что можно услышать

Вопрос, который, наверное, интересует всех: что же там можно услышать? Да много чего разного. Для меня основной интерес составили переговоры местных дорожных полицейских. Обычно там все было вполне стандартно: один стоит на горе и высматривает нарушителей, передавая номера и приметы экипажу, стоящему чуть ниже; сообщения о разных ДТП; классическое «тут реверсивное движение забыли на мосту переключить, уже два часа как светофор неправильно горит», и подобное. Правда, пару раз удалось наткнуться на погони в прямом эфире, когда очередной лихач на дорогой машине не остановился по требованию ДПС и в итоге за ним гонялись через весь город. Конец был не героический: у одной машины полицейских кончился бензин, а от другой машины нарушитель ушел по сельхозполям в пригороде. Учитывая, что он был на лендкрузере, а преследователи на чем-то легковом, то, в принципе, не удивительно.

Потом выяснилось, что очень-очень рядом на соседней частоте сидят еще другие представители органов порядка. Переговоры у них слышно нечасто, но, в принципе, бывает тоже интересно послушать. То школьники ночью разбили стекло в алкомагазине, то наркоман выламывает кому-то квартирную дверь топором, то жильцы дома устроили массовую драку из-за занятого кем-то «чьего-то» парковочного места во дворе. В общем, нормальная жизнь российского провинциального города.

Legal disclaimer

И самый главный вопрос: законно ли это? Долгое время существовал проект DPS-FM, который занимался ничем иным, как трансляцией в интернет переговоров ДПС в Петербурге. Они изучали российское законодательство и сделали простой вывод: явного запрета на прослушивание радиопереговоров, передаваемых в открытом (не шифрованном виде) в законах нет, следовательно, это разрешено. Более того, парни даже сделали запрос в Роскомнадзор о легальности такой деятельности и получили такой ответ:

e19a5e808ea223756154d782f868685d.gif

Другое дело, что на некоторых радиолюбительских форумах я встречал упоминания, что незаконно публиковать конкретные частоты, на которых вы услышали что-либо интересное. Обоснование было простое: в ряде документов силовых структур эти частоты перечислены в документах «для служебного пользования», и если вы «разгласите» эту информацию, то могут возникнуть проблемы. С одной стороны, притянуто за уши, а с другой стороны, не забывайте, что это все-таки Россия и ожидать от государства можно всего чего угодно, лучше не ходить по тонкому льду.

Ну и последний вопрос о моральной составляющей вопроса. Я считаю, что это хорошо и правильно. Переговоры изначально передаются в открытом и незашифрованном виде — если бы надо было скрыть от наблюдателей, зашифровали бы. Граждане имеют конституционное право на свободу получения и распространения информации. В конце концов, это общественный контроль над структурами, которые работают на налоги граждан и должны работать на благо граждан.

Удачных исследований радиоэфира!

Электронный редуктор или как кардинально увелич ить крутящий момент коллекторного двигателя пер еменного тока на низких оборотах. Часть 2

 Arduino  Комментарии к записи Электронный редуктор или как кардинально увелич ить крутящий момент коллекторного двигателя пер еменного тока на низких оборотах. Часть 2 отключены
Ноя 022021
 

Журнал РАДИОЛОЦМАН, ноябрь 2019

Алексей Кузьминов

Часть 1

Вебинар «Экономичные решения МЕAN WELL для надежных разработок» (30.09.2021)

Принципиальная схема устройства регулятора-стабилизатора скорости на базе микросхемы U2010B

Схема регулятора-стабилизатора скорости вращения двигателя для дрели «TUNGFULL 1806B» (Рисунок 1), как можно убедиться, не отличается особой сложностью. Здесь необходимо заметить, что нумерация резисторов и конденсаторов схемы Рисунок 1 соответствует оригинальной нумерации на схеме, приведенной в справочном листке на U2010B.

Принципиальная схема стабилизатора скорости вращения электродвигателя 260 Вт на базе микросхемы U2010B.
Рисунок 1. Принципиальная схема стабилизатора скорости вращения электродвигателя
260 Вт на базе микросхемы U2010B.

Входное переменное напряжение выбрано на 10 В больше указанного выше (140 В) и с запасом составило 150 В. Это напряжение с помощью двухконтактной сетевой вилки X7 подается на устройство с ЛАТРа. Вместо него можно использовать и обычный трансформатор со вторичной обмоткой, рассчитанной на напряжение 150 В, или работающий в режиме ЛАТРа, то есть имеющий отвод от первичной обмотки, подключенной к сетевому напряжению 220 В. Главное требование к трансформатору или ЛАТРу – максимальный ток, на который они рассчитаны, при напряжении 150 В должен быть не менее 2 А. Кроме того, пожертвовав некоторой мощностью дрели (10% – 15%), можно использовать известное стандартное напряжение 127 В, полученное с широко распространенного трансформатора 220 В/127 В.

Балластный резистор номиналом 13 кОм (R1), диод СМ4007 (VD1), работающий как однополупериодный выпрямитель, и сглаживающий конденсатор C1 служат для получения напряжения питания микросхемы U2010B (DA1). Это отрицательное напряжение (около –13 В) образуется на выводе 11 (VS) благодаря внутреннему коммутатору, соединяющему вывод 12 (High load), куда подключен анод диода VD1, с выводом 11 (VS), куда подключен минус конденсатора C1, а его плюс подключен к «земле» (GND). Номинал резистора R1 при напряжении питания 220 В по справочному листку составляет 18 кОм. Но поскольку рабочее напряжение, подаваемое на DA1, снижено до 150 В, пропорционально снижен и номинал резистора R1 – до 13 кОм. Мощность резистора R1 – 3 Вт (это проволочный резистор KNP300). При его мощности 2 Вт (рекомендуемой в справочном листке) он достаточно сильно нагревается (по ощущениям автора – до 50 °C и более), нагревая саму плату и её компоненты, а при мощности 3 Вт его температура поднимается не выше 40 °C при достаточно долговременной работе устройства. Светодиод красного свечения LD1, индицирующий перегрузку, подключен к выводам 11 и 12 DA1 с помощью двух двухконтактных разъемов X3 и X4. Разъем X3 – два цанговых штыря с расстоянием 2.54 мм между собой (PSLM-2), впаянные в плату устройства и соединенные с выводами 11 и 12 DA1. К разъему X4 – ответному X3 (два цанговых гнезда, SIP-2) – припаян один конец двухжильного провода (два провода МГТФ-0.1), второй конец которого соединен со светодиодом LD1.

Если представить себе сетевое напряжение в виде синусоиды U(t) = UMAXsin(ωt), то при ωt = 0, π и 2π эта функция пересекает 0 (строго говоря, она пересекает 0 при ωt = nπ, где n – целое). Угол φ, при котором открывается симистор VD2 (BTA24-600CW) в положительной полуволне напряжения, отсчитывается от π в сторону нуля, или, другими словами, это угол π–φ, а угол, при котором открывается симистор при отрицательной полуволне, соответственно, равен 2π–φ. Резисторы R8 и R8_1, общий номинал которых по обозначению справочного листка составляет Rφ, подключены между напряжением питания VS (вывод 11 DA1) и входом VRφ (вывод 14 DA1), управляя напряжением (VRφ) на котором с помощью изменения Rφ можно изменять начальный угол открытия симистора φ. А чем больше угол φ, тем раньше открывается симистор и тем бóльшую площадь соответствующей полусинусоиды он пропускает в нагрузку (в данном случае это мотор М). Другими словами, регулируя Rφ, можно задавать начальную скорость вращения мотора М.

Помимо Rφ на угол φ влияет конденсатор C3, подключенный к выводу Cφ (вывод 3 DA1). Этот конденсатор совместно с Rφ образует RC-цепочку RφCφ (Rφ = R8 + R8_1, Cφ = C3), постоянная времени которой и определяет угол φ. Мотор М подключается к двухконтактной сетевой розетке X1 с помощью двухжильного провода, на одном конце которого установлена двухконтактная сетевая вилка X2, а второй конец соединен с мотором М. Розетка X1 одним контактом (2-й вывод X1) подключена ко входному напряжению (~150 В), а вторым (вывод 1 X1) – к выводу А2 симистора VD2. С вывода OUT (вывод 16 DA1) через резистор R3 на УЭ симистора VD2 подаются короткие импульсы, открывающие его как раз во время, соответствующее углам π–φ и 2π–φ. Для синхронизации с сетевым напряжением, то есть для определения момента перехода сетевого напряжения через ноль (от момента которого и отсчитывается угол φ) используется резистор R2, подключенный между сетевым напряжением (~150 В) и входом VSYNC (вывод 15 DA1). Вывод симистора VD2 A1 через токоизмерительный резистор (параллельно соединенные резисторы R6 и R6_1) подключен к «земле». Напряжения с двух концов токоизмерительного резистора (R6||R6_1) через резисторы R4 и R5 подаются на два входа ISNS (выводы 1 и 2 DA1), служащих для измерения значения тока через симистор. Максимальное напряжение на входах ISNS составляет 0.25 В (по справочному листку). Если учесть, что максимальный ток через симистор составляет 1.88 А (см. выше), нетрудно подсчитать номинал токоизмерительного резистора: 0.25 В/1.88 A = 0.133 Ом. Автор использовал два резистора R6 = 0.15 Ом и R6_1 = 1 Ом, соединенные параллельно, общее сопротивление которых, как нетрудно подсчитать, составляет 0.13 Ом.

На выводе VREF (вывод 8 DA1) формируется опорное напряжение, которое используется тремя потребителями.

Первый потребитель – вход CSOFT (вывод 7 DA1), к которому подключен конденсатор C2, служащий для «мягкого старта» (Soft Start) двигателя после включения питания. Второй вывод конденсатора подключен к напряжению VREF.

Второй потребитель – вход ILOAD (вывод 6 DA1), к которому подключены резистор R11 и параллельно ему конденсатор C5, вторые выводы которых также подключены к опорному напряжению VREF. Вход ILOAD служит для настройки срабатывания защиты по току, то есть при превышении тока определенного порога (например, 1.8 А) срабатывает защита; в этом случае двигатель отключается от входного напряжения, и загорается светодиод LD1. Через некоторое время, если причина срабатывания защиты устранена, на двигатель вновь подается напряжение, и он продолжает работать с той же скоростью, с которой работал до срабатывания защиты. Условием срабатывания защиты является отсутствие подключения к выводу 9 DA1 (MODE – режим) какого-либо напряжения, то есть этот вывод должен оставаться свободным (как на Рисунке 1). Если же этот вывод подключить к VREF, то защита по току отключается, то есть двигатель после превышения тока, например, 1.8 А, продолжает работать (режим «c»).

Третий потребитель VREF – вход CTRL (вывод 4 DA1). К этому входу одновременно подключены два напряжения: первое – с вывода 5 (COMP – Compensation output), служащего для компенсации токовой нагрузки, второе – снятое с движка потенциометра P1, которое через подстроечный резистор R10 и включенный последовательно с ним резистор R10_1 также подключено к входу CTRL. Один из выводов потенциометра P1 через резистор R14 подключен к VREF, а второй, через резистор R7 – к «земле» (вывод 10 DA1). Сам потенциометр P1 расположен вне платы устройства и подключается к ней с помощью 3-штырькового цангового разъема с шагом 2.54 мм (PSLM3 – X5), впаянного в плату. К этому разъему подключается ответный разъем – 3-контактное цанговое гнездо (SIP3 – X6), которое припаяно к одному концу трехжильного провода, а второй его конец припаян непосредственно к P1. Ручка этого потенциометра выведена на лицевую поверхность корпуса устройства (см. далее), а сам потенциометр служит для задания необходимой скорости вращения дрели. Как видно из Рисунка 1, на входе CTRL складываются два напряжения: одно – с вывода COMP, второе – с движка P1 (через R10 и R10_1). Подстроечный резистор R10 служит для настройки компенсации нагрузки, о чем будет подробно рассказано далее. Здесь же, на взгляд автора, необходимо объяснить сам принцип компенсации нагрузки. Этот принцип заключается в следующем.

Выходное напряжение на выводе COMP, в соответствии со справочным листком, прямо пропорционально напряжению, снятому с двух концов токоизмерительного резистора (выводы 1 и 2 DA1) или току, проходящему через него. Но крутящий момент, как было упомянуто выше, прямо пропорционален квадрату тока, то есть увеличение крутящего момента в 2 раза (например, при торможении вала) увеличивает ток через двигатель дрели в 4 раза. Квадратичная зависимость тока от тормозного момента имеет одну особенность, проявляющуюся в том, что при малом крутящем моменте имеет место некая «слепая» зона, в которой на малых скоростях вращения, то есть при малом крутящем моменте при торможении вала ток возрастает незначительно. В этом можно легко убедиться, если, например, рассмотреть две функции: линейную y(x) = x и квадратичную z(x) = x2 на интервале 0 < x < 1. На этом интервале линейная функция y(x) всегда больше квадратичной z(x). И только при x > 1 функция z(x) > y(x). Этот факт приводит к тому, что на самых малых скоростях вал двигателя легко затормозить, поскольку ощутимого увеличения тока при этом не будет, а значит, не будет и компенсации нагрузки, или, другими словами, вал не будет сопротивляться торможению.

Теперь сравним между собой два режима работы. В первом подадим на двигатель напряжение U1 = 220 В, во втором, – например, уменьшенное до U2 = 150 В. Очевидно, что при одной и той же мощности, поданной на двигатель, или при одной и той же скорости вращения ток I150В > I220В. Поскольку мощность, передаваемая на двигатель, пропорциональна площади под полусинусоидой двух разных напряжений (220 В и 150 В), начиная от момента открытия симистора, то есть от угла π–φ до π и от 2π–φ до 2π, то при более низком напряжении (150 В) угол φ150В > φ220В. Другими словами, «слепая» зона при напряжении 150 В существенно меньше таковой при напряжении 220 В, поэтому при напряжении 150 В можно добиться меньшей скорости вращения вне «слепой» зоны.

Как видно из схемы Рисунка 1, на выводе CTRL складываются два напряжения: выходное напряжения с вывода COMP и выходное напряжение, снятое с движка потенциометра P1 с учетом падения напряжения на R10 и R10_1. A угол φ прямо пропорционален напряжению на выводе CTRL. Так вот, принцип компенсации нагрузки состоит в том, что при торможении вала двигателя напряжение на выводе COMP возрастает, а с ним и возрастает напряжение на выводе CTRL, отчего увеличивается угол φ, на двигатель подается бóльшая мощность, что приводит к существенному сопротивлению торможения и сохранению первоначальной скорости вращения, определяемой положением движка потенциометра P1. А подстроечный резистор R10 определяет превалирующее воздействие на вывод CTRL либо напряжения с вывода COMP, либо напряжения, снятого с движка потенциометра P1. При увеличении R10 влияние напряжения с вывода COMP, очевидно, увеличивается, а влияние напряжения, снятого с движка потенциометра P1, уменьшается (и наоборот). Этот принцип и положен в основу настройки схемы.

И последний момент, который нуждается в пояснении. Он связан с использованием трансформатора. Как известно, при увеличении нагрузки на трансформатор его выходное напряжение падает. В связи с этим падает и напряжение питания микросхемы VS. Однако если посмотреть на схему Рисунка 1, то можно заметить, что вывод VRφ, определяющий начальное состояние угла открытия φ симистора (или, в том числе, начальную скорость дрели), соединен с выводом питания VS (через резисторы R8 и R8_1), а не с выводом опорного напряжения VREF, которое практически не зависит от напряжения питания (на то оно и опорное). Это приводит к тому, что при уменьшении напряжения питания VS скорость дрели увеличивается (и наоборот). Таким способом реализуется одна из особенностей работы микросхемы U2010B, состоящая в компенсации изменения входного напряжения (Mains supply variation compensated). Был даже проведен простой эксперимент: уменьшив выходное напряжение ЛАТРа со 150 В до 130 В, можно было убедиться в том, что скорость дрели несколько увеличилась, а при увеличении напряжения со 130 В до 150 В – восстановилась до первоначальной. Таким образом и происходит компенсация падения выходного напряжения трансформатора.

Настройка схемы Рисунок 1 достаточно проста. В самом начале к напряжению на двигателе необходимо подключить стрелочный тестер. Движок потенциометра P1 установить на минимальную скорость вращения, то есть ближе к R14. Вывод 9 DA1 соединить с выводом 8, то есть отключить режим защиты по току (см. справочный листок, режим «c»), чтобы он не мешал настройке.

При включении напряжения питания, если двигатель не вращается совсем или вращается слабо, либо наоборот, вращается очень быстро, изменяют положение движка подстроечного резистора R8, добиваясь приемлемых минимальных оборотов (300 – 500 об/мин). После этого необходимо притормозить вал, например, рукой (лучше в перчатке, чтобы не повредить кожу). Если двигатель легко останавливается, и напряжение, измеренное тестером, не увеличивается, необходимо увеличить R10, при этом скорость вращения уменьшится, и ее необходимо восстановить до первоначального значения, изменяя R8. Если при торможении вала скорость вращения, наоборот, начинает увеличиваться, и при этом напряжение, измеренное тестером, также резко увеличивается, необходимо уменьшить значение R10, что приведет к увеличению скорости, и ее опять необходимо скорректировать, изменив значение R8. Так, путем последовательных приближений добиваются таких значений минимальной скорости, при которых вал будет существенно сопротивляться торможению, а напряжение, измеренное тестером, при торможении также будет увеличиваться (вплоть до напряжения питания при максимальном торможении). После этого необходимо проверить, не увеличивается ли скорость на средних и максимальных оборотах (до примерно 2000 об/мин) при торможении вала. При ее увеличении (перерегулирование) необходимо подкорректировать (уменьшить) номинал резистора R10 и соответственно подкорректировать R8.

Далее необходимо настроить режим срабатывания защиты по току при перегрузке. Для этого вывод 9 отключить от вывода 8, то есть оставить свободным (режим «b»), а вместо R11 подключить потенциометр (переменный резистор) номиналом 200 – 300 кОм. Затем, при существенном торможении вала вплоть до полной его остановки, подобрать номинал R11 так, чтобы при этом режиме торможения загорелся светодиод LD1, с двигателя на короткое время снялось напряжение питания, а при отпускании вала двигатель восстановил первоначальную скорость вращения. После этого, измерив значение переменного резистора R11, установить вместо него постоянный резистор. В данном случае, как видно из схемы Рисунок 1, его номинал равен 82 кОм.

Если предполагается настроить схему для работы с другим типом дрели, то настройка несколько усложняется (но ненамного), однако принцип её остается прежний. В этом случае, вместо R7, R14 и P1 необходимо установить переменные резисторы по 50 кОм, а вместо R8 – переменный резистор 500 кОм. Резистор R14 установить на минимум (0 Ом), движок P1 повернуть к R14, а R7 установить в среднее положение (25 кОм). После настройки, аналогичной вышеописанной в некотором диапазоне P1, измерить значения P1 при минимальной и максимальной скорости, разбить его на два постоянных резистора и один переменный, но уже меньшего номинала (например, 20 кОм), а, если потребуется, аналогично заменить 20 кОм на 10 кОм (как на схеме Рисунок 1).

Как видно из вышеописанного, настройка схемы не представляет каких-либо сверхъестественных сложностей. Здесь главное – не бездумно крутить все подстроечные резисторы, а использовать строгую последовательность их настройки.

И последнее, что необходимо особенно подчеркнуть, это достаточно высокое напряжение (150 В), которое присутствует на плате. При настройке следует быть очень аккуратным, чтобы ненароком не коснуться этого напряжения. Кроме того, при настройке автор настоятельно рекомендует использовать отвертку с пластиковой ручкой и керамическим шлицем, а ручка потенциометра P1 также должна быть пластиковой, то есть должна быть хорошо изолирована от металлического стержня потенциометра.

Принципиальная схема устройства регулятора-стабилизатора скорости на базе микросхемы U2008B

Как указывалось выше, микросхема U2008B – упрощенная версия U2010B, поэтому схема устройства на ее основе (Рисунок 2) более проста.

Принципиальная схема стабилизатора скорости вращения электродвигателя 480 Вт на баз микросхемы U2008B.
Рисунок 2. Принципиальная схема стабилизатора скорости вращения электродвигателя 480 Вт
на баз микросхемы U2008B.

Хотя наиболее предпочтительным рабочим напряжением для дрели «SKRAB 56000» оказалось напряжение 190 В (см. выше), было решено использовать для этой цели сетевое напряжение 220 В. Это было сделано по двум причинам. Во-первых, напряжение 220 В ненамного отличается от 190 В, в связи с чем для работы устройства не требуется трансформатор 220 В/190 В, что существенно упрощает все устройство. Во-вторых, на основе дрели «SKRAB 56000» были сконструированы циркулярная пила и точило, скорости работы которых почти на порядок больше скоростей при сверлении. Поэтому максимальная и минимальная скорости вращения дрели были выбраны в диапазоне 2000 об/мин (минимальная) и 10000 об/мин (максимальная). В связи с этим, при минимальной скорости в 2000 об/мин даже при работе от напряжения 220 В, как было выявлено из эксперимента, «слепая зона», о которой говорилось выше, отсутствует, поскольку при такой скорости вращения ток, потребляемой дрелью, довольно значителен и поэтому вполне достаточен для его «захвата» петлей компенсации нагрузки в микросхеме U2008B.

Здесь следует заметить, что минимальная и максимальная скорости вращения мини дрели «TUNGFULL 1806B» (300 – 2000 об/мин – см. выше) и мини дрели «SKRAB 56000» (2000 – 10000 об/мин) взяты «не с потолка». Эти скорости были измерены автором достаточно точным способом с помощью головки для поверки газовых счетчиков, оснащенной крыльчаткой (звездочкой), инфракрасным светодиодом и фототранзистором, между которыми она вращается. Для измерения частоты вращения был использован частотомер. Более подробно о подобном способе измерении скорости вращения написано в статье автора [2].

Для получения напряжения питания микросхемы также используется гасящий резистор R1 номиналом 22 кОм (как в справочном листке) мощностью 5 Вт (цементный резистор SQP-5), так как при его мощности в 2 Вт (по справочному листку) его нагрев (по ощущениям автора) составлял более 50-60 °C, тогда как при мощности в 5 Вт – только около 40 °C. Диод SM4007 (VD1) используется для однополупериодного выпрямления погашенного R1 напряжения, а конденсатор C1, включенный между напряжением питания –VS (вывод 5 DA1) и «землей» (вывод 4 DA1), – как сглаживающий. Это напряжение питания через подстроечный резистор R8 и последовательно включенный с ним резистор R8_1 подается на вход Rφ (вывод 6 DA1), предназначенный для начальной установки угла φ открытия симистора BTA24-600CW (VD2). Таким образом, сумма номиналов резисторов R8 и R8_1 определяет номинал Rφ: R8 + R8_1 = Rφ, который совместно с конденсатором C3 (Cφ), подключенным к выводу Cφ (вывод 2 DA1), образует RC-цепочку, RφCφ, постоянная времени которой и определяет начальный угол φ открытия симистора VD2. Резистор R2 включен между сетевым напряжением ~220 В и входом VSYNC (вывод 7 DA1) и служит для синхронизации с сетевым напряжением. Импульсы для открытия симистора VD2 поступают на его УЭ с выхода OUT (вывод 8 DA1) через резистор R3. Мотор М с помощью 2-контактной сетевой вилки X2 подключен к 2-контактной розетке X1 устройства. Как видно из схемы, мотор М оказывается включенным между сетевым напряжением ~220 В и силовым электродом A2 симистора VD2, второй силовой электрод A1 которого через токоизмерительный резистор номиналом 0.1 Ом (R6) подключен к «земле». При максимальном токе 2.5 А (см. выше) максимальное напряжение на R6, как нетрудно подсчитать, составляет 0.25 В, что согласовывается с его максимальным значением по справочному листку.

В отличие от микросхемы U2010B микросхема U2008B имеет только один вход ISNS (вывод 1 DA1), предназначенный для измерения напряжения на токоизмерительном резисторе R6. Фактически – это его потенциал относительно «земли». В микросхеме отсутствуют две опции: защита по току (поэтому в схеме не предусмотрен светодиод и вывод для него) и выход опорного напряжения (VREF), как в U2010B. Кроме того, выход напряжения компенсации нагрузки (COMP) уже соединен с входом CTRL внутри микросхемы. Этот вывод (вывод 3 DA1) так и называется Control input/compensation output. В связи с этим один конец потенциометра P1 через резистор R14 подключен к напряжению питания –VS (а не к VREF, как в U2010B), второй его конец через резистор R7 подключен к «земле», а движок – через подстроечный резистор R10 и последовательно с ним включенный резистор R10_1 – к входу CTRL. Резистор R10 также служит для настройки компенсации нагрузки. Сам потенциометр P1 расположен отдельно от платы (на корпусе – см. далее) и подключается к ней с помощью 3-жильного провода, один конец которого припаян к P1, а второй – к 3-контактному разъему X4, представляющему собой три цанговых гнезда с расстоянием между собой 2.54 мм (SIP-3). Этот разъем подключается к ответному разъему X3, расположенному на плате и представляющему собой 3 цанговых штыря (PSLM-3).

Конденсатор C4 служит для сглаживания напряжения на входе CTRL, поскольку, как уже отмечалось, для получения этого напряжения используется напряжение питания –VS, полученное одополупериодным выпрямителем и имеющее значительные пульсации. Устройство подключается к сетевому напряжению ~220 В с помощью стандартной двухконтактной вилки X5.

Настройка схемы Рисунок 2 абсолютно аналогична настройке схемы Рисунок 1, исключая настройку защиты по току, поскольку такой защиты в U2008B не предусмотрено. Обозначения всех резисторов, используемых для настройки (R8, R10, R7, R14 и P1), схемы на Рисунке 2 – те же, что и на Рисунке 1, поэтому, чтобы не повторяться, подробное описание настройки не приводится.

Здесь следует еще раз упомянуть, что на плате присутствует достаточно высокое напряжение ~220 В, поэтому при настройке автор настоятельно рекомендует использовать отвертку с пластиковой ручкой и керамическим шлицем, а ручка потенциометра P1 также должна быть пластиковой, то есть должна быть хорошо изолирована от металлического стержня потенциометра.

Материалы по теме

  1. Datasheet Atmel U2008B
  2. Datasheet Atmel U2010B
  3. Datasheet STMicroelectronics BTA24
  4. Datasheet Diotec SM4007

Окончание

Делаем свою Time Machine для Линукса

 Arduino  Комментарии к записи Делаем свою Time Machine для Линукса отключены
Ноя 022021
 

Настройка Linux *

После интенсивного пользования time machine на маках и пару ситуаций когда она реально пригодилась (были варианты когда пришлось поставить систему из бэкапов и варант когда пришлось откатывать назад после проблем), возникла мысль а собственно почему такой удобной системы нет на линуксе. После исследования вопроса и опроса знакомых линуксоидов оказалось что:
1. сделать такую систему можно просто за пару минут на коленках
2. странно, но как-то никто собственно не в курсе что это можно поднять настолько быстро.
3. наша time machine для линукса будет с маджонгом и гейшами.

Как раз был ненужный appletv первого поколения из которого было решено сделать небольшой сервер на hardeded linux для сбора логов и всяких вспомогательных целей. После установки hardened gentoo как раз и возник вопрос как его бы бэкапить чтобы весь и сразу диск — чтобы можно было при полном отказе накатить бэкап на новый диск или на полностью новый appletv (хм, если потом такой найду конечно), или выборочно востанавливать удалённые или потерянные файлы просто ссылаясь на опеределенную дату.

Как работает time machine? Довольно просто, первый слепок системы просто копируется как файлы со всеми атрибутами в Backups.backupdb/hostname/YYYY-MM-dd-hhmmss, +делается симлинк Latest указывающий на последний слепок. А уже при втором слепке происходит следующее: сравниваются даты файлов и если файл не поменялся то вместо новой копии файла делается hardlink на файл из предыдущего слепка. Тогда если нет изменений файлов то весь новый слепок будет полностью ссылаться на предыдущий. Слепки будут отличатся только новыми/модифицированными/удалёнными файлами. В результате можно просто удалить любой слепок (каталог типа YYYY-MM-dd-hhmmss) и ничего не поломается. Самая ближайшая ассоциация — умный указатель в c++ например: когда пропадает последняя ссылка на файл (из всех слепков) он и удалится с дисков.

Очень удобная система с точки зрения просмотра предыдущих файлов, их востановления, удаления старых бэкапов итд. Вплоть до восстановления всей системы из слепка.

После исследования всех известных мне систем бэкапа под линукс, они были отброшены как немного не то что нужно. Зато нашлось простейшее решение с rsync в одну строчку.

rsync имеет чудесную опцию —link-dest которая как раз и делает всю выше описанную логику по сравнению с предыдущими слепками и создания hardlink-ов. Опция -x исключит все примонтированные файловые системы как /proc /sys /dev итд. —delete будет удалять файлы которые пропадут.

Вся time machine будет одним скриптом как:

#!/bin/sh
date=`date «+%Y-%m-%d-%H%M%S»`
SRC=/
DST=/mnt/backup-hdd/Backups.backupdb/atv

rsync -ax \
—delete \
—link-dest=../Latest \
$SRC $DST/Processing-$date \
&& cd $DST \
&& mv Processing-$date $date \
&& rm -f Latest \
&& ln -s $date Latest

Копируем скрипт в /etc/cron.hourly и вуаля у нас бэкапы как в time machine.
Если наша система слетела, мы можем загрузтся со флешки, отформатировать раздел, и запустить тот же rsync в обратную сторону, потом перегрузится или сделать chroot и система опять рабочая.

Еще положим в /etc/cron.daily простой скрипт который будет удалять hourly слепки предыдущий дней оставляя только 24 за последний день, потом удалять daily слепки за предыдущие месяцы итд — как в apple time machine, только выбирайте вашу последовательность.

Хотим заливать бэкапы по сети на backup сервер? Тоже пожалуста. Делаем авто авторизацию с ssh ключиками и немого меняем скрипт:

#!/bin/sh
date=`date «+%Y-%m-%d-%H%M%S»`
SRC=/
DST=/mnt/backup-server-hdd/Backups.backupdb/atv

rsync -axz \
—delete \
—link-dest=../Latest \
$SRC backup-user@company.com:$DST/Processing-$date \
&& ssh backup-user@company.com \
«cd $DST \
&& mv Processing-$date $date \
&& rm -f Latest»
&& ln -s $date Latest»

Тестируем, 3ГБ система на appletv сравнилась с последним слепком на сервером за минут пять — сервер удалённый — не в локальной сети, соединение было около 1.5MB/s. Мы добавили «-z» для компресии. Неплохо, но если будет расти можно делать не hourly а с большим диапазоном. Надо указать что rsync по сети похоже не передаст «owner:group» файлов — так как будет пользовать пользователя backup-user@… – можно просто сделать дамп всех атрибутов файлов в текст файл и положить в бэкап.

Теперь чего нет у Мак пользователей
1. Гибкая конфигурация с cron.
2. Опция —exclude=PATTERN/—exclude-from=FILE позволяет указать куда более гибкие правила на исключение чем просто указать папки. Например я очень недоволен что time machine бэкапит у меня на маке все *.о файлы — компиляция проекта легко раскидывается на пару гигабайт obj файлов, а сами папки проектов я исключать совсем из бэкапа не хочу.
3. Легко добавить доп логику чтобы делать локи баз данных если нужно
4. Легко сделать также в дополнению к слепку еще соотв слепок только тех файлов что изменились — легко мониторить потом какие файлы были изменены. Так как hardlink-и то места это много не займёт.
5. Добавьте теперь что сами хотите, у вас всё-таки линукс в руках 😉

Update: Пожалуй добавлю список требований к системе резервного копирования который у меня был в голове когда я смотрел на доступные пакеты/системы:
1. Простота использования (rsync: всего одна команда)
2. Доступность (rsync найдёте пожалуй на любом livecd)
3. Зависимости (если у вас слетел диск, вы загрузились с livecd, то теперь надо ставить куда-то пакеты с их зависимостями?)
4. Отсутствие конфиг файлов или их минимум (или теперь сначала искать конфиг руками в бэкапе?)

Система резервного копирования Linux на лету анало г Acronis?

 Arduino  Комментарии к записи Система резервного копирования Linux на лету анало г Acronis? отключены
Ноя 022021
 

Доброго времени суток!
Подскажите есть ли для linux система резервного копирования всего диска без отключения сервера. Аналог Acronis true image и ему подобных. Чтобы после выхода из строя системного диска можно было вставить в сервер новый диск и развернутся из бекапа. так сказать делать слепки жесткого диска.

Сейчас использую rsync по крону.

#!/bin/sh date=`date "+%Y-%m-%d-%H%M%S"` SRC=/ DST=/mnt/backup-server-hdd/Backups.backupdb/atv rsync -axz \ --delete \ --link-dest=../Latest \ $SRC backup-user@company.com:$DST/Processing-$date \ && ssh backup-user@company.com \ «cd $DST \ && mv Processing-$date $date \ && rm -f Latest» && ln -s $date Latest"

Взято тут

Заранее спасибо.

UPD. как вариант рассматриваю DD
что то вроде
# dd if=/dev/sda | of=/bacup_dir/DEVICE.img».
Но есть проблемы:
1. Объем снимка равен объему HDD а на 1 ТБ HDD может быть всего 200ГБ данных.
2. Невозможно развернуть снимок на диске меньшего объема.