Содержание
- Суть и цель проекта
- Компоненты и сборка
- Немного физики
- “Душа” устройства, пишем код
- Запускаем
Суть и цель проекта
На уроках физике в школе нам говорили, что магнитное поле нельзя пощупать и увидеть, однако, почти обязательно тут же его показывали. Всем знакомая с детства картина - двухмерная визуализация силовых линий магнитного поля, созданная естественным путем при помощи мелких намагниченных металлических частиц, рассыпанных по столу, под которым спрятан магнит.Компоненты и сборка
Для начала подготовим саму жидкость. Найти и купить ее, при желании, не проблема, был бы интернет. Существуют варианты на основе керосина и силикона, второй чуть дороже, но для нашего проекта большой разницы нет. Покупаем относительно большой флакончик на 30 мл, этого вполне достаточно.Заполняем обычной чистой водой (лучше дистиллированной, чтобы избежать сюрпризов от примесей) примерно на половину или чуть больше.
Хорошенько взбалтываем, чтобы тщательно смочить все стенки сосуда, включая горлышко, это очень важно!
Соблюдая осторожность, откупориваем флакончик с ферромагнитной жидкостью и, стараясь не потерять ни капли, неспешно, но уверенно переливаем ее в бутылку.
Доливаем воду до краев, плотно закручиваем крышку.
Объясняем почему именно так. Жидкость на основе керосина крайне липучая к любым поверхностям, включая стекло. Если вылить кляксу в бутылку первой, часть ее навсегда останется в виде пятна на стенке. Нам это совсем не нужно. Также постарайтесь, чтобы она не попала вам на руки и особенно на одежду или мебель, неприятно удивитесь, как сложно будет ее отмыть и отстирать.
Итак, получили бутылку, в которой находятся две несмешиваемые жидкости - ферромагнитная и обычная вода. Черная и белая. Черная, будучи более плотной, благополучно лежит на дне емкости.
Воплощаем задуманную схему в жизнь при помощи 3D Принтера (Бизон). Корпус удерживает саму бутылку, прикрывая ее бока и горлышко, три магнита сзади и два куска светодиодной ленты по бокам для выгодной подсветки происходящего внутри. Пока что обвинить в неземной красоте трудно, но для тестов и обкатки вполне годится.
Немного физики
Решающее значение для динамических характеристик движения кляксы имеют физические свойства окружающей ее жидкости (основы). Особо важны ее плотность и вязкость. Плотность основы влияет на “невесомость” феррожидкости, а вязкость на инертность движения. В нашем случае пока что используется обычная вода, в принципе, ее характеристик достаточно для нашей задачи, но можно и хочется их слегка улучшить. Плотность чистой воды, как подсказывает нам учебник физики за 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); } }
Для разнообразия поток хаоса иногда рекомендуется разбавлять готовыми действиями (скриптами). Мы сделали один такой для примера, он подхватывает кляксу снизу, подкидывает вверх и несколько раз энергично пульсирует ей в пространстве. Немного поэкспериментировав, можно прописать десяток собственных скриптов, раскидав их среди общей вакханалии. Как уже было сказано выше, нет предела развития проекта, все ограничивается лишь воображением и ленью.Исходники