Увеличение количества входов/выходов микроконтроллеров esp8266/esp32/arduino

Быстрота — залог успеха

Primare I32 работает в классе D, и данный факт я бы отметил особо. С момента основания компании и до второй половины нулевых, то есть более 20 лет, усилители Primare базировались на АВ-классе, привычном и понятном аудиофилам со стажем. Технологии, с которых все начиналось, довели до высокой степени совершенства, и у Primare набралось немало поклонников. С приходом новых трендов перед компанией встал выбор: продолжать целенаправленно работать на уже сформировавшуюся аудиторию аудиофилов старой школы, оттачивая свою наиболее успешную технологию, или набраться смелости и предложить покупателям нечто принципиально новое. Primare пошла по второму пути, что означало неизбежную потерю самой консервативной части поклонников, но обещало и появление новых.

Не будь внутри модуля ММ30, ни чем бы не отличался от моделей прошлых лет

По словам инженеров Primare, именно десятилетия работы с усилителями других классов привели их к выводу, что настоящий High End можно сделать только в классе D. Но такого рода мысли они озвучивали, говоря о потенциале технологии, а не текущем исполнении. Поэтому компания одной из первых начала разрабатывать D-класса и High-End-уровня. Проблему повышения качества им пришлось решать самостоятельно.

Фирменный получил название UFPD (Ultra Fast Power Device), что переводится как «сверхбыстрый источник энергии». Этот усилитель работает в традиционной для Primare балансной схемотехнике, обладает очень быстрой реакцией и способен одномоментно отдавать высокие токи, не создавая при этом искажений и шумов. Одним словом, в плане характеристик это буквально эталонный усилитель. Во всяком случае, на это нам намекает описание технологии.

Внутри нет огромного тороидального трансформатора и десятков конденсаторов, однако мощности и энергичности усилителю не занимать

Инженеры Primare решили использовать импульсный блок питания. Но в силу того, что усилители D-класса очень требовательны к питанию, компания переосмыслила этот компонент. Фирменный блок питания PFC (Power Factor Control) выступает в роли своеобразного буфера. Он обеспечивает чистую энергию с большим запасом для самого усилителя и при этом минимизирует просадки напряжения в сети при пиковых нагрузках. Таким образом, остальные компоненты, включенные в ту же электрическую сеть, не будут страдать, даже когда музыка звучит на высокой громкости. Кроме того, сам и блок питания отличаются высокой энергоэффективностью, а значит, и устройство в целом потребляет минимально возможное количество энергии. В экономной и ориентированной на экологию Европе и Скандинавии этот факт учитывается покупателем.

Как воспроизводить музыку из внутренней памяти ESP32

Во втором примере мы хотим воспроизводить музыку через динамик. Звуковые данные хранятся в виде массива во внутренней RAM ESP32. Мы используем плату аудиоразъема MAX98357 I2S для преобразования цифрового сигнала в аналоговый. Поэтому мы используем протокол I2S для вывода цифровых звуковых данных без потери качества.

На следующем рисунке показана проводка между ESP32 NodeMCU, коммутационной платой MAX98357 I2S и динамиком.

Для кода Arduino мы используем библиотеку ESP8266Audio от Earle F. Philhower. Чтобы включить эту библиотеку в ваш Arduino, выполните 4 шага:

  1. Загрузите папку github в виде zip-файла
  2. разархивируйте загруженную папку
  3. переименуйте распакованную папку в ESP8266Audio
  4. скопируйте папку в путь к вашей библиотеке IDE Arduino (в моем случае: C:\Users\chris\Documents\Arduino\libraries)

Мы используем следующий код Arduino из примеров библиотеки для воспроизведения музыки из внутренней памяти.

#include "AudioGeneratorAAC.h"
#include "AudioOutputI2S.h"
#include "AudioFileSourcePROGMEM.h"
#include "sampleaac.h"

AudioFileSourcePROGMEM *in;
AudioGeneratorAAC *aac;
AudioOutputI2S *out;

void setup() {
  Serial.begin(115200);

  in = new AudioFileSourcePROGMEM(sampleaac, sizeof(sampleaac));
  aac = new AudioGeneratorAAC();
  out = new AudioOutputI2S();
  out -> SetGain(0.125);
  out -> SetPinout(26, 25, 22);
  aac->begin(in, out);
}

void loop() {
  if (aac->isRunning()) {
    aac->loop();
  } else {
    aac -> stop();
    Serial.printf("Sound Generator\n");
    delay(1000);
  }
}

В первых строках мы добавляем следующие заголовочные файлы из библиотеки ESP8266Audio:

  • AudioGeneratorAAC: генератор аудиовыхода с использованием декодера Helix AAC.
  • AudioOutputI2S: базовый класс для интерфейсного порта I2S
  • AudioFileSourcePROGMEM: сохранить «файл» как массив PROGMEM и использовать его как данные источника звука.
  • sampleaac: заголовочный файл, в котором аудиофайл хранится в виде массива

Цифровые звуковые данные хранятся в заголовочном файле sampleaac

Чтобы загрузить код Arduino с файлом заголовка в EPS32, важно, чтобы Arduino (файл .ino) и заголовок (файл .h) находились в одной папке

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

В функции настройки мы устанавливаем скорость передачи 115200 бод и инициализируем файлы заголовков. Для AudioFileSourcePROGMEM мы определяем, что образец аудиофайла находится в файле sampleaac с размером содержащего его массива.

Объект AudioOutputI2S имеет разные функции. Мы используем функцию SetGain, чтобы уменьшить громкость динамика, и определяем распиновку с помощью функции SetPinout. В моем случае я выбираю следующую распиновку по умолчанию:

  • Последовательные часы (SCK) = 26
  • Выбор слова (WS) = 25
  • Последовательные данные (SD) = 22

Но не стесняйтесь выбирать другие цифровые выводы микроконтроллера EPS32.

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

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

3-проводное соединение I2S

Протокол I2S использует для связи три провода.

Последовательные часы (SCK), также называемые линией битовых часов (BCLK), используются для получения всех компонентов в одном цикле. Частота тактовых импульсов последовательного интерфейса определяется следующим образом:

Частота = Частота дискретизации * Количество бит на канал * Количество каналов.

Для моего WAVE-файла, который я использую в этом руководстве, мы уже знаем следующие переменные:

  • Частота дискретизации: 44,1 кГц
  • Бит на канал: 16
  • Количество каналов: 2

Следовательно, тактовая частота последовательного интерфейса составляет 44,1 кГц * 16 * 2 = 1,411 МГц.

Вторая линия протокола связи I2S — это провод выбора слова (Word Select — WS) или выбора кадра (Frame Select — FS), который различает левый или правый канал.

  • Если WS = 0 → используется канал 1 (левый канал)
  • Если WS = 1 → используется канал 2 (правый канал)

Последний провод — это линия последовательных данных (Serial Data — SD), по которой полезная нагрузка передается с двумя дополнениями

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

Но что произойдет, если длина слова между передатчиком и приемником не совпадает?

  • Если WS приемника > WS передатчика → слово усекается (младшие значащие биты данных устанавливаются в 0)
  • Если WS приемника < WS передатчика → биты после LSB игнорируются

TIDA-01434

TIDA-01434 — это полнофункциональный законченный модуль аналоговых входов ПЛК (рис. 7), который удовлетворяет современным требованиям эффективности и плотности каналов при небольших габаритах печатной платы, а также обладает низким энергопотреблением и широким диапазоном рабочих температур. Конструкция данного модуля использует конвертер DC/DC в режиме Charge Pump, а переход из одноканального режима в многоканальный легко осуществляется без изменения параметров питания.

Рис. 7. Внешний вид модуля TIDA-01434

Особенности модуля:

  • Наличие изолированного источника питания и высокоточного сигма-дельта аналого-цифрового преобразователя;
  • наличие биполярного аналогового источника питания с Inverting Charge Pump;
  • отсутствие необходимости подключения дополнительных цепей обвязки;
  • отсутствие катушек индуктивности на борту, благодаря чему высота модуля составляет всего 3,5 мм;
  • возможность внешнего подключения.

Обобщенные характеристики модуля отображены в таблице 3.

Таблица 3. Характеристики модуля TIDA-01434

Параметр

Величина

Источник питания входного сигнала

Общая шина питания

Напряжение питания

3–5,5 В

Ток потребления

17 мА

Выходное напряжение

3,3 В; –2,5 В; 2,5 В

КПД

≈ 12%

Рабочая температура

–40…+124 °C

Размеры

35×35×3,65 мм

В конструкции современных модулей управления аналоговыми сигналами к АЦП, как правило, для повышения производительности добавляется LDO-регулятор. На модуле TIDA-01434 для этих целей предусмотрен специально выделенный LDO-регулятор LM27762 с высоким коэффициентом подавления нестабильности питания (PSRR). Также LM27762 осуществляет функцию формирования биполярного сигнала на АЦП.

При работе с модулем TIDA-01434 нет необходимости включения в цепь дополнительных компонентов, в частности не нужно добавлять фильтры типа RC или LC для фильтрации импульсов с источника питания; это стало возможным благодаря применению в схеме цифрового изолятора ISOW7841.

TIDA-01434 предназначен для работы в качестве одно- или много­канального аналогового входа с биполярными входными сигналами и применяется в большинстве случаев для построения решений на базе ПЛК, но не ограничивается только этим. Модуль подходит как для систем типа «канал-канал» (channel-to-channel), так и для входов с групповой изоляцией. В системе channel-to-channel каждый канал входного сигнала имеет собственную «землю» — такая топология позволяет работать с входными сигналами с большей разницей потенциалов. При использовании топологии групповой изоляции величины допустимых напряжений ограничены. В данном случае предпочтительно использовать топологию типа channel-to-channel.

Модуль TIDA-01434, помимо упомянутых ранее АЦП ADS124S08 и преобразователя LM27762 типа Charge Pump, имеет на борту линейный регулятор TPS7A87, источник опорного напряжения и тока REF6225, цифровой изолятор ISOW7841 и ISO7741, а также неинвертирующие буферы SN74AHC1G04 и SN74AHC1G125 (рис. 8).

Рис. 8. Блок-схема TIDA-01434

Для удобства отладки и оценки возможностей модуля можно использовать отладочную плату на базе контроллера MSP430FR5969 (рис. 9).

Рис. 9. Внешний вид отладочной платы MSPEXP430FR5969

RTC

Подключение внешнего кварцевого резонатора к ESP32

По одним статьям RTC в ESP32 — это не Real Time Clock, а ядро низкого энергопотребления. Однако, по другим все-же Real Time Clock, но плохого качества (+-5%), который не стоит использовать в бизнес-приложениях.

Возможно, проблема неточности встроенного RTC может быть решена добавлением внешнего кварцевого резонатора. Я нашел упоминание о схеме подключения карцевого резонатора к контактам RTC_GPIO8/RTC_GPIO9. Но непонятно как запитывать встроенный RTC от батарейки. Отдельного входа RTC VBAT нет.

В общем, не факт, что удастся сэкономить на входе. Особенно, если нужен data logger, а не только RTC. В data logger RTC уже встроен и SPI выводы на чтение/запись придется отдать :-(. Хотя в data logger RTC нередко подключается на шину I2C.

МЭМС-микрофоны

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

В 2010 году STMicroelectronics приступила к производству МЭМС-микрофонов — модель MP45DT01 имеет однобитный PDM-выход (pulse density modulation — плотностно-импульсная модуляция) и требует тактирования внешним сигналом с частотой 2,5 МГц. Характеристики устройства следующие:

  • Чувствительность -26 dBFS;
  • Отношение сигнал/шум 58 dB;
  • Точка акустической перегрузки 120dBSPL;
  • Размеры 4,72х3,76мм;
  • Средний ток потребления- 0,65мА при 1,8В
  • Возможность совместной работы пары микрофонов в стерео режиме

Наличие PDM-выхода позволяет использовать сигнал как в цифровых, так и в аналоговых схемах (пропустив его предварительно через фильтр нижних частот).

Ссылки

1. STM32F105xx/107xx Datasheet (http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00220364.pdf)

2. I2S bus specification. Philips Semiconductors, 1996.

3. Reference Manual for STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx

4. http://www.flickr.com/photos/mikelaaron/3946085257/ 

5. Vocoder demonstration using a Speex audio codec on STM32F101xx and STM32F103xx microcontrollers

6. http://www.embedinfo.com/en/list.asp?id=57 

7. MP45DT01 Datasheet. MEMS audio sensor omni-directional digital microphone, STMicroelctronics, 2010.

•••

Подключение передней панели к материнской плате

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

Прилагаю ссылки на официальные сайты:

  • Asus
  • Gigabyte
  • MSI 
  • Asrock 

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

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

Начнем

Первым делом рассмотрим модель материнской платы Gigabyte B450M DS3H с сокетом AM4 для подключения процессоров от компании AMD. Эта материнская плата достаточно популярна для недорогих сборок на Ryzen, а значит пример будет актуален.

Самым распространенным местом для размещения пинов подключения фронтальной панели является самый низ платы. Рассмотрим подключение на данной плате.

  1. USB 2.0 (на плате два разъема. Если шнур один, то подключайте в любой из них)
  2. USB 3.0
  3. Power Led
  4. HDD Led
  5. Power SW
  6. Reset SW
  7. CI (датчик вскрытия корпуса, не настолько распространен, как остальные)
  8. Speaker

Самые внимательные из вас уже могли заметить отсутствие разъема HD Audio, но не переживайте. Просто он находится в другой части платы, а именно слева.

Официальная документация говорит нам все то же самое, что я рассказал и вам.

А теперь давайте для сравнения возьмем похожую, но чуть более дешевую плату от той же компании – Gigabyte B450M S2H.

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

  1. HD Audio
  2. USB 2.0 (на плате два разъема. Если шнур один, то подключайте в любой из них)
  3. Speaker
  4. Power Led
  5. Power SW
  6. HDD Led
  7. Reset SW
  8. USB 3.0

Заметьте, что в этой модели отсутствует разъём CI (датчик вскрытия корпуса), который присутствовал в предыдущем примере. Это не большая проблема, так как он, как уже упоминалось, не слишком распространен.

В официальной документации можем увидеть вот такую схему.

Теперь вам будет куда проще ориентироваться в системной документации, когда увидели это на примере, не так ли?

Абсолютно такие же обозначения на текстолите платы и схемы в руководстве пользователя будут выглядеть практически таким же образом будь это хоть китайская плата Killsre X79 для Intel Xeon на LGA2011, хоть старая MSI N1996 K9N для AMD на AM2.

Прошлое и настоящее

Усилители Primare я не тестировал достаточно долгое время, поэтому для меня это было заочным сравнением звучания старых моделей класса АВ и новинки с усилителем класса D. Первое впечатление приятно удивило, поскольку I32 имел звуковой почерк близкий тому, что запомнился мне по моделям прошлых лет, и самое любопытное — новинка давала даже бОльшее ощущение цельности и аналоговости звука, особенно на средних частотах.

Мощная стереопара Procella Audio P8 — удачный партнер с точки зрения качества звука

Отличительной особенностью I32 можно назвать нейтральность и точность звука в сочетании с отличной перегрузочной способностью. 120 Вт на канал — это, конечно, немало, но в качестве партнеров для него были предложены большие напольники KEF серии Reference и мощная кинотеатральная Procella Audio P8. В обоих случаях отлично контролировал весь диапазон частот даже на высокой громкости и хорошо продемонстрировал характер каждой модели.

Система на базе Procella Audio P8 показалась мне более интересной для живой музыки, а KEF лучше всего показали себя на электронной. Динамические способности усилителя не вызывают сомнений ни на микро-, ни на макроуровне. Верхние частоты прозрачны и чисты, середина естественная, без излишней резкости или яркости даже на сложном контенте; бас отлично контролируемый, упругий, без гулкости и уханья, которые подчас свидетельствуют не о неверных настройках фазоинвертора, а о низком демпинг-факторе и малой мощности усилителя.

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

Обратите внимание — усилители мощности установленные в нижней части стойки, не были задействованы при прослушивании. Вся система состоит из i32 с MM30 и акустики. Из всех способов подачи контента наилучшим по качеству вариантом был USB-накопитель и сетевое подключение

Причем при условии малой загрузки Wi-Fi сети не было слышно разницы, как именно подключена сеть — проводным или беспроводным способом. Hi-Res файлы FLAC до 24бит/192кГц включительно воспроизводятся не только с флешки или сервера, но даже по Wi-Fi из памяти смартфона. DSD поток не декодируется. В роли ЦАП модуль ММ30 лучше всего работает с компьютером. Асинхронный USB-интерфейс явно превосходит возможности обычного SPDIF. Услышать разницу между различными способами цифрового подключения можно было главным образом благодаря высокой разрешающей возможности системы. Будь звук усилителя чуть проще — и все эти тонкости перестали бы быть настолько очевидными

Из всех способов подачи контента наилучшим по качеству вариантом был USB-накопитель и сетевое подключение. Причем при условии малой загрузки Wi-Fi сети не было слышно разницы, как именно подключена сеть — проводным или беспроводным способом. Hi-Res файлы FLAC до 24бит/192кГц включительно воспроизводятся не только с флешки или сервера, но даже по Wi-Fi из памяти смартфона. DSD поток не декодируется. В роли ЦАП модуль ММ30 лучше всего работает с компьютером. Асинхронный USB-интерфейс явно превосходит возможности обычного SPDIF. Услышать разницу между различными способами цифрового подключения можно было главным образом благодаря высокой разрешающей возможности системы. Будь звук усилителя чуть проще — и все эти тонкости перестали бы быть настолько очевидными.

Инструкции NORM_X и SCALE_X

Для начала рассмотрим типовой метод преобразования значения аналогового входа при помощи инструкций «NORM_X» — нормализации значения и «SCALE_X» — масштабирования.

NORM_X нормализует параметр VALUE к диапазону значений, определенному параметрами MIN и MAX. На вход параметра VALUE приходит значение с датчика. MIN — минимальное значение в диапазоне, в данном случае 0, MAX — максимальное значение, как мы помним для 4…20 мА это значение составляет 27648. На выходе мы получаем нормализованное значение, которое заносим в переменную temp_value.

Затем масштабируем полученное значение согласно диапазону измерения датчика, в нашем случае от 0 до 160 bar.

Результирующим значением выходной переменной out_value будет фактическое значение давления в bar. Таким образом мы из электрического сигнала с датчика давления получаем целочисленное значение этой переменной.

Увеличение количества цифровых GPIO входов/выходов

Плата увеличения количества GPIO портов.

Для увеличения количества цифровых входов можно воспользоваться добротной платой расширителя GPIO на 8 Входов/Выходов. Она хорошо документирована, исполнена на высоком техническом уровне. Хотя, ценник не Aliexpress-а. При изготовлении нескольких сотен устройств, себестоимость конечного устройства существенно вырастет.

Посмотрим, что есть на сей счет есть у китайских собратьев. А у них конечно-же что-то есть и недорого.

8-канальный расширитель GPIO на чипе PCF8574 с DIP переключателями для назначения I2C адреса
8-канальный расширитель GPIO на чипе PCF8574 с джамперами для назначения I2C адреса. Эту плату можно каскадировать.

Конструктивно синие модули удобно каскадировать, втыкая один в другой. Адрес устройств удобно задается либо DIP переключателями, либо джамперами. Возможно подключение внутренних pullup резисторов на +5V.

16-ти канальный расширитель GPIO на чипе PCF8575

Старший брат TI PCF8575 позволяет получить 16 GPIO портов за цену в два раза выше. Но реализация платы попроще. никаких DIP переключателей для выбора адреса I2C. Зато 16 каналов в компактном исполнении.

Аналогичный чип от компании Microchip на 16 входов для расширения количества GPIO портов, MCP23017. Есть вариант для шины I2C и более шустрый для SPI (MCP23S17). Китайские продавцы нередко указывают в описании товара чип MCP23S17, однако по фото платы видно, что чип MCP23017

Обращайте на это внимание! Аналогичный чип на 8 портов — MCP23008

MCP23017 плата увеличения GPIO для микроконтроллеров

Цена этого варианта модуля в районе 1,5 USD. Исполнение платы попроще обойдется почти в два раза дешевле. Чип позволяет обеспечить увеличение GPIO на 8+8=16. Как и чип от Texas Instruments помимо входов для подключения устройств есть два выхода прерываний на каждый блок из 8 устройств. Этот чип позволяет работать на частоте до 1,7 МГц и 10 MHz для версии под шину SPI, в отличие от чипа PCF8574 для которого верхний предел 400 кГц. Также возможно подключение внутренних pullup резисторов на +5V. Схема подключения платы к ESP8266 разобрано здесь.

SX1509 модуль для увеличения количества GPIO.

Ещё один 8+8=16-ти канальный расширитель количества GPIO с Aliexpress на чипе SX1509. Библиотека и описание от Sparkfun. Чип дороже, чем ранее представленные. По ТТХ чип очень похож на ранее рассмотренные варианты. Работает на частоте 400 кГц. Есть встроенная поддержка ШИМ (PWM) на выходах.

Чип «заточен» для работы с LED и клавиатурой. В части LED из-за наличия ШИМ позволяет управлять яркостью светодидов, выполнять затухание, моргание и пр. Есть в наличии выход INT для трансляции прерываний микроконтроллеру. Поддерживаются встроенные pull-up, pull-down резисторы на входах.

GPIO expander от Fairchild (ON Semiconductor) FXL6408UMX. Аналогично 8 портов управляемых по шине I2C. Datasheet.

Заключение

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

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

А на этой ноте закончим данную статью и попрощаемся вплоть до момента следующей публикации.

Related posts
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
The voice for you
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector