Для станка ЧПУ
приобрел мотор шпиндель с регулировкой оборотов.
Радиолюбительский зуд не давал покоя — захотелось иметь на станочке показометр оборотов. Вариант с оптическим энкодером показался слишком сложным. Датчика холла, который применяется во всех автомобилях, не было под рукой. И тут на одном форуме подкинули идейку — попробовать ИК сенсор. Как раз без дела лежал ИК датчик препятствий, который не знал куда применить. Решил его попробовать — результат под катом.
Данный модуль применяется в основном в ардуинщиками в роботостроительстве как ИК датчик препятствия. Представляет маленькую очень бюджетную платку (особенно если покупать партиями штук по 10)
Схема у этого сенсора очень простая
В основе лежит ИК пара диод-транзистор. Что вроде L-53P3C/L-53F3C работающие в диапазоне 940нм
Компаратор LM393 сравнивает уровень фоторанзистора с уровнем, выставляемым подстроечным резистором.
Подцепил к валу шпинделя кусочек фольги, поднес сенсор к валу, покрутил подстроечник — модуль стал моргать светодиодом в так вращения.
Поковырявшись в своей барахолке нашел
ATmega328 в DIP корпусе и
четырехразрядный семисегментный индикатор
Максимальная скорость вращения у мотора 12000RPM и лучше было бы применить 5-разрядный индикатор, но будем работать с чем имеем
Накидал такую схему
Порядок подключения выводов индикатора к микроконтроллеру значения не имеет (так как настраивается в программе) и обусловлен исключительно из удобства проектирования печатной платы
«Квадратный» дизайн платы потому что на данном этапе я осваивал изготовление печатных плат на станке ЧПУ
Закругленные полигоны сложнее, а главное, дольше выбирать гравировкой.
Основным достоинством изготовления плат на станке является то, что весь процесс происходит не отрывая зада от кресла. С покупкой ламинатора я отказался от этого метода, оставив для станка сверление отверстий и обрезку плат.
Итак гравируем, сверлим, режем
И вот можно отлаживать готовую плату
Сразу делаю корпус из обрезков ПВХ пластика
Для работы индикатора применяется
простая и удобная библиотека SevSeg, позволяющая подключать индикатор к каким угодно выводам МК, применять индикаторы как с общим катодом, так и анодом да еще и яркостью управлять.
Для измерения частоты попробовал
библиотеку FreqMeasur. МК с ней отлично мерит сигнал с генератора от 10 до 200Гц (а больше мне и не нужно)
А вот когда на вход контроллера подал с сигнал с сенсора, результат получился плачевным.
Частота прыгала как ненормальная. Виной этому оказался «дребезг» сигнала с оптического датчика. Фольга давала массу помех. Попытка настроить сигнал подстроечником или заменить кусочек фольки на другой не дали ощутимого результата.
Тогда я решил давить «дребезг» программно. Осциллограф показал, что помехами являются импульсы в 0.3 — 1 мкс, тогда как сигнал — это импульсы 5мс (При частоте 12000RPM) и больше.
В результате родилась такая программка с подавлением помех длительностью менее 2мкс
// Библиотека работы с 7-сегментным индикатором
// https://github.com/sparkfun/SevSeg
#include <mSevSeg.h>
SevSeg myDisplay;
byte displayType = COMMON_CATHODE; //Your display is either common cathode or common anode
byte digit1 = 18;
byte digit2 = 19;
byte digit3 = 8;
byte digit4 = 10;
byte segA = 17;
byte segB = 9;
byte segC = 12;
byte segD = 14;
byte segE = 15;
byte segF = 16;
byte segG = 13;
byte segDP = 11;
byte numberOfDigits = 4;
int dot = 0;
uint32_t ms, ms1 = 0, ms0 = 0, ms2 = 9;
uint32_t rps = 0;
uint32_t count = 0;
char buf[10];
void setup(){
// Инициализация индикатора
myDisplay.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP);
myDisplay.SetBrightness(100);
myDisplay.DisplayString("----", 0);
// Инициализация входа для счета импульсов
attachInterrupt(0, pulseCount, RISING);
}
void loop(){
ms = millis();
char s[10];
uint16_t rpm = 0;
// Перевыдача дисплея
myDisplay.DisplayString(buf, dot);
// Каждую секунду перевыдаем значение скорости
if( ms2 == 0 || ms2 > ms || ( ms - ms2 )>1000 ){
ms2 = ms;
// Переводим в коичество оборотов в минуту
rpm = rps*60;
// Отображение 10=тичной точки, сли число больше 4-х разрядов
if( rpm > 9999 ){
dot = 2;
sprintf(buf,"%4d",rpm/10);
}
else{
dot = 0;
sprintf(buf,"%4d",rpm);
}
rps = 0;
}
}
/**
* Счетчик импульсов
*/
void pulseCount(){
uint32_t ms = micros();
// Убираем импулься менее 2 мс (дребезг)
if( ms - ms0 > 2000 )count++;
ms0 = ms;
// 0.5 сек цикл подсчета импульсов
if( ms - ms1 > 500000 ){
ms1 = ms;
rps = count*2;
count = 0;
}
}
Программа показала 100% результат с тестового генератора. При включенном моторе с сенсора показывались стабильные обороты, которые хорошо коррелировали с режимом работы мотора. На том и остановимчя
Еще одна проблема нартсовалась при выборе места установки счетчика на станок.
В длинных проводах наводились сильные помехи от мотора и БП и индикатор, отлично работавший «на коленках» никак не хотел работать на станке. В результате смонтировал контроллер в непосредственной близости от сенсора и запитал его через импульсный DC-DC преобразователь от 24В. (Напряжения для шаговиков, подсветки, вентиляторов охлаждения).
Так мой новый станочек обзавелся счетчиком оборотов шпинделя. индикаторы К слову, данный измеритель должен практически без изменения схемы и программы заработать и с «кошерным» датчиком холла и магнитиком на валу.
Пока собирал станок, приехали 5-ти разрядные индикаторы. Хотел переделать измеритель скорости вращения на них с более компактным Atmega8 в TQFP32. Но потом решил, что лучшее — враг хорошего.
А индикаторы пошли в другой проект - индикатор для любого Sonoff с управлением по UART
Следующий обзор я посвящу контроллеру станка, его доработке и настройке.
Весь мой путь от старого к новому станку есть в
моем блоге.
Кот за любой кипишь кроме голодовки )))
Вообще хорошо бы составить общую статистику по шпинделям различной мощности и заглублению проходов по различным материалам и фрезам.
Тогда бы каждый знал какой именно шпиндель ему лучше покупать.
А то у нас набоум покупают самый мощный. ;)
Но больше фанеры 6мм на скорости 200мм/мин за один проход пока не загружал
В принципе у шпинделя есть характеристики — мощность, обороты, крутящийся момент
А дальше все решается материалом, фрезой и скоростью подачи. Тут, мне кажется, у каждого свой опыт, сформированный загубленным заготовками и поломанными фрезами
Есть доп. датчики температуры/влажности (можно и другие туда подключить), счетчики электроэнергии и прочее
Влажность мне удобно отображать «100.0%»
Если сценарий работы выключателя связан с другим модулем
Кондер может и меньше стоять
Я зажигаю точку декадного делителя:
12000 = 12.00 — типа 12К RPM
В любом кулере есть такой датчик внутри.
Герцы — это у радистов :)
ATmega8 для этого проекта не хватит?
Для чего кнопка сброс?
Для 328 могу бинарник выложить
В принципе на частоте 200-1000Гц без проблема и самому фильровать
Вон спектроанадизаторы на звуковой частоте FFT применяют
Да и не нравится мне магнит на валу. Вдруг он вибрацию даст еще
Во вторых ток будет зависеть от нагрузи шпинделя
В моем случае проще было откалибровать положения переменного резистора регулировки оборотов
Да, ток так же даст информацию о моменте на двигателе, что может спасти фрезу при заклинивании. В отличие от оптического датчика.
Вот зависимость оборотов, нагрузки (момента) от тока, информации больше, схема проще и надежней
Небольшое скольжение поля легко компенсировать
Легко как-раз в двигателе постоянного тока.
Для дома вряд ли это целесообразно
а те «кулеры», что с тремя проводами, еще и выход импульсного таходатчика (ключ) имеют, 2 замыкания на оборот.
измерял скорость вентилятора: подключил пищалку-прозвонку к таходатчику и записал звуковые пакеты микрофоном на компе.