Summary: Взвешенная ферромагнитная жидкость под воздействием переменного магнитного поля. Suspended ferrofluid under the influence of an alternating magnetic field.
Суть и цель проекта
На уроках физике в школе нам говорили, что магнитное поле нельзя пощупать и увидеть, однако, почти обязательно тут же его показывали. Всем знакомая с детства картина - двухмерная визуализация силовых линий магнитного поля, созданная естественным путем при помощи мелких намагниченных металлических частиц, рассыпанных по столу и попавшемуся под руку магниту.
С тех времен технологии ушли дальше. Сделав частицы еще мельче и создав из них коллоидный раствор в жидкости, удалось не только максимально детализировать изображение, но и придать ему трехмерность. Такого “ежика” видели все, хотя бы на картинке.
Раствор называется “ферромагнитная жидкость” и он свободно продается в специальных магазинах. С его помощью можно создать не только учебное пособие, но и забавную игрушку, если влить немного в прозрачный сосуд с другой жидкостью, тем самым придав ему свободную плавучесть. Поднося магнит с разных сторон и двигая его вдоль стенок, можно наблюдать достаточно интересный эффект “живой кляксы”, жидкость вся или частично движется за магнитом, меняя форму и размер, подобно медузе. Выглядит завораживающе и необычно.
Нам пришла в голову мысль, что если заменить обычный постоянный магнит на электрический, управление которым доверить микроконтроллеру? Будет ли клякса двигаться в такт импульсам включения и выключения питания магнита? А если привязать эти импульсы к музыкальным ритмам, не получим ли мы оригинальную “танцующую кляксу”? Стоит попробовать, давайте уже займемся.
Компоненты и сборка
Для начала подготовим саму жидкость. Найти и купить ее, при желании, не проблема, был бы интернет. Существуют варианты на основе керосина и силикона, второй чуть дороже, но для нашего проекта большой разницы нет. Покупаем относительно большой флакончик на 30 мл, этого вполне достаточно.
“Домик” для кляксы выбирали по наитию. Объем основной жидкости, по нашему разумению, должен относиться к активной феррожидкости примерно как 1:5 - 1:10, то есть 150-300 мл. Чтобы ей было место разгуляться, но не потеряться. Замечательно подошла плоская бутылка от популярной на Руси жидкости емкостью 250 мл, но на ее месте может быть любая другая посуда, например большой флакон из-под духов или аквариум для миниатюрных рыбок.
Загружаем “жильца” обязательно в таком порядке:
Заполняем обычной чистой водой (лучше дистиллированной, чтобы избежать сюрпризов от примесей) примерно на половину или чуть больше.
Хорошенько взбалтываем, чтобы тщательно смочить все стенки сосуда, включая горлышко, это очень важно!
Соблюдая осторожность, откупориваем флакончик с ферромагнитной жидкостью и, стараясь не потерять ни капли, неспешно, но уверенно переливаем ее в бутылку.
Доливаем воду до краев, плотно закручиваем крышку.
Объясняем почему именно так. Жидкость на основе керосина крайне липучая к любым поверхностям, включая стекло. Если вылить кляксу в бутылку первой, часть ее навсегда останется в виде пятна на стенке. Нам это совсем не нужно. Также постарайтесь, чтобы она не попала вам на руки и особенно на одежду или мебель, неприятно удивитесь, как сложно будет ее отмыть и отстирать.
Итак, получили бутылку, в которой находятся две несмешиваемые жидкости - ферромагнитная и обычная вода. Черная и белая. Черная, будучи более плотной, благополучно лежит на дне емкости.
Пора приготовить главную движущую силу проекта - электромагнит. Их очень много, особенно таких, что используются в качестве замка. Выбор размера зависит от размера флакона, где будет жить клякса. Сразу удачной идеей показалось взять магнит диаметром близким к ширине бутылки, в нашем случае 70 мм. Такой в природе есть, и он достаточной мощности для нашей задачи, кляксу примагничивает на “ура”.
А вот в процессе поиска оптимального расположения магнита относительно бутылки возникли первые трудности не технического, но дизайнерского характера. Если разместить в самом низу бутылки, шевеления жидкости при включении-выключении магнита получают минимальную амплитуду по вертикали, она то просто лежит на дне, то, чуть вздымаясь, прижимается к стенке. Выглядит не очень зрелищно и уж никак не похоже на танец. Последовательно поднимая магнит, работающий в импульсном режиме, следим за поведением жидкости. Замечаем, что до какой-то высоты жидкость подпрыгивает все заметнее, но потом дело идет на спад, потому что гравитация становится сильнее, чем магнитное поле на далеком расстоянии. Оптимальная высота магнита - всего лишь примерно треть бутылки. Жаль, что рабочее пространство используется так неэффективно. Поэтому мы решаем - была не была - и покупаем еще два вспомогательных магнита поменьше. Идея такая: два маленьких будут стоять внизу и подкидывать кляксу к большому, который стоит выше. Таким образом мы и емкость максимально задействуем и получим возможность дополнительного маневра, за счет переменного включения-выключения уже не одного, а целых трех магнитов.
Воплощаем задуманную схему в жизнь при помощи 3D Принтера. Рисуем модель.
Корпус удерживает саму бутылку, прикрывая ее бока и горлышко, три магнита сзади и два куска светодиодной ленты по бокам для выгодной подсветки происходящего внутри. Пока что обвинить в неземной красоте трудно, но для тестов и обкатки вполне годится.
Печатаем в пластике.
Основная часть устройства собрана и проверена. Займемся вспомогательной - музыкальной. Для этого нам потребуется пара динамиков и звуковая плата с блютузом. То и другое продается в готовом виде и в широком ассортименте. Для удобства монтируем музыкальное оборудование в один блок, тоже применив 3D принтер.
Схема управляющего устройства настолько проста, что нет смысла ее изображать. Магниты подключаются к источнику питания 12 V, ампера на три, через MOSFETы, аудиосигнал подаем на аналоговый вход контроллера. К пинам подключаем так:
Пин что подключаем
2 MOSFET малого магнита 1
3 MOSFET малого магнита 2
4 MOSFET большого магнита
A0 аудиовыход
Немного физики
Решающее значение для динамических характеристик движения кляксы имеют физические свойства окружающей ее жидкости (основы). Особо важны ее плотность и вязкость. Плотность основы влияет на “невесомость” феррожидкости, а вязкость на инертность движения. В нашем случае пока что используется обычная вода, в принципе, ее характеристик достаточно для нашей задачи, но можно и хочется их слегка улучшить. Плотность чистой воды, как подсказывает нам учебник физики за 7 класс, составляет порядка 1 г/см3, плотность ферромагнитной жидкости различается от производителя к производителю и от партии к партии, но в среднем составляет 1,1-1,2 г/см3, что ощутимо тяжелее, чем вода.
Клякса в обычном, не намагниченном состоянии лежит на дне посуды и быстро на него же падает после выключения магнита. Появилась идея поднять плавучесть кляксы, сделав ее более независимой от силы тяжести, для чего потребуется повысить плотность основы. Сделать это можно, растворяя в воде соли, но неизвестно, в какую реакцию вступят с ними составляющие ферромагнитной жидкости. Было решено, что проще и безопаснее повысить плотность добавлением в воду глицерина, его плотность приближается к 1,3 г/см3, что делает его еще тяжелее, чем сама феррожидкость. Здесь, как и во многом другом, главное не перестараться. Понемногу, при помощи шприца, откачиваем воду, заменяем ее на глицерин, внимательно следя за поведением кляксы. После каждой дозы в 5 мг встряхиваем емкость, добиваясь однородного состояния основы и замечаем, что феррожидкость становится все легче. В идеале клякса должна быть чуть тяжелее основы, нельзя допускать, чтобы она висела в “невесомости” без магнита и тем более всплывала. Примерно на 250 мл общего объема ушло 20 мг глицерина. Мы сделали нашу черную медузу более объемной, легкой, а заодно слегка повысили вязкость основы, а значит движения станут плавнее и загадочнее.
Наконец-то с аппаратной точки зрения все готово. Пора оживить уже нашу кляксу и научить танцевать.
“Душа” устройства, пишем код
Скажем сразу, наш алгоритм никак не претендует на предел совершенства, его можно улучшать бесконечно, подстраивать под разные музыкальные стили и настроения, причем делать это вручную или автоматически. Тут полный простор для творчества, и вопрос, скорее к музыкантам, дизайнерам и прочим труженикам искусства. Нас же интересует работа устройства в принципе, и она получается более чем выразительной даже в таком сыром виде.
Если коротко, суть работы алгоритма в следующем. Программа с некоторой частотой отслеживает состояние аудиовхода, выискивая скачки разного уровня (в нашем случае уровней два). При достижении сработки первого уровня случайную команду на включение или выключение получают нижние магниты, при достижении второго уровня и нижние, и верхний тоже. В теории, чем громче звуковые импульсы, тем выше должна скакать клякса, а чем быстрее музыка, тем выше ритм скачек. Бо́льшая часть кода снабжена комментариями, поясняющими происходящее.
#define M1 2 // нижний магнит 1
#define M2 4 // нижний магнит 2
#define M3 3 // верхний магнит
#define A A0 // аудиовход
byte sound;
void setup() {
pinMode(A, INPUT);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
randomSeed(analogRead(A0));
digitalWrite(M2, HIGH);
digitalWrite(M1, HIGH);
delay(200);
digitalWrite(M3, HIGH);
delay(500);
}
void loop() {
load(); // читаем что на аудио
drig(); // дрыгаем магнитами
}
void load() { // читаем аудио
static int a[3];
static unsigned long timer;
if (timer > millis()) return; // раз в 50 сек (опционально)
a[0] = a[1];
a[1] = a[2];
a[2] = analogRead(A); // считываем и сравниваем с предыдущими показаниями, улавливая разницу
if (a[2] > a[1] + 35) { // большой всплеск
sound = 2;
} else if (a[2] > a[1] + 10) {// малый всплеск
sound = 1;
} else {
sound = 0;
}
timer = millis() + 50; // частота опроса
}
void drig() { // дрыгаем магнитами
static unsigned long timer;
static byte timerOut;
if (timer > millis()) return; // частота реакции (задается в конце функции)
if (sound == 1) { // малый всплеск, случайно дрыгаем нижними магнитами
digitalWrite(M1, random(2));
digitalWrite(M2, random(2));
timerOut = 0;
} else if (sound == 2) { // большой всплеск, случайно дрыгаем нижними и верхним магнитом
int a = random(0, 30);
if (a == 7) kl1(); // изредка (с частотой 1/30 (опционально) уходим на сценарий (их можно сделать много)
digitalWrite(M1, random(2));
digitalWrite(M2, random(2));
digitalWrite(M3, random(10) > 6);
timerOut = 0;
} else {
timerOut++;
if (timerOut > 10) { // если музыки долго нет, выключаем магниты
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
digitalWrite(M3, LOW);
}
}
timer = millis() + random(50, 200); // частота случайная от 50 до 200 мс (можно менять в зависимости от музыки)
}
void kl1() { // скрипт для примера
Serial.println("kl1");
digitalWrite(M2, LOW);
digitalWrite(M1, LOW);
delay(500);
digitalWrite(M2, HIGH);
digitalWrite(M1, HIGH);
delay(300);
digitalWrite(M2, LOW);
digitalWrite(M1, LOW);
for (byte i = 0; i < random(3, 6); i++) {
digitalWrite(M3, HIGH);
delay(400);
digitalWrite(M3, LOW);
delay(400);
}
}
Теперь все готово и все работает как задумано!
Для разнообразия поток хаоса иногда рекомендуется разбавлять готовыми действиями (скриптами). Мы сделали один такой для примера, он подхватывает кляксу снизу, подкидывает вверх и несколько раз энергично пульсирует ей в пространстве. Немного поэкспериментировав, можно прописать десяток собственных скриптов, раскидав их среди общей вакханалии. Как уже было сказано выше, нет предела развития проекта, все ограничивается лишь нехваткой воображения и ленью, чем наши читатели ни в коем случае не страдают.