Добрый вечер! В этой публикации я расскажу о своей самоделке, задумал которую я достаточно давно. Но реализовал только сейчас.
Впервые увидел этот эффект еще в детстве. Меня попросили помочь, подержать и посветить автомобильным стробоскопом на маховик двигателя автомобиля. Мотор запустили и после чего я увидел на вращающемся моховике, почти не подвижную насечку, которая стояла на одном месте, а маховик при этом вращался. После чего родилась идея сделать вентилятор и стробоскопом остановить его. Идею спустя какое то время реализовал, на лампе ИФК-120, тиристоре КУ202 с обвязкой, поигрался и закинул в дальний угол, но вот лет 6 тому назад увидел японское видео с левитацией воды. Так и родилась идея повторить этот трюк с левитацией капель. Долго не доходили до реализации руки и вот наконец то, сбылась мечта…
// Выводы ЭНКОДЕРА
#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 для следующей проверки
}
К сожалению, не доступен сервер mySQL