[Перевод] Светильник «чёрная дыра»
Предлагаю вашему вниманию светильник, одновременно являющийся наглядным пособием «чёрная дыра в двумерном пространстве».
Общая теория относительности Эйнштейна гласит, что предметы с массой искажают ткань пространства-времени. Чёрные дыры — точки настолько огромной плотности, что пространство-время в них искажаются в достаточной мере, чтобы наружу не могли выбраться ни излучение, ни вещество.
Для воссоздания этого явления я взял кусок чёрного эластана, чтобы он имитировал «ткань пространства-времени», а вокруг него разместил «горизонт событий» — кольцо из белых светодиодов; стóит ещё чуть приблизиться к «чёрной дыре» — и свет наружу не выйдет. Чем дольше вы держите светильник включённым, тем больше разрастается чёрная дыра, вбирая в себя вещество и энергию. В нашей модели для имитации этого эластан натягивает плетёная леска, пропущенная через медную трубу и приводимая в движение расположенным в основании электродвигателем. Регулятор яркости одновременно влияет на скорость натяжения: чем больше света и вещества попадает в чёрную дыру за единицу времени, тем быстрее она растёт, и наоборот. Если светильник выключить, двигатель вращается в обратную сторону, ослабляя натяжение, что является аналогом испарения чёрной дыры за счёт излучения Хокинга.
Полезно ли такое художественное представление чёрной дыры кинетической скульптурой с примитивной механикой? Наверное, да, в той же степени, что и комикс «Тим и Бит» про человечков в компьютере. Или моделирование любых физических явлений схемами на операционных усилителях. Хотите более серьёзного, хотя и тоже упрощённого рассказа о чёрных дырах — вот вам это видео на 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);
}
Готово, можно пользоваться!