Программирование AVR: работа с USB AVR-USB-MEGA16: простой регистрирующий измеритель pH с интерфейсом USB Wed, December 11 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AVR-USB-MEGA16: простой регистрирующий измеритель pH с интерфейсом USB Печать
Добавил(а) Сергей Кухтецкий   

В статье описан лабораторный регистрирующий измеритель pH с интерфейсом USB. Оцифровка сигнала с электродов, контроль температуры исследуемого раствора и USB интерфейс выполнены на базе платы AVR-USB-MEGA16. Прибор может быть использован как в лабораторной практике, так и в быту (например, для контролирования уровня CO2 в аквариуме, оценки качества питьевой воды, почвы и других объектов окружающей среды). Разработка выполнена в лаборатории проблем материаловедения Института химии и химической технологии СО РАН, г. Красноярск (www.icct.ru).

[Введение]

Что такое pH

Аббревиатура pH – означает «водородный показатель». Он характеризует активность ионов водорода H+ в растворах (точнее - ионов гидроксония Н3О+, т.к. время жизни свободных ионов водорода в воде чрезвычайно мало и они практически моментально гидратируются). Для разбавленных растворов активность ионов совпадает с их концентрацией. В этом случае показатель pH равен отрицательному десятичному логарифму этой концентрации, выраженной в молях на литр:

pH = -lg(H+)

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

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

Как измеряют pH

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

Стеклянный электрод представляет собой небольшой тонкостенный шарик из специального стекла. Внутри этого шарика размещается электрод (обычно хлорсеребряный), погруженный в хлоридный буферный раствор или просто раствор соляной кислоты. Если опустить этот шарик в исследуемый раствор, то потенциал электрода устанавливается на некотором уровне, зависящем от pH раствора. Этот потенциал измеряют относительно второго электрода, который называется электродом сравнения или вспомогательным электродом. Иногда стеклянный электрод и электрод сравнения конструктивно объединяются в один комбинированный электрод, что очень удобно (особенно в полевых условиях). Хорошее введение в историю и теорию стеклянного электрода можно найти в статье [3]. Для дальнейшей работы нам достаточно знать про стеклянные электроды следующее:

1. Разность потенциалов между стеклянным электродом и электродом сравнения определяется pH и температурой раствора, в который эти электроды погружены. Для кислых растворов эта потенциал стеклянного электрода положителен и достигает нескольких сотен милливольт (при pH = 1-2). Для щелочных растворов – потенциал отрицателен и тоже доходит до нескольких сотен милливольт (при pH = 10-12). В нейтральной среде (например, кипяченная дистиллированная вода, остуженная без доступа углекислого газа) потенциал порядка нуля.

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

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

4. pH существенно зависит от температуры раствора, поэтому для повышения точности определения pH измерение температуры раствора обязательно.

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

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

[Аппаратная часть]

Аппаратная часть состоит из следующих элементов:

1. Штатив с электродами и температурным датчиком.
2. Согласующий усилитель с высоким входным сопротивлением.
3. Плата AVR-USB-MEGA16 (АЦП, мастер шины 1-Wire для датчика температуры и программная реализация USB интерфейса).
4. Персональный компьютер для управления и регистрации сигналов.

Штатив с электродами и термометром

Если покупать, то штатив с электродами – будет самой дорогой частью измерителя pH (не считая, конечно, компьютера). В продаже имеется огромный ассортимент всевозможных электродов по цене от тысячи рублей и выше. Для не очень ответственных работ можно взять и «древние» электроды из ЗИПов старых измерителей pH, обычно в избытке валяющиеся в химических лабораториях. После вымачивания стеклянного электрода в 0.1 н соляной кислоте в течение нескольких дней, даже очень старые электроды, десятилетиями валяющиеся на полке, начинают показывать вполне разумные результаты (если, конечно, шарик чистый, целый и на нем нет микротрещин). С электродом сравнения (вспомогательным электродом) еще проще. Главное чтобы затворы не были необратимо забиты чем-нибудь нерастворимым. Его нужно хорошенько отмыть от старого хлорида калия и вымочить несколько дней в дистиллированной воде. Затем вновь заполнить насыщенным раствором хлорида калия. Для контроля можно измерить его сопротивление (на переменном токе). Оно не должно превышать 10-20 кОм.

Я взял штатив и электроды от старенького портативного иономера И-102, долгое время провалявшегося на полке без дела. Штатив был использован практически без переделок - заменил только имевшийся (специальный) разъем кабеля на разъем BNC. В качестве датчика температуры я использовал любимый датчик DS18B20. Он был помещен в узкую пробирку, в которую было налито трансформаторное масло для улучшения теплового контакта с раствором. Эта пробирка как раз уместилась на штативе вместо штатного ртутного термометра. Вся конструкция показана на Рис.1.
pH01-avr-usb-mega16.JPG

Усилитель

Схема согласующего усилителя представлена на Рис.2. Важнейшим требованием к нему является высокое входное сопротивление. Поэтому в качестве операционных усилителей были выбраны микросхемы TL08X, имеющие входное сопротивление порядка 1012 Ом. В данном случае использован сдвоенный усилитель TL082. Существуют усилители и с более высокими параметрами специально предназначенные для разработки электрометрических систем (см. примеры решений в [4]), но мне попались под руку именно TL082.
pH02-avr-usb-mega16.GIF

Первый каскад (TL082.1) является повторителем, как в простейшем измерителе pH из статьи [5]. Второй каскад (TL082.2) - предназначен для инверсии сигнала (чтобы pH был пропорционален выходному напряжению), его масштабирования и смещении в положительную область для согласования с уровнями входных сигналов АЦП. Потенциал смещения (Vref) берется от внутреннего источника опорного напряжения микроконтроллера ATMega16, входящего в плату AVR-USB-MEGA16. Для этого плату нужно немного модифицировать (см. раздел ниже).

Для смещения двух полярного сигнала в положительную область и его масштабирования до диапазона входных напряжений АЦП выбрана самая простая схема. У этой схемы есть серьезный недостаток - взаимное влияние регулировок смещения и усиления [14], поэтому процесс настройки приходится выполнять итерационно. К счастью, его достаточно выполнить только один раз. Текущую подстройку небольших смещений нуля в процессе работы можно выполнить и программно. Эксперименты показали, что в диапазоне комнатных температур от 15 до 35 oС этот "уход" не превышает 2-3 кванта АЦП. Поэтому я и не стал усложнять схемы регулировок операционных усилителей.

Питание усилителя осуществляется от шины USB (т.е. только +5В). Поскольку сигнал со стеклянного электрода двухполярный, то на плате усилителя предусмотрен преобразователь, собранный на микросхеме LMC7660, для получения отрицательного напряжения питания операционных усилителей. И, наконец, последний узел усилителя – реле, переключающее измерительный вход усилителя между «землей» и стеклянным электродом. Реле включено в коллекторной цепи транзистора, усиливающего сигнал порта PD7 микроконтроллера платы AVR-USB-MEGA16. RC-цепочка в цепи коллектора предназначена для снижения потребляемого тока реле в режиме удержания. В качестве реле может быть использовано любое слаботочное реле с переключающей группой контактов, срабатывающее от 5В. Я поставил что было - WJ102H-1C-5VDC. Транзистор и защитный диод тоже могут быть любыми низковольтными слаботочными элементами. То, что мне попалось под руку, указано на схеме. При подаче на порт PD7 логической единицы усилитель подключается к электроду, т.е. устройство переходит в режим «Измерение».

Вид собранного усилителя приведен на Рис.3 и Рис.4. lay-файл платы (для Sprint Layout) находится в папке «Железо» архива к данной статье [6].

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

 pH03-avr-usb-mega16.JPG
 pH04-avr-usb-mega16.JPG

[Модификация платы AVR-USB-MEGA16]

Для использования платы AVR-USB-MEGA16 в описываемом измерителе pH, необходимо выполнить несколько модификаций платы. Они изображены на Рис.5 красным цветом. Первая модификация (вверху слева) – разъем, необходимый для подключения выхода усилителя к нулевому каналу АЦП (порт PA0). На этот же разъем выводится и опорное напряжение от внутреннего источника ATMega16 для смещения усилителя (см. раздел «Усилитель» выше). Для использования внутреннего источника опорного напряжения, необходимо выпаять резистор R3 из платы AVR-USB-MEGA16. Второй разъем (сверху посредине) предназначен для подключения ведомых устройств шины 1-Wire. В нашем случае это датчик DS18B20. И, наконец, третий разъем служит для подключения сигнала PD7 к плате усилителя (для включения реле в режиме «Измерение»).
pH05-avr-usb-mega16.PNG

Весь pH-метр в сборе представлен на Рис.6.
pH06-avr-usb-mega16.JPG

Перейдем теперь к программному обеспечению.

[Программное обеспечение]

Firmware

Firmware должно позволить хосту выполнять следующие функции:
1. Настроить и запускать канал АЦП, проверить готовность данных и считать результат оцифровки сигнала с электродов.
2. Включить и выключить реле «Измерение» - это бит 7 порта D.
3. Проверить наличие температурного датчика (DS18B20) и измерить температуру раствора. Для этого firmware нужно реализовать программный протокол шины 1-Wire.

Пункты 1 и 2 можно выполнить в рамках простейшей универсальной прошивки (Firmware Simple), которая описана в статье [7]. Ее и можно взять за основу firmware. К сожалению, выполнение пункта 3 потребует некоторой модификации firmware. Дело в том, что протокол 1-Wire требует четкого выдерживания временных параметров сигналов, поэтому простым «дерганьем» ножки порта PB1 из хоста по USB здесь не обойтись.

Информацию по организации шины 1-Wire и протоколу легко найти в Сети (в том числе и применительно к AVR см., например, исчерпывающий документ [8]). Поэтому не будем здесь ее рассматривать, а перейдем сразу же к расширениям Firmware Simple, которые нам необходимо сделать для реализации протокола шины 1-Wire. По сути, в программе микроконтроллера, который играет роль мастера шины 1-Wire, нам нужно реализовать только три базовые функции, требующие четкого соблюдения длительностей сигналов. Это – следующие операции:

1. Сигнал «Сброс-Присутствие», по которому мастер сможет определить наличие устройств на шине.
2. Запись бита по шине.
3. Чтение бита по шине.

Все остальные команды протокола 1-Wire уже не требуют такой жесткой временной привязки как перечисленные выше. Поэтому (в принципе) они могут быть выполнены под непосредственным управлением из хоста. Однако, поскольку на плате AVR-USB-MEGA16 реализован медленный USB, то некоторые операции могут выполняться слишком медленно. В основном это, так называемые «команды функций ПЗУ», в которых фигурирует 64-разрядный идентификационный код. Проделаем некоторые оценки.

Один временнОй слот шины 1-Wire составляет 60 мкс. За один слот передается только один бит информации. Следовательно, на непрерывную передачу/прием идентификационного кода (64 бит) необходимо время порядка 4 мс. Т.е. быстрее не позволит сама шина. Теперь оценим во что это выльется если управлять из хоста по USB. Как показали результаты экспериментов с шаговым двигателем (см. статью [9]), минимальное время с которым мы можем «дергать» ножки портов по USB из программы на C# составляет порядка 10 мс. Чтобы убедиться в этом, проделаем простейший эксперимент с платой AVR-USB-MEGA16. Для этого используем программное обеспечение из статьи [7]. Модифицируем приложение хоста следующим образом.

В методе Form1_Load() разрешим использование бита 7 порта D на выход:

dev.DDRD |= 0x80;

и сразу же за этой строкой вставим бесконечный цикл:

while (true) {dev.PORTD |= 0x80; dev.PORTD &= 0x7F;}

Подключив осциллограф на порт PD7, мы увидим меандр, который временами будет «подергиваться» влево или вправо. Средний полупериод этого меандра как раз и скажет нам о предельных возможностях управления шиной 1-Wire при помощи цепочки «C#-программа хоста» -> «USB порт ПК» -> «USB микроконтроллера» -> «firmware» -> «порт микроконтроллера». Для моего «железа» это время оказалось около 7 мс.

Отсюда следует, что если управлять шиной 1-Wire на низком уровне по низкоскоростному USB, то время пересылки 64-битного идентификационного кода будет составлять уже более половины секунды (!). Это почти на два порядка больше, чем ограничение самой шины (4 мс). Понятно, что для многих задач такие времена становятся неприемлемыми. Следовательно, в firmware нам необходимо реализовать не только три базовые команды 1-Wire: сброс-присутствие, запись и чтение бита, но также передачу/прием целых байтов и несколько функций ПЗУ. Естественно, довольно громоздкую процедуру идентификации ведомых устройств тоже стоит реализовать в firmware.

Исходные файлы firmware и готовую прошивку можно найти в архиве данной статьи [6]. В исходном файле (main.c) комментарии и ссылки.

ПО хоста

Базовая часть приложения хоста, отвечающая за инициализацию оборудования и организацию рабочих циклов измерения и регистрацию показателя pH, аналогична соответствующим модулям приложений, рассмотренных ранее в статье [10]. Только одно существенное отличие – здесь добавлено дополнительное усреднение сигнала с АЦП в течение секунды, поскольку в измерителе pH влияние наводок гораздо сильнее, чем в термопарах.

Как и в предыдущих системах, взаимодействие C#-приложения хоста с микроконтроллером платы AVR-USB-MEGA16 осуществляется по USB через класс-обертку ATMega16 и библиотеку libusb-win32 [11]. Для построения графиков используется свободная библиотека zedGraph [12]. Средство разработки хоста – свободно доступная Visual Studio 2008 Express Edition [13], язык программирования C#. Законченный проект со всеми сервисными функция для поддержки измерителя pH находится в папке host\phMeter архива данной статьи [6].

Рассмотрим общую организацию приложения хоста (файл Form1.cs). В конструкторе класса Form1 происходит загрузка калибровочных данных, необходимых для расчета показателя pH по измеренной температуре раствора и коду АЦП (метод InitStBufColFromXML("StBufCol.xml") в конструкторе формы). Далее, при загрузке главной формы приложения (метод Form1_Load()), создается объект dev класса ATMega16 и происходит инициализации USB. В случае успешного завершения этих действий, в этом же методе происходит инициализация АЦП и графики. В конце модуля происходит запуск 1-секундного таймера и специального таймера timer50ms, управляющего работой АЦП и накоплением оцифрованного сигнала.

Каждые 50 мс происходит тик таймера АЦП timer50ms. По этому событию вызывается метод  timer50ms_Tick(). В нем происходит настройка, запуск нулевого канала АЦП и ожидание готовности данных. Время преобразования АЦП достаточно мало (около 100 мкс для 10 разрядов), поэтому ожидание готовности происходит тут же прямо в цикле. Когда данные АЦП готовы, формируется 10 разрядное слово кода АЦП, которое помещается в накопитель dSum для последующего вычисления среднего значения за секунду. Такое усреднение сигнала позволяет существенно снизить уровень наводок с электродной системы. В лабораторных условиях прибор  вполне прилично работает даже безо всяких дополнительных экранов и заземления.

Основные действия приложения хоста происходит один раз в секунду по тику таймера timer1sec. При этом вызывается метод timer1sec_Tick().

В начале этого метода определяется количество датчиков, подключенных к шине 1-Wire. Если датчики есть, то после сброса шины всем датчикам подается команда начать преобразования и запускается таймер timer750ms. Таймер сгенерирует тик через 750 мс. Это как раз и есть время 12-разрядного преобразования датчиков DS18B20.

Тем временем (пока датчики преобразуют температуру в код) продолжается отработка тика секундного таймера – вычисляется среднее значение кода АЦП по накопленным в накопителе dSum значениям сигнала АЦП. Это значение используется как средний код АЦП при вычислении значения показателя pH по калибровочным данным (вызов ph = stBufCol.ph(t0, d)). Температура t0 берется с предыдущего временного шага. Далее в этом же методе timer1sec_Tick() происходит вывод информации в статусную строку и на панели графиков.

Наконец, после истечения 750 мс происходит событие (тик) таймера timer750ms, по которому вызывается метод timer750ms_Tick(). К этому времени датчики температуры на шине 1-Wire должны уже закончить свою работу. В методе timer750ms_Tick() мы предполагаем, что первый датчик – это и есть тот самый датчик, который измеряет температуру раствора. Считываем его код и преобразуем его в температуру.

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

На Рис.7 показан вид работающего приложения хоста в режиме потенциометрического титрования на примере ортофосфорной кислоты. Титрант (0.1н раствор NaOH) подается при помощи микродозатора, о котором шла речь в статье [9] (см. предпоследний рисунок в этой статье).  Скорость подачи титранта 600 мкл/мин (т.е. 1 минута на графике соответствует 0.6 мл).
pH07-avr-usb-mega16.JPG

Существенная часть приложения хоста представляет собой сервисные функции для обеспечения функционирования измерителя pH. Они весьма специфичны для данной задачи и их подробное рассмотрение выходит за рамки данной статьи. Отмечу только, что регулярность и полнота калибровки прибора играет важнейшую роль в обеспечение точности измерений. Стеклянные электроды, используемые в измерителях pH, склонны к старению и изменению своих характеристик (в том числе и основных – крутизна и положение изопотенциальной точки). Температурные зависимости также отклоняются от теоретических и «плывут» со временем. Ввод потенциометрических данных в компьютер дает возможность отказаться от приблизительных теоретических зависимостей, лежащих в основе калибровки простых приборов. Вместо этого в данной работе для определения pH используется произвольный набор калибровочных точек и стандартных буферных растворов, который необходим для работы в нужном диапазоне изменения pH и температуры. Естественно, эти наборы и точки можно изменять, дополнять и удалять прямо в процессе работы. Все изменения сразу же автоматически учитываются при расчете pH. Вид приложения хоста в режиме калибровки представлен на Рис.8.
pH08-avr-usb-mega16.JPG

Байты перемычек (fuse bits) ATmega16 должны быть 0xFF (low) и 0x09 (high). 

[Ссылки и литература]

1. pH site:wikipedia.org
2Водородный показатель site:wikipedia.org.
3. Стеклянный электрод site:wikipedia.org
4. pH-метрия для начинающих site:aquacontrol.narod.ru.
5. Building the Simplest Possible pH Meter site:66pacific.com - изготовление простейшего измерителя pH.
6. Архив с исходными текстами программ, схема и разводка усилителя - 090710pH-software.rar.
7. AVR-USB-MEGA16: быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16 
8. AVR318: Dallas 1-Wire master site:atmel.com.
9. AVR-USB-MEGA16: управление шаговым двигателем через USB.
10. AVR-USB-MEGA16: измеряем и контролируем температуру
11. LibUsb-Win32 site:libusb-win32.sourceforge.net.
12. ZedGraph site:sourceforge.net.
13. Visual Studio Express Edition Download site:microsoft.com.
14. Алексенко А. Г., Коломбет Е. А., Стародуб Г. И. "Применение прецизионных аналоговых ИС". М., "Советское радио", 1980, с.224. См. раздел "Регулировка Uсм" на стр. 18.

@ S.V.Kukhtetskiy,
2009 Кухтецкий Сергей Владимирович, лаборатория проблем материаловедения, Институт химии и химической технологии СО РАН, Красноярск E-mail: ku@icct.ru

 

Комментарии  

 
0 #7 Васильев Владимир 18.05.2011 13:55
Здравствуйте!
Пожалуйста, ПОМОГИТЕ!!! Ищу паспорт на прибор иономер переносной И-102. Нигде не могу найти. Их давно сняли с производства, поэтому с паспортами напряг. Поэтому прошу - если у кого-то паспорт есть, отзовитесь или посоветуйте где взять.
Цитировать
 
 
0 #6 Vladimir 14.03.2011 00:28
Просто отличный проект, попробую сделать. Если бы можно доработать.

Для аквариумистики нужен еще электромагнитны й клапан, управляющий подачей СО, было бы просто здорово если бы калибровка и настройка осуществлялась с компьютера, а далее прибор сам работал, автономно без компьютера.
Цитировать
 
 
0 #5 Андрей 123 24.08.2010 04:38
Один из лучших сайтов, что я видел. :-)
Цитировать
 
 
0 #4 Sergey 23.03.2010 15:17
Добрый день. Вопрос по использованию прибора. При отключенном температурном датчике при попытке добавить новый буферный раствор выдает ошибку: Входная строка имела неверный формат. Может это из за того что нет датчика? Спасибо.

microsin: тут ничего посоветую, только Сергей Кухтецкий может помочь.
Цитировать
 
 
0 #3 sergey 18.03.2010 23:49
Я имел в виду немного другое. Там в схеме два подстроечных резистора. Вот и интересно узнать как автор настраивал усилитель...И еще момент. фьюз биты должны быть выставлены на тактирование от внешнего кварца? Больше ничего менять в них не надо? Спасибо!

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

С фьюзами (перемычками) еще проще - байты перемычек ATmega16 должны быть 0xFF (low) и 0x09 (high).
Цитировать
 
 
0 #2 Sergey 18.03.2010 23:15
Здравствуйте. :-) Очень понравился этот проект. Спасибо автору. Есть вопрос. Как производить калибровку усилителя? Спасибо.

microsin: может быть, Сергей Кухтецкий прочитает комментарий и правильно ответит на этот вопрос. Как мне кажется, калибровка всего прибора в целом (в том числе усилителя и электродов) происходит с помощью стандартных буферных растворов. Они упоминаются в описании режима калибровки.
Цитировать
 
 
0 #1 Engineerus 18.03.2010 14:26
Просто превосходно!
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page