Добрый вечер! В этой публикации я расскажу о своей маленькой самоделке, задумал которую я достаточно давно.
Некоторое время назад я прочитал статью об интересных устройствах – левитронах, которые бывают как чисто механическими, так и с электронным управлением.
Естественно, захотел собрать себе такую игрушку, но, поискав в интернете, к своему удивлению обнаружил, что все схемы были исключительно аналоговыми. Так как в аналоговой технике я понимаю мало, решил «изобрести» левитрон заново. Для экспериментов под рукой оказался Arduino Uno. Заказал в Китае линейный датчик Холла (что такое эффект Холла), а именно UGN3503UA, насобирал некоторое количество старых трансформаторов для намотки пробных катушек и приступил к экспериментам.
Вот что из этого получилось:
Как это работает. В нижней части катушки по центру установлен датчик Холла, измеряющий расстояние до неодимового магнита, который приклеен к «левитирующей» пробке. Датчик имеет три «ножки» — питание 5В и аналоговый выход, который подключен к АЦП Arduino.
Управляющая соленоидом схема собрана на полевом транзисторе и подключается к выходу с ШИМ Arduino.
Соленоид подключен к выводам J1, контакт 1 разъема J2 к ШИМ Arduino. Подключение датчика Холла к входу АЦП на схеме нет, но сложностей тут никаких быть не должно.
Количество витков катушки сказать не могу, так как в ходе экспериментов изготовил 3 или 4 катушки, мотал по принципу «сколько провода еще осталось на трансформаторе». Остальные параметры: сопротивление катушки около 12Ом, диаметр 30 мм, высота 10 мм, толщина провода 0,3 мм, катушка без сердечника.
Программа в первом варианте была крайне проста, при выходе значения из допустимого диапазона схема или отключается или включается на полную мощность, на видео выше устройство как раз работает по такому алгоритму. В следующей версии прошивки МК пытается плавно регулировать напряжение на соленоиде, в результате чего снизилась склонность к возникновению колебаний в системе.
#define sensorPin A0
#define pwmPin 6
int sensorValue = 0;
int levitPoint = 370;
int deltaLevit = 5;
int maxL, minL;
byte induction = 128;
void setup()
{
Serial.begin(115200);
pinMode(pwmPin, OUTPUT);
maxL = levitPoint - deltaLevit;
minL = levitPoint + deltaLevit;
}
int sensorRead(int sensorPin)
{
int s = 0;
for(byte i =0; i < 5; i++) {s += analogRead(sensorPin);}
return s/5;
}
void loop()
{
sensorValue = sensorRead(sensorPin);
if (sensorValue < 490)
{
if (sensorValue < maxL) induction = 0;
if (sensorValue > minL) induction = 250;
if (sensorValue >= maxL and sensorValue <= minL) induction = ((sensorValue - maxL)*25);
} else induction = 0;
analogWrite(pwmPin, induction);
}
Питается схема от 12В, датчик запитан от встроенного стабилизатора Arduino. Потребление в максимальном режиме около одного ампера, в режиме висения 0.3-0.4 А.
Устройство заработало, но дольше одной минуты пока работать опасно, транзистор сильно нагревается, греется также и катушка, вплоть до расплавления клея (все собрано на термоклее).
Планирую в дальнейшем переделать соленоид и перевести схему на питание от 5 вольт, поставить более мощный транзистор, с радиатором. Ну и заменить Arduino на ATiny. Не помешает также поставить на входные цепи конденсатор большой емкости, или даже батарею конденсаторов для защиты блока питания (первый блок питания на 1,5А, сгорел через 10 секунд работы от скачков нагрузки).
На этом, пожалуй, закончу, спасибо за внимание.