[Перевод] Светильник «чёрная дыра»

gnywv37kpuymrtmmqridtu4kqpm.jpeg

Предлагаю вашему вниманию светильник, одновременно являющийся наглядным пособием «чёрная дыра в двумерном пространстве».

Общая теория относительности Эйнштейна гласит, что предметы с массой искажают ткань пространства-времени. Чёрные дыры — точки настолько огромной плотности, что пространство-время в них искажаются в достаточной мере, чтобы наружу не могли выбраться ни излучение, ни вещество.

Для воссоздания этого явления я взял кусок чёрного эластана, чтобы он имитировал «ткань пространства-времени», а вокруг него разместил «горизонт событий» — кольцо из белых светодиодов; стóит ещё чуть приблизиться к «чёрной дыре» — и свет наружу не выйдет. Чем дольше вы держите светильник включённым, тем больше разрастается чёрная дыра, вбирая в себя вещество и энергию. В нашей модели для имитации этого эластан натягивает плетёная леска, пропущенная через медную трубу и приводимая в движение расположенным в основании электродвигателем. Регулятор яркости одновременно влияет на скорость натяжения: чем больше света и вещества попадает в чёрную дыру за единицу времени, тем быстрее она растёт, и наоборот. Если светильник выключить, двигатель вращается в обратную сторону, ослабляя натяжение, что является аналогом испарения чёрной дыры за счёт излучения Хокинга.

GIF ~11 МБ
05545b6edc46ceaf1294ea1488539a5d.gif


Полезно ли такое художественное представление чёрной дыры кинетической скульптурой с примитивной механикой? Наверное, да, в той же степени, что и комикс «Тим и Бит» про человечков в компьютере. Или моделирование любых физических явлений схемами на операционных усилителях. Хотите более серьёзного, хотя и тоже упрощённого рассказа о чёрных дырах — вот вам это видео на YouTube-канале «Короче говоря».

Если вы желаете собрать такой же светильник, приготовьте:

— чёрную растягивающуюся ткань вроде эластана (он же спандекс, лайкра и др.)
— полудюймовую медную трубу (подойдёт и пластмассовая, если вы не стимпанкер) и три 90-градусных угловых фитинга
— деревянное основание
— плетёную леску
— баллончик с чёрной краской
— Arduino Nano
— 9-вольтовый блок питания
— самодельную белую светодиодную ленту, отличающуюся от стандартной тем, что в ней все светодиоды просто соединены параллельно
— модуль с двумя H-мостами с защитой от сквозного тока L9110
— шаговый двигатель 28BYJ
— тумблер
— переменный резистор
— провода, припой, флюс, макетную плату
— инструменты для радиомонтажа и деревообработки

Отпилите три куска трубы: два по 330 мм и один в 368 мм.

asseanzgunvlehyikeyyrub4nz4.gif

При желании можно отполировать так:

diiuoskpv7cr0zdj8o8ou1thori.jpeg

Просверлите три 16-миллиметровых отверстия: два под наклоном примерно в 25 градусов от вертикали — для труб, к которым вы затем прикрепите светодиодное кольцо, затем, отступив от них назад на 25 мм — центральное отверстие для трубы, через которую будет пропущена леска.

Просверлите ещё два отверстия соответствующих диаметров для тумблера и переменного резистора. Ещё одно отверстие, показанное на фото готового прибора в конце статьи, просверлено ошибочно, вам повторять его не нужно.

Напечатайте чёрным филаментом два комплекта полуколец и склейте каждое из них. Чтобы напечатать кольца целиком, у автора не хватило площади стола принтера.

Вырежьте из эластана квадрат и наложите на тонкое кольцо. Проделайте в ткани отверстия для 10 саморезов, затем, продолжая держать её слегка натянутой, накройте толстым кольцом и соедините получившийся «бутероброд» саморезами. Срежьте эластан, оставшийся за пределами.

Привяжите к центру куска эластана плетёной леской бусину.

4vppa7l_tchc_fglg71dimhsrwq.jpeg

Наклейте на кольцо по периметру светодиодную ленту. Прикрепите кольцо к коротким трубам через фитинги. Припаяйте провода к ленте, пометив их так, чтобы была понятна полярность, либо взяв разноцветные провода, и пропустите через одну из труб.

Окрасьте основание в чёрный цвет. На длинную трубу также наденьте фитинг. Установите все трубы, тумблер и переменный резистор в предназначенные для них отверстия. Пропустите леску через установленную посередине длинную трубу.

Соедините компоненты по прилагаемой схеме.

1g8vurjkndpxviwtu5kjx9thati.jpeg

У шагового двигателя 28BYJ пять проводов, но один из них — красный — никуда подключать не надо. Оранжевый и розовый провода подключите к выходу модуля H-мостов «Motor B», а жёлтый и синий — к выходу «Motor A». Сам модуль подключите к Arduino так:

B1A к D11
B1B к D10
A1A к D9
A1B к D8

Светодиодную ленту (напомню, она самодельная, и у неё все светодиоды просто соединены параллельно) подключите через 100-омный резистор между выходом D3 (или другим выходом с ШИМ, можно выбрать в скетче) и общим проводом. Тумблер подключите таким образом, чтобы он подключал через резистор на 2,2 кОм к входу D2 в нижнем положении общий провод, в верхнем — выход пятивольтового стабилизатора. Интересно, за что автор так не любит подтягивающие резисторы, это позволило бы использовать и выключатели без нормально замкнутых контактов. Один из боковых выводов переменного резистора подключите к общему проводу, другой — к выходу пятивольтового стабилизатора, а средний вывод — к входу A0.

Напечатайте шкив из того же набора STL-файлов, наденьте на вал двигателя, прикрепите леску. Вот и получилось что-то вроде показанного на снимке.

q2ie-iocpg3rvrl8txighqhd01y.jpeg

Залейте скетч:

//Драйвер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);
}

Готово, можно пользоваться!

© Geektimes