Много лет работаю в области создания средств захвата и обработки сигналов от бортовых и береговых навигационных РЛС. Примерно года два назад выпустил последнюю, на сегодняшний день, версию нашей платы RVAQ (Radar Video AcQuisition) и задумался, чем в жизни заняться дальше. Хотелось чего-то нового и неизведанного. Выбор пал на неохваченную мной до сих пор область — цифровой радиоприем с легким заходом в СВЧ-область.
Это первая глава, посвященная начальной постановке задачи.
С чего начать, если никогда профессионально не занимался цифровым радиоприемом, если не считать приемник «Мишутка», собранный в детстве? Конечно, с
1. Полоса приема не менее 6 МГц (162-156=6)
2. Чувствительность не хуже -110дБм, а то засмеют
3. Большой динамический диапазон, так как когда слушаешь на берегу судно в море за 30 миль, рядом обязательно кто-то заорет своими 25-ю ваттами. Для приличных приемников уровень блокирования должен быть не меньше 70дБ. Забегая немного вперед, скажу, что получилось реализовать более 90дБ по блокированию. Одним словом, RTL-SDR решительно не соответствовал ожиданиям. Прикидку начал, как ни странно, с выбора АЦП. Так как если в природе нет соответствующих (хотя бы в теории) АЦП, то и браться не стоит. Такой АЦП нашелся.
Теперь нужно выбрать архитектуру приемника. Обзор актуальных решений, изучение элементной базы и интуиция позволили остановиться на приемнике прямого преобразования. Также решено было перенести в ноль частоты интересующий участок спектра при помощи квадратурного демодулятора и работать в первой зоне Найквиста, чтобы максимально утилизировать все качества выбранного АЦП.
clear all;
k = 1.381e-23; % Joule/K - Boltzmann's Constant
T0 = 290; % K - temperature
% Encoding Windows-1251
% 1. Функциональная схема
% 1010 - Схема защиты входных каскадов
% 1011 - Преселектор
% 1012 - Управляемый МШУ (вкл/выкл.)
% 1013 - Фильтр основной селекции
% 1014 - Управляемый усилитель петли АРУ
% 1015 - Квадратурный смеситель
% 1021, 1022 - Фильтры низкой частоты.
% 1031, 1032 - Низкочастотные усилители
% 1041, 1042 - Фильтры низкой частоты АЦП
% 1051, 1052 - АЦП
% 2. Системная диаграмма радиотракта для анализа мощности шумов и чувствительности
Rrf_inp_ohm = 50; % Ohm - входной импеданс.
% 2011 - Преселектор
BWrf_ekv_prf_hz = 20.0e6; % Hz - Эквивалентная полоса пропускания преселектора
Lrf_max_prf_db = 1.0; % dB - Максимальный уровень затухания преселектора в рабочей полосе РПУ (insertion loss)
% 2012 - МШУ
% (для примера взяты параметры Agilent MGA-71543 с учетом реализационных потерь)
Grf_lna_db = 16.0; % dB - Коэффициент усиления МШУ
NFrf_lna_db = 1.0; % dB - Коэффициент шума МШУ
% 2013 - Фильтр основной селекции
BWrf_ekv_fms_hz = 6.0e6; % Hz - Полоса пропускания фильтра основной селекции
Lrf_max_fms_db = 4.0; % dB - Максимальный уровень затухания фильтра основной селекции в полосе пропускания (insertion loss)
% 2014 - Усилитель высокой частоты
% (для примера взяты параметры Agilent MGA-71543 с учетом реализационных потерь)
Grf_amp_db = 16.0; % dB - Коэффициент усиления УВЧ
NFrf_amp_db = 1.0; % dB - Коэффициент шума УВЧ
% 2015 - Квадратурный смеситель
% (для примера взяты параметры Analog Devices ADL5387)
Grf_mix_db = 4.5; % dB - Коэффициент усиления квадратурного смесителя
NFrf_mix_db = 15.0; % dB - Коэффициент шума квадратурного смесителя
IP1dBrf_mix_dbw = 13.0 - 30.0; % dBW - Input P1dB (IP1dB)
% 3. Системная диаграмма цифрового приемника для анализа чувствительности и максимально допустимого уровня блокирующего сигнала
% 3011 - Радиотракт
% Коэффициент шума радиотракта (db)
NFrf_sys_db = pow2db( ( db2pow( Lrf_max_prf_db ) ) + ...
( db2pow( NFrf_lna_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db )) + ...
( db2pow( Lrf_max_fms_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db ) * db2pow( Grf_lna_db )) + ...
( db2pow( NFrf_amp_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db ) * db2pow( Grf_lna_db ) * db2pow( -Lrf_max_fms_db )) + ...
( db2pow( NFrf_mix_db ) + 1 ) / ( db2pow( -Lrf_max_prf_db ) * db2pow( Grf_lna_db ) * db2pow( -Lrf_max_fms_db ) * db2pow( Grf_amp_db )) ...
);
% Коэффициент усиления радиотракта (dB)
Grf_sys_db = ( Grf_lna_db + Grf_amp_db + Grf_mix_db ) - ( Lrf_max_prf_db + Lrf_max_fms_db );
% Полоса сигнала на выходе радиотракта (Hz)
BWrf_sys_hz = BWrf_ekv_fms_hz;
% 3012 - Baseband LPF
Lbb_lpf_db = 9; % dB - Максимальный уровень затухания Baseband LPF в полосе пропускания (insertion loss)
% 3013 - Baseband УНЧ (LTC6400-14)
Gbb_opa_db = 0; % dB - Коэффициент усиления УНЧ
NFbb_opa_db = 0; % dB - Коэффициент шума УНЧ
% Эквивалентный коэффициент усиления УНЧ, состоящего из фильтра и ОУ (dB)
Gbb_lfa_db = Gbb_opa_db - Lbb_lpf_db;
% Коэффициент шума системы от входа до выхода УНЧ (dB) - практически не поменялся.
NFbb_sys_db = pow2db( ( db2pow( NFrf_sys_db ) ) + ...
( db2pow( NFbb_opa_db ) + 1 ) / ( db2pow( Grf_sys_db )) ...
);
% Коэффициент усиления системы от входа до выхода УНЧ (dB)
Gbb_sys_db = Grf_sys_db + Gbb_lfa_db;
% Полоса сигнала в основной полосе (Hz) - не поменялась
BWbb_sys_hz = BWrf_sys_hz;
% Мощность шума на выходе УНЧ в основной полосе (dBW)
PNbb_out_dbw = pow2db( k * T0 * BWrf_sys_hz ) + NFbb_sys_db + Gbb_sys_db;
% 3014 - АЦП
% (для примера взяты параметры 1 канала Linear Technology LTC2271)
FSadc_hz = 20.0e6; % Hz - Sampling rate
SNadc_fs_db = 84; % dB - SNR
NBadc_fs_bits = 16; % bits - Full scale bits
Vadc_fs_v = 2; % V - Full scale voltage
Radc_inp_ohm = 1000; % Ohm - Input ADC resistance
% Мощность синусоидального сигнала при размахе на полную шкалу для пары АЦП (dBW)
PFSadc_inp_dbw = pow2db( 2.0 * (( Vadc_fs_v * 0.5 * sqrt( 0.5 )) ^ 2 ) / Radc_inp_ohm );
% Мощность собственного шума пары АЦП (dBW)
PNadc_snr_dbw = PFSadc_inp_dbw - SNadc_fs_db;
% Мощность шума квантования пары АЦП (dBW)
PNadc_qan_dbw = PFSadc_inp_dbw - ( NBadc_fs_bits * mag2db( 2 ) + mag2db( sqrt( 6 ) / 2 )); % adding correction factor for sinusoidal signal
% 3015 - Эквивалентная схема обработки сигнала с ЧМ
SNfm_min_db = 12.0; % dB - минимальное отношение сигнал-шум для приема голосовых передач в режиме ЧМ
BWfm_max_hz = 25.0e3; % Hz - максимальная ширина полосы канала, предназначенного для передачи речи
BWfm_min_hz = 6.25e3; % Hz - минимальная ширина полосы канала, предназначенного для передачи речи
% Чувствительность радиотракта (dBW) при идеальных АЦП и цифровой обработке канала передачи (минимальная мощность в полосе канала передачи)
Pfm_min_dbw = pow2db( k * T0 * BWfm_max_hz ) + NFbb_sys_db + SNfm_min_db;
% Мощность сигнала на выходе унч при синусоидальном входном сигнале, по уровню равным уровню чувствительности (dBW)
Pfm_min_bb_sys_dbw = Pfm_min_dbw + Gbb_sys_db;
% Мощность сигнала на входе смесителя. Такой сигнал после прохождения всех последующих каскадов
% на выход АЦП даст размах полной шкалы (dBW)
PFSmix_inp_dbw = PFSadc_inp_dbw - Gbb_lfa_db - Grf_mix_db;
% Запас линейного участка передаточной характеристики смесителя (по входу)
deltaPmix_inp_lin = IP1dBrf_mix_dbw - PFSmix_inp_dbw;
% Разрешение БПФ равно минимальной полосе канала
Nfft = 2 * (( FSadc_hz / 2 ) / BWfm_min_hz );
Nsmp = Nfft;
tmp_fft_buf = zeros( 1, Nfft );
tmp_acc_buf = zeros( 1, Nfft );
tmp_smp_buf = zeros( 1, Nsmp );
max_acc = 30;
for acc = 1:max_acc
% Принимаемый сигнал 1
% на входе приемного тракта - сигнал на уровне чувствительности приемного тракта
% на входе АЦП - сигнал прошедший все каскады преобразования и усиления
PS1 = db2pow( Pfm_min_bb_sys_dbw );
WS1 = 25.0e3;
FS1 = 1.0e6;
Fstart = FS1;
Fstop = Fstart + WS1 - BWfm_min_hz;
Pstep = PS1 / ( WS1 / BWfm_min_hz );
PS1_smp_buf = zeros( 1, Nsmp );
for f = Fstart:BWfm_min_hz:Fstop
phi_acc = 2.0 * pi * rand( 1 ); % random phase
phi_stp = pi * ( f / ( FSadc_hz / 2 ));
for k = 1:Nsmp
PS1_smp_buf( k ) = PS1_smp_buf( k ) + sqrt( Pstep ) * exp( j * phi_acc );
phi_acc = phi_acc + phi_stp;
if( phi_acc > ( 2.0 * pi ))
phi_acc = phi_acc - 2.0 * pi;
else
if( phi_acc < ( -2.0 * pi ))
phi_acc = phi_acc + 2.0 * pi;
end
end
end
end
% Принимаемый сигнал 2
% на входе приемного тракта - сигнал по уровню близок блокировке приемного тракта
% на входе АЦП - сигнал прошедший все каскады преобразования и усиления
PS2 = db2pow( PFSadc_inp_dbw - 1.0 ); % -1 dB back off
WS2 = 25.0e3;
FS2 = -2.0e6;
Fstart = FS2;
Fstop = Fstart + WS2 - BWfm_min_hz;
Pstep = PS2;
PS2_smp_buf = zeros( 1, Nsmp );
for f = Fstart:BWfm_min_hz:Fstop
phi_acc = 2.0 * pi * rand( 1 ); % random phase
phi_stp = pi * ( f / ( FSadc_hz / 2 ));
for k = 1:Nsmp
PS2_smp_buf( k ) = PS2_smp_buf( k ) + sqrt( Pstep ) * exp( j * phi_acc );
phi_acc = phi_acc + phi_stp;
if( phi_acc > ( 2.0 * pi ))
phi_acc = phi_acc - 2.0 * pi;
else
if( phi_acc < ( -2.0 * pi ))
phi_acc = phi_acc + 2.0 * pi;
end
end
end
end
% Шум на выходе унч основной полосы
PN1 = db2pow( PNbb_out_dbw );
WN1 = BWbb_sys_hz;
Pfull_bw = PN1 * ( FSadc_hz / WN1 );
PN1_smp_buf = sqrt( 0.5 * Pfull_bw ) * complex( randn( 1, Nsmp ), randn( 1, Nsmp ));
tmp_fft_buf = fftshift( fft( PN1_smp_buf ));
tmp_msk_buf = zeros( 1, Nfft );
tmp_msk_buf((( Nfft / 2 ) - (( WN1 / FSadc_hz ) * ( Nfft / 2 )) + 1 ) : (( Nfft / 2 ) + (( WN1 / FSadc_hz ) * ( Nfft / 2 )))) = ...
ones( 1, (( WN1 / FSadc_hz ) * Nfft ));
tmp_fft_buf = tmp_fft_buf .* tmp_msk_buf;
PN1_smp_buf = ifft( fftshift( tmp_fft_buf ));
% Шум аналоговой части АЦП
PN2 = db2pow( PNadc_snr_dbw ) - db2pow( PNadc_qan_dbw );
%PN2 = db2pow( PNadc_snr_dbw );
Pfull_bw = PN2;
PN2_smp_buf = sqrt( 0.5 * Pfull_bw ) * complex( randn( 1, Nsmp ), randn( 1, Nsmp ));
% Ограничитель и квантователь АЦП
QAN_smp_buf = PS1_smp_buf + PS2_smp_buf + PN1_smp_buf + PN2_smp_buf;
QAN_delta = Vadc_fs_v / ( 2 ^ NBadc_fs_bits );
QAN_smp_buf = round( QAN_smp_buf ./ QAN_delta ) .* QAN_delta;
QAN_smp_buf_re = real( QAN_smp_buf );
QAN_smp_buf_re( find( QAN_smp_buf_re > ( Vadc_fs_v / 2.0 ))) = Vadc_fs_v / 2.0;
QAN_smp_buf_re( find( QAN_smp_buf_re < ( -Vadc_fs_v / 2.0 ))) = -Vadc_fs_v / 2.0;
QAN_smp_buf_im = imag( QAN_smp_buf );
QAN_smp_buf_im( find( QAN_smp_buf_im > ( Vadc_fs_v / 2.0 ))) = Vadc_fs_v / 2.0;
QAN_smp_buf_im( find( QAN_smp_buf_im < ( -Vadc_fs_v / 2.0 ))) = -Vadc_fs_v / 2.0;
QAN_smp_buf = complex( QAN_smp_buf_re, QAN_smp_buf_im );
% Спектр после ADC
tmp_smp_buf = QAN_smp_buf;
%tmp_smp_buf = PS1_smp_buf + PS2_smp_buf + PN1_smp_buf + PN2_smp_buf;
tmp_fft_buf = fft( tmp_smp_buf ) / Nfft;
tmp_acc_buf = tmp_acc_buf + ( tmp_fft_buf .* conj( tmp_fft_buf ));
end
tmp_acc_buf = tmp_acc_buf ./ max_acc;
f = linspace(( -FSadc_hz / 2 ) + BWfm_min_hz, FSadc_hz / 2, Nfft );
plot( f, pow2db( fftshift( tmp_acc_buf )));
xlim( [( -FSadc_hz / 2 ), ( FSadc_hz / 2 )] );
ylim( [-150.0, -20.0] );
title('Power Spectrum')
xlabel('Frequency (Hz)')
ylabel('P(f) dBW')
drawnow;
Что ж, модель показала жизнеспособность идеи — чувствительность -115дБм, блокровка под 90дБ.
Далее, в ПЛИС, с помощью блока нормализации сигналов квадратур, мы уберем постоянную составляющую, справимся с зеркальным каналом и подадим сигнал на вход DDC. После сноса интересующей частоты в ноль, сигнал попадет на цепочку цифровых CIC — и FIR-фильтров, формирующих канальную полосу. Разумеется, если мы хотим одновременно принимать не один канал, у нас должна быть кучка DDC и фильтров.
В следующей статье, если публике будет интересно, расскажу о дальнейших шагах в моделировании, и оценке аппаратных ресурсов ПЛИС.
Комментарии (36)
gapel
11.07.2016 15:50очень интересно.Более того, было бы очень интересно про радары и плату захвата. Ибо не хватает такой информации на этом ресурсе)))
pacific182
11.07.2016 15:57А что за плата RVAQ и «наша» — это чья? Если не секрет, конечно.
Electrovoicer
11.07.2016 16:02Не уверен, что тут можно давать подобные ссылки. Да и тема специфическая. Просто «наша» — это значит наша )) Мы — небольшая компания в Санкт-Петербурге, которая разрабатывает подобные вещи уже более 10 лет. Я являюсь архитектором системы, и, по совместительству, занимаюсь разработкой «железа».
gapel
11.07.2016 16:05ну если не военный продукт, с секретностью, то почему просто не сделать статью с указанием параметров))) На правах рекламы. Приятно что есть еще у нас такие компании, и думаю это было бы интересно многим.
Electrovoicer
11.07.2016 16:11+3Нет, проект не военный, секретности нет, и пиар не помешает. Просто техника двойного назначения требует внимательности при написании статей. Статью напишу.
gapel
11.07.2016 18:16кстати про секретность. А схемы в лучшем разрешении нет?
Electrovoicer
11.07.2016 23:19Это всего лишь блок-схема радио-фронтэнда, ничего особо выдающегося. Преселекторы, аттенюатор, МШУ, смеситель, гетеродин.
jok40
12.07.2016 16:50И тем не менее, я тоже присоединяюсь к просьбе gapel: раз уж опубликовали схему, то хотелось бы, всё-таки, чтобы на ней хотя бы надписи читались. Можно было бы сделать картинку кликабельной — чтобы по клику на неё открывался нормально читаемый вариант.
ZEvS_Cat
12.07.2016 02:22-1Простите, но стоит ли ждать 70дБ динамический диапазон на приемнике, в основе которого квадратурный демодулятор?
pvvv
12.07.2016 16:49У АЦП полоса 200МГц по входу, нельзя ли было перенести вниз самим АЦП, причем одноканальным, просто взяв соответствующую нечётную зону Найквиста (15ю), а всё остальное уже делать в цифре?
Линеар делает хорошие АЦП, собственные шумы и так несколько нВ/Гц^0.5, там и усиливать-то не особо много надо, одного МШУ хватило бы, по сравнению со смесителем.
Взять только АЦП с частотой дискретизации немного побольше, LTC220X, чтобы требования к входному полосовому фильтру ослабить.hdmi
12.07.2016 17:54Простите за сомнительный вопрос: я правильно понимаю, что 15ая зона Найквиста в данном случае (при частоте дискретизации 20МГц) — это полоса 150МГц — 160МГц? Сигнал лежит в 156МГц — 162МГц, т.е. на стэке зон.
pvvv
12.07.2016 18:21Частоту дискретизации АЦП можно сделать 20.5МГц, чтобы сигнал попал ровно в середину 15 зоны или 18.17МГц, чтобы в середину 17.
hdmi
12.07.2016 18:43Спасибо, все понял.
Однако, указанный в статье АЦП больше 20МГц не потянет. А 18.17МГц вроде как и получается, только как вы и заметили выше, полосовой фильтр будет серьезного порядка.Electrovoicer
13.07.2016 14:57Дело в том, что при работе в зонах выше первой, заметно (в рамках задачи) ухудшаются такие параметры, как SFDR и SNR. Поэтому решено было делать Zero-IF и работать в первой зоне Найквиста, чтобы получить максимальные характеристики. По этой же причине не используются более быстрые АЦП — шумы еще можно было бы обменять на полосу, а вот с линейностью ничего не поделаешь…
pvvv
13.07.2016 16:14Линейность от частоты не должна зависеть, она там у всех +-0.5LSB, даже у 100МГц LTC2207.
Шумы тоже одинаковые, если их плотность смотреть в человеческих нВ/Гц, вон у LTC2204 формально шумы почти в два раза выше, но так и полоса почти в 4 раза больше, так что плотность-то абсолютно та же.
SFDR ухудшается немного, но дополнительные усилители и смеситель линейность тоже совсем не улучшают, и ухудшается он у АЦП, судя по графикам, только при сигнале на всю шкалу, если амплитуду чуть скрутить остаются те же -110-120 (dBFS) — просто уровень шумов.
Тактирование только нужно очень аккуратное, чтобы в шумы не росли, а определялись только собственными 80fs aperture jitter.Electrovoicer
15.07.2016 20:01Какое бы ни было аккуратное тактирование, линейность от частоты все же зависит, и довольно заметно. Если мы заглянем в даташит LTC2271, или в любой другой даташит любого другого быстрого конвейерного АЦП с широкополосным sample&hold, позволяющим работать в N-ной зоне Найквиста, мы расстроимся, обнаружив, что SFDR снижается как минимум на 3дб, а то и больше, в каждой последующей зоне…
pvvv
16.07.2016 17:52
Не знаю откуда взялась цифра 3дБ ухудшения на каждую следующую зону, вот картинки sfdr из даташита, ltc2204 при входе 140МГц (7 зона) и ltc2271 при 5 МГц, третья — наложенные друг на друга. Найдите 10 отличий.
Опять же сравнивать надо не голые АЦП, а один АЦП по сравнению с АЦП + усилитель и смеситель, а они sfdr тоже не повышают.Electrovoicer
18.07.2016 12:04Так вот Вы и попробуйте, с учетом драйвера и остального тракта, получить одинаковую линейность на 5 и на 140МГц. Буду рад посмотреть на результаты… Мы ведь не сферический конь в вакууме обсуждаем, а реальную жизнь, в которой есть реальные драйверы/трансформаторы.
pvvv
18.07.2016 15:36А вышеприведённые картинки из даташита, они не достаточно достоверны?
Вопрос-то в том и заключается, что если уж сам по себе АЦП всё равно нормально измеряет и на высокой частоте, не будет ли лучше для той же линейности упростить тракт (одинаковый для обоих случаев), только выкинуть смеситель и дополнительный каскад предусилителя, которые в реальной жизни эту самую линейность будут только ухудшать. У Вас в модели линейность тракта никак не учитывается, так что утверждать что всё упрётся исключительно в sfdr ацп тоже не совсем правильно.
Я пробовал, но мне надо было очень узкополосный ЯМР сигнал в широком диапазоне частот, соответственно интересовали только шумы, линейности не смотрел.
Вот и хотелось бы понять чем такой подход будет лучше/хуже для радиоприёмника.
hdmi
12.07.2016 16:50+1Очень интересно, с нетерпением жду продолжения! И на правах заинтересованного читателя, смею попросить: не скупитесь на детали (прим. диаграмма низкого разрешения — негодую в попытках ее прочитать). Понятно, что для серьезных дядек все это «само-собой-разумеется», а вот для тех кто пытается по крупицам информации понять матерьял, любая мелочь полезна. Спасибо!
Rumlin
13.07.2016 14:19Перечислю желаемые свойства такого приемника
Т.е. цель записывать переговоры и AIS?Electrovoicer
13.07.2016 14:52Да, изначально было так. Но приемник оказался богаче, и будет уметь гораздо больше.
old_bear
13.07.2016 14:51Интересно будет глянуть на ресурсоёмкость фильтров, сравнить со своими старыми работами. Так что я тоже присоединяюсь к ожидающим следующих частей.
Electrovoicer
15.07.2016 20:08+1Пока дам затравку, сказав, что в недорогой кристалл Lattice LFE3-70 удалось запихнуть примерно 30 GMACS плюс 96 CIC-5 фильтров. Если переносить это на ПК, с учетом накладных расходов в виде арбитража, сумматоров и линий задержек понадобится парочка топовых Core i7…
Что еще любопытно. MATLAB сгенерил некий Verilog-код, в наш целевой кристалл влезло только 8 приемников. После жесточайшей ручной оптимизации поместилось 48… почувствуйте разницу… Думаю, отдельная глава будет посвящена этому.pvvv
17.07.2016 17:52Вместо пары топовых i7, самая дешевая видеокарта за 50$ по GMACам эту недорогую плисину за 150$ вполне уделает.
А сигнал с полосой 6МГц внутрь ПК даже через usb2 можно попробовать пропихнуть, не говоря про usb3.Electrovoicer
18.07.2016 12:12Возможно, и уделает, но это иной подход, который мы не обсуждаем в рамках данной статьи. Шейдеры не всесильны, они хорошо подходят для определенных классов задач. Кроме того, 2 х 20Мспс х 16бит это 80МБайт в секунду, что не по силам для usb2. Кроме того, очень немного в природе серьезных приборов с интерфейсом usb. Этот интерфейс для мышек и клавиатур, но никак не для вещей, гарантирующих 146%-надежность, особенно в критических применениях.
old_bear
18.07.2016 16:45Честно говоря, я не удивлён результатами из Матлаба. Он известен своей прожорливостью к ресурсам FPGA как и любой HLS.
По поводу фильтров, почитаю в следующей статье. Всегда интересно глянуть на чужие достижения для оценки своих. :)
baghear
Мне думается, реальное фото устройства лучше бы смотрелось чем картинка, а то не понятно готово устройство или нет.
Electrovoicer
Устройство готово, картинка будет в одной из следующих статей.