Управление электродвигателем джойстиком ардуино передатчиком 433 мгц.

Программы

Управление электродвигателем джойстиком ардуино передатчиком 433 мгц.

5 октября 2016 в 18:41

Управление шлагбаумом с помощью Arduino UNO и радиопередатчика 433 МГц

  • Программирование микроконтроллеров

Всем привет! У меня на работе есть автомобильная парковка. Конечно, цель данной статьи не хвастовство, учитывая тяжелую ситуацию на дорогах с парковочными местами, и не пиар моего руководства о том, что они заботятся о своих сотрудниках (не буду даже упоминать о месте свой работы!), дело совершено не в этом. Суть в том, что мешает любому другому человеку, не имеющему отношения к месту моей работы, припарковаться на этой парковке? А это шлагбаум, ограничивающий въезд и выезд с этой парковки.

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

Итак, ближе к делу. Прежде всего, узнал, что шлагбаум оказался довольно-таки популярной фирмы Nice и начал искать о нем информацию. Однако, несмотря на популярность фирмы производителя, информации о его форматах кодов было очень мало. Выяснилось, что существуют 12-битные и 24-битные форматы кодов. 12-битные более древние, 24-битные – посовременней. Так как я знаю, что шлагбаум на работе стоит давно, решил начать с 12-битных кодов (впоследствии угадал). И так пакет данных состоит из 12 бит. Перед 12-битным кодом идет, так называемый, «пилотный период» и «стартовый импульс». «Пилотный период» состоит из 36 интервалов низкого уровня, «стартовый импульс» состоит из 1 интервала высокого уровня. Один пакет данных состоит из «пилотного периода», за ним «стартовый импульс» и за ним 12-битный код (для каждого шлагбаума свой). Пульты шлагбаумов передают сразу по 4 пакета данных, но я поставил больше, так как очень много устройств работают на данной частоте (в частности автомобильные сигнализации) и возможны помехи. Длительности импульсов для шлагбаумов Nice:

  • Логическая «1» – 1400 мкс низкого уровня (два интервала) и 700 мкс высокого (один интервал)
  • Логический «0» – это 700 мкс низкого уровня (один интервал) и 1400 мкс высокого (один интервал)
  • «Пилотный период» – 25200 мкс (36 интервалов)
  • «Стартовый импульс» – 700 мкс (1 интервал)

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

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

Список компонентов:

1.
Arduino Uno,

2.
Радиопередатчик 433Мгц, самодельная антенна к нему,

3.
Батарейка 9 вольт, в народе «Крона».

Данные радиопередатчики в известных китайских магазинах продаются очень дешево (порядка 50 руб.), совместно с радиоприемниками. Они очень простые, три контакта: питание, земля и сигнальный контакт. Питания от 5 до 12 вольт, чем выше напряжение питания, тем лучше дальнобойность. Собственно по этой причине была выбрана 9 вольтовая батарейка. Рекомендованное напряжения питания Arduino Uno от 7 до 12 вольт (контакт Vin), так что «Крона» вполне подходит. Также дальнобойность радиопередатчика зависит от наличия антенны (без нее дальность будет около 1 метра). Весь комплект обошелся порядка 300 руб.

Вот, собственно, и сам скетч для Arduino Uno:

Int send_code_pin = 13;
//int send_code = 3061; это код определенный методом перебора для моего шлагбаума
void setup()
{
pinMode(send_code_pin, OUTPUT);
}
void loop ()
{
for (int send_code = 0; send_code 0; i–)
{
boolean bit_code = bitRead(send_code, i – 1);
if (bit_code)
{
digitalWrite(send_code_pin, LOW); // единица
delayMicroseconds(1400);
digitalWrite(send_code_pin, HIGH);
delayMicroseconds(700);
}
else
{
digitalWrite(send_code_pin, LOW); // ноль
delayMicroseconds(700);
digitalWrite(send_code_pin, HIGH);
delayMicroseconds(1400);
}
}
digitalWrite(send_code_pin, LOW); // пилотный период
delayMicroseconds(25200);
}
}
//delay(10000); после определения кода поставить задержку
}

Перебор всех возможных вариантов занял около 1 недели, с учетом одного выхода в день к шлагбауму. Методика быстрого выбора правильного кода была очень простой. С помощью команды micros()
определил время передачи одного кода. Он составил примерно 0,25 сек. Общее перебора всех вариантов около 17 мин. Перед шлагбаумом запустил Arduino и засек время. Где-то на 12,5 минуте открылся шлагбаум. Исходя из этого, я отбросил сразу первые 2800 вариантов. И так далее. Когда вариантов осталось около 30, после каждой передачи данных ставил задержку в 1 секунду. Так как контакт передачи данных я установил 13-ым (со светодиодом), было видно каждый момент передачи, подсчитал и определил точный код.

Вот и все! В качестве демо – видео вскрытия.

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

Лежат у меня разные приемники и передатчики данного диапазона, решил обобщить и классифицировать данные устройства. Тем более, что в конструировании устройств без радиоканала обойтись довольно сложно, особенно если поделка не должна находиться в стационарном положении. Кто-то возможно возразит, что сейчас довольно немало решений на wi-fi и стоит использовать их, однако, отмечу что не везде их использование целесообразно, к тому же иногда не хочется мешать себе и соседям занимая столь ценный частотный ресурс.

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


Купить можно, например, стоит $0.65 за приемник вместе с передатчиком. В моих прошлых обзорах использовался именно он.

Следующий комплект позиционируется как более качественный:


Продается за $2.48 в комплекте с антеннками пружинками для данного диапазона.

Собственно предмет обзора, продается отдельно в виде приемника:

Следующее устройство участвующее в данном мероприятии является передатчиком:


Где конкретно я его купил – не помню, впрочем, не так важно.

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


Также, я припаял выводы для вставки в макетку.

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

Для тестов я решил использовать библиотеку , ее нужно распаковать в каталог “libraries” установленной среды arduino IDE. Пишем нехитрый код передатчика, который будет стоять стационарно:
#include
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableTransmit(10);
}
void loop() {
mySwitch.send(5393, 24);
delay(5000);
}

Пин данных передатчиков будем подключать к выходу 10 arduino. Передатчик будет каждые 5 секунд посылать в эфир цифру 5393.

Код приемника немного более сложный, из-за подключения внешнего диода через ограничительный резистор к выводу 7 arduino:
#include
#define LED_PIN 7
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, 0);
mySwitch.enableReceive(0);
}
void loop() {
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
if (value == 0) {
Serial.print(“Unknown encoding”);
} else {
Serial.print(“Received “);
uint16_t rd = mySwitch.getReceivedValue();
if(rd==5393){
digitalWrite(LED_PIN, 1);
delay(1000);
digitalWrite(LED_PIN, 0);
delay(1000);
}
}
mySwitch.resetAvailable();
}
}

Приемник подключен к выводу 2 arduino Nano (в коде используется mySwitch.enableReceive(0), так как вход 2 соответствует 0-му типу прерывания). Если принята та цифра которая отправлялась, то на секунду мигнем внешним диодом.

Благодаря тому, что все передатчики имеют одинаковую распиновку, в ходе эксперимента их можно будет просто менять:


У приемников ситуация аналогична:

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

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

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


При его использовании расстояние уверенного приема сокращалось на 1-2 метра. Остальные передатчики работали абсолютно одинаково.

А вот с приемниками все оказалось сложнее. Почетное 3-е место занял приемник из этого комплекта:


Он начал терять связь уже на 6 метрах в пределах прямой видимости (на 5 метрах – при использовании аутсайдера среди передатчиков)

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


Уверненно принимал на 8-ми метрах в пределах прямой видимости, 9-ый метр осилить не удалось.

Ну и рекордсменом стал предмет обзора:


Доступный участок прямой видимости (12 метров) оказался для него легкой задачей. И я перешел к приему через стены, итог 4 капитальные бетонные стены, при расстоянии порядка 40 метров – он принимал уже на грани (шаг вперед прием, шаг назад светодиод молчит). Таким образом, предмет обзора однозначно могу рекомендовать к покупке и использованию в поделках. При его использовании можно при равных расстояниях снижать мощность передатчика, либо при равных мощностях увеличивать расстояние уверенного приема.

Согласно рекомендациям, увеличить мощность передачи (а следовательно и расстояние приема) можно повышая напряжение питания передатчика. 12 Вольт позволило увеличить исходное расстояние на 2-3 метра в пределах прямой видимости.

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


Планирую купить

+122

Добавить в избранное

Обзор понравился

+121

+225

На этом уроке мы решим задачу по передаче радиосигнала между двумя контроллерами Ардуино с помощью популярного приемопередатчика с частотой 433МГц.
На самом деле, устройство по передаче данных состоит из двух модулей: приемника и передатчика. Данные можно передавать только в одном направлении. Это важно понимать при использовании этих модулей.
Например, можно сделать дистанционное управление любым электронным устройством, будь то мобильный робот или, например, телевизор. В этом случае данные будут передаваться от пульта управления к устройству. Другой вариант — передача сигналов с беспроводных датчиков на систему сбора данных. Здесь уже маршрут меняется, теперь передатчик стоит на стороне датчика, а приемник на стороне системы сбора.
Модули могут иметь разные названия: MX-05V, XD-RF-5V, XY-FST, XY-MK-5V, и т.п., но все они имеют примерно одинаковый внешний вид и нумерацию контактов. Также, распространены две частоты радиомодулей: 433 МГц и 315 МГц.

1. Подключение

Передатчик имеет всего три вывода: Gnd, Vcc и Data.


Подключаем их к первой плате Ардуино по схеме:
Собираем оба устройства на макетной плате и приступаем к написанию программ.

2. Программа для передатчика

Для работы с радиомодулями воспользуемся библиотекой RCSwitch . Напишем программу, которая будет каждую секунду по-очереди отправлять два разных сообщения.
#include
RCSwitch mySwitch = RCSwitch();
void setup() {
mySwitch.enableTransmit(2);
}
void loop() {
mySwitch.send(B0100, 4);
delay(1000);
mySwitch.send(B1000, 4);
delay(1000);
}
Разберем программу. Первое что мы сделали — объявили объект для работы с передатчиком и назвали его mySwitch.
RCSwitch mySwitch = RCSwitch();
Затем, внутри стандартной функции setup

включили передатчик и указали вывод, к которому он подключен:
mySwitch.enableTransmit(2);
Наконец, в основном цикле программы loop отправляем сначала одно сообщение, а затем и второе с помощью функции send

:
mySwitch.send(B1000, 4);
Функция send

имеет два аргумента. Первый — это отправляемое сообщение, которое будет отправляться в эфир в виде пачки импульсов. Второй аргумент — это размер отправляемой пачки.
В нашей программе мы указали сообщения в формате двоичного числа. На это указывает английская буква «B» в начале кода B1000. В десятеричном представлении это число превратится в восьмерку. Так что мы могли вызвать функцию send

так:
mySwitch.send(8, 4);
Также send умеет принимать двоичные строки:
mySwitch.send(“1000”, 4);

3. Программа для приемника

Теперь напишем программу для приемника. Для демонстрации факта передачи мы будем зажигать светодиод, подключенный к выводу №3 на плате Ардуино. Если приемник поймал код B1000 — включим светодиод, а если B0100 — выключим.
#include
RCSwitch mySwitch = RCSwitch();
void setup() {
pinMode(3, OUTPUT);
mySwitch.enableReceive(0);
}
void loop() {
if(mySwitch.available()){
int value = mySwitch.getReceivedValue();
if(value == B1000)
digitalWrite(3, HIGH);
else if(value == B0100)
digitalWrite(3, LOW);
mySwitch.resetAvailable();
}
}
Функция available

возвращает истину, если передатчик принял хоть какие-то данные:
mySwitch.available()
Функция getReceivedValue

извлекает из потока данных одну пачку и декодирует её в число. В программе мы присваиваем полученное число переменной value

:
int value = mySwitch.getReceivedValue();

Задания

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

  1. Пульт для светильника. На стороне приемника , включенный в цепь питания светильника (осторожно, 220 Вольт!). На стороне передатчика: . Написать программы для приемника и передатчика, которые по нажатию кнопки будут включать удаленное реле. При повторном нажатии кнопки реле будет выключаться.
  2. Уличный термометр с радиоканалом. На стороне передатчика разместить . Предусмотреть автономное питание от батареек. На стороне приемника: . Написать программы для приемника и передатчика, которые позволят выводить показания температуры с удаленного датчика на дисплее.

Заключение

Итак, теперь мы знаем простой и недорогой способ передавать данные на расстоянии. К сожалению, скорость передачи и дистанция в таких радиомодулях весьма ограничены, так что мы не сможем полноценно управлять, например квадрокоптером. Однако, сделать радиопульт для управления простым бытовым прибором: светильником, вентилятором или телевизором, нам под силу.
На основе приемопередатчиков с частотой 433 МГц и 315 МГц работает большинство радиоканальных пультов управления. Имея Ардуино и приемник, мы можем декодировать сигналы управления и повторить их. Подробнее о том, как это сделать мы напишем в одном из следующих уроков!

Всем привет! У меня на работе есть автомобильная парковка. Конечно, цель данной статьи не хвастовство, учитывая тяжелую ситуацию на дорогах с парковочными местами, и не пиар моего руководства о том, что они заботятся о своих сотрудниках (не буду даже упоминать о месте свой работы!), дело совершено не в этом. Суть в том, что мешает любому другому человеку, не имеющему отношения к месту моей работы, припарковаться на этой парковке? А это шлагбаум, ограничивающий въезд и выезд с этой парковки.

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

Итак, ближе к делу. Прежде всего, узнал, что шлагбаум оказался довольно-таки популярной фирмы Nice и начал искать о нем информацию. Однако, несмотря на популярность фирмы производителя, информации о его форматах кодов было очень мало. Выяснилось, что существуют 12-битные и 24-битные форматы кодов. 12-битные более древние, 24-битные – посовременней. Так как я знаю, что шлагбаум на работе стоит давно, решил начать с 12-битных кодов (впоследствии угадал). И так пакет данных состоит из 12 бит. Перед 12-битным кодом идет, так называемый, «пилотный период» и «стартовый импульс». «Пилотный период» состоит из 36 интервалов низкого уровня, «стартовый импульс» состоит из 1 интервала высокого уровня. Один пакет данных состоит из «пилотного периода», за ним «стартовый импульс» и за ним 12-битный код (для каждого шлагбаума свой). Пульты шлагбаумов передают сразу по 4 пакета данных, но я поставил больше, так как очень много устройств работают на данной частоте (в частности автомобильные сигнализации) и возможны помехи. Длительности импульсов для шлагбаумов Nice:

  • Логическая «1» – 1400 мкс низкого уровня (два интервала) и 700 мкс высокого (один интервал)
  • Логический «0» – это 700 мкс низкого уровня (один интервал) и 1400 мкс высокого (один интервал)
  • «Пилотный период» – 25200 мкс (36 интервалов)
  • «Стартовый импульс» – 700 мкс (1 интервал)

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

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

Список компонентов:

1.
Arduino Uno,

2.
Радиопередатчик 433Мгц, самодельная антенна к нему,

3.
Батарейка 9 вольт, в народе «Крона».

Данные радиопередатчики в известных китайских магазинах продаются очень дешево (порядка 50 руб.), совместно с радиоприемниками. Они очень простые, три контакта: питание, земля и сигнальный контакт. Питания от 5 до 12 вольт, чем выше напряжение питания, тем лучше дальнобойность. Собственно по этой причине была выбрана 9 вольтовая батарейка. Рекомендованное напряжения питания Arduino Uno от 7 до 12 вольт (контакт Vin), так что «Крона» вполне подходит. Также дальнобойность радиопередатчика зависит от наличия антенны (без нее дальность будет около 1 метра). Весь комплект обошелся порядка 300 руб.

Вот, собственно, и сам скетч для Arduino Uno:

Int send_code_pin = 13;
//int send_code = 3061; это код определенный методом перебора для моего шлагбаума
void setup()
{
pinMode(send_code_pin, OUTPUT);
}
void loop ()
{
for (int send_code = 0; send_code 0; i–)
{
boolean bit_code = bitRead(send_code, i – 1);
if (bit_code)
{
digitalWrite(send_code_pin, LOW); // единица
delayMicroseconds(1400);
digitalWrite(send_code_pin, HIGH);
delayMicroseconds(700);
}
else
{
digitalWrite(send_code_pin, LOW); // ноль
delayMicroseconds(700);
digitalWrite(send_code_pin, HIGH);
delayMicroseconds(1400);
}
}
digitalWrite(send_code_pin, LOW); // пилотный период
delayMicroseconds(25200);
}
}
//delay(10000); после определения кода поставить задержку
}

Перебор всех возможных вариантов занял около 1 недели, с учетом одного выхода в день к шлагбауму. Методика быстрого выбора правильного кода была очень простой. С помощью команды micros()
определил время передачи одного кода. Он составил примерно 0,25 сек. Общее перебора всех вариантов около 17 мин. Перед шлагбаумом запустил Arduino и засек время. Где-то на 12,5 минуте открылся шлагбаум. Исходя из этого, я отбросил сразу первые 2800 вариантов. И так далее. Когда вариантов осталось около 30, после каждой передачи данных ставил задержку в 1 секунду. Так как контакт передачи данных я установил 13-ым (со светодиодом), было видно каждый момент передачи, подсчитал и определил точный код.

Вот и все! В качестве демо – видео вскрытия.

Приемник XD-RF-5V и передатчик FS1000A/XD-FST для радио частоты 433 МГц используется для передачи данных между двумя устройствами. Очень часто применяются для связи нескольких Arduino устройств.

Характеристики XD-RF-5V

Рабочее напряжение: 3V ~ 12V
Рабочий ток: 20 мА ~ 28mA
Резервное течение: 0mA
Рабочая частота: 433MHz
Расстояние передатчика: >500 м (чувствительность может быть выше-103dBm если в широком поле)
Выходная мощность: 16dBm (40 мВт)
Скорость Передатчик: Режим модуляции: ООК (AM)

Размер: 19 х 19 х 8 мм

Для подключения имеет выводы PIN1 DATA, PIN2 VCC, PIN3 GND. Встроенной антенны нет, но есть контакт для ее подключения. Зачастую для увеличения дальности передачи изготоваливают проволочные антенны.Передатчик применяется в устройствах умного дома, автоматических системах сбора данных. Главным преимуществом является неприхотливость, стабильность в работе и низкое энергопотребление. Из минусов стоит отметить его “аналоговость”. Нужно усложнять программный код для кодирования потока данных, но это же и является преимуществом т.к. нет никаких ограничений на протокол связи.

Радио приемник FS1000A/XD-FST 433Mhz

Рабочее напряжение: DC 5V
Рабочий ток: 4 мА
Режим модуляции: ООК (AM)
Рабочая температура: -10 ° C ~ +70 ° C
Получать чувствительность:-110dB
Рабочая частота: 433MHz
Размер: 30 х 14 х 7 мм

Приемник работает на основе колебательного контура с усилителем. Подключается с помощью выводов PIN1 VCC, PIN2/3 DATA, PIN5 GND. Выход радио модуля логический по уровню, но сигнал принимает аналоговый. По тому задача декодирования послания лежит на плечах устройства (обычно Arduino) которое принимает сигнал.

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

Для существенного увеличения дальности приема можно к приемо-передающим устройствам подпаять антенну. Самый простой вариант – кусок провода длиной 17 см с сопротивлением 50 Ом. Такая длина будет резанировать на частоте 433 Mgz т.к. ее длина равна 1/4 волны.

Для кодирования.декодирования передаваемого сигнала на Arduino удобно применять библиотеку VirtualWire.h
Приведу пару примеров использования библиотеки для передачи цифровых данных.

Передатчик:

#include “VirtualWire.h”
const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика
void setup()
{
vw_set_tx_pin(transmit_pin);
vw_setup(2000); // Скорость передачи (Бит в секунду)
pinMode(led_pin, OUTPUT);
}
void loop()
{
const char *msg = “Hello, Arduinomania”; // Передаваемое сообщение
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи
vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
vw_wait_tx(); // Ожидаем окончания отправки сообщения
digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
delay(1000); // Пауза 1 секунда
}

Приемник:

#include “VirtualWire.h”
byte message; // Буфер для хранения принимаемых данных
byte messageLength = VW_MAX_MESSAGE_LEN; // Размер сообщения
const int led_pin = 13; // Пин светодиода
const int receiver_pin = 11; // Пин подключения приемника
void setup()
{
Serial.begin(9600); // Скорость передачиданных
Serial.println(“Read 433mHz begin”);
vw_set_rx_pin(receiver_pin); // Пин подключения приемника
vw_setup(2000); // Скорость передачи данных (бит в секунду)
vw_rx_start(); // Активация применика
}
void loop()
{
if (vw_get_message(message, &messageLength)) // Если есть данные..
{
digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале приема пакета
for (int i = 0; i

Оцените статью
Добавить комментарий

11 + 20 =