Дело было вечером, делать было нечего (с)
Как-то вошкаясь в сети, я наткнулся на один проект, на который даже был патент. Проект связан с силовыми гироскопами и системой стабилизации, но сейчас немного не об этом речь. Для реализации этого изделия, как вы поняли, необходимы гироскопы. Я попытался найти готовое решение, потому как понимал, что большая сложность в изготовлении — балансировка маховика гироскопа. И, конечно же, я его не нашёл. В качестве мотора использовал бесколлекторный мотор, наподобие этого, да что уж говорить, именно его и выбрал для своих экспериментов. Выбор пал на него, по той причине, что маховик крепится не одним центральным винтом, а четырьмя небольшими винтам, расположенными по окружности.
Ну и нужен маховик. Быстренько нарисовал чертёж, отправил токарю, чутка подождал и получил готовое изделие.
Одно прикрутил у другому и получил вот такую незамысловатую конструкцию.
Осталось прикрутить к основанию, чтобы по столу эта штука весело и безмятежно не каталась.
При запуске вся эта неведома конструкция неистово вибрирует, того и гляди — сейчас развалится. От этого становилось страшно и как-то не по себе. Было решение собрать самодельный стенд для балансировки. Т.к. опыта разработки электроники и прошивок для контроллеров у меня крайне мало, т.е. по сути нет, то и пришлось информацию собирать в разных источниках.
Я примерно понимал как работает балансировочный станок-ищем пик вибрации, запоминаем или как-то указываем место, где этот пик был найден. Всё просто. В моём случае — буду использовать светодиод для подсветки «тяжёлого» места маховика.
В качестве датчика я решил использовать акселерометр. Начитался этих ваших интернетов и понял, что нужно использовать аналоговый акселерометр, например ADXL-335. Связано с тем, что у цифровых на выходе стоят фильтры, а мне нужны прям сырые данные и обрабатывать я их хочу сам. Возможно, это не так. Если не так, поправьте. Кстати, частоту больше 400Гц этим акселерометром не измерить.
В качестве светодиода решил использовать 1Вт светодиод. Поставил его через ограничивающий ток резистор в 27Ом, с надеждой что ардуинка его (светодиод) вытянет по нагрузке. В принципе, она и вытянула, перебоев каких-то не было.
В качестве контроллера взял платку с Arduino Nano. Она недорогая и прикольно мелкая.
Сначала всё повесил на сопли на имеющийся кронштейн для проверки работоспособности всей идеи. Выглядело это довольно печально.
Собрал всё, решил посмотреть что там на выходе с акселерометра. А вот же что там, такая себе синусоида.
Что я думал и как себе представлял. Пока буду находиться на вершине синусоиды — буду включать светодиод. Выглядело это для меня крайне логично и вполне работоспособно. Добавил потенциометр для регулировки «высоты» порога срабатывани.
Написал вот такую коротенькую программу.
Первая прошивка
int axel = A0; // аналоговый акселерометр
int reg = A1; // потенциометр
int ledPin = 13; // светодиод
void setup() { pinMode(ledPin, OUTPUT);} //мегакоТ
void loop() {
if (analogRead(axel)>analogRead(reg)) digitalWrite(ledPin, HIGH); //чтение. сравнение и включение светодиода
else digitalWrite(ledPin, LOW);// выключение светодиода
}
С предвкушением её залил в микроконтроллер и ничего не произошло. Иногда, можно было разглядеть метки на маховике, но это случайности были.
Посоветовавшись с умными людьми я понял, что детектировать пик нужно более точно и однозначно, это первое, второе — длину импульса светодиода нужно задавать самостоятельно, а не как у меня было (длина подсветки зависит от частоты вращения и порога срабатывания). А ещё можно специальной магией увеличить скорость работы АЦП.
На основе этих изменений родилась прошивка 2. Ничего не придумывал, взял готовые формулы.
Вторая прошивка
int axel = A0 ; // аналоговый акселерометр
int ledPin =13 ; // светодиод
int minADC = 1023; // присваиваю начальное значение переменной
int maxADC = 0; // присваиваю начальное значение переменной
int nowADC = 0; // присваиваю начальное значение переменной
bool maxIsWorked = true; // присваиваю начальное значение переменной
bool minIsWorked = true; // присваиваю начальное значение переменной
uint32_t timer; // присваиваю тип переменой (целые числа)
float freq, ampV, A, S, V, m; // присваиваю тип переменой (числа с плавающей запятой)
void setup() {
pinMode(ledPin, OUTPUT); // ledpin будет выход
Serial.begin(2000000); // настройка скорости com порта
ADCSRA |= (1 << ADPS2); // магия 1
ADCSRA &= ~ ((1 << ADPS1) | (1 << ADPS0)); // магия 2
}
void loop() {
nowADC = 1023-analogRead(axel); //реверс сигнала, изменения направления оси
if (nowADC > maxADC) {
maxADC = nowADC;
}
else if (nowADC < minADC) {
minADC = nowADC;
}
else if (maxADC > nowADC + 10 and minIsWorked) {
maxIsWorked = true;
minIsWorked = false;
//кусок выше - условия, при которых ищу пик на синусоиде
uint32_t nowTime = micros(); //записываю текущее время в мкс в переменную nowTime
Serial.println("xx");
freq=1000000 / (nowTime - timer); //вычисляю частоту сигнала с акселерометра, Гц
ampV=(maxADC-minADC)4.87;//вычисляю амплитуду сигнала, мВ A=ampV/3009.8;//вычисляю виброускорение в м/с^2
S=A25.35/freq/freq;//вычисляю виброперемещение, мм V=S0.63freq;//вычисляю виброскорость, мм/с m=8040.3V/(2.5freq*60); // вычисляю массу на радиусе 2 см, при массе всего ротора 300 г, пытался вычислить массу, которую необходимо убрать с маховика. не вышло
Serial.println(freq, 0);
Serial.println(ampV);
Serial.println(S, 3);
Serial.println(V);
Serial.println(m, 3);
Serial.println(" ");
timer = nowTime;
digitalWrite(ledPin, HIGH);
delayMicroseconds(12); //время свечения светодиода в мкс
digitalWrite(ledPin, LOW);
minADC = 1023;
//кусок выше - вывод данных в порт
}
else if (minADC < nowADC - 10 and maxIsWorked) {
maxADC = 0;
maxIsWorked = false;
minIsWorked = true;
}
}
И только после этого случилось то, что случилось!
Т.к. балансировать необходимо не одно изделие, а несколько, то запилил настольный микростенд. Нарисовал спроектировал, напечатал на принтере и собрал.
Поставил мотор с маховиком на стенд, разметил маховик, раскрутил, измерил виброкорость (именно по этому параметру решил оценивать вибрацию). Нашёл место для облегчения маховика.
Виброскорость до балансировки составляла 1,9 мм/с.
Найденное место, с которого необходимо снять материал (около девяточки).
Процесс удаления лишней массы. Магнит нужен для того, чтобы стружка не разлеталась в разные стороны и не попала в мотор, например.
После сверловки запускаю маховик и смотрю на сколько изменилась картина. Сверлю или дальше отверстие по глубине, или сверлю отверстие в другом месте.
В результате виброскорость упала до 0,6 мм/с.
Вы скажете, а можно ли уменьшить ещё. В данной работе мне это сделать меньше мне не удалось. Видимо, уже начинает сказываться качество подшипников, люфты, ретроградный Меркурий или иные воздействия. А я пробовал, пытался. В результате получается сыр.
Но, этого результата мне более чем достаточно. Вибрация, конечно, есть, её ногтем можно ощутить, но корпус, с установленным мотором и маховиком уже не прыгает на столе и не разрушает сам себя.
В целом, можно было исследовать виброскорость на разных частотах, озадачиться измерением виброскоростей в двух опорах, как делают взрослые дяди на больших станках, для проведения более точной балансировки, но я добился того, что мне необходимо было в первом приближении и остановился на этом.
Ниже — немного другое представление информации, но там голые ножки и зима.