Лайв фокус лазера
- Войдите на сайт для отправки комментариев
Доброго времени суток всем.
Гравирую и режу фанеру на самодельном со2 лазере.
Из за того, что материал бывает не лучшего качества (гнутый) приходится пользоваться тяжелыми грузами, что бы придавить фанеру к столу. Иначе фокусное расстояние получается не точным и соответственно получаем плохой рез и некачественную гравировку.
Задался целью поставить лайв фокус на станок, но штука эта прямо скажу не по карману. Тем более станок не для бизнеса, а для домашних поделок.
Расстояние хочу отслеживать ультразвуковым сенсором. Высоту головы менять шаговиком с швп.
Набросал по быстрому вот такой скетч:
#include <AccelStepper.h> #define PIN_TRIG 12 #define PIN_ECHO 13 AccelStepper Stepper1(1,3,5); //использует пин 12 и 13 для dir и step, 1 - режим "external driver" (A4988) int dir = 1; //используется для смены направления int step1 = 0; long duration, mm; int e = 0; void setup() { // Инициализируем взаимодействие по последовательному порту Serial.begin (9600); //Определяем вводы и выводы pinMode(PIN_TRIG, OUTPUT); pinMode(PIN_ECHO, INPUT); Stepper1.setMaxSpeed(3000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду) Stepper1.setAcceleration(1000); //устанавливаем ускорение (шагов/секунду^2) } void loop() { // Сначала генерируем короткий импульс длительностью 2-5 микросекунд. digitalWrite(PIN_TRIG, LOW); delayMicroseconds(2); digitalWrite(PIN_TRIG, HIGH); // Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц. delayMicroseconds(10); digitalWrite(PIN_TRIG, LOW); // Время задержки акустического сигнала на эхолокаторе. duration = pulseIn(PIN_ECHO, HIGH); // Теперь осталось преобразовать время в расстояние mm = (duration / 2) / 2.91; if (e >= mm) { if (dir < 0) { dir = dir*(-1); } step1 = (e-mm); if(Stepper1.distanceToGo()==0){ //проверка, отработал ли двигатель предыдущее движение Stepper1.move(step1*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление) } } if (e < mm) { if (dir < 0) { dir = dir*(-1); } step1 = (e+mm); if(Stepper1.distanceToGo()==0){ //проверка, отработал ли двигатель предыдущее движение Stepper1.move(step1*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление) } } Serial.print("distance: "); Serial.print(mm); Serial.println(" 0.1 mm."); // Задержка между измерениями для корректной работы скеча delay(100); }
Ардуино иде не выдала ни одной ошибки, но скетч не работает.
Ткните плиз носом (но не сильно) в мою ошибку. Где накосячил - не пойму.
Спасибо всем.
А что значит "не работает"?
Я присоединяюсь к вопросу, но заодно хочу сделать пару замечаний.
Вот Вы знаете, специалисты разбивают задачу на части и делают по частям. А по мере готовности частей (и хоть какой-то уверенности в том, что с ними всё нормально) добавляют готовые части к системе. Потому что разобраться в системе, где глючить может всё, что угодно не хватит никакого внимания и никакой квалификации. А вот новички валят всё в кучу и запускают за раз, надеясь, что как-нибудь отладят, мол "хватит квалификации".
Вопрос: Вы по отдельности измеряли расстояние и двигали лазер мотором? Если нет - делайте. Делайте по отдельности, а когда будете уверены, что и то, и другое отлично работает, только тогда пытайтесь запускать их вместе.
А если делали, то скажите пожалуйста, с какой точностью у Вас измеряется расстояние? Вы же сравнивали с линейкой? А то меня терзают смутные сомнения, что там "плюс/минус два вершка".
Спасибо за совет.
Погрешность в 0.1 - 0.5 мм меня вполне устроит, поскольку перевязь луча после линзы имеет допустимую для гравировки величину около 0.5 мм.
По отдельности работает.
Расстояние измеряет. Не так точно, как хотелось бы, но на дистанциях 100-150 мм погрешность 0.1 мм.
Только надо коррекцию ввести, поскольку на расстоянии, к примеру, 100 мм показывает в мониторе порта 110 мм, а на расстоянии 150 показывает 160. Измерял штангеном на штативе. Но если построить график, то во всем диапазоне данные из монитора строго соответствуют измереным физически + N мм.
Библиотеку accelstepper тоже проверял отдельно. Взял штатный пример и покрутил движком влево - вправо тоже работает нормально. Ротор поворачивается на строго заданный угол.
А вот вместе эти 2 составляющие почему то не хотят работать.
Смотрел и на осциле и в физической сборке.
Не работает - угол двигателя не изменяется в зависимости от расстояния датчика до объекта.
На результаты измерения сонара температура влияет вроде. А там, где резка лазером, она будет меняться...
Ну тут не принципиально использование ультразвука.
Я для теста еще несколько датчиков заказал.
Лазерный в ИК диапазоне и светодиодный.
У них заявленная 1 мм, но фактическую буду смотреть по факту.
Мне сейчас важно обкатать сам принцип. а с типом датчика потом разберусь.
Ruida, на сколько мне известно, как раз лазерный использует.
Я про точность. PulseIn может получить в лучшем случае 330 м/с * 4×10-6с = 1.32 10-3 м Т. е. По вашему методу измерения точность не лучше 1.3 мм. Чтобы повысить точность до 0.1 мм надо использовать таймер для измерения времени с периодом тактирования лучше 0.4 мкс.
Ноги драйвера мотора и измерителя расстояния должны быть разведены на разные ноги процессора. И точно не на первую.
Принцип такой:
1) выкидываете аксельстеппер
2) измеряете расстояние.
3) расстояние > максимально допустимого - выставляете dir=1 (например) и даете импульс в step (или несколько) для того, чтобы переместить измеритель ближе к поверхности;
4) расстояние < максимально допустимого - выставляете dir=0 и даете импульс step (или несколько) для того, чтобы переместить измеритель дальше от поверхности;
5) переходите на шаг 2.
Не забывайте про гистерезис, иначе будет ваш двигатель дергаться туда-сюда постоянно
Согласен, но считаю необходимым добавить: также установить датчик температуры и добавить тепмературную компенсацию в расчёт расстояния. Тогда можно реально получать качественный результат.
Если захотите делать, то скорость звука равна 20.02 * sqrt(T) (Т - абсолютная температура).
Так что можете легко посчитать, что при 20ºС она 342,77 м/с, а при 30ºС - 348,57 м/с. Т.е. почти два процента (если точнее, то 1,7%) погрешности Вы получили на ровном месте за счёт игнорирования температуры.
Так! Ожидается отличная конструкция, "в бой идут одни старики" )))
А по такому принципу может попробовать https://www.youtube.com/playlist?list=PLqsrg-73aerUt6OJbu1cPYp-S-8uQ9gyj
Только щуп ближе к точке лазера
Я еще размышлял насчет прижима листового материала с шариковыми опорами снизу (по аналогии с фрезером) Но у меня портал 2 метра и в центре его может изгибать. соответственно собьется юстировка.
Ларчик просто открывался.
Теперь всё вращается как надо.
Спасибо всем.
Тема наболевшая у лазерщиков. Я думаю, скетч пригодится не только мне.
Приедут другие типы датчиков - обкатаю на них.
Потом еще дисплей прикручу.
Я еще размышлял насчет прижима листового материала с шариковыми опорами снизу (по аналогии с фрезером) Но у меня портал 2 метра и в центре его может изгибать. соответственно собьется юстировка.
А если лазер на шариковой опоре кататься будет... Жестко не привязывать к оси Z