Левитация на Ардуино

Впервые увидел этот эффект еще в детстве. Меня попросили помочь, подержать и посветить автомобильным стробоскопом на маховик двигателя автомобиля. Мотор запустили и после чего я увидел на вращающемся моховике, почти не подвижную насечку, которая стояла на одном месте, а маховик при этом вращался. После чего родилась идея сделать вентилятор и стробоскопом остановить его. Идею спустя какое то время реализовал, на лампе ИФК-120, тиристоре КУ202 с обвязкой и закинул в дальний угол, но  вот лет 6 тому назад увидел японское видео с левитацией воды. Так и родилась идея повторить этот трюк с левитацией капель. Долго не доходили до реализации руки и вот наконец то, сбылась мечта ...

Посмотрите видеоролик того, что у меня получилось:

Как это работает
В ютубе есть несколько видео, в которых пытаются рассекать воду на капли, текущую из силиконового шланга, при помощи аудио колонки или динамической головки. Но в этом способе есть несколько недостатков.
1 — громоздкость конструкции(колонка, усилитель, генератор частот, стробоскоп)
2 — низкочастотный динамик не может воспроизводить меандр, из — за своей механической конструкции и на выходе у него получается что то вроде синусоиды. В итоге вода не рассекается на капли, а извивается как змея.
3 — Генератор частот каждый раз придется подстраиваться под частоту стробоскопа. Частота будет уплывать.

В моей конструкции все просто и дешево.
Эту конструкцию может повторить каждый желающий, в домашних условиях.
Работает так:
Стробоскоп и электромагнит от автомобильного реле, работают на одной частоте
Электромагнит разбивает поток воды на капли, а стробоскоп засвечивает эти капли, в определенный момент. Так как капли падают с частотой равной стробоскопу, то получается эффект висящих в воздухе капель.

Схема
Транзисторы КТ972 у меня были под рукой, вот я их и поставил.
Вы можете поставить любые другие транзисторы рассчитанные на напряжение не менее 30В и ток не менее 2А
Резисторы в базах транзисторов ограничивают ток до 40мА, что бы не повредить выход контроллера.
Светодиодный элемент я использовал из старой неисправной светодиодной лампы.
Что бы уменьшить напряжение питания элемента до 24 В.
Я поделил элемент на две части, разрезав одну дорожку и запараллелил эти два массива светодиодов.
Так как питание светодиодного элемента осуществляется короткими импульсами, а напряжение питания
равно напряжению падения на светодиодах, то ограничивать ток я не стал.
Диод стоящий параллельно электромагниту, защищает от отрицательных выбросов электромагнитной катушки.
Можно поставить диод из той же, разобранной LED лампы.
Электромагнит сделан из автомобильного реле. Реле у меня уже было раскурочено , по этому мне
пришлось использовать его таким какое оно есть.
Если бы у меня было исправное реле , я бы сначала попробовал подключить китайскую палочку на якорь реле.
Для обеспечения зазора между постоянным магнитом и электромагнитом, можно вложить между ними кусочек поролона, или сдвинуть палочку с магнитом в бок. Как я и сделал.

Скетч для ардуино
Я использую Arduino Nano,
потому что у меня их много и они прекрасно устанавливаются на макетной плате.
Но Вы можете использовать абсолютно любой контроллер Ардуино и даже Digispark
Энкодер использует прерывание INT1. Если вращать энкодер без нажатия,
то тогда регулируется частота вспышек стробоскопа и частота электромагнита, с шагом 0,1Гц. Если вращать с нажатием,
то регулируется длительность вспышек светодиода, у фотографов это называется время выдержки. При этом частота не изменяется.
Управление светодиодным элементом, для удобства отладки я подключил на D13, но
Вы можете поменять все пины подключения, на любые другие. Только нельзя менять пин D3(INT1) энкодера.

//Скетч от Cyber-Place.ru
// Выводы ЭНКОДЕРА
#define CLK 3  // Clock Подключаем к INT1, нельзя переназначать
#define DT 4  // второй вывод энкодера
#define SW 5  // switch кнопка энкодера
#define led_pin 13       // подключен светодиод
#define coil_pin A0      // электромагнит

#define Min 1 // минимальное значение 
#define Max 20000 //максимальное значение

#define step_freq 1       // шаг изменения частоты плавно 0,1Гц
#define step_freq_rough 10   // шаг изменения частоты грубо  1Гц 
#define step_timelght 100 // шаг приращивания в мкс
volatile int freq = 250; // частота в Гц умноженная на 10, для более плавной настройки
volatile uint32_t paus, time_light=2000; // время свечения светодиода в мкс по умолчанию 
uint32_t oldcount;
boolean DT_last; // последнее состояние энкодера

void setup()  
{
  pinMode(CLK,INPUT_PULLUP); // Clock Подключаем к INT1, нельзя переназначать
  pinMode(DT, INPUT_PULLUP); // второй вывод энкодера
  pinMode(SW, INPUT_PULLUP); // кнопка энкодера
  pinMode(led_pin, OUTPUT);    // управление симистором
  pinMode(coil_pin, OUTPUT);

  attachInterrupt(1, encoderTick, CHANGE); // прерывания от Энкодера
  
  DT_last = digitalRead(CLK);         // считываем положение CLK
  Serial.begin(115200);           // для отладки
}

void loop()
{
    paus=5000000/freq;
    digitalWrite(coil_pin, 1);
    digitalWrite(led_pin, 1);
    
    oldcount = micros();
    while( (micros() - oldcount) < time_light){}   // длительность импульса выдержки          
    digitalWrite(led_pin, 0);
    while( (micros() - oldcount) < paus){}  // положительный полупериод
    digitalWrite(coil_pin, 0);
    
    oldcount = micros();
    while( (micros() - oldcount) < paus){} //отрицательный полупериод
}

//********************обработчики прерываний Энкодера*******************************
void encoderTick() 
{
  uint8_t DT_now = digitalRead(CLK);       // считываем текущее положение CLK
  
  if (DT_now != DT_last && digitalRead(SW))   // если предыдущее и текущее положение не равны, значит был поворот 
  {                     
    if (digitalRead(DT) != DT_now)    // если DT не равен CLK, значит вращение по часовой стрелке
    {                             
      if( freq < Max ) freq += step_freq;    // прибавить 
    } else {                                   // если DT равен CLK, значит вращение против часовой
             if( freq > Min ) freq -= step_freq;  // убавить            
            }
  } else 
          if (DT_now != DT_last && !digitalRead(SW)) //если нажата кнопка и было вращение
          {
           if (digitalRead(DT) != DT_now)         // если DT не равен CLK, значит вращение по часовой стрелке
            {                             
              if( time_light < paus ) { time_light += step_timelght; } // убавить длительность           
            } else  if( time_light > 0 ) time_light -= step_timelght;    // прибавить длительность импульса выдержки/
          }
          
  DT_last = DT_now;                   // сохранить положение CLK для следующей проверки
}

Настройка левитрона
Основная настройка сводится к регулировке потока воды. Нужно настроить скорость потока воды таким образом,
что бы электромагнит мог стабильно разбивать поток воды на капли.
Я думаю что это очень просто и Вы визуально сразу поймете где золотая середина.
Так же настройте частоту вспышек стробоскопа, на более комфортную для Ваших глаз. Частота вспышек влияет
на расстояние между каплями, а если капли начнут рваться без синхронизации, то перестройте поток воды.
Если хотите снять видео на камеру , то нужно подстроить стробоскоп под частоту камеры, что бы на камере не было мерцаний

Будут вопросы спрашивайте здесь не стесняйтесь.
Я с удовольствием отвечу на них

Поделиться
Отправить
Запинить
1 комментарий
Игорь

Интересно! Спасибо за код. :)

Популярное