Окт 032022
 

Журналы радио, архив http://archive.radio.ru/
Отечественная техника ХХ века http://rw6ase.narod.ru/
Классный обзор редких советских мелкосхем http://155la3.ru
Музей релейно защиты со списком музеев http://museumrza.ru/info/poisk
Музей старых компов https://hardware-museum.livejournal.com/

Окт 032022
 

https://habr.com/ru/company/realtrac/blog/282698/

Немного про UWB..

Большинство современных радиостандартов передачи данных работают в пределах достаточно узкой полосы частот, а именно, допускают достаточно небольшие отклонения от так называемой базовой (или несущей) частоты.
Согласно теореме Шеннона-Хартли, именно ширина полосы частот определяет пропускную способность канала радиотехнической системы. Альтернативым способом увеличить емкость информационного канала может быть увеличение мощности выходного сигнала, однако, это не столь эффективно и не всегда возможно.
По причине развития информационных систем и спроса на них, проблема увеличения скорости передачи данных в радиолокационных системах становится все более актуальной, как для радиосвязи, так и для радиолокации. В последние годы это стало причиной развития технологии, использующей сверхширокополосные (СШП) сигналы — радиостандарта UWB (Ultra-Wide Band, IEEE 802.15.4a)…..

https://club.dns-shop.ru/blog/t-57-tehnologii/44262-zachem-nujna-tehnologiya-pozitsionirovaniya-uwb

Содержание

Что ты такое, UWB?ХронологияUWB — потенциальный убийца BluetoothUWB-меткаUWB против RFIDБудущее UWB

В наших руках и ушах оказывается все больше устройств, использующих соединение по воздуху: джойстики, чайники, наушники, клавиатуры, лампочки, пылесосы. Практически во всех современных гаджетах есть Bluetooth — технология, передающая данные на расстояние 10–20 метров со скоростью до 24 Мбит/с. Развитие компьютерной техники и интернета создало запрос на высокоскоростную беспроводную передачу данных. Для трансляции видео в формате HDTV нужен канал связи минимум в 19 Мбит/с. Сигнал «синего зуба» теряет стабильность пройдя через пару стенок или в 3–5 метрах от объекта. Этому миру нужен новый герой!

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

Окт 032022
 

https://www.rlocman.ru/review/article.html?di=140268

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

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

Сен 282022
 

Изначально я, как, видимо, и большинство тех, кто делает платы сам, вполне обходился без паяльной маски на своих платах и не считал ее чем-то особенно нужным. Но переход ко все более и более плотному монтажу и эксперименты с самодельной печью для пайки SMD компонентов показали, что маска штука не только красивая, но и реально необходимая. Имеющаяся информация об промышленных паяльных масках как-то не особо вдохновляла к ее использованию, поэтому когда я копаясь на ебэе обнаружил, что существует однокомпонентная паяльная маска с УФ отверждением, немедленно ее заказал. Куцая (мягко говоря) информация по применению маски слегка охлаждала энтузиазм, но первые же опыты с ней показали, что маска весьма неприхотлива и достаточно удобна в работе.

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

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

  1. Твердое гладкое основание, на котором будет экспонироваться плата. В моем случае это лист стекла.
  2. Накрывное стекло. Замены вроде крышек от коробок для компактов тут не годятся.
  3. УФ лампа для засветки. В моем случае это три «черные энергосберегайки» DeLux EBT-01, мощностью 26Вт каждая. Лампы расположены на высоте 50см от поверхности основания.

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

Исходные материалы:

  1. Собственно плата. В описании это будет вот такая панель из 9 плат:
    88152c.jpg
    Существенные моменты: плата должна иметь технологический край на котором должна оставаться фольга (достаточно иметь такие поля с двух сторон от рисунка). При изготовлении плат с помощью ФР это, как правило, получается автоматом.
    Также важно, что бы поверхность платы была чистой, причем с обратной стороны тоже. Один неудачный експеримет был связан с забытым на обратной стороне ценником на стеклотекстолит…
  2. Однокомпонентная паяльная маска (ее места обитания, и описание технологии применения есть по ссылке выше), но я на всякий случай снял и ту, что у меня:
    c28941.jpg
  3. Фотошаблон для маски. Фотошаблон должен быть негативный (то есть «окна» в маске должны быть черными, а остальная часть — прозрачной). Для тех, кто пользуется сухим пленочным фоторезистом такие шаблоны будуть «как родные», поскольку именно такие готовятся для самих плат. Фотошаблон должен быть как можно менее прозрачным на просвет. Те фотошаблоны, которыми пользуюсь я, на просвет совершенно непрозрачные.
  4. Скотч. Я пользуюсь таким:
    f91e65.jpg
    Сам по себе скотч отличный, в добавок оказалось, что у него весьма подходящая толщина — 20мкм.
  5. Кусок пленки для подложки. Для получения равномерной маски подложка должна быть равномерной по толщине и достаточно прочной. Увы, бумага не подошла, маска через нее легко проникает и после засветки весьма плохо отдирается от основы. Я пользуюсь использованными или испорченными фотошаблонами.
  6. Кусок тонкой лавсановой пленки. Изначально я пользовался кусками верхней защитной пленки от фоторезиста, которые остаются после изготовления плат, но потом приобрел у бабулек-цветочниц на рынке рулон пленки в которую заворачивают цветы.
  7. Уайт-спирит. Есть в магазинах стройтоваров.
  8. Ванночка для проявки. Я пользуюсь пластиковыми судками с крышкой. Крышка крайне желательна, если вам придется носиться с этой ванночкой, например, на балкон.

Сам процесс достаточно прост, хотя и изобилует мелкими нюансами:

  1. На основание кладем подложку и на него плату:
  2. Клеим скотч так, что бы один край был на фольге технологического поля платы, а второй — на подложке. Край на фольге следует клеить акуратно, не допуская складок и пузырей:
    caa8ea.jpg
    Существенный момент: если прижим накрывного стекла осуществляется в двух точках, то плата и скотч должны располагаться так, что бы находиться на линии прижима, при этом скотч должен располагаться перпендикулярно этой линии. Применительно к фотке выше, грузы, которыми я прижимаю стекло, расположены сверху и снизу.
    Такая ориентация в моих экспериментах давала более равномерную толщину пленки (ну и, как следствие, цвет маски).
  3. В центр платы кладем горку жидкой маски:
    3f7b89.jpg
    Маски идет не много, но жадничать тут не стоит — лишняя маска просто вытечет на подложку, а вот если ее не хватит, то придется поднимать защитную пленку и добавлять. При этом образуются воздушные пузыри, избавиться от которых не сложно, но геморно. Если уж такое произошло, то согнать пузыри на край платы можно с помощью плоского предмета с ровной гранью (я пользуюсь старой пластиковой карточкой). Основное требование — грань должна быть гладкой и не иметь острых углов.
  4. На маску кладем защитную пленку, а на нее — накрывное стекло, после чего плавно увеличиваем нажим. При этом маска постепенно растекается по поверхности платы:
    e66589.jpg
  5. Осторожно снимаем накрывное стекло и кладем фотошаблон, по возможности ровно на место, затем сверху снова кладем накрывное стекло:
    1ff0c8.jpg
  6. Еще раз прижимаем накрывное стекло окончательно выравнивая маску, после чего прижимаем стекло как для экспозиции (в моем случае это два старых транса, которые служат грузами для прижима стекла).
  7. Тщательно совмещаем фотошаблон и плату просто аккуратно двигая накрывное стекло. Тут очень полезным оказалось наличие рамки по периметну на фотошаблоне и на рисунке платы. В моем случае (я пользуюсь Eagle) это делается просто добавлением слоя Dimension в итоговые фотошаблоны маски и самой платы.
  8. Включаем УФ лампу на 60 минут. Изначально выдержка была только 40 минут, но при проявке в глубоких местах (широкие зазоры между дорожками, например) иногда маска отваливалась. Увеличение выдержки эту проблему решило. На «окна» в плате это никакого заметного влияния не оказало.
  9. Снимает прижим, стекло, фотошаблон. Берем подложку (с платой и защитной пленкой), ванночку, уайт-спирит и несем все туда, где будем проявлять (я делаю это на балконе). В ванночку наливаем уайт-спирит, затем с платы снимаем защитную пленку:
    3ba33a.jpg
    На фото видно, что окна в маске практически чистые.
  10. Снимаем плату с подложки и кладем в уайтспирит:
    fe6d58.jpg
    Крайне желательно иметь некий импровизированный мусорник под рукой, куда сразу же можно будет выбросить защитную пленку и подложку. Иначе остатки маски можно будет обнаружить в самых неожиданных местах.
  11. Даем покиснуть плате в уайт-спирите несколько (3-5) минут, после чего начинаем легонько тереть маску пальцем (в перчатке, помним?):
    ed7de8.jpg
    Цель этой процедуры вовсе не очистка окон в маске (они очистятся при промывке), а определение момента завершения проявки. Когда плата перестанет быть слегка липкой, а станет на ощупь гладкой, значит процесс завершен.
  12. Вынимаем плату из проявителя, дожидаемся пока остатки уайт-спирита стекут и несем плату на промывку. Промывка делается любым моющим средством (я пользуюсь Cif-ом) и мягкой губкой. После промывки плата выглядит уже так: 126a3e.jpg
  13. По окончании промывки плату необходимо протереть и положить под ультрафиолет еще на час.

Итог выглядит так:
0cefcd.jpg

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

Сен 282022
 

Напоминаю: РАБОТАЕМ В ПЕРЧАТКАХ!
Применительно к данному этапу ВАЖНО ПОМНИТЬ СЛЕДУЮЩЕЕ:
1. ЗАГОТОВКИ РУКАМИ КАСАТЬСЯ НЕЛЬЗЯ, ДАЖЕ В ПЕРЧАТКАХ!
2. ОТКРЫТАЯ ЕМКОСТЬ С АКТИВАТОРОМ ЯВЛЯЕТСЯ ИСТОЧНИКОМ АММИАКА! ДЕРЖИТЕ ГОЛОВУ ПОДАЛЬШЕ ОТ НЕЕ!

Приборы и инструменты:
1. Электропечь или аэрогриль. От них требуется возможность оперативно регулировать температуру. Если у вас есть термостатированная (хотя бы до +-5 градусов) печь или печь способная выдерживать температуру по заданному профилю (например, покупная/самодельная печь для пайки SMD) это даже лучше. Если такой печи нет и, в лучшем случае, имеется лишь «показометр» в виде регулятора или термометра с точностью +- пол-слона, то понадобится так же термометр способный мерять температур в диапазоне до 200 градусов. Термопара и тестер вполне подойдут.

2. Медицинский зажим (лучше длинный). Кто не в курсе, эта штука выглядит вот так:
33a835.jpg

Материалы:
1. Моющее средство с мягким абразивом.

2. Моющее средство без абразива.

Вот тот комплект моющих средств, которым я сейчас пользуюсь:
5ec258.jpg

3. Две мягких губки, одна используется с первым моющим средством, другая — со вторым. И путать их не желательно.

4. Самая мелкозернистая шкурка, какую удастся найти или абразивный брусок (твердый поролон с нанесенным абразивом) с наибольшим номером (то есть наименьшим размером зерна).

Подготовка платы к процессу активации делается так:

1. Сверлим все отверстия в заготовке, причем сразу нужного диаметра. Сверлить нужно твердосплавными сверлами и на станке (дремель со станиной для сверления вполне подходит, думаю, с аналогичной проксоновской конструкцией, равно как и с самодельными сверлильными станками проблем не будет тоже).
Если сверлить несколько заготовок сразу или под заготовку подкладывать кусок ненужного стеклотекстолита, то заготовки не будут требовать зачистки отверстий совсем, так что шаг #3 можно пропустить. Следует помнить, что «подкладку» не стоит использовать дважды, в местах, где уже есть отверстия она работать не будет и появятся заусенцы. Ну и есть заметный риск сломать сверло.

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

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

4. Тшательно промываем заготовку и проверяем чистоту отверстий. При необходимости отверстия нужно тщательно прочистить и еще раз промыть. На вид все отверстия одного диаметра должны выглядеть одинаково.

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

6. Тщательно промываем плату под струей воды. Когда моющее средство смыто с обеих сторон, еще раз проходимся струей воды по отверстиям, удерживая плату перпендикулярно струе, таким образом давая ей возможность промыть отверстия. По окончании промывки вода должна «липнуть» к заготовке, стекая с нее крайне неохотно. Если это не так, повторяем пункти #5 и #6 до получения нужного результата. На выходе этого шага заготовка выглядит примерно так:
8cee28.jpg
Самый правый ряд отверстий (увы, его плохо видно даже на полноразмерной фотке) имеет диаметр 0.3.

7. Тщательно стряхиваем воду с заготовки и начинаем обрабатывать активатором. Для этого емкость с активатором открываем и удерживая заготовку за края или за углы не торопясь опускаем ее в активатор, но ни в коем случае не касаемся дна (там есть нерастворенный гипофосфит, который может вступать в реакцию с незащищенной медью). Через 2-3 секунды так же не торопясь приподнимаем заготовку так, что бы ее поверхность оказалась чуть выше поверхности активатора. При этом вокруг отверстий слой активатора быстро светлеет, поскольку активатора протекает в отверстия и слой тановится тоньше. Необходимо убедиться, что это произошло вокруг всех отверстий. Вокруг совсем мелких отверстий, типа 0.2-0.3-0.4, это происходит с некоторой задержкой, все-таки жидкости требуется некоторое время, что бы протечь через такое маленькое отверстие. Если этого не произошло, так же плавно опускаем заготовку в активатор на 2-3 секунды и так же плавно приподнимаем. Таких повторов имеет смысл делать 3-4, не больше и как только все отверстия смочились активатором, обработку следует закончить (см. следующий шаг). Если этого не произошло, то имеет место проблема с отверстиями, следует смыть активатор под струей воды и вернуться к шагу #4.

8. Как только все отверстия смочены активатором, поднимаем заготовку над активатором и поворачиваем одним углом вниз и даем возможность излишкам активатора стечь обратно в емкость. Касаясь углом заготовки стенки емкости с активатором (обеими сторонами) снимаем излишки жидкости. Особо усердствовать тут не надо, достаточно будет если активатор не будет капать сам с горизонтально расположенной заготовки. Отверстия продувать тоже не нужно. Если в каком-то из отверстий пленка активатора лопнула, ничего страшного, но самому что-либо делать для очистки отверстий не нужно.

9. Как только излишки активатора стекли в емкость, закрываем емкость с активатором, а заготовку наклоняем под разными углами, стараясь дать возможность активатору растечься как можно равномернее. В процессе заготовка потихоньку подсыхает и активатор перетекает все менее охотно. Как только активатор более-менее ровно распределен по поверхности можно переходить к термообработке. На выходе этого шага заготовка должна выглядеть примерно так:
8b975f.jpg

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

11. Включаем нагрев и доводим температуру до 125 (+-5) градусов. При этой температуре заготовку нужно выдержать не менее 10 минут, лучше 12-15. К концу этого интервала плата приобретает следующий вид:
3da868.jpg
(сорри, из-за засветки от лампы аэрогриля сделать снимок получше не удается, а когда лампа гаснет, то тоже слишком темно, что бы увидеть цвет заготовки).

12. Доводим температуру до 175 (+-5) градусов и выдерживаем при такой температуре 5 минут, лучше 7-8.

13. По истечении времени выключаем печь и открываем крышку (но заготовку не трогаем) давая заготовке остыть. Заготовка при этом выглядит примерно так:
5dbb04.jpg
Как только ее температура опустится ниже 100 градусов, заготовку можна доставать. Для этого удобно пользоваться зажимом. Желательно не сильно усердствовать (зажимом довольно легко повредить фольгу на плате) и брать плату за самый край.

14. Слегка ополаскиваем плату в горячей, а затем в теплой воде. После этого снимаем зажим приступаем к отмывке.

15. На плату наливаем много моющего средства без абразива и мягкой губкой легонько начинаем отмывать (пока без воды). Затем переворачиваем плату и повторяем с другой стороны. Затем смываем пену полностью, ополаскиваем мочалку и снова наливаем моющее средство. Теперь мочалкой продавливаем моющее средство сквозь все отверстия, стараясь ничего не пропустить. Наконец смываем всю пену и промываем еще раз заготовку струей воды, стараясь промыть все отверстия. На выходе плата должна выглядеть примерно так:
f2d0b9.jpg
Во время отмывки усилий прикладывать не нужно, так же не нужно отмывать все до единого пятна. Что смылось, то смылось, что нет, то нет. Попытка отмыть все вероятнее всего приведет к обрыву электрического контакта с медью в отверстиях и к браку. На простоту отмывки и качество заготовки на выходе напрямую влияет равномерность исходного слоя активатора. Применение абразивов на этом этапе также не желательно по той же причине.

Вот, собственно, и все, плата готова к гальванике.

P.S. Заготовка, на которой делались фотки, после 5 минут гальваники (3А/дм2):
d0d699.jpg
Если присмотреться, можно заметить, что отверстия в плате имеют ровный слой меди. Крошечные участки не закрытые медью в самых больших отверстиях затянутся еще за 3-4 минуты.

Update Крупным планом:
До гальваники:
6d3d5e.png
После гальваники:
5db589.png

Платы снимались еще мокрые, так что в отверстиях есть вода, она несколько мешает разглядеть подробности.

Сен 272022
 

Металлизация отверстий в картинках (часть І, приготовление активатора)

Технологии
750x170.png

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

Вторая часть описания процесса

Итак.

Небольшой экскурс в теорию, историю и воздание должного людям, которые сделали этот метод доступным для любителей.
В основе этого метода лежит способность некоторых соединений меди разлагаться под действием тепла с выделением металлической меди. Этот метод появился в результате работ над беспалладиевыми технологиями металлизации начатых еще во времена бывшего СССР. После развала СССР работа не была остановлена и в начале 90-х группа химиков из Новосибирского Института химии твердого тела и механохимии возглавляемая Олегом Ивановичем Ломовским получила последний патент на эту технологию. Собственно говоря, тот метод, описание которого приведено ниже, это только адаптация технологии описанной в патенте.
Еще один человек, которому надо воздать должное — пользователь JIN с форума vrtp.ru. Именно он сделал доступным для широких масс чайников в химии, вроде меня, доступный способ получения базового раствора для активатора.
Ну а теперь, когда все нужные реверансы сделаны, перейду к, собственно, технологии.

ВНИМАНИЕ! ВСЕ РАБОТЫ ПО ПРИГОТОВЛЕНИЮ РАСТВОРА И ОБРАБОТКЕ ПЛАТЫ ВЫПОЛНЯЮТСЯ В ПЕРЧАТКАХ!
В процессе обработки в активаторе поверхности платы касаться категорически не рекомендуется, даже если руки в перчатках. Это уже забота о результате, а не о руках.
В составе активатора нет сильно ядовитых веществ, но, все же, он содержит соединения меди, большинство из которых, как минимум, не полезны для здоровья. Аммиак тоже на пользу здоровью не пойдет, так что активатор следует хранить в закрытой посуде, в месте недоступном для детей и домашних животных.

Для работы понадобятся следующие реактивы и приборы:

Реактивы:
1. Сульфат меди (ІІ) (он же медный купорос)
Нужен именно реактив, Ч (чистый) или ЧДА (чистый для анализа). Можно, конечно и ХЧ (химически чистый) или ОСЧ (особо чистый), но мне такой не попадался. Купорос, который продается в магазинах сад-огород может содержать неизвестное количество примесей.
2. Фосфорноватистокислый кальций (он же гипофосфит кальция, он же фосфинат кальция).
Тоже Ч или ЧДА (и, конечно же, ХЧ или ОСЧ).
3. Дистиллированная вода. Вполне подойдет та, что продается в автомагазинах.
4. Аммиачная вода 25% (она же нашатырный спирт, она же гидрат аммиака, она же гидроксид аммония).
Аптечный нашатырный спирт тоже подойдет, но его придется лить больше и скорректировать количество воды (сколько именно — я не считал, но, полагаю, с этой задачей из школьного курса химии справятся все).
5. Жидкое мыло. Подойдет любое, но по возможности стоит брать то, в котором поменьше всяких добавок (оно, обычно, еще и дешевле). Так же стоит отдавать предпочтение мылу с нейтральным pH, такое мыло, обычно усиленно подчеркивает этот факт на упаковке.

Инструменты и материалы:
1. Бытовые весы с разрешением хотя бы в 1 грамм (точнее, на самом деле и не нужно).
2. Две емкости в которых готовится раствор, стеклянные или пластиковые. Емкость первой где-то от литра и больше. Емкость второй — около полулитра.
3. Пластиковый судок с плотно закрывающейся крышкой. Это будет рабочая емкость в которой активатор хранится и в которой же обрабатываются платы.
4. Большая воронка для переливания жидкости, лучше пластиковая.
5. Несколько влажных салфеток для рук (если есть старые высохшие — это даже лучше). Крайне желательно подобрать такие, которые без каких-либо добавок. Салфетки перед использованием надо положить в теплое место и просушить. Эти салфетки будут использоваться для фильтрации. Поскольку осадка много, обычные бумажные салфетки не выдерживают. К тому же они впитывают слишком много жидкости и таким образом влияют на состав, что не желательно.
6. Большой шприц на 20 или (лучше) на 60мл.

ВНИМАНИЕ! Заключительные этапы приготовления раствора (начиная с шага 7) лучше проводить на открытом воздухе или под вытяжкой. Все-таки, аммиак изрядно вонюч. Приготовленный раствор воняет значительно меньше и им вполне можно пользоваться в помещении.

Раствор готовится так:
(Для тех, кто смотрел другие рецепты, уточню, что рецепт «удвоенный» по количеству компонентов, «одинарного» маловато для удобной работы.)

1. Наливаем 140мл дистиллированой воды в первую емкость:
be5334.jpg
Для ускорения следующего шага воду желательно подогреть в микроволновке градусов до 35-40.
2. Насыпаем 30грамм купороса:
0bc3ec.jpg
Затем тщательно перемешиваем до полного растворения в воде. Когда весь купорос растворится, получаем вот такую жидкость голубого цвета:
587257.jpg
3. Насыпаем 22грамма гипофосфита кальция:
913584.jpg
И мешаем получившуюся смесь несколько минут. Раствор быстро становится белесым, это выделяется сульфат кальция (гипс), который не растворим в воде:
33048e.jpg
4. Во вторую емкость ставим воронку, в воронку кладем салфетки:
1171bf.jpg
5. Акуратно сливаем жидкость из первой емкости в воронку. При этом нужно периодически взбалтывать осадок, что бы он не остался в первой емкости. Когда фильтрация закончена получаем вот такую картину:
f73075.jpg
6. Через осадок проливаем 100мл воды. При этом осадок становится немного белее. Дожидаемся пока вся жидкость стечет, снимаем лейку и получаем раствор гипофосфита меди в воде:
078f81.jpg
7. В раствор добавляем с помощью шприца 40мл аммиачной воды в раствор. Если шприц большой, то это можно сделать за один раз, с 20-кой прийдется сделать два захода. Выдавливать аммиачную воду в раствор удобнее всего опустив кончик шприца прямо в раствор, это позволяет избежать разбрызгивания. Если нужно делать два захода, то между заходами кончик шприца следует ополоснуть в дистиллированой воде. Раствор мгновенно густеет и в нем появляются белые хлопья:
2dd9c6.jpg
Медленно помешиваем раствор до полного исчезновения хлопьев и превращения раствора в однородную жидкость темно-синего цвета:
e349e4.jpg
Этот раствор уже воняет значительно меньше и продолжить процесс можно в помещении, при необходимости.
8. Добавляем в раствор 5-6мл жидкого мыла:
1cfa4a.jpg
9. Добавляем в раствор 8-10 грамм гипофосфита кальция:
b604c2.jpg
Еще раз тщательно перемешиваем. Гипофосфит не растворяется полностью, но нерастворившийся осадок тоже нужен, он будет поддерживать концентрацию ионов гипофосфита в растворе по мере использования. Продолжая помешивать переливаем раствор в рабочую емкость. При этом нужно следить, что бы осадок полностью перелился вместе с остальным раствором. Активатор готов.

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

В следующей части я опишу собственно процесс металлизации.

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.