Как сделать металлоискатель терминатор 3 своими руками: схема и печатная плата
Содержание:
- Введение в класс std::string_view
- Описание
- Нюансы std::string_view
- Функция data()
- Другие спецэффекты
- Проблемы владения и доступа
- Забудьте про «Парк юрского периода»: рапторы были охотниками-одиночками
- Как сделать своими руками металлоискатель «Терминатор 3» –подробная инструкция
- Операторская работа
- От металла Филда до Терминатора — рукой подать
- Схема металлодетектора
- Настройка металлоискателя
- Манипуляторы ввода –вывода
- Итоги
Введение в класс std::string_view
В качестве следующего примера возьмем окно в вашем доме и автомобиль, стоящий на улице неподалеку. Вы можете посмотреть через окно и увидеть машину, но при этом вы не можете дотронуться до машины или передвинуть её. Ваше окно лишь обеспечивает вид на автомобиль, который является отдельным независимым от вас объектом.
В стандарте C++17 вводится еще один способ использования строк — с помощью класса std::string_view, который находится в заголовочном файле string_view.
В отличие от объектов класса std::string, которые хранят свою собственную копию строки, класс std::string_view обеспечивает представление (англ. «view») для заданной строки, которая может быть определена где-нибудь в другом месте.
Попробуем переписать код предыдущего примера, заменив каждое вхождение на :
#include <iostream>
#include <string_view>
int main()
{
std::string_view text{ «hello» }; // представление для строки «hello», которое хранится в бинарном виде
std::string_view str{ text }; // представление этой же строки — «hello»
std::string_view more{ str }; // представление этой же строки — «hello»
std::cout << text << ‘ ‘ << str << ‘ ‘ << more << ‘\n’;
return 0;
}
1 |
#include <iostream> intmain() { std::string_viewtext{«hello»};// представление для строки «hello», которое хранится в бинарном виде std::string_viewstr{text};// представление этой же строки — «hello» std::string_viewmore{str};// представление этой же строки — «hello» std::cout<<text<<‘ ‘<<str<<‘ ‘<<more<<‘\n’; return; } |
В результате мы получим точно такой же вывод на экран, как и в предыдущем примере, но при этом у нас не будут созданы лишние копии строки . Когда мы копируем объект класса std::string_view, то новый объект std::string_view будет «смотреть» на ту же самую строку, на которую «смотрел» исходный объект. Ко всему прочему, класс std::string_view не только быстр, но и обладает многими функциями, которые мы изучили при работе с классом std::string:
#include <iostream>
#include <string_view>
int main()
{
std::string_view str{ «Trains are fast!» };
std::cout << str.length() << ‘\n’; // 16
std::cout << str.substr(0, str.find(‘ ‘)) << ‘\n’; // Trains
std::cout << (str == «Trains are fast!») << ‘\n’; // 1
// Начиная с C++20
std::cout << str.starts_with(«Boats») << ‘\n’; // 0
std::cout << str.ends_with(«fast!») << ‘\n’; // 1
std::cout << str << ‘\n’; // Trains are fast!
return 0;
}
1 |
#include <iostream> intmain() { std::string_viewstr{«Trains are fast!»}; std::cout<<str.length()<<‘\n’;// 16 std::cout<<str.substr(,str.find(‘ ‘))<<‘\n’;// Trains std::cout<<(str==»Trains are fast!»)<<‘\n’;// 1 // Начиная с C++20 std::cout<<str.starts_with(«Boats»)<<‘\n’;// 0 std::cout<<str.ends_with(«fast!»)<<‘\n’;// 1 std::cout<<str<<‘\n’;// Trains are fast! return; } |
Т.к. объект класса std::string_view не создает копии строки, то, изменив исходную строку, мы, тем самым, повлияем и на её представление в связанном с ней объектом std::string_view:
#include <iostream>
#include <string_view>
int main()
{
char arr[]{ «Gold» };
std::string_view str{ arr };
std::cout << str << ‘\n’; // Gold
// Изменяем ‘d’ на ‘f’ в arr
arr = ‘f’;
std::cout << str << ‘\n’; // Golf
return 0;
}
1 |
#include <iostream> intmain() { chararr{«Gold»}; std::string_viewstr{arr}; std::cout<<str<<‘\n’;// Gold // Изменяем ‘d’ на ‘f’ в arr arr3=’f’; std::cout<<str<<‘\n’;// Golf return; } |
Изменяя , можно видеть, как изменяется и . Это происходит из-за того, что исходная строка является общей для этих переменных. Стоит отметить, что при использовании объектов класса std::string_view лучше избегать модифицирования исходной строки, пока существуют связанные с ней объекты класса std::string_view, так как в противном случае, это может привести к путанице и ошибкам.
Совет: Используйте std::string_view вместо строк C-style. Для строк, которые не планируете изменять в дальнейшем, предпочтительнее использовать класс std::string_view вместо std::string.
Описание
Например, в строковом буфере (области памяти, выделенной для хранения строки) размером 11 байт нуль-терминированная строка «СТРОКА» в кодировке Windows-1251 может представляться следующим образом:
С | Т | Р | О | К | А | NUL | F | % | NUL | 4 |
0xD1 | 0xD2 | 0xD0 | 0xCE | 0xCA | 0xC0 | 0x00 | 0x46 | 0x25 | 0x00 | 0x34 |
В данном примере представлена область памяти из 11 байт, хотя на самом деле строка занимает всего 7. Символы после нуль-символа (8 — 11 байты) называются мусором — это данные, которые могли остаться в буфере от предыдущих строк или от других использований памяти. Среди них также могут находиться нулевые символы.
При использовании однобайтных кодировок (ASCII) объём памяти, требуемый для представления строки из N символов, равен N + 1 байт. В том случае, когда для кодирования символов применяется Юникод, длина строки зависит от используемого представления Юникода (например, 2N + 2 байта для UCS-2).
Такие строки являются стандартом в Си и некоторых других языках программирования. Поскольку они используются для передачи строковых аргументов в стандартные функции во многих операционных системах, операции для работы с нуль-терминированными строками появились в Паскале и других языках.
Для ссылки на нуль-терминированную строку применяется указатель на первый её символ. Это простой, быстрый и гибкий подход, но чреватый ошибками. Программист постоянно должен следить за своим кодом, а именно:
- быть уверенным, что не случаются переполнения буфера;
- аккуратно проводить управление памятью, выделяемой под строки;
- следить за корректной нуль-терминацией строк при использовании функций, которые её не гарантируют (например, strncpy);
- в редких случаях, когда размер строки может быть очень велик, следить, что не происходит переполнение целого при подсчёте длины и прочих связанных с длиной вычислениях.
Кроме того, некоторые операции со строками, например, конкатенация, для нуль-терминированных строк выполняются медленнее, чем для других типов строк.
Нюансы std::string_view
Будучи относительно недавним нововведением, класс std::string_view реализован не так уж и идеально, как хотелось бы:
std::string s{ «hello» };
std::string_view v{ «world» };
// Не работает
std::cout << (s + v) << ‘\n’;
std::cout << (v + s) << ‘\n’;
// Потенциально небезопасно или не то, что мы хотим получить,
// поскольку мы пытаемся использовать объект std::string_view в качестве строки C-style
std::cout << (s + v.data()) << ‘\n’;
std::cout << (v.data() + s) << ‘\n’;
// Приемлемо, т.к. нам нужно создать новый объект std::string, но некрасиво и нерационально
std::cout << (s + std::string{ v }) << ‘\n’;
std::cout << (std::string{ v } + s) << ‘\n’;
std::cout << (s + static_cast<std::string>(v)) << ‘\n’;
std::cout << (static_cast<std::string>(v) + s) << ‘\n’;
1 |
std::strings{«hello»}; std::string_viewv{«world»}; // Не работает std::cout<<(s+v)<<‘\n’; std::cout<<(v+s)<<‘\n’;
// Потенциально небезопасно или не то, что мы хотим получить, std::cout<<(s+v.data())<<‘\n’; std::cout<<(v.data()+s)<<‘\n’; // Приемлемо, т.к. нам нужно создать новый объект std::string, но некрасиво и нерационально std::cout<<(s+std::string{v})<<‘\n’; std::cout<<(std::string{v}+s)<<‘\n’; std::cout<<(s+static_cast<std::string>(v))<<‘\n’; std::cout<<(static_cast<std::string>(v)+s)<<‘\n’; |
Нет никаких причин для неработоспособности строк №5-6, но тем не менее они не работают. Вероятно, полная поддержка данного функционала будет реализована в следующих версиях стандарта C++.
Функция data()
Доступ к исходной строке объекта std::string_view можно получить при помощи функции data(), которая возвращает строку C-style. При этом обеспечивается быстрый доступ к представляемой строке (как к строке C-style). Но это следует использовать только тогда, когда объект std::string_view не был изменен (например, при помощи функций или ) и связанная с ним строка имеет нуль-терминатор (так как это строка C-style).
В следующем примере функция std::strlen() ничего не знает о std::string_view, поэтому мы передаем ей функцию :
#include <cstring> // для функции std::strlen()
#include <iostream>
#include <string_view>
int main()
{
std::string_view str{ «balloon» };
std::cout << str << ‘\n’;
// Для простоты мы воспользуемся функцией std::strlen(). Вместо неё можно было бы использовать любую другую функцию, которая работает со строкой с нуль-терминатором в конце.
// Здесь мы можем использовать функцию data(), так как мы не изменяли представление и строка имеет нуль-терминатор
std::cout << std::strlen(str.data()) << ‘\n’;
return 0;
}
1 |
#include <cstring> // для функции std::strlen() intmain() { std::string_viewstr{«balloon»}; std::cout<<str<<‘\n’; // Для простоты мы воспользуемся функцией std::strlen(). Вместо неё можно было бы использовать любую другую функцию, которая работает со строкой с нуль-терминатором в конце. // Здесь мы можем использовать функцию data(), так как мы не изменяли представление и строка имеет нуль-терминатор std::cout<<std::strlen(str.data())<<‘\n’; return; } |
Результат выполнения программы:
Когда мы пытаемся обратиться к объекту класса std::string_view, который был изменен, функция data() может вернуть совсем не тот результат, который мы ожидали от неё получить. В следующем примере показано, что происходит, когда мы обращаемся к функции data() после изменения представления строки:
#include <cstring>
#include <iostream>
#include <string_view>
int main()
{
std::string_view str{ «balloon» };
// Удаляем символ «b»
str.remove_prefix(1);
// Удаляем часть «oon»
str.remove_suffix(3);
// Помните, что предыдущие 2 команды не изменяют исходную строку, они работают лишь с её представлением
std::cout << str << » has » << std::strlen(str.data()) << » letter(s)\n»;
std::cout << «str.data() is » << str.data() << ‘\n’;
std::cout << «str is » << str << ‘\n’;
return 0;
}
1 |
#include <cstring> intmain() { std::string_viewstr{«balloon»}; // Удаляем символ «b» str.remove_prefix(1); // Удаляем часть «oon» str.remove_suffix(3); // Помните, что предыдущие 2 команды не изменяют исходную строку, они работают лишь с её представлением std::cout<<str<<» has «<<std::strlen(str.data())<<» letter(s)\n»; std::cout<<«str.data() is «<<str.data()<<‘\n’; std::cout<<«str is «<<str<<‘\n’; return; } |
Результат выполнения программы:
Очевидно, что данный результат — это не то, что мы планировали увидеть, и он является следствием попытки функции data() получить доступ к данным представления std::string_view, которое было изменено. Информация о длине строки теряется при обращении к ней через функцию data(). std::strlen и std::cout продолжают считывать символы из исходной строки до тех пор, пока не встретят нуль-терминатор, который находится в конце строки .
Предупреждение: Используйте std::string_view::data() только в том случае, если представление std::string_view не было изменено и отображаемая строка содержит завершающий нулевой символ (нуль-терминатор). Использование функции std::string_view::data() со строкой без нуль-терминатора чревато возникновением ошибок.
Другие спецэффекты
Особое внимание стоит уделить использованию дыма в кадре. Помимо того, что это явление очень кинематографично и создает особую тревожную атмосферу, оно позволяет скрадывать нежелательные детали
К примеру, в миниатюрных съемках мира будущего дым создает иллюзию обширного пространства и скрывает детали грубо сделанного летательного аппарата, подвешенного на тросы. Интересно, что в натурных сценах дым не был запланирован и возник не благодаря усилиям съемочной группы. Дело в том, что из-за нашествия каких-то насекомых на Лос-Анджелес, по округу распрыскивали химикаты, следы от которых и попадали в кадр. Другой пример – дым, исходящий от Терминатора. Для получения этого эффекта одежду Шварценеггера обливали специальной кислотой, раздражавшей актера ужасным запахом. Наконец совсем просто был создан дым в кадрах гибели Терминатора под прессом – член съемочной группы просто раскурил рядом сигаретку. Кстати, этот кадр в целом поражает соотношением эффектности и элементарности исполнения. Половинки сдавливающего пресса были сделаны из пенопласта, покрашенного под металл, гибнущего Терминатора заменила плотная фольга, а в качестве глаза использовали регулируемую красную лампочку. Вот такая магия кино.
Проблемы владения и доступа
Поскольку std::string_view является всего лишь представлением строки, его время жизни не зависит от времени жизни строки, которую он представляет. Если отображаемая строка выйдет за пределы области видимости, то std::string_view больше не сможет её отображать и при попытке доступа к ней мы получим неопределенные результаты:
#include <iostream>
#include <string>
#include <string_view>
std::string_view askForName()
{
std::cout << «What’s your name?\n»;
// Используем std::string, поскольку std::cin будет изменять строку
std::string str{};
std::cin >> str;
// Мы переключаемся на std::string_view только в демонстрационных целях.
// Если вы уже имеете std::string, то нет необходимости переключаться на std::string_view
std::string_view view{ str };
std::cout << «Hello » << view << ‘\n’;
return view;
} // str уничтожается и, таким образом, уничтожается и строка, созданная str
int main()
{
std::string_view view{ askForName() };
// view пытается обратиться к строке, которой уже не существует
std::cout << «Your name is » << view << ‘\n’; // неопределенное поведение
return 0;
}
1 |
#include <iostream> std::string_view askForName() { std::cout<<«What’s your name?\n»; // Используем std::string, поскольку std::cin будет изменять строку std::stringstr{}; std::cin>>str; // Мы переключаемся на std::string_view только в демонстрационных целях. // Если вы уже имеете std::string, то нет необходимости переключаться на std::string_view std::string_viewview{str}; std::cout<<«Hello «<<view<<‘\n’; returnview; }// str уничтожается и, таким образом, уничтожается и строка, созданная str intmain() { std::string_viewview{askForName()}; // view пытается обратиться к строке, которой уже не существует std::cout<<«Your name is «<<view<<‘\n’;// неопределенное поведение return; } |
Результат выполнения программы:
Когда мы объявили переменную и с помощью std::cin присвоили ей определенное значение, то данная переменная создала внутри себя строку, разместив её в динамической области памяти. После того, как переменная вышла за пределы области видимости в конце функции askForName(), внутренняя строка вслед за этим прекратила свое существование. При этом объект класса std::string_view не знает, что строки больше не существует, и всё также позволяет нам к ней обратиться. Попытка доступа к такой строке через её представление в функции main() приводит к неопределенному поведению, в результате чего мы получаем .
Такая же ситуация может произойти и тогда, когда мы создаем объект std::string_view из объекта std::string, а затем модифицируем первоначальный объект std::string. Изменение объекта std::string может привести к созданию в другом месте новой внутренней строки и последующему уничтожению старой. При этом std::string_view продолжит «смотреть» в то место, где была старая строка, но её там уже не будет.
Предупреждение: Следите за тем, чтобы исходная строка, на которую ссылается объект std::string_view, не выходила за пределы области видимости и не изменялась до тех пор, пока используется ссылающийся на неё объект std::string_view.
Забудьте про «Парк юрского периода»: рапторы были охотниками-одиночками
Динозавры — еще одна излюбленная тема кинорежиссеров, самые продвинутые из которых (режиссеры, а не древние рептилии) стараются опираться на научные труды. А ученые, в свою очередь, делают новые открытия, сводя на нет усилия кинематографистов.
Итак, фанаты Парка юрского периода, смиритесь: да, рапторы были крупными, зубастыми и быстрыми, но…
- Во-первых, авторы фильма ошиблись с блестящей чешуей: судя по последним данным, эти ящеры были очень даже пернатыми;
- Во-вторых, далеко не факт, что они издавали такие звуки, как в фильме (их озвучили спаривающиеся черепахи);
- В третьих, что самое существенное, они не охотились стаями, подобно волкам, умело распределяя роли и загоняя добычу.
По словам ученых, идея коллективной охоты динозавров призвана была объяснить, как эти хищники могли справиться с добычей, которая была намного крупнее их.
«Но проблема с этой идеей заключается в том, что современные динозавры, то есть птицы и крокодилы, редко охотятся группами и почти никогда не нападают на добычу, которая им не по зубам», — объясняет палеонтолог Джозеф Фредериксон из Висконсинского университета в Ошкоше.
К такому выводу Фредериксон пришел, изучая зубы древних рапторов и крокодилов, которые населяли Северную Америку от 115 до 108 млн лет назад, а зубы эти, по словам ученого, могут рассказать о том, что ел на обед их обладатель.
Дело в том, что социальные, то есть способные к активному взаимодейстию с представителями своего вида животные, которые охотятся стаями, также проявляют и родительскую заботу о потомстве. Это значит, что дети едят ту же пищу, что и родители.
А вот диета животных, ведущих одиночную охоту, и их потомства будет сильно отличаться, поскольку малыш просто не сможет одолеть крупную добычу.
О смене диеты может рассказать состав зубов, вернее, уровень содержащегося в них изотопа углерода-13.
Сравнив зубы взрослых и юных крокодилов мелового периода, ученые пришли к выводу, что их диета сильно отличалась: молодняк питался самостоятельно насекомыми и разной мелочью, а старые охотники могли завалить и крупную добычу.
По словам Фредериксона, эта модель применима и к рапторам. «Взрослые не кормили молодых динозавров, так что мы считаем, что авторы «Парка юрского периода» ошибались на счет их поведения», — полагает ученый.
И хотя у специалистов нет в запасе достаточного количества зубов велоцираптора, чтобы делать окончательные выводы, находка в 2007 году раптора, убившего своего собрата, скорее подтверждает теорию о том, что эти динозавры едва ли могли что-то делать сообща.
- Динозавры выглядели совсем не так, как в «Парке юрского периода». А как?
- Гигантские динозавры жили на Земле гораздо раньше, чем мы думали
- Почему никто не верит, что динозавры были покрыты перьями
Как сделать своими руками металлоискатель «Терминатор 3» –подробная инструкция
Металлодетектор «Терминатор 3» много лет занимал ведущие места среди самодельных приспособлений. Двухтональное устройство функционирует по принципу баланса индукции.
Его отличительными чертами станут: незначительное потребление электроэнергии, металлодискриминация, опция цветных металлов, функция поиска золота и отличные показатели глубины поиска, в сравнении с полупрофессиональными промышленными изделиями.
Какие инструменты нужны для работы
Прежде чем приступить к работе, требуется приготовить такие инструменты:
- паяльник;
- припой, олово, канифоль;
- пассатижи;
- отвёртки;
- ножовку по металлу;
- осциллографы и прочие измерительные устройства.
Инструменты для металлоискателя ФОТО: youtube.com
Watch this video on YouTube
Как собрать схему и подобрать детали
Чтобы изготовить блок управления, требуется сделать специальную плату, где размещены все ключевые радиодетали. Схема переносится на гетинакс с фольгированным покрытием из меди и изготавливается монтажная плата так же, как и в случае с металлоискателем «Пират». Размеры схемы должны находиться в диапазоне 10,4×6,6 см, а заготовка на 1 см больше со всех сторон.
Пошаговое руководство изготовления печатной платы для металлодетектора.
- Берётся текстолитовая пластина с фольгированным медным покрытием. Обезжиривается химическим либо механическим методом.
- Наносится схема на пластинку, дорожки покрываются при помощи защитного лака, и заготовка подвергается травлению. Тонкое сверло проделывает отверстия для радиоэлементов и креплений.
- Размещаются детали согласно схеме, проводится распайка.
- Плата для металлоискателя готова.
Создание печатной платы ФОТО: youtube.com
Watch this video on YouTube
Изготовление катушки для металлоискателя своими руками
Это наиболее восприимчивая составляющая устройства, ответственная за сканирование площади под землёй. Стадии изготовления обыкновенной катушки для металлодетектора:
- На фанере очерчиваются 2 окружности, которые соответствуют диаметру катушек – внутренней и внешней. Вбиваются по периметру круга гвозди. Диаметр наружной обмотки должен быть в границах 20 см. Катушку делают из 2 сложенных проводов. Они наматываются на гвозди на 30 оборотов.
- Обмотка перевязывается по кругу с помощью нитей. Вытаскиваются гвозди, готовая катушка покрывается лаком. Когда он просохнет, берутся изолента и фольга и обматывается окружность. Аналогично изготавливается внутренняя обмотка, которая вдвое меньше наружной (предполагает 48 оборотов проволоки).
- Помещаются катушки внутрь корпуса, и проводится распайка проводов, присоединяемых к панели управления.
- Рамка для металлодетектора готова.
Создание катушки ФОТО: youtube.com
Watch this video on YouTube
Операторская работа
Над «Терминатором», как впоследствии и над его сиквелом работал оператор Адам Гринберг. Признанный к тому времени мастер жанра экшн, Гринберг славился умением привнести в изображение долю психологизма. Поскольку финансирование проекта было весьма скромным, для создания выразительных кадров Гринбергу часто приходилось прибегать к нестандартным приемам. К примеру, из-за того, что группа не могла позволить себе арендовать операторскую тележку и рельсы, Гринберг брал ручную камеру и снимал, сидя в движущейся инвалидной коляске. Среди других приемов, к которым Гринберг прибегал для того, чтобы подчеркнуть опасность, исходящую от героя Арнольда Шварценеггера, – расположение камеры под острым углом снизу от него.
Эмоциональное восприятие фильма во многом определяется цветовой палитрой, составленной преимущественно из контрастных оттенков красного и голубого. Значение цветов при этом трактуется по-разному, в зависимости от контекста. Светло-голубой может быть как символом пост-апокалиптического будущего, если речь идет о холодном свете металла, так и символом надежды, если, скажем, вспомнить финальные кадры грозового неба. Красный, с одной стороны, сообщает об опасности, например, глаза Терминатора, а с другой стороны, как бы напоминает о силе человеческого духа, неугасимого, подобно огню в катакомбах выживших людей будущего.
Особая роль в картине отведена рапиду. По словам Кэмерона, применение замедленного изображения в сцене перестрелки в клубе, когда происходит первая встреча трех центральных героев, с одной стороны позволило подчеркнуть механическую, неестественную природу Терминатора, а с другой – уподобило действие видению или сну
Последнее было особенно важно, учитывая, что идея фильма была навеяна приснившимся Кэмерону кошмаром.
Другой прием, регулярно повторяющийся в картине – субъективная камера. Кадры, снятые как бы от лица героев, работают на идентификацию зрителя с героями, причем с каждым по очереди
Конечно, самые запоминающиеся в этом плане – алые монохромные кадры взгляда самого Терминатора. Снятые с помощью фильтров с последующим наложением кода Apple II, они позволяют глубже понять героя, чье восприятие мира отличается от человеческого, и для которого, соответственно, не существует свойственных людям представлений о правилах и нормах.
От металла Филда до Терминатора — рукой подать
Помните продвинутого робота из фильма «Терминатор 2: Судный день»? Нет, не милягу, которого сыграл старый добрый Арни, а злобного и бездушного монстра из жидкого металла, который мог просачиваться сквозь препятствия и принимать любые формы.
Так вот, отдаленное фантастическое будущее оказалось куда ближе, чем мы думали: первый шаг на пути к созданию таких металлов, которые под воздействием тепла теряют и вновь обретают прежнюю форму, уже сделан.
Исследователи из нью-йоркского Бингемтонского университета придумали, как можно «натянуть» сплав висмута, индия и олова, известный также как металл Филда, на каркас из резиноподобного эластомера, что придает этому легкоплавкому металлу дополнительные и весьма полезные свойства.
Одно из них как раз и заключается в том, что после нагревания конструкцию из жидкого металла на каркасе из эластомера можно как угодно деформировать, но при повторном нагреве она вернет свою первоначальную форму (не как робот, восстающий из расплавленного металла в доменном цеху, конечно, но что-то вроде того).
«Мы потратили полгода на разработку производственного процесса, — рассказывает автор проекта, инженер Пу Чзан. — Без каркаса это не сработает, именно он отвечает за сохранение формы и целостности конструкции, без него жидкий металл просто утечет».
Металл Филда имеет сравнительно низкую точку плавления — всего 62 градуса по Цельсию — и широко применяется в самых разных сферах, в том числе в качестве охладителя радиоактивных материалов.
В новом проекте этот сплав наносится на каркас, тщательно собранный в процессе гибридного производства с применением трехмерной печати, вакуумной формовки и конформного покрытия (которое защищает электронику от воздействия влаги, пыли, химических веществ и экстремальных температур).
Ну а что касается сфер применения, то помимо пресловутых роботов-убийц («Честно говоря, я даже не видел этот фильм!» — признается Чзан, а мы будем надеяться, что до этого не дойдет), новая технология может оказаться незаменимой в тех ситуациях, когда жесткий предмет нужно компактно упаковать, например, для перевозки или доставки в космос, а затем вернуть ему прежнюю форму.
«Космический аппарат может жестко приземлиться на Луну или Марс, — поясняет Чзан. — Обычно инженеры в качестве аммортизатора используют алюминиевые или стальные конструкции, но при ударе они деформируются, — и всё, их уже нельзя использовать вторично. А с металлом Филда конструкция деформируется, но после нагревания вернет прежнюю форму, и ее можно будет использовать снова и снова».
В ходе испытаний ученые придавали структурам разные формы, от конверта и шара до паутины и пчелиных сот, но как ни странно, лучше всего форму восстанавливала рука из жидкого металла.
Схема металлодетектора
По своей конструкции металлоискатель «Терминатор 3» представляет собой стандартный монетник, претерпевший некоторые изменения, которые позволили ему обнаруживать золото и игнорировать другие цветные металлы. При использовании схемы со специальным режимом «всех металлов» прибор может искать любой металлолом. Стандартная схема позволяет осуществлять металлоискателем поиск монет, не более того.
Нестандартное применение логики в качестве ОУ является базисом схемы металлодетектора. Недостатком этого являются лишние шумы и неизвестный КУ всех микросхем. Конечно, можно для создания прибора использовать отечественную логику, однако это грозит слишком большим разбросом параметров. Снизить ущерб и избежать дополнительных проблем можно путём замены микросхемы звука на отечественный аналог.
Настройка металлоискателя
На схеме металлодетектора отмечены определённые узлы, которые берутся во внимание, поскольку при дальнейшей сборке придётся ориентироваться именно на них. Это также может понадобиться в процессе настройки металлодетектора
Выброс колебаний тока генератором осуществляется после подключения к нему передающей катушки. Подобные колебания выходят из микросхемы МС1 в виде меандра.
Ток, наводимый ТХ и создающий поле, передаётся через приёмную катушку. По формируемому полю поисковая катушка уравновешивается с ТХ: проще говоря, из поля ТХ вычитается поле RX. С этой целью используется компенсационная катушка СХ. В зависимости от датчиков меняется её представление: в случае с датчиком DD CX катушка виртуальная, в датчике «КОЛЬЦО» СХ — реальная. Подключается она таким образом, чтобы направление движения тока в ней было противоположно приёмной катушке. Уравновешивание RX и ТХ достигается за счёт отматывания с компенсационной катушки.
Осциллографом контролируется сведение баланса, благодаря чему во всех положениях ручки устанавливается минимальная амплитуда. Один конец компенсационной катушки идёт на изготовление настроечной петли, которая приводится в действие после достижения амплитудой определённой точки, в которой она вновь начинает расти. ТХ и RX предварительно обязательно настраиваются по частоте, при этом ТХ должна быть выше RX на 100 Гц. Настроить все катушки на желаемую частоту можно путём их подключения к генератору металлоискателя «Терминатор 3» и осциллографу.
Настраивать СХ по частоте не нужно. При появлении под датчиком металлического объекта нарушается баланс, что провоцирует поступление в RX тока, который затем подаётся в предварительный усилитель и синхродетектор, который фиксирует фазы поступающего сигнала и выдаёт их в усилительные каналы. В последнем все полученные параметры усиливаются и подаются на компаратор МС8, который сравнивает полученные уровни сигналов и активирует звуковой генератор.
Принцип работы практически всех металлодетекторов сходен между собой, за исключением некоторых нюансов. В большинстве случаев они затрагивают отстройку прибора от грунта. В случае с металлоискателем «Терминатор М» отстройка фазовая.
Манипуляторы ввода –вывода
Кроме представленных ранее методов, существует и другой способ
управления процессом ввода-вывода, основанный на использовании
манипуляторов ввода-вывода. Манипуляторы позволяют менять режимы
операций ввода-вывода непосредственно в выражениях внесения или
извлечения. Для того чтобы использовать их в своей программе, в исходные
тексты нужно включить заголовочный файл iomanip.h.
В прошлый раз мы накладывали ограничение на размер буфера cin, применяя метод width():
cin.width(sizeof(buff));
cin >> buff;
Теперь, используя манипулятор setw(), можно определить размер буфера так
cin >> setw (sizeof (buff)) >> buff;
Существует два вида манипуляторов ввода-вывода: параметризованные
и непараметризованные. Вот список стандартных манипуляторов библиотеки iostream()
манипулятор | i/o | описание |
dec | o | устанавливает базу для преобразования чисел к 10-, |
oct | o | 8- |
hex | o | и 16-ичной форме |
ws | i | пропуск начальных пробелов |
ends | o | выводит нулевой символ |
endl | o | Выводит признак конца строки |
setfill (int ch) | o | Устанавливает символ-заполнитель |
setprecision(int n) | o | Устанавливает точность вывода чисел с плав точкой (знаков после запятой) |
setbase (int b) | o | устанавливает ширину поля для последующей операции |
setbase (int b) | o | устанавливает базу для преобразования числовых значений |
setiosflags (int f) | i/o | устанавливает отдельные флаги потока |
resetiosflags (int f) | i/o | сбрасывает отдельные флаги потока |
Вот некоторые из флагов потока
флаг | описание |
left | выравнивание по левому краю |
right | выравнивание по правому краю |
dec, oct, hex | устанавливают базу для ввода-вывода |
showbase | выводить показатель базы |
showpoint | выводить десятичную точку для чисел с плав точкой |
uppercase | 16-ричные большие буквы |
showpos | показать «+» для положительных целых чисел |
scientific | установить экспон форму для чисел с плав точкой |
fixed | установить формат чисел с фиксированной плав точкой |
Кроме того, вы можете создать свой собственные манипуляторы.
Этому могут быть, по крайней мере, две причины. Во-первых, это может
быть манипулятор, заключающий в себе некоторую часто встречающуюся в
программе последовательность манипуляторов. Во-вторых, для управления
нестандартными устройствами ввода-вывода.
Создание непараметризованных манипуляторов не очень сложное
занятие. Все, что для этого нужно, это определить функцию, имеющую
прототип, похожий на следующий:
ios& manipul (ios&);
Если вы пишите манипулятор только для вывода, ios замените на ostream, если для ввода – на istream.
В теле функции можно, что-то сделать с потоком, переданным в
качестве параметров, а затем передать его в вызывающую программу на
переданный функции аргумент типа поток.
Вот пример манипулятора для вывода с выравниванием по правому краю:
ostream & right(ostream &)
{
s << resetiosflags(ios::left) << setiosflags(ios::right);
return s;
}
Функция манипулятор изменяет биты флагов потока, переданного ей в качестве аргумента. После того, как right установит биты флагов потока, последний будет выводиться в таком режиме до тех пор, пока флаги потока не будут изменены.
Таким образом, выражениеcout << setw(20) << right<< 1234 << endl;
означает следующее. Манипулятор setw(20) установит поле вывода шириной 20 символов, манипулятор right установит выравнивание по правой границе поля вывода, выведется число, а манипулятор endl вызовет переход к следующей строке.
Параметризованные манипуляторы более сложны в написании, так как в
этом случае необходимо создать класс, содержащий указатель на
функцию – манипулятор и указатель на аргументы функции
манипулятора. Макроопределения, которые облегчат процесс разработки
параметризованных манипуляторов, содержатся в заголовочном файле iomanip.h.
Итоги
Собрать металлоискатель своими руками не так уж и сложно. Это потребует определённых финансовых и временных затрат, но при этом пользователь, собравший своими силами металлодетектор, получает определённые преимущества в качестве бонуса.
«Терминатор 3» — довольно мощное устройство в сравнении с аналогичными фирменными моделями металлоискателей. Учитывая тот факт, что собрать его можно своими руками с возможностью экономии денежных средств, он является более доступным, выгодным и привлекательным для пользователей.
Правильно собрать и настроить металлоискатель при отсутствии необходимого опыта достаточно сложно
Начинающим радиолюбителям на специализированных форумах предоставляются подробные инструкции и пособия, которые позволят провести все работы корректно и без ошибок, что очень важно при работе с электроникой
Преимущество металлоискателя «Терминатор 3» и последующих моделей — возможность самостоятельной сборки устройства и доступная цена. Отыскать необходимые схемы можно в интернете на специализированных форумах специалистов, профессионально занимающихся поиском металлических объектов. Создатели прибора всегда готовы помочь советом тем, кто планирует собрать металлоискатель своими силами.