Предлагаю вашему вниманию светильник, одновременно являющийся наглядным пособием «чёрная дыра в двумерном пространстве».
Общая теория относительности Эйнштейна гласит, что предметы с массой искажают ткань пространства-времени. Чёрные дыры — точки настолько огромной плотности, что пространство-время в них искажаются в достаточной мере, чтобы наружу не могли выбраться ни излучение, ни вещество.
Для воссоздания этого явления я взял кусок чёрного эластана, чтобы он имитировал «ткань пространства-времени», а вокруг него разместил «горизонт событий» — кольцо из белых светодиодов; стóит ещё чуть приблизиться к «чёрной дыре» — и свет наружу не выйдет. Чем дольше вы держите светильник включённым, тем больше разрастается чёрная дыра, вбирая в себя вещество и энергию. В нашей модели для имитации этого эластан натягивает плетёная леска, пропущенная через медную трубу и приводимая в движение расположенным в основании электродвигателем. Регулятор яркости одновременно влияет на скорость натяжения: чем больше света и вещества попадает в чёрную дыру за единицу времени, тем быстрее она растёт, и наоборот. Если светильник выключить, двигатель вращается в обратную сторону, ослабляя натяжение, что является аналогом испарения чёрной дыры за счёт излучения Хокинга.
Полезно ли такое художественное представление чёрной дыры кинетической скульптурой с примитивной механикой? Наверное, да, в той же степени, что и комикс «Тим и Бит» про человечков в компьютере. Или моделирование любых физических явлений схемами на операционных усилителях. Хотите более серьёзного, хотя и тоже упрощённого рассказа о чёрных дырах — вот вам это видео на YouTube-канале «Короче говоря».
Если вы желаете собрать такой же светильник, приготовьте:
— чёрную растягивающуюся ткань вроде эластана (он же спандекс, лайкра и др.)
— полудюймовую медную трубу (подойдёт и пластмассовая, если вы не стимпанкер) и три 90-градусных угловых фитинга
— деревянное основание
— плетёную леску
— баллончик с чёрной краской
— Arduino Nano
— 9-вольтовый блок питания
— самодельную белую светодиодную ленту, отличающуюся от стандартной тем, что в ней все светодиоды просто соединены параллельно
— модуль с двумя H-мостами с защитой от сквозного тока L9110
— шаговый двигатель 28BYJ
— тумблер
— переменный резистор
— провода, припой, флюс, макетную плату
— инструменты для радиомонтажа и деревообработки
Отпилите три куска трубы: два по 330 мм и один в 368 мм.
При желании можно отполировать так:
Просверлите три 16-миллиметровых отверстия: два под наклоном примерно в 25 градусов от вертикали — для труб, к которым вы затем прикрепите светодиодное кольцо, затем, отступив от них назад на 25 мм — центральное отверстие для трубы, через которую будет пропущена леска.
Просверлите ещё два отверстия соответствующих диаметров для тумблера и переменного резистора. Ещё одно отверстие, показанное на фото готового прибора в конце статьи, просверлено ошибочно, вам повторять его не нужно.
Напечатайте чёрным филаментом два комплекта полуколец и склейте каждое из них. Чтобы напечатать кольца целиком, у автора не хватило площади стола принтера.
Вырежьте из эластана квадрат и наложите на тонкое кольцо. Проделайте в ткани отверстия для 10 саморезов, затем, продолжая держать её слегка натянутой, накройте толстым кольцом и соедините получившийся «бутероброд» саморезами. Срежьте эластан, оставшийся за пределами.
Привяжите к центру куска эластана плетёной леской бусину.
Наклейте на кольцо по периметру светодиодную ленту. Прикрепите кольцо к коротким трубам через фитинги. Припаяйте провода к ленте, пометив их так, чтобы была понятна полярность, либо взяв разноцветные провода, и пропустите через одну из труб.
Окрасьте основание в чёрный цвет. На длинную трубу также наденьте фитинг. Установите все трубы, тумблер и переменный резистор в предназначенные для них отверстия. Пропустите леску через установленную посередине длинную трубу.
Соедините компоненты по прилагаемой схеме.
У шагового двигателя 28BYJ пять проводов, но один из них — красный — никуда подключать не надо. Оранжевый и розовый провода подключите к выходу модуля H-мостов «Motor B», а жёлтый и синий — к выходу «Motor A». Сам модуль подключите к Arduino так:
B1A к D11
B1B к D10
A1A к D9
A1B к D8
Светодиодную ленту (напомню, она самодельная, и у неё все светодиоды просто соединены параллельно) подключите через 100-омный резистор между выходом D3 (или другим выходом с ШИМ, можно выбрать в скетче) и общим проводом. Тумблер подключите таким образом, чтобы он подключал через резистор на 2,2 кОм к входу D2 в нижнем положении общий провод, в верхнем — выход пятивольтового стабилизатора. Интересно, за что автор так не любит подтягивающие резисторы, это позволило бы использовать и выключатели без нормально замкнутых контактов. Один из боковых выводов переменного резистора подключите к общему проводу, другой — к выходу пятивольтового стабилизатора, а средний вывод — к входу A0.
Напечатайте шкив из того же набора STL-файлов, наденьте на вал двигателя, прикрепите леску. Вот и получилось что-то вроде показанного на снимке.
Залейте скетч:
//ДрайверL9110 -> шаговый двигатель 28BYJ int A1A = 8; int A2A = 9; int B1B = 10; int B2B = 11; int PotPin = 0; //аналоговый вход A0 int SwitchPin = 2; int LEDring = 3; //укажите выбранный вами ШИМ-выход int waitTime; // пауза между шагами (больше нуля) int PotVal; //сигнал с переменного резистора int SwitchVal; int intensity; //укажите геометрические параметры собранной вами конструкции float pulleyRadius = 1.4; //радиус шкива в см float maxStringContraction = 7.0; //максиальная длина, на которую можно натягивать ткань, в см float stepsPerRevolution = 2048.0; //количество шагов на оборот двигателя float Pi = 3.14159; float circumference = 2.0 * Pi * pulleyRadius; float MaxRevs = maxStringContraction / circumference; //максимальное разрешённое количество оборотов float MaxSteps = MaxRevs * stepsPerRevolution; //максимальное разрешённое количество шагов в одном направлении int StepLimit = MaxSteps; //переведённое в целое число int StepCount = 0; void setup() { Serial.begin(9600); //Serial.println(circumference); //Serial.println(MaxRevs); //Serial.println(MaxSteps); //Serial.println(StepLimit); pinMode(SwitchPin, INPUT); pinMode(LEDring, OUTPUT); pinMode(A1A, OUTPUT); pinMode(A2A, OUTPUT); pinMode(B1B, OUTPUT); pinMode(B2B, OUTPUT); } void step1() { digitalWrite(A1A, LOW); digitalWrite(A2A, HIGH); digitalWrite(B1B, HIGH); digitalWrite(B2B, LOW); delay(5); } void step2() { digitalWrite(A1A, LOW); digitalWrite(A2A, HIGH); digitalWrite(B1B, LOW); digitalWrite(B2B, HIGH); delay(5); } void step3() { digitalWrite(A1A, HIGH); digitalWrite(A2A, LOW); digitalWrite(B1B, LOW); digitalWrite(B2B, HIGH); delay(5); } void step4() { digitalWrite(A1A, HIGH); digitalWrite(A2A, LOW); digitalWrite(B1B, HIGH); digitalWrite(B2B, LOW); delay(5); } void Stop() { digitalWrite(A1A, LOW); digitalWrite(A2A, LOW); digitalWrite(B1B, LOW); digitalWrite(B2B, LOW); delay(5); } void BHgrowth() { analogWrite(LEDring, intensity); if (StepCount < StepLimit) { //хватит натягивать эластан step1(); step2(); step3(); step4(); StepCount += 1; } Stop(); } void HawkingRadiation() { analogWrite(LEDring, 0); if (StepCount > 0) { step3(); step2(); step1(); step4(); StepCount -= 1; } Stop(); } void loop() { PotVal = analogRead(PotVal); intensity = map(PotVal, 0, 1024, 0, 254); SwitchVal = digitalRead(SwitchPin); if (SwitchVal == 1) { BHgrowth(); waitTime = 255 - intensity; //чем ярче светим, тем быстрее натягиваем, и наоборот if (waitTime < 1){ waitTime = 1; } } else { HawkingRadiation(); waitTime = 255; } delay(waitTime); Serial.println(waitTime); Serial.println(SwitchVal); }
Готово, можно пользоваться!
Источник