Как стать автором
Обновить

Левитрон на Arduino

Время на прочтение2 мин
Количество просмотров96K
Добрый вечер! В этой публикации я расскажу о своей маленькой самоделке, задумал которую я достаточно давно.

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

Естественно, захотел собрать себе такую игрушку, но, поискав в интернете, к своему удивлению обнаружил(по крайней мере на тот момент), что большинство схем были исключительно аналоговыми. Так как в аналоговой технике я понимаю мало, решил «изобрести» левитрон заново. Для экспериментов под рукой оказался Arduino Uno. Заказал в Китае линейный датчик Холла (что такое эффект Холла), а именно UGN3503UA, насобирал некоторое количество старых трансформаторов для намотки пробных катушек и приступил к экспериментам.

Вот что из этого получилось:





Как это работает. В нижней части катушки по центру установлен датчик Холла, измеряющий расстояние до неодимового магнита, который приклеен к «левитирующей» пробке. Датчик имеет три вывода — питание 5В и аналоговый выход, который подключен к АЦП 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() 
{
  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 секунд работы от скачков нагрузки).

На этом, пожалуй, закончу, спасибо за внимание.
Теги:
Хабы:
Всего голосов 69: ↑69 и ↓0+69
Комментарии31

Публикации

Истории

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн