Теперь в нашем онлайн-магазине доступна уникальная книга «BEAM-робототехника. От азов до создания практических устройств», идеально подходящая как для кружков робототехники, так и для самообучения дома. Вы можете приобрести её по привлекательной цене в 699 рублей. Дополнительная информация о книге доступна на нашем сайте. Также в ассортименте нашего онлайн-магазина представлены готовые наборы для сборки роботов, с помощью которых ваш ребенок сможет легко собрать своего первого робота, следуя нашим подробным инструкциям. Перейти в магазин
Есть такой робототехнический набор "ASURO robot KIT" - такой набор для сборки робота. Поставляется в виде набора для сборки и пайки своими руками. Размеры робота сравнительно не большие, сколько точно не скажу ищите в описании. Мне лень хотел сказать замерять, но вот как на зло я знаю где лежит линейка и без особых телодвижений до нее можно дотянуться... Так и быть - 10.5 х 12.5 (см).
Все это умещается на плате которую вам предстоит спаять и установить на нее детали. Все детали, кстати, выполнены в DIP корпусе и с ним подобным, что облегчает жизнь начинающему робототехнику. Паять не сложно будет. Детали расположены очень кучно и при пайке соблюдайте аккуратность и внимательно устанавливайте на свои места детали. Иначе перепаивать а это оочень тяжко для таких плат, так как у меня обычно детали припаиваются намертво =).
Мозговым центром бота является микроконтроллер фирмы Atmel - ATmega8L, где L - означает что микросхема из рода мало потребляющих и мало-требующих для работы. Обычно запускаются от 3-5 Вольт. Этот МК управляет 6 тактильными датчиками (датчиками касания), установленными в передней части бота, 4 опто-парами которые установлены рядом с редуктором для подсчета количества оборотов колеса. А также датчиком линии состоящим из 2х фототранзисторов и одним светодиодом между ними.
Редуктор на этом роботе, мягко говоря - некудышнейший ! Я просто не могу Вам сказать все что о нем думаю, но он просто некудышнейший для настоящих соревнований по робототехнике да и вообще для современного человека, робототехника. Он очень м-е-е-е-едленный, очень слабенький, руками слегка притормаживаешь и он дохнет от напряги, пищит. Сразу говорю - редуктор меняйте ! Иначе он не нужен.... Моторами управляет Н-мост на транзисторах C32740 и, кажется микросхемой CD4081BD.
Напряжение робот просит в количестве 4 батареек типо-размера ААА по 1.5 (1.2) Вольт каждая.
Описание от производителя:
Автономный робот ASURO оснащён микропроцессором Atmel AVR ATmega8 с возможностью загружать свои программы. Шесть датчиков касания, одометры на колёсах, пара фототранзисторов снизу со светодиодом подсветки позволяют роботу неплохо ориентироваться в окружающем мире. Предназначен как для любителей, так и для школьных кружков и студенческих лабораторий. При сборке требуется пайка!!! Микроконтроллер AVR ATMega8 Память: 8 kB флэш, из них около килобайта занято Bootloader-ом 1 kB RAM 1 kB EEPROM Программирование: Робот поставляется с прошитой во флэш программой AVR-Bootloader, после подачи питания загрузчик пытается принять с компьютера данные, а если IR сигнал не обнаружен, через две секунды робот начинает исполнять текующую программу. Сенсоры: Два фототразистора позволяют отслеживать линию на полу Шесть контакных датчиков (микропереключатели) Две фотоячейки считают обороты колёс Размеры: (Д × Ш × В) 117 × 122 × 45 мм Питание 4 AAA В комплект входит CD с компилятором Си. Робот может общаться с компьютером по инфракрасному каналу, в набор входит адаптер IR <-> RS232.
Продолжим... Будем считать что робот у вас спаен и собран. Батарейки новые и при включени он запускает тестовую прошивку которая проверяет все агрегаты типа моторов, датчиков, сенсоров. Вообщем все ок у вас.
ПРОГРАММИРОВАНИЕ:
1. Первым делом нужно установить пакет программ которые идут на диске с роботом, а это
WinAVR или AVRStudio4. Это компиляторы С\С++ спомощью которых мы будем составлять и компилировать инструкцию поведения робота - .hex файл, который скушает микроконтроллер. В нашем случае будет использоваться первый вариант - WinAVR
Flash - загрузчик нашего .hex кода.
Adobe Reader по идее есть у каждого, но если хотите можете его скачать тоже для чтения мануала на английском.
НАСТРАИВАЕМ программу.
Запускаем WINAVR - Programmers Notepad. Нажимаем вкладку Tools -> Options -> Tools(именно tools a не project tools). Откроется окошко подписанное как "Sheme". В этом окне выбираем нашу схему - C\C++. Выбрав схему нажимаем Add. Сейчас нужно будет добавить батник (.bat) который содержит в себе всего одну строку комманду или "make all" или "clean all" В открывшемся окне "Свойства: New Tool" набираем имя(name): make asuro. В поле комманда указываем файл test-all.bat, который находится на диске в разделе \ASURO_src\FirstTry\Test-all.bat.
ВНИМАНИЕ! Скопируйте папку FistTry c диска на свой компьютер на диск С прямо в корень. Т.е. путь к папке должен быть следующим C:\FirstTry\. Это связанно с тем что компилятор не сможет перезаписать файлы находящиеся на диске что идет в комплекте и когда вы бы попытались запустить коммануду make asuro(позже узнаете как), то компилятор бы не ругаясь сделал все на ок, но на самом деле файлы не изменятся совершенно. И да, компилятор не умеет работать с русскими путями. Например если у вас файл находится по такому пути C:\FirstTry\Вася Пупкин\ . Будьте внимательными.
И так, вы указали путь к файлу test-all.bat. Идем дальше. В поле Folder указываем путь к папке в котором находится этот файл test-all.bat. Т.е. получается так: C:\FirstTry\. Указали. Теперь закроем окно нажав кнопку "ОК". Теперь у нас появился список: [WinAVR] Make All ... make.exe ... all Снова нажимаем Add. В поле Name пишем clean asuro. В поле Command указываем файл Test-clean.bat. Файл находится тамже где и Test-all.bat. В поле Folder указываем папку где находится файл. Нажимаем "Ок". Все на этом пока наши настройки закончены !
В скопированной папке FistTry которая у вас находится по адресу C:\FistTry\ найдите файлик test.c - это файл программы на языке Си. Можете открыть его блокнотом и вы увидете в нем следующий код:
Quote
#include "asuro.h"
int main(void) { Init();
while(1); return 0; }
Откройте окно программы WinAVR - Notepad programmer. Нажмите File -> Open. Найдите папку FirstTry и в ней файлик test.c. Выберите его и нажмите Открыть. Откроется точно тот же код что указан выше, правда теперь он немного подсвечен.
Разберем наш код. 1. #include "asuro.h" - библиотека с настроенными заранее функциями для корректной работы робота и его микроконтроллера ATmega8. 2. Int main(void) - начало нашей программы(функции) 3. Int(); - инициализация. В некоторых случаях не требуется, но укажем всеравно. 4. While(1) - бесконечный цикл, проверяющий соответствие true\false (правда\ложь) 4. Return(0) - возращение в начало функции
Важный момент - " ; " точка с запятой (!) должна присутствовать в конце каждой строки кода, исключения различные условия.
После того как мы разобрали строки попробуем его скомпелировать. Для этого нажимаем вкладку меню Tools -> make asuro. Нажав на make asuro мы запустим команду make all которая находится в файлике Test-all.bat. Как только мы запустили компиляцию в низу в окне Output начали мелькать строки состояния, ошибок, путей и прочих информационных данных, часть из которых нам пока что не нужна, но кое что всегда должно быть во внимании. В саамом низу этих строк будет надпись:
Quote
Errors: none --------------- end ------------------ > Process Exit Code: 0 > Tame Taken: 00:01
Что это значит ? Первая строка говорит о том, что в ходе компилирования не обнаружено каких либо ошибок сиснтаксиса и почего. Вторая строка просто так. Третья строка говорит что ошибок (точек выхода\сбоя\ошибки) не найдено. Четвертая строка показывает затраченное время на компиляцию.
ВНИМАНИЕ!Перед каждой компиляцией обязательно сохраняйтесь ! Иначе, когда вы вносите изменения в коде, в самой программе WinAVR NP, в тесте вашей программы, при запуске на компиляцию он вам не покажет что есть ошибка а вы, радостные, побежите заливать прошивку в мк и потом ломать голову почему ничего не изменилось )
Для проверки увидет ли он ошибку сделайте тест: 1. открыв файл программы test.c и запустите на компиляцию. Вы увидете что ошибок 0. 2. теперь открытый файл test.c на любой из строчек удалите ; После чего также запустите на компиляцию. Что в итоге ? Ошибок, опять же, он не выдал. Видимо компиляция проихсодит не из окна с текстом программы а именно от файла test.c где-то из папки...
И так. Теперь мы знаем как установить, настроить, скомпилировать и проверить нашу программу. Возникает закономерный вопрос - что нужно сделать чтобы робот начал выполнять нашу программу (инструкцию) сам ?
Для этого нужно нашу программу запихать в его мозги, - микроконтроллер. Причем в память его не энергозависимую. А то если запишем в энергозависимую, то при его выключении все потеряется. Для тех кого заинтересовало какие есть типы памяти - ищите в гугле
Помните мы было дело создавали папку FirstTry ? Вот сейчас идем в эту папку и находим там файлик test.hex. Это тот самый файл который умеет читать МК. Если хотите, можете его открыть в блокноте и узнаете что он из себя представляет =)
ПРОШИВАЕМ МИКРОКОНТРОЛЛЕР
Запускаем программу Flash, которую вы должны были скачать с диска с роботом. Если еще этого не сделали -самое время. Запустили. Откроется маленькое окошко в котором Вам предстоит выбрать:
а) COM-порт
COM-порт - это мост, который связует программку Flash и наш программатор, который вы подключили в USB-порт. На самом деле COM - тот же самый USB, только называется по другому. Как узнать какой COM порт нам нужен ? Когда вы подключите программатор в юсб, если у вас стоит Windows 7, то в большинстве случаев драйвера на него найдутся сами, и установятся автоматически. Но бывают случаи, в большинстве, приходится все делать вручную.
б) Обзор ... - Тут мы находим файл с расширением .HEX. В нашей папке выбираем файл test.hex
в) Programm ... Нажимая эту кнопку программатор начинает запрашивать у МК состояние - готов ли МК к прошивке или нет. Включен он или нет ? Будьте готовы включить робота сразу после нажатия на эту кнопку, так как если робот будет ывключен - прграмма будет писать TameOut - время ожидания вышло.
УСТАНАВЛИВАЕМ ДРАЙВЕР ДЛЯ ПРОГРАММАТОРА
1. Мой компьютер -> Свойства -> Управление. В открывшемся окне нажимаем "Диспетчер устройств". В диспетчере находим "Неизвестное устройство". Если с вашей системой ранее было все ОК, то неизвестных устройств должно быть всего 1 - наш программатор. 2. Нажимаем правой кнопкой по этому неизвестному -> Обновить драйвер -> Выполнить поиск драйверов на этом компьютере -> Выбрать драйвер из списка уже установленных -> В списке (принтеры, мониторы, клавиатуры и прочей фигне) тыкаете на первое попавшееся устройство, например "Принтеры" -> В открывшемся окошке жмем "Установить с диска" -> Заходим в папку, точнее на диск что идет в комплекте с роботом. На диске идем в папку "USB-driver", тыкаем по первому попавшемуся INF файлу. Жмет открыть, ОК. Появится строка типа "USB Serial converter". Нажимаете на эту строку, -> Далее -> Да. 3. Установка драйвера завершена.
Можете проверить наличие нашего программатора. Заходим в Диспетчер устройств, находим вкладку "Порты(COM и USB)". Там будет либо название программатора, либо название как у меня: USB Serial port (COM1). Так вот, к чему я все подвожу. Вот эта надпись в скобках - (COM1) - и есть тот порт, который вам нужно указать в программе Flash. У кого-то может быть другой порт, например COM21. Так что смотрите каждый персонально.
НАЧИНАЕМ ПРОШИВАТЬ МИКРОКОНТРОЛЛЕР
Будем считать что у вас настроен программатор, робот с заряженными батарейками, прошивка готова в виде файла test.hex.
Выполняем простые телодвижения: 1. В программе Flash нажимаем Programm. 2. Берем тут же робота и включаем его. 3. Глаз робота - TSOP - ИК датчик, спомощью которого он видит данные от программатора. Черный такой, с 3 ножками. Его направьте на ваш программатор чтобы между роботом и программатором небыло предметов. Расстояние должно быть около 20 см, больше не рекомендую.
ВНИМАНИЕ! Не стоит пытаться прошить робота рядом с лампой дневного света, или рядом с монитором с электронно лучевой трубкой. Мало ли, но от них идут всяческие помехи. Если помехи есть, то в окне программы Flash будут появляться красные буквы "t "- timeout. Если они появились, ну, потрясите роботом перед программатором, должно помочь )
Если все идет хорошо, то там будет писаться flashed, flashed, tttflashed, tcccflashed. Главное что flashed - записано, сохранено.
И так. После картины "шамана с бубном", трясущего роботом над программатором, ну, по крайней меря - я тряс ) Вы кое как, возможно и не с первого раза, но всеже прошили МК на 100%. Теперь можно выключить питание робота, так как он будет весеть так далее, ждать новые команды от программатора.
Включите робота. Через 5 секунд ожидания робот начнет выполнять программу. Что он начнет делать ? Ответ прост - ничего ! =) Мы не указывали каких либо действий - просто программа типа START-END.
ПРОГРАММА "МИГАНИЕ СВЕТОДИОДОМ" - первая программа
На нашем роботе 20 объектов, которыми мы можем в полной мере управлять. Начнем с самого простого - светодиоды. У нас их 7 штук, 3 из которых ИК(инфрокрасного диапазона), остальные обычные.
Разберем как они идентифицируются. Так как у нас есть asuro.h - в нем содержаться все дефайны, функции, с которыми мы работаем в основной программе. Дефайны(defain) - заменяет одно на другое. Например "Вася Пупкин Пупкович" "Вася". Вместо того, чтобы нам в программе писать полное Вася Пупкин Пупкович... мы напишем просто Вася. Нам проще, а программе всеравно, так как мы заранее указали что Вася содержит в себе полное ФИО.
Также в нашем случае, производитель заранее попарился и понапридумывал различных функций, упрощающих жизнь программисту. В место того чтобы писать и настраивать порты на Запись\Чтение - Ввод\Вывод, мы просто напишем LED и наш светодиод включится. Возникает вопрос, LED'ов то у нас дофига, как именно тот что нужен нам включить ? Ответ скрывается в мануале... Но я его тут процитирую:
Начнем с индикатора питания. Он у нас сдвоенный, имеет два цвета - красный, зеленый, желтый(если горят и тот и тот). Команда для включения красного цвета: StatusLED(RED); - как видно, тут указан статус светодиода: RED или GREEN
Quote
#include “asuro.h”
int main(void) { Init(); StatusLED(RED); while(1); return 0; }
Компилируем. Tools -> Make asuro -> Проверяем на ошибки. Если ошибок нет... Надеюсь вы не забыли что нужно было сохраниться перед компиляцией ? Быстренько сохраняем и нажимаем компелировать снова... Если ошибок нет, то запускаем программу Flash, выбираем все тот же COM-порт и тот же test.hex файл. Нажимаем Programm ... Включаем робота и шаманим с роботом над программатором.
Ок. Прошивка на месте. Перезапускаем робота. Сначала как всегда ожидание в 5 секунд, и после чего загорается красным цветом светодиод. Готово - как говорят программисты - It's Work !
Сообственно вот сейчас мы запустим нашу мигалочку в работу. Будем использовать вечный цикл, чтобы программа постоянно крутилась по кругу. Напишем программу:
Code
#include "asuro.h"
int main(void) { Init(); while(1) { unsingned int i; StatusLED(GREEN); for (i = 0; i < 842; i ++) Sleep(0xFF); StatusLED(RED); for (i = 0; i < 842; i ++) Sleep(0xFF); }
}
Разберем код: Используем 2 вида цвета - зеленый и красный. Делаем задержку в виде счетчика FOR, в котором мы объявим переменную i равную 0, и значение, до которого эта переменная будет увеличиваться, - до 842. Команда i ++ означает, что к i будет прибавляться цифра 1. Т.е. мат. действие можно записать разными способами: i+=1; i++; i=i+1; Как только i будет равно 842, счетчик запустит команду Sleep(). Эта команда активирует паузу. Как рассчитать паузу ? Ответ в этой формуле: (0.003s/1)/72kHz=216 Это при условии если нам нужна задержка в 3 миллисекунды. Итог: мигание светодиода то зеленый то красный.
Для тех кто хочет зажечь другие светодиоды, вот другие команды: 1. FrontLED(ON); - светодиод который предназначен для поиска линии 2. BackLED(OFF,ON); - два светодиода расположенные рядом с моторами
Инфрокарасные светодиоды включаются чуть по другому, но об этом позже
Кстати по поводу дефайнов, ниже пример того как их правильно указывать:
Quote
#define NAME replacement_text
DEFINE ПРОСТОЙ НАГЛЯДНЫЙ ПРАКТИЧЕСКИЙ ПРИМЕР
Quote
#include “asuro.h” #define STARTINGVALUE 33
int main(void) { int i; i= STARTINGVALUE; // теперь переменная i равна 33 return 0; }
Разберем пример: мы задали переменную i типа int (int - Integer - Целое число). До начала программы, в "хедере" (шапке, в самоом верху), мы задаем замену - число 33 мы заменяем на целое слово STARTINGVALUE. По умолчанию переменная i = 0. Но в программе мы нашу переменную приравниваем (=\==) к слову STARTINGVALUE, которое в свою очередь просто заменяется цифрой 33.
В будущем такой заменой можно заменить целую кучу строк кода !
Эти команды всегда используются для создания различного рода событий, которые происходят и выполняются в зависимости от ситуации. Как движение автомобилей на перекрестке с участием светофора - ЕСЛИ (IF) горит красный (StatusLED(RED), то { выполняется одно действие }, если нет, т.е. что-нибудь еще (ELSE), то { выполняется другое действие }.
Как это выглядит в программе:
Quote
if ( Ваше условие) { Если условие совпадает, т.е. оно правда (true), выполняется эта строка ; } else { Если условие не совпадает, т.е. оно не правда (false), выполняется эта строка ; }
Какими бывают условия: == что-то равно чему-то != что-то не равно чему-тоl < что-то меньше чего-то > что-то больше чего-то <= что-то меньше или равно чему-то >= что-то больше или равно чему-то
Пример: (A > B), (A <= и так далее...
Давайте разберем более наглядный пример с использованием все тех же светодиодов:
Quote
#include “asuro.h” int main(void) { while (1) { if (PollSwitch()>0) {StatusLED(RED);} else {StatusLED(GREEN);} } }
Скомпилируйте и залейте этот код в микроконтроллер. Готово ? Тогда включите робота. Что начало происходить ? Нет, выключать и включать по десять раз, думая что что-то не так, не стоит. В идеале у вас должен загореться зеленый светодиод, и больше никаких действий не будет совершаться, пока...
Вот тут то и начинает работать наше условие "ПОКА".
Что такое функция PollSwitch() ?
Объясняю. Эта функция отвечает за опрос наших контактных датчиков, которых у нас аж 6 штук. Каждый датчик обзывается как К1, К2, ... ,К6. В нашей программе мы делаем условие:
Quote
ЕСЛИ хоть 1 датчик касания нажат, ТО включаем зеленый светодиод, ЕСЛИ нет, то включаем красный светодиод
Теперь снова включите робота и тут же нажмите и держите любой датчик касания. Светодиод поменяет свой цвет. Ура ! Работает !
Занятная вчера с роботом ситуация случилась однако ...
Пытался прошить робота, но через программу Flash прошивка ну ни в какие ворота не шла, постоянно писала сообщения об ошибках типа " с с с с с... или с.с.с.с.с. ....с ". Причем занимательно то, что если запустить программу Flash151, что находится там же на диске, вроде бы она для Linux платформы заточена а может и показалось мне, но не суть. Так вот - через 151 прошивка залитала как в открытые двери, а в ту прежднюю ну не хотела и все. Я уже много причин в голове прокрутил, от механических поломок робота - короткое, мб отпало что-то, но деффектов особых не обнаружил. До программных - ошибки в коде, кривой драйвер, занятый COM-порт, неправильно выставленный битрэйт и тп. Но все четно. Даже подумал что вдруг программа с диска как-то влияет. Ведь я программу Flash запускал прямо с диска. Скопировал в папку с файлами для прошивки. Запустил - вроде прошивать, ну или хотябы как-то видеть начал... Но всеравно... Не особо помогло. Программу проверил 10 раз. Ошибок нет, даже простой код типа СТАРТ-ФИНИШ не помог. В ходе этих действий заметил что пусть он и не прошился но стали гореть те светодиоды которые я устанавливал в коде как ON, RED и тп. Горят так будто включены через подтяжку резистора... Тускло. Моторы не крутятся когда выставлял ШИМ на все 255. Менял питание, ставил от БП. Один фиг...
В ходе пыток каким-то образом удалось залить прошивку SelfTest.hex. Ура ! Она зашилась и бот ожил... Вот пока думаю что же с ним было... ?
Давайте разберем как же нам заставить робота не только реагировать на прикосновения, но и как-то уже передвигаться - ездить в зад и в перед, поворачивать, танковый разворот... и так далее.
За управление моторами отвеччают две команды:
1. MotorDir(параметр_1, параметр_2);
"МоторДирекшен"(MotorDirection или MotorDir) отвечает за направление вращения двигателей. Для контроля направления используется "параметр_1,2". Чтобы мотор крутился вперед, нужно задать параметр FWD (Forward - прямо), если нужно назад - параметр RWD (Backward\Revers - назад). Если вы хотите остановить мотор, нужно указать параметр BREAK.
Например:
Quote
MotorDir(FWD,FWD); -Задать движение обоих моторов вперед MotorDir(RWD,RWD); -Задать движение обоих моторов назад MotorDir(FWD,RWD); -Один матор крутим вперед, второй крутим назад. "Танковый разворот" MotorDir(FWD,BREAK); -Один мотор крутим вперед, второй останавливаем.
2. MotorSpeed(параметр_1, параметр_2);
"МоторСпиид"(MotorSpeed) отвечает за скорость вращения наших моторов. Скорость вращения контроллируется специальной вещью - ШИМ - Широтно Импульсная Модуляция. В кратце это пучек импульсов которые с определенной частотой включают мотор. Обычно мы как включаем мотор ? подали постоянное напряжение и мотор раскрутился. А в ШИМе мы подаем импульсами наше "постоянное напряжение" и мотор начинает вращаться. Чем чаще эти импульсы приходят, тем быстрее крутится мотор.
Можете провести эксперимент: возьмите мотор с проводками уже припаянными, возьмите батарейку, и один проводок подключите к батарейке, а второй возьмите в другую руку. Взяли ? Будем считать что вы один провод мотора подключили на +, а вторым будем касаться -. И так. Подключите наш проводок что в руке на минус. Мотор начнет крутиться постоянно с максимальной скоростью. А тепеь давайте симмитируем наш ШИМ: начинайте многократно касаться нашим проводом на - батарейки. Что наблюдаем ? Пока вы касаетесь мотор - крутится, как только провод не касается мотор останавливается. Чем чаще и быстрее вы начинаете касаться батарейки - тем быстрее крутится мотор. Это и есть наш ШИМ, в общих чертах.
Параметр_1 и Параметр_2 задаются числом в диапазоне от 0 - 255. Почему 255 ? Это расчитывается по формулам, зависит от частоты и прочих параметров нашего робота. Если 0 - это значит мотор стоит, 255 - мотор крутится на максимальных оборотах. Если хотите медленно - пробуйте уже сами задавать число в этом диапазоне. По идее, но не факт, минимальное значение при котором мотор еще будет подавать признак работы - 60. Это будет либо писк либо ооооочень медленное вращение, либо жалостный писк.
Например:
Quote
MotorSpeed(255,255); -Моторы на полную мощьность
Ну как вы должно быть уже поняли - одно без другого работать не будет. По этому вот вам цельный код, который вы должны залить в ваш МК:
Quote
#include "asuro.h"
int main(void) { Init(); MotorDir(FWD,FWD); MotorSpeed(255,255); while(1); return 0; }
Прошиваем и проверяем. Сразу после включения ваши моторы должны закрутится вперед. поэксперементируйте с диапазоном чисел и направлением.
Общайтесь с друзьями в нашем Online-чате по робототехнике
Мы рады, что в России открывается все больше кружков по робототехнике и мы стараемся прикладывать к этому свои усилия начиная с 2008 года :) Мы будем очень рады видеть в чате живое общение, обмен опытом между учащимися в робототехнике и просто увлеченными в этом направлении людей. Мы всегда онлайн, приходите, спрашивайте, помогайте другим - давайте сделаем Мир чуточку лучше!
Чтобы не потерять чат и быть всегда с нами на связи - откройте окно чата в новом окне браузера и добавьте его в заколадки. Открыть в новом окне