Управление через интернет
Компас поможет АП разобраться, что модель летит против ветра хвостом вперед (случай не надуман…).
В последней ссылке, как понял, на плате есть проц, но нет софта…
Вот все жду, надеюсь, может хоть в какой ветке появится обсуждение реальных алгоритмов авиагоризонта…
Подключить сервы напрямую к платке не получится в линухе
ну прямо как дети. используйте один из таймеров процессора напрямую.
#include <time.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/neutrino.h>
#include <gulliver.h>
#include <inttypes.h>
#include <unistd.h>
#include <float.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#include "main.h"
#include "AT91SAM9260.h"
static const struct sigevent * TC1_intr (void *area, int id){
unsigned int a;
a = ((AT91PS_TCB)TC_base)->TCB_TC1.TC_SR;
if(inPPMchannel < MAX_CH){
inPPMvalues[inPPMchannel] = ((AT91PS_TCB)TC_base)->TCB_TC1.TC_RA;
inPPMvalues_ms[inPPMchannel] = inPPMvalues[inPPMchannel] * 1280 / 1000;
if(inPPMvalues_ms[inPPMchannel] < 1000 || inPPMvalues_ms[inPPMchannel] > 2000){
inPPMchannel = 0;
return 0;
}
inPPMchannel++;
}
if(inPPMchannel == MAX_CH){
values_ms[0] = inPPMvalues_ms[0];
values_ms[1] = inPPMvalues_ms[1];
values_ms[2] = inPPMvalues_ms[2];
values_ms[3] = inPPMvalues_ms[3];
values_ms[4] = inPPMvalues_ms[4];
values_ms[5] = inPPMvalues_ms[5];
}
//это пауза между посылками
if( ((AT91PS_TCB)TC_base)->TCB_TC1.TC_RB > 5000){
inPPMchannel = 0;
// ll++;
}
return 0;
}
//------------------------------------------------------------------------------------
static const struct sigevent * TC0_intr (void *area, int id){
unsigned int a;
int temp;
//read for reset flags
a = ((AT91PS_TCB)TC_base)->TCB_TC0.TC_SR;
//переведем длинну пакета из мСек в тики таймера
if(channel < MAX_CH){
if(values_ms[channel] > 2000) values_ms[channel] = 2000;
if(values_ms[channel] < 1000) values_ms[channel] = 1000;
values[channel] = values_ms[channel] * 1000 / 1280;
}
((AT91PS_TCB)TC_base)->TCB_TC0.TC_RA = pause_len;
((AT91PS_TCB)TC_base)->TCB_TC0.TC_RC = values[channel] - pause_len;
#ifndef SUM_PPM
((AT91PS_TCB)TC_base)->TCB_TC0.TC_RC = values[channel];
((AT91PS_PIO)PIOA_base)->PIO_CODR = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
switch(channel){
case 0:
((AT91PS_PIO)PIOA_base)->PIO_SODR = CH1;
break;
case 1:
((AT91PS_PIO)PIOA_base)->PIO_SODR = CH2;
break;
case 2:
((AT91PS_PIO)PIOA_base)->PIO_SODR = CH3;
break;
case 3:
((AT91PS_PIO)PIOA_base)->PIO_SODR = CH4;
break;
case 4:
((AT91PS_PIO)PIOA_base)->PIO_SODR = CH5;
break;
case 5:
// ((AT91PS_PIO)PIOA_base)->PIO_SODR = CH6;
break;
}
#endif
channel++;
if(channel >= MAX_CH + 1){
channel = 0;
temp = total_len - values[0] - values[1] - values[2] - values[3] - values[4] - values[5];
#ifdef SUM_PPM
temp += pause_len * MAX_CH;
#endif
((AT91PS_TCB)TC_base)->TCB_TC0.TC_RA = pause_len;
((AT91PS_TCB)TC_base)->TCB_TC0.TC_RC = temp;
}
return 0;
}
//------------------------------------------------------------------------------------
void timers_init(void){
int errvalue;
int TC0_int;
// PPM формирование
errno = EOK;
PIOA_base = mmap_device_memory( 0, 0x100, PROT_READ|PROT_WRITE|PROT_NOCACHE,
MAP_PHYS|MAP_SHARED, (uint64_t)0xFFFFF400 );//AT91C_BASE_PIOA
errvalue = errno;
if (PIOA_base == (unsigned char *) MAP_DEVICE_FAILED){
fprintf(stderr, "Unable to map AT91C_BASE_PIOA\r\n");
fprintf(stderr, "The error generated was %d\r\n", errvalue );
fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
exit(1);
}
#ifdef SUM_PPM
// Configure PIO controllers to periph mode
fprintf(stderr, "UAV: summary PPM output\r\n");
((AT91PS_PIO)PIOA_base)->PIO_ASR = AT91C_PA26_TIOA0 | AT91C_PA27_TIOA1;
((AT91PS_PIO)PIOA_base)->PIO_BSR = 0;
((AT91PS_PIO)PIOA_base)->PIO_PDR = AT91C_PA26_TIOA0 | AT91C_PA27_TIOA1; // Set in Periph mode
#else
// Configure PIO controllers to output
fprintf(stderr, "UAV: channel PPM output\r\n");
((AT91PS_PIO)PIOA_base)->PIO_PER = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
((AT91PS_PIO)PIOA_base)->PIO_OER = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
((AT91PS_PIO)PIOA_base)->PIO_CODR = CH1 | CH2 | CH3 | CH4 | CH5 | CH6;
((AT91PS_PIO)PIOA_base)->PIO_ASR = AT91C_PA27_TIOA1;
((AT91PS_PIO)PIOA_base)->PIO_BSR = 0;
((AT91PS_PIO)PIOA_base)->PIO_PDR = AT91C_PA27_TIOA1; // Set in Periph mode
#endif
//-------------------------------------
//TC0 Configure
errno = EOK;
TC_base = mmap_device_memory( 0, 0x100, PROT_READ|PROT_WRITE|PROT_NOCACHE,
MAP_PHYS|MAP_SHARED, (uint64_t)0xFFFA0000 );//AT91C_BASE_TC0
errvalue = errno;
if (TC_base == (unsigned char *) MAP_DEVICE_FAILED){
fprintf(stderr, "Unable to map AT91C_BASE_TC\r\n");
fprintf(stderr, "The error generated was %d\r\n", errvalue );
fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
exit(1);
}
//TC Block Mode Register
((AT91PS_TCB)TC_base)->TCB_BMR = 0;//TCLK0, TCLK1, TCLK2
((AT91PS_TCB)TC_base)->TCB_TC0.TC_IDR = 0xFFFFFFFF; //disable all ints
// MCK/128
#ifdef SUM_PPM
((AT91PS_TCB)TC_base)->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE
| AT91C_TC_ACPA_SET | AT91C_TC_ACPC_CLEAR;
#else
((AT91PS_TCB)TC_base)->TCB_TC0.TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE;
#endif
errno = EOK;
if(ThreadCtl( _NTO_TCTL_IO, 0 ) == -1){
errvalue = errno;
fprintf(stderr, "Unable to ThreadCtl( _NTO_TCTL_IO, 0 );\r\n");
fprintf(stderr, "The error generated was %d\r\n", errvalue );
fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
}
// Attach interrupt
errno = EOK;
fprintf(stderr, "UAV: InterruptAttach TC0 ");
TC0_int = InterruptAttach(AT91C_ID_TC0, TC0_intr, NULL, 0, 0);
if(TC0_int == -1){
fprintf(stderr, "\r\nCan`t attach interrupt 0x%x\r\n", AT91C_ID_TC0);
fprintf(stderr, "The error generated was %d\r\n", errvalue );
fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
}else{
fprintf(stderr, "OK\r\n");
}
((AT91PS_TCB)TC_base)->TCB_TC0.TC_IER = AT91C_TC_CPCS;// RC Compare
((AT91PS_TCB)TC_base)->TCB_TC0.TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
//-------------------------------------
// разрешим вывод TIOA1 на вход in a TC0 init
//TC1 Configure
((AT91PS_TCB)TC_base)->TCB_TC1.TC_IDR = 0xFFFFFFFF; //disable all ints
// MCK/128
((AT91PS_TCB)TC_base)->TCB_TC1.TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_ABETRG |
AT91C_TC_ETRGEDG_RISING | AT91C_TC_LDRB_RISING | AT91C_TC_LDRA_FALLING | AT91C_TC_CPCTRG;
// установим обработчик прерывания на TC1 для захвата РРМ пакета
errno = EOK;
if(ThreadCtl( _NTO_TCTL_IO, 0 ) == -1){
errvalue = errno;
fprintf(stderr, "Unable to ThreadCtl( _NTO_TCTL_IO, 0 );\r\n");
fprintf(stderr, "The error generated was %d\r\n", errvalue );
fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
}
errno = EOK;
fprintf(stderr, "UAV: Interrupt Attach TC1 ");
TC0_int = InterruptAttach(AT91C_ID_TC1, TC1_intr, NULL, 0, 0);
if(TC0_int == -1){
fprintf(stderr, "\r\nCan`t attach interrupt 0x%x\r\n", AT91C_ID_TC1);
fprintf(stderr, "The error generated was %d\r\n", errvalue );
fprintf(stderr, "That means: %s\r\n", strerror( errvalue ) );
}else{
fprintf(stderr, "OK\r\n");
}
// установим уровень срабатывания
((AT91PS_TCB)TC_base)->TCB_TC1.TC_IER = AT91C_TC_ETRGS;// External Trigger
((AT91PS_TCB)TC_base)->TCB_TC1.TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}
Ну дак он же хочет сделать АП для самолета, а на машинке только провести первые опыты.
Уточнение: не предлагаю совсем отказатся от горизонта и полета. По-моему лучше сначала проверить сколько ресурсов занимает видео. Если мало, то можно нагрузить основной проц расчетом ориентации (и м.б. платку с датчиками подключить по i2c, без usb, ~100$), если много - то придется обсчитывать датчики на другом проце (типа fy21, ~300$).
В последней ссылке, как понял, на плате есть проц, но нет софта…
Исходник во вкладке “Useful links”, внизу ссылка “Source code”.
Вот все жду, надеюсь, может хоть в какой ветке появится обсуждение реальных алгоритмов авиагоризонта…
Вроде сделано два АПа (не ком.разр.), msv(?) и Dikoy, Вам и начинать такую ветку 😃
В последней ссылке, как понял, на плате есть проц, но нет софта…
The board comes programmed with the 8MHz Arduino bootloader and example firmware that tests the outputs of all the sensors. Simply connect to the serial TX and RX pins with a 3.3V FTDI Basic Breakout, open a terminal program to 38400bps and a menu will guide you through testing the sensors.
такое можно себе представить, если модель способна зависать в воздухе.
Я бы сказал что на данном этапе развития проекта, задача слегка неординарная.
Компас поможет АП разобраться, что модель летит против ветра хвостом вперед (случай не надуман…).
Даже если допустить что случай не надуман, компас все равно не поможет… ну представьте, летит самолет, и вдруг начинает лететь назад хвостом вперед (опустим как это могло произойти), что произойдет с данными с компаса? да ничего, вектор не изменится.
Вот все жду, надеюсь, может хоть в какой ветке появится обсуждение реальных алгоритмов авиагоризонта…
Боюсь вызвать возмущение у общественности, но ИМХО нет в них ничего экстраординарного, если вникнуть, сплошные треугольники, и ко- синусы, а в формулы думаю большинству вникать просто незачем… (это то что касается только авиагоризонта, без АП).
Вот интересный открытый проект автопилота code.google.com/p/ardupilot-mega/
и ещё paparazzi.enac.fr/wiki/Main_Page
The board comes programmed with the 8MHz Arduino bootloader and example firmware that tests the outputs of all the sensors.
Т.е. в моем понимании софта нет…
вдруг начинает лететь назад хвостом вперед (опустим как это могло произойти), что произойдет с данными с компаса? да ничего, вектор не изменится.
Скорость встречного ветра больше скорости самолета. АП по направлению полета считает, что самолет правильно ориентирован и продолжает удерживать против ветра (реальная ситуация была). По показанию компаса он бы смог сообразить, что нос самолета ориентирован в противоположенную сторону от базы.
но ИМХО нет в них ничего экстраординарного, если вникнуть, сплошные треугольники, и ко- синусы,
Ну можно так же сказать, что любая прога это только сложения, вычитания и пересылки… 😃 Пока не представляю простого алгоритма (а вдруг он есть?). А калмана боюсь не потяну ни я, ни мой проц…
Уточнение: не предлагаю совсем отказатся от горизонта и полета. По-моему лучше сначала проверить сколько ресурсов занимает видео. Если мало, то можно нагрузить основной проц расчетом ориентации (и м.б. платку с датчиками подключить по i2c, без usb, ~100$), если много - то придется обсчитывать датчики на другом проце (типа fy21, ~300$).
С учетом, что на самолете будет стоят нетбук, то думаю нагрузка от работы АП на проц ничтожно мала. В FY-21, как я понимаю, с этим справляется Атмел с тактовой 8-16 Мгц. В пплане надежности и конфигурируемости системы я бы конечно предпочел многомодульную архитектуру, где каждый модуль выполняет свою ф-ю, но так будет явно дороже и больше весить (и то и то намного).
Компас поможет АП разобраться, что модель летит против ветра хвостом вперед (случай не надуман…).
Задачу, кот. вы хотите решить по идее надо реализововать через ДИСС (Доплеровской измеритель скорост и сноса) или АРК (автоматический радио компас), но в модельных масштабах это нереально. На практике есть ЖПС. Полет модели хвостом вперед вне видимости земли я могу представить с трудом. Да и не забыываем, что наша инет-система работает на высотах до 300-500м, т.е. скорее всего полет ниже облаков.
Компас конечно интересен, но тогда надо здорово лезть в теорию навигации (всякие магнитные склонения и т.п.). Да и датчик компаса выносить надо далеко от метала, т.е. куда-то на конец крыла или киль.
Вот интересный открытый проект автопилота code.google.com/p/ardupilot-mega/
и ещё paparazzi.enac.fr/wiki/Main_Page
По 2-му проекту есть на форуме человек, кот. собрал железо и скоро наверно будут опыты.
Боюсь вызвать возмущение у общественности, но ИМХО нет в них ничего экстраординарного, если вникнуть, сплошные треугольники, и ко- синусы, а в формулы думаю большинству вникать просто незачем… (это то что касается только авиагоризонта, без АП).
АП - это ПИД регулятор. Естественно коэф. настройки надо подбирать. А навигация - действительно треугольники, только надо фильтровать шумы от датчикв, кот. вызваны вибрациями и т.п.
В FY-21, как я понимаю, с этим справляется Атмел с тактовой 8-16 Мгц.
Нет, там ARM с ядром Cortex (STM32F103) и тактовая до 72 МГц. 😃
Полет модели хвостом вперед вне видимости земли я могу представить с трудом.
В прошлом сезоне я сталкивался с этим неоднократно. Уже на высоте в 100 м трудно понять в какую сторону летим. Хорошо еще датчик воздушной скорости был. 😃
По большому счету, имея некоторый опыт, пилот легко сможет отличить “полет хвостом вперед” только по GPS, но научить этому автопилот без компаса - труднее. Например, АП от Samlltim, решает задачу грубо - увеличивая газ до максимального через n секунд неприближения к базе.
Интересная камера:
www.prosystema.ru/index.php/…/466-autovideosq3
Интересная камера:
Да, любопытная. Интересно, наложение координат и т.п отключаемое? Жаль устанавливается горизонтально.
Нет ли где в инете инструкции и примера записи?
Нет, там ARM с ядром Cortex (STM32F103) и тактовая до 72 МГц
Что он считает интересно.
В прошлом сезоне я сталкивался с этим неоднократно. Уже на высоте в 100 м трудно понять в какую сторону летим. Хорошо еще датчик воздушной скорости был. 😃
По большому счету, имея некоторый опыт, пилот легко сможет отличить “полет хвостом вперед” только по GPS, но научить этому автопилот без компаса - труднее. Например, АП от Samlltim, решает задачу грубо - увеличивая газ до максимального через n секунд неприближения к базе.
Кажется понял. Речь идет о том, когда скорость встречного ветра больше воздушной скорости самолета, т.е. он летит хвостом вперед относительно земли. Я вначале это не понял.
Можно анализировать направление вектора движения формируемого с ЖПС данных и при обнаружении его изменениябольше, чем на 90 градусов без изменения вектора направления движения, получаемого с гироплатформы, сделать вывод, что летим задом наперед. Ну или сравнивать значение воздушной и ЖПС скорости.
С компасом конечно проще на первый взгляд. Если компас особо не стоит лишних денег, то конечно пусть он будет. Может пригодится.
Интересная камера:
www.prosystema.ru/index.php/…/466-autovideosq3
Ничего интересного не вижу. Координаты скорее всего на видео не накладываются, а записываются в отдельный файл. Потом спец. прогой все это можно смотреть. На авто видеорегистраторах с ЖПС часто вообще без спец. проги ничего не увидишь, т.к. используются свои форматы файлов.
Также нет уверености, что при записи на видеовыходах есть сигнал. Возможно он есть только при просмотре. А вообще таких устройств много кто выпускает. Например DOD. К-во видео приемлимое. В сети много примеров.
Что он считает интересно.
ИМХО корректирует дрейф гироскопа… И похоже не всегда безупречно… У Вас есть идеи, как это сделать просто и надежно?😉
Поставить гироскоп с меньшим дрейфом, но значительной большей ценой ))
Честно говоря не вижу проблем с дрейфом гироплатформы. Мы ж ее используем для стабилизации положения АП, а не навигации. Т.е. нас интересуют краткосрочные измерения курса, позволяющие выявить разворот ЛА, а не отслеживать его курс. Курс мы вполне можем брать по ЖПС.
Т.е. в моем понимании софта нет…
…
Leading IMU-based autopilot examples:
We recommend ArduPilotMega (APM), which was created by the DIY Drones community. It can fly planes, quadcopters and helicopters. It is available as a kit for $255 or pre-assembled and tested for $350.
“APM is part of a full UAV system, including powerful ground station and mission planning software. It can fly missions with hundreds of 3D waypoints, execute automatic takeoff and landing and supports mission commands such as photos and loitering over a target spot. It is fully open source (both hardware and software). It is the most popular open source autopilot available today.”
It is fully open source (both hardware and software) - есть всё, что душа пожелает, главное поискать. А если покупать готовое, то попробуйте найти дешевле с такими характеристиками.
Недавно наткнулся на этот ресурс, и понял, что городить самому уже не имеет смысла, только если для самосовершенствования.
Недавно наткнулся на этот ресурс, и понял, что городить самому уже не имеет смысла, только если для самосовершенствования.
Альтернатива это хорошо, глядишь и Ардупилотчики зашевелятся активнее, а может и производители систем радиоуправления, к тому же я планирую сделать систему не привязанную к какому-то определенному железу по возможности. Еще один плюс - не надо долго и нудно писать в техподдержку, чтоб добавили фичи/исправили баги.
Yotу уже поделили, будут строить LTE, все только начинается!
Т.е. нас интересуют краткосрочные измерения курса, позволяющие выявить разворот ЛА
Лично меня (уж извините за частный подход) интересует только надежное определение крена и тангажа. Если существуют доступные гироскопы, способные выдержать приемлемый дрейф нуля без дополнительной коррекции за все время полета , готов признать, что отстал от жизни… И буду благодарен за ссылку.
We recommend ArduPilotMega (APM), which was created by the DIY Drones community.
Ну это уже другой девайс и за другие деньги…
Недавно наткнулся на этот ресурс, и понял, что городить самому уже не имеет смысла, только если для самосовершенствования.
Да никогда имхо особого смысла в этом не было… Можно просто телевизер посмотреть на диване, там даже FPV иной раз показывают… Шутка…
А серьезно, точнее говоря - исключительно для самореализации.
Максим, извините, заоффил топик…
Всем привет
Вот тоже раздумываю над подобной идеей и нашел вашу ветку
rcopen.com/forum/f4/topic224807
Наверное продолжать буду у вас 😃
Нет, там ARM с ядром Cortex (STM32F103) и тактовая до 72 МГц.
Что он считает интересно.
ИМХО корректирует дрейф гироскопа… И похоже не всегда безупречно…
Ничего он не считает, и если там стоит относительно быстрый проц, это не значит что он работает хотя бы на 10 % своей вычислительной мощности.
Вот пример
rcopen.com/forum/f4/topic198243/41
обычный приемник и туда засунули точно такой же проц.
Разгадка проста - посмотрите цены:
www.terraelectronica.ru/catalog.php?ID=769&Search=…
А вот например цены на Мегу128:
www.terraelectronica.ru/catalog.php?ID=769&Search=…
а посчитать что в китае да еще и оптом это намного дешевле.
Да и можно добавить что чем мощнее проц, тем меньше надо думать над оптимизацией кода, вообще программировать можно не заморачиваясь, проц позволит.
Что касается вычисления авиагоризонта, - не забывайте что кроме гироскопов, есть 3-осевые аксели, которые указывают направления вектора g, который направлен вниз, и сильно отличается на фоне любых вибраций, если полет самолета прямолинеен с равномерной скоростью, то аксель весьма однозначно укажет и крен и тангаж, другое дело виражи, и вектор ускорения достаточно сильно изменится, но для этого есть гироскопы, которые вместе с акселями могут указать значения крена и тангажа, ИМХО никаких Калманов туда городить не надо, просто геометрия.
ИМХО никаких Калманов туда городить не надо
Вот и фейтехвцы так думали, вероятно, но для возможности Кальмана в перспективе - заложили проц с запасом.
В результате горизонт Фишек, хоть и лучше любых пиродатчиков, временами врет безбожно, а где там ошибка фейтеховцы либо не знают, либо не хотят знать.
Разгадка проста - посмотрите цены:
Да, и это самое удивительное, когда цена 32-бит ARM кристалла почти равна 8-ми разрядной однокристалке, которая к тому-же стала резко дефицитной. Единственно что сдерживает программистов, накопленный программный багаж и лень перехода на новую архитектуру. 😃
есть 3-осевые аксели, которые указывают направления вектора g, который направлен вниз, и сильно отличается на фоне любых вибраций, если полет самолета прямолинеен с равномерной скоростью, то аксель весьма однозначно укажет и крен и тангаж, другое дело виражи, и вектор ускорения достаточно сильно изменится, но для этого есть гироскопы, которые вместе с акселями могут указать значения крена и тангажа, ИМХО никаких Калманов туда городить не надо, просто геометрия.
Т.е. есть два заведомо недостоверных параметра:
- вектор ускорения, который действительно показывает ускорения свободного падения, но только в те счастливые моменты, когда наш ЛА летит прямолинейно и равномерно (те. практически никогда). По каким критерям однозначно определить этот момент и как трактовать эти данные во все остальное время? Ну еще не забыть шум и вибрацию, которые тоже надо как-то надежно отсекать.
- скорость поворота, по которой действительно интегрированием можно определить смещение. К сожалению с необратимой накапливаемой ошибкой, зависящей от кучи факторов.
Треугольники говорите… 😃 Раскажите про них разработчикам фишки и Тимофею, а то он что-то подзастрял со своим IMU… 😃
ЗЫ Калман имхо не некоторый законченный черный ящик, в который достаточно запустить несколько сигналов с ошибками и он волшебным образом выдаст правильный результат. Это всего лишь обобщенная методология решения подобных задач. И его конкретная реализация под конкретную проблему определяет возможность успеха. Почему то думаю, что в фишке он все же есть…
ЗЫЫ Все, все… замолкаю… когда действительно созрею, создам отдельную тему.