Датчик автоуровня на основе датчика давления для Rostock

Подписаться на 3Dtoday
PororoThePinguin
Идет загрузка
Загрузка
22.02.17
11880
48
печатает на Ultimaker Original
RepRap
51
Статья относится к принтерам:
Rostock
Во всех моих 3д-принтерах меня каждый раз неимоверно бесила необходимость выставлять высоту сопла над уровнем стола. Необходимость эта возникала регулярно, при каждой замене сопла или каких-то других действиях с хотэндом, требовавших его разборки.

Периодически я видел всякие конструкции на базе датчиков приближения (холла), оптических датчиков и прочих шайтан-машин. Но все они требовали точно так же выставлять уровень сопла после каких-либо манипуляций с хотом. Правда, теперь уровень задавался относительно датчика, а не стола. Но радости это все равно не приносило.

Проблему решать надо было кардинально. Для этого нужно, чтобы в качестве датчика уровня использовалось само сопло.

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

Второй способ был - поставить микрик на каретку так, чтобы касание соплом стола вызывало срабатывание микрика. Способ рабочий, но у меня не получилось избавиться от люфтов в креплении хот-энда, и я от него отказался.

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

Я заказал модуль АЦП HX711и сам датчик на 1кг. Спустя месяц ожидания все это дело было получено и настало время прикрутить эту красоту к принтеру.

Есть два варианта подключения. Первый - это подключить АЦП напрямую к мозгам принтера и сказать прошивке, что это датчик веса. Но это решение, на мой взгляд, сильно так себе. Во-первых, поддержка таких датчиков находится пока только в экспериментальном состоянии. Во-вторых, мозгам и так есть чем заняться помимо того, чтобы постоянно читать вес от датчика и пытаться понять, что там происходит.
Значит нам нужен второй вариант: подключить это через промежуточный контроллер, который будет прикидываться концевиком для мозгов принтера. Его и выберем.

План действий будет следующий:

  1. Печатаем крепления датчика на эффектор
  2. Подключаем датчик веса к Arduino
  3. Подключаем Arduino с датчиком к мозгам принтера
  4. Редактируем прошивку принтера.
Крепления можно скачать тут. Вариант сыроватый, но рабочий и дорабатываемый по мере выявления недостатков.

Теперь подключаем контроллер к АЦП. Я нарыл в закромах Arduino Nano, но это не принципиально. На время отладки и калибровки сойдет и так, а дальше я поменяю на Attiny13, которая будет монтироваться вместе с платой АЦП прямо на эффектор для уменьшения уровня наводок по всем этим трактам. Почему на эффектор, а не рядом с основными мозгами принтера? Потому что для наилучшей точности стоит максимально укоротить провода между АЦП и датчиком веса. А если мы монтируем туда АЦП, то есть смысл прицепить туда и контроллер, чтобы от эффектора просто вести три провода к мозгам.

Также с этим АЦП есть нюанс: по умолчанию частота выборок АЦП составляет 10Гц, что слишком мало для нашего применения. То есть, технически, будет работать и так, но точность срабатывания будет плохой.
Для нормальной работы надо перевести АЦП в режим частоты опроса 80Гц. Для этого надо отцепить ногу RATE от земли и посадить ее на VCC.
Тут есть два варианта, зависят от ревизии платы HX711.

Вариант с новой ревизией - просто запаиваем перемычку на слева от которой написано 80Hz.
Если не повезло и пришла старая ревизия, то надо отпаять от платы вторую сверху ногу со стороны 4х-пинового разъема и подпаять ее к VCC или первой сверху ноге.
Все, модуль переключен в режим опроса 80Гц и наша жизнь стала немного прекраснее.

Зачем это проделывать? Так как показания датчика нестабильны из-за наличия вентилятора на голове и постоянных движений эффектора в процессе калибровки, то в скетче используется фильтр НЧ, который сглаживает скачки показаний датчика для большей надежности работы. Фильтр берет 10 значений веса и из них получает отфильтрованные показания. На частоте 80Гц выборка 10 значений занимает примерно 120мс, на частоте 10Гц - займет секунду. Соответственно, надо жертвовать фильтром, что будет приводить к ложным срабатываниям во время движения головы.

Подключаем датчик к АЦП. Соединяем провода:

  • Красный -> E+
  • Черный -> E-
  • Белый -> A-
  • Зеленый -> A+
Подключаем АЦП к Arduino:

  • VCC -> 5V Arduino
  • DT -> A2
  • CLK -> A3
  • GND -> GND Arduino
Клонируем репозиторий

git clone https://github.com/alpha6/HX711_endstop

и открываем в Arduino IDE скетч - *Tenso_sensor.ino*

В скетче меняем const bool DEBUG = false; на const bool DEBUG = true;

Заливаем скетч в Arduino и через Serial monitor смотрим за показаниями.

2 раза в секунду там должна появляться строка

current weight! [848342] [848267]

цифры будут зависеть от нагрузки на датчик и погоды на Юпитере и могут плавать между измерениями, даже если датчик просто лежит на столе.

Убеждаемся, что значения датчика меняются при воздействии на него. Если меняются, значит, все собрано верно. Если нет - надо поменять местами провода DT и CLK. Я так один раз перепутал контакты DT и CLK: с виду все работало, но при попытке калибровки принтер попытался проломить соплом стол.

В установленном на принтер виде цифра от датчика должна увеличиваться при касании стола!

Вот так все это выглядит в установленном на принтер виде:
Теперь сделаем из Arduino концевик для мозгов принтера.

Для управления принтером у меня используется плата Melzi. Для RAMPS все будет сильно проще с точки зрения получения пинов и настройки прошивки.

Для этого нам понадобится любой оптрон и резистор на 1кОм. Оптрон я использовал 4n35, потому что он был под рукой. Любой другой подключается аналогично с разницей на нумерацию ног.

На плате Melzi всего 3 пина под концевики, на Дельте они все используются для калибровки осей. Так что нам нужен какой-то другой концевик. На своем принтере я не использую экран с кнопками, и у меня есть целый свободный разъем на 10 пин рядом с ISP, так что я буду использовать пин A1 оттуда. Для RAMPS никаких подобных телодвижений не надо, благо, концевиков у него хватает.

Для обычных принтеров у которых стол паркуется в Z-MIN датчик цепляется вместо Z-MIN.

  • Соединяем землю Arduino и пин 2 оптрона
  • Сажаем пин 1 через резистор на пин D7
  • Пин 4 оптрона соединяем с землей 10 пинового разъема на Melzi. Для RAMPS соединяем с землей концевика Z-Min
  • Пин 5 отпрона соединяем с пином A1 10 пинового разъема на Melzi. Для RAMPS соединяем с сигнальным пином концевика Z-Min.
Схема подключения:
Устанавливаем датчик на принтер. После того, как все установлено, подводим датчик к столу. Задача - откалибровать порог срабатывания так, чтобы датчик срабатывал от касания стола, но не срабатывал от движений головы.

Для контроля срабатываний без заглядывания в сериал-монитор удобно подключить светодиод. Цепляем землю диода на пин 5 оптрона, а + через резистор на +5В. Теперь диод будет загораться при срабатывании датчика.

Теперь отредактируем прошивку.

Я не буду описывать конфигурацию прошивки с нуля, опишу только специфичные для калибровки вещи. По всему остальному в интернете полно гайдов, а эта статья и так здоровенная выходит.
Предполагается, что все остальное уже настроено для Дельты, принтер работает и нужно только автокалибровку прикрутить.
В принципе эта часть подойдет для любого принтера, а не только дельт. Разница только в том, что на дельтах можно использовать только автокалибровку под названием BILINEAR, а на остальных принтерах к ней добавится еще 2 вида.

Будем использовать самые последние решения в стане прошивкостроения.

Клонируем репозиторий Marlin

git clone https://github.com/MarlinFirmware/Marlin.git

Переключаемся на бранч RcBugFix потому что в master и RC автокалибровка на дельтах не работает.

cd Marlin
git checkout RcBugFix

Открываем прошивку в Arduino IDE. Настраиваем все, что необходимо, и приступаем к настройке автокалибровки.

*N.B.* Если у вас вообще не Дельта с хомингом в Z-MIN, то просто воткните Arduino в Z_MIN и смело пропускайте все настройки высот и прочее, что относится к дельтам или принтерам с хомингом стола в Z_MAX.

Первым делом нам надо добавить концевик Z-Min для Melzi. На RAMPS он есть, и этот пункт нужно пропустить.

Открываем вкладку pins_SANGUINOLOLU_11.h и после

#define E0_DIR_PIN 0

добавляем строки

#define Z_MIN_PROBE_PIN 30
#define Z_MIN_PIN 30

Технически, должно хватить только указания Z_MIN_PIN, но в той ревизии, что сейчас лежит в гите, есть баг, и сборка падает, если не задан Z_MIN_PROBE_PIN.

Сохраняем файл и переходим в Configuration.h

Раскомментируем строку

#define USE_ZMIN_PLUG

В строке

#define Z_MIN_PROBE_ENDSTOP_INVERTING false

false меняем на true

Раскомментируем строку

#define FIX_MOUNTED_PROBE

Выставим смещения Z-Probe на 0

#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER 0

Раскомментируем строку

#define Z_MIN_PROBE_ENDSTOP

Ну, и главная наша цель:

#define AUTO_BED_LEVELING_FEATURE

Тоже раскомментируем. Также раскомментируем строку

#define AUTO_BED_LEVELING_BILINEAR

Это единственный доступный тип автоуровня для Дельты. Сопло проходит по всему столу и строит карту высот, по которой потом печатает.
В строке:

#define ABL_GRID_MAX_POINTS_X 3

регулируется кол-во точек на грани квадрата. Т.е., при настройке в 3 сопло проверит высоту в 9 точках. Если указать 9 - то точек будет 81, время калибровки возрастет соответственно.

Также стоит выставить высоту области печати в значение, близкое к реальному.

#define MANUAL_Z_HOME_POS 156.8

Высота должна более-менее совпадать с реальными цифрами!

Сопло после выполнения G28 и получения G29 идет в минимум со скоростью, указанной для хоминга. Скорость эта по умолчанию составляет 2000 мм/мин, на некотором расстоянии от поверхности стола скорость сбрасывается в 2 раза и на этой скорости происходит касание. Если заданная в прошивке высота области печати будет сильно больше реальной, то сопло просто врежется на полном ходу в стол и датчик может не успеть сработать. Точнее, датчику на срабатывание надо 120мс, за это время сопло пройдет 4мм вниз. А дальше все зависит от прочности конструкции и силы моторов. Один раз таким образом у меня получилось разбить стекло на столе.

А если область печати будет меньше реальной, то от заданной области печати сопло будет идти со скоростью в 2 раза меньше скорости калибровки, и ждать окончания процесса придется очень долго.

Скорости хоминга по Z регулирются этими строками:

#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z
#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2)

Еще можно включить опцию двойного касания, дает большую точность (в теории), но и занимает больше времени:

#define PROBE_DOUBLE_TOUCH

Заливаем прошивку в принтер. Проверяем, что работает G28, командой M119 проверяем, что концевик Z-MIN в состоянии open.

Теперь откалибруем датчик веса на нужный уровень срабатывания.

Для этого подводим голову к поверхности стола и прижимаем сопло к столу. В этот момент должен сработать датчик. Если этого не произошло, уменьшаем порог срабатывания в прошивке датчика:

long trigger = 13000;

Имеет смысл уменьшать сразу на 1000, но это зависит от используемого датчика. У меня датчик срабатывает от легкого касания сопла пальцем. Чемь меньше будет порог срабатывания, тем лучше, но без фанатизма. Он не должен срабатывать от торможения каретки при калибровке, например.

Датчик работает. В качестве финального штриха к портрету, проверяем, что в разных положения эффектора в области печати не срабатывает датчик из-за натяжения трубки боудена или проводов вентилятора. Пишу этот пункт по собственному опыту, ибо я долго боролся со срабатыванием датчика при торможении каретки, а оказалось, что это трубка боудена дергала хот вверх со всеми вытекающими. После изменения положения мотора экструдера проблема ушла.

Теперь, когда все проверено, говорим G29. Голова поедет вниз и начнет тыкаться в стол согласно количеству точек, указанных в прошивке. После окончания калибровки будет выдана карта высот. Стоит убедиться, что все значения в ней находятся на одном уровне в переделах погрешности (второй цифры после запятой). Ну, это если стол ровный, без бугров, впадин и перекосов.

Все. На этом процесс настройки автокалибровки завершен, и можно заняться ее тюнигом.
Подписаться на 3Dtoday
51
Комментарии к статье

Комментарии

22 Фев 20:57
3
Хорошая реализация, давно витали мысли такой реализации т.к. она самая правильная.

Датчик нельзя минуя АЦП подключить на аналоговой вход Nano?
Разве Nano нельзя подключить к основной плате напрямую?

А для борьбы с ложными срабатывания во время работы я бы добавил еще обычный концевик, который бы срабатывал чуть раньше при приближении сопла к столу и позволял соплу дальше двигаться. В итоге если сопло высоко, то показания датчика не важно т.к. концевик не сработал. Остается только работа с первыми словами, когда концевик активирован.
22 Фев 22:26
2
Датчик нельзя минуя АЦП подключить на аналоговой вход Nano?
В теории можно, но на практике там нужен усилитель потому что сигнал от резисторов достаточно хилый. Я думал взять только усилитель и читать напрямую ардуиной, но после подсчета стоимости и габаритов устройства оказалось что овчинка выделки не стоит. Хотя более скоростной АЦП я пока лениво подыскиваю.

Разве Nano нельзя подключить к основной плате напрямую?
Нет, там надо сигнал к земле прижимать, а с ардуины этого не сделать. Она умеет только подавать или убирать напряжение с пина.

А для борьбы с ложными срабатывания во время работы я бы добавил еще обычный концевик, который бы срабатывал чуть раньше при приближении сопла к столу и позволял соплу дальше двигаться. В итоге если сопло высоко, то показания датчика не важно т.к. концевик не сработал. Остается только работа с первыми словами, когда концевик активирован.
Показания датчика не учитываются нигде кроме команд автокалибровки и определения высоты (G29 и G30 соответственно). Так что дополнительный концевик это будет бессмысленное усложнение конструкции. У меня на датчик выведен светодиод и во время печати он постоянно мигает.
24 Фев 01:13
0
Нет, там надо сигнал к земле прижимать, а с ардуины этого не сделать. Она умеет только подавать или убирать напряжение с пина.
Не может этого быть. Там полноценное питание или земля на выходе. Если у кого-то, конечно, не сепаленный контроллер.
24 Фев 10:26
0
Ну возможно я что-то делал не так, но теперь у меня на нане 3 ноги не подают признаков жизни:D
Хотелось бы увидеть правильную схему подключения.
2 Мар 14:24
0
Нет, там надо сигнал к земле прижимать, а с ардуины этого не сделать. Она умеет только подавать или убирать напряжение с пина.
Подтягивающий резистор вам в помощь
22 Фев 21:08
2
А мне кажется или этот пост реплика вот этого блога?
22 Фев 22:18
1
Нет, не кажется ;)
23 Фев 09:01
0
А вы какое отношение имеете к первоисточнику?
23 Фев 09:57
5
Никакого, я и есть первоисточник 8)
23 Фев 01:47
0
Круто. А я пожалуй на сопло провод кину. А Дельта не умеет не по центру калиброваться ? Типа три пятака на окружности ?
зы. можно и один если как чисто концевик использовать.
23 Фев 02:30
0
Дельта умеет всяко калиброваться:)
У меня по 25 точкам.
23 Фев 09:27
0
А можно подробнее как можно кинув контакт на сопло добится калибровки? Срабатывать же будет при касании стола и следовательно будет маленький зазор, практически отсутствовать.
23 Фев 09:59
1
Так и не должно быть никакого зазора между соплом и столом в нуле. Зазор создаст слайсер когда будет печатать первый слой.
На этой конструкции зазора тоже нет - 0 это сопло упертое в стол.
23 Фев 02:49
1
А что мешает покрыть стол пищевой фольгой и кинуть контакт на неё? Я, вот, попробовал, вполне нормально работает, хотя стол тоже стеклянный. Побрызгал лаком для волос положил кусок фольги разгладил, все хорошо контачит!
23 Фев 09:02
0
Гемор лишний.
23 Фев 10:01
2
Задача в том, чтобы при смене сопла не делать вообще никаких дополнительных действий - ткнул печать и он печатает. А фольгу придется кидать перед каждой печатью, а я ленив :)
4 Мар 20:54
1
Фольгу можно кольцом по краю намертво приклеить, правда рабочяя площадь малость урежется.
23 Фев 12:32
0
Я детальки для датчика заказал. Попробую собрать. Если все удачно выйдет, то может нарисую платку под него на манер дигиспарка.
23 Фев 13:00
0
Ну я изначально под него купил дигиспарковскую плату, но она что-то не захотела сходу прошиваться, так что собрал на нане. А так как уже едут тини13 - то проще будет собрать все на ней сразу.
Один фиг у АЦП и дигиспарка отверстия для крепления не совпадают :( И хотел из них бутерброд сделать чтобы компактно все крепилось.
24 Фев 11:22
0
Я то вообще хотел плату под распайку, что бы на одной был АЦП и спарк. Я поиграюсь потом выложу.
ЗЫ кстати говоря неплохо было бы указать лицензию на софт что на гитхабе (в смысле прошика)
23 Фев 13:21
0
Спасибо за полезные дискуссии!
23 Фев 14:05
0
Я датчик к хотэнду вот так закрепил, датчик 150 граммовый, винты M2,5


ce73ec0150ae8032ed335e8dd2d50229.JPG
23 Фев 15:13
0
А что за радиатор такой хитрый?

Я вот тоже думаю взять датчик поменьше, с килограммовым я что-то погорячился.
23 Фев 16:23
0
e7d0a0c0855d529e84f7dd3ebb7d8581.JPG

Самодельный, но отличается от китайского только тем что одно из ребер сточено, и термоблок сделан из меди, а не прессованного алюминия.
23 Фев 16:34
0
Я вот думаю что я взял маленький, наверное грам на 300-400 надо было брать. Боюсь как бы трубка боудена не вносила погрешности. У меня будет на операционнике собран, без оцифровки, детали в пути, на макетке все работает.
23 Фев 17:31
0
Ну с килограммовым пришлось перекладывать трубку боудена и провода насмерть прикручивать к эффектору. Иначе из-за рывков проводов ложные срабатывания были.

У меня в скетче берется динамика изменений значений. Динамика будет одинаковой независимо от предела измерений датчика.
23 Фев 18:18
0
Я что то не пойму как он, датчик этот срабатывает, от удара соплом по столу? У меня датчиков таких дома штук 40 на 200 грамм, хотелось бы тоже применить хоть один.
23 Фев 19:02
1
В датчике стоят 4 резистора которые изменяют сопротивление в зависимости от изгиба пластины. Дальше ацп получает значения сопротивления и выдает его в виде числового значения. Ардуина опрашивает АЦП и смотрит на динамику изменений значений. Как только значения переходят указаный порог ардуина говорит что датчик сработал. Соответственно как только сопло упирается в стол сопротивление резисторов резко меняется и датчик срабатывает.
23 Фев 19:02
1
На алюминиевом бруске наклеены тензорезисторы которые соединены по схеме моста уинстона. При нажатии получается перекос по сопротивлению, а следовательно по напряжению, именно его усиливает усилитель, а дальше или в ацп и ардуину или в операционник.
27 Фев 23:07
0
Сегодня убил датчик, нажал пальцем с усилием килограмм на 5, один из резисторов ушел в обрыв. Аккуратнее надо быть.
23 Фев 19:50
0
Спасибо за разъяснение. Как я понимаю датчик опрашивается только в том случае когда каким то образом запускается калибровка перед началом печати потом он бездействует. Так как при печати головка двигается как сумасшедшая надо же датчику отфильтровать данные и понять об стол он ударился или от движения осей вибрация.
23 Фев 20:00
0
Угу. незнаю как в других прошивках, но в марлине если по логике работы щуп не должен касаться стола, то он не будет опрашиваться.
24 Фев 00:25
0
Ну у меня просто сделан НЧ фильтр и порог срабатывания. При обычных движениях головы рывки не выходят за порог, а при упоре в стол он превышается многократно и датчик срабатывает.
Все дело облегчается тем, что прошивка на показания датчика смотрит только когда они нужны, в остальных случаях ей до лампочки, как и с остальными концевиками.
24 Фев 11:46
0
Я ещё когда первый принтер собирал, то прочитал статейку
https://m.geektimes.ru/post/249138/comments/
Закупил тоже тензодатчик с усилителем, но так и не доли руки это поставить. Ни на первый ни на третий принтер...
24 Фев 11:46
0
есть ли видео как это работает?
25 Фев 00:14
2
28 Фев 21:46
0
Надо стекло с напылением брать на стол. Напыление хорошо проводит.
1 Мар 10:03
0
Его сдерет нафиг прилипшей деталью и приплыли. Тут ломаться нечему + можно получить статистику по работе экструдера всякую, но мне лень :)
1 Мар 10:06
0
Смотря какое напыление. Если брать за К- стекло, то его содрать можно только сошлифовав со стекла алмазным кругом.
2 Мар 16:57
0
что за стекло такое?
2 Мар 17:23
0
К стекло то? да популярная вещь, с металлическим напылением. На вид как чуток тонированное. Вообще изначально оно для отражения ИК обратно в квартирку. Типо энергосберегающее. Но проводит хорошо и мы в 2007 году делали из таких стекл обогреватели, нарезая лазером на них дорожки и снимая по киловатту с квадратного метра.
2 Мар 17:23
0
Да, стекло проводящее настолько, что по нему даже индукционнный датчик лазерного резака срабатывал, которй откалиброван под стальной лист.
2 Мар 17:25
0
А закалить такое стекло как?
3 Мар 00:32
0
А при наклейке каптона или, что еще хуже, синего скотча... Тогда как?
4 Мар 21:09
0
А зачем всю площадь металлизировать, можно полосой по периметру пустить той-же фольгой
7 Мар 21:10
0
По хорошему дельте для калибровки нужно несколько точек на плоскости стола, если точки будут только по периметру то получится фигня. Или одна центральная точка для определения высоты, если плоскость нормально выставлена руками.
24 Июн 22:54
0
7807d38302b0bf9fb0d71110781f3e81.jpg

Спасибо за прошивку на digispark attiny85 с небольшими доработками подошла. Датчик на 1 кг в самый раз. Развязка на оптроне на ramps 1.4 не потребовалась, работает на Repitier.
9 Окт 09:52
0
В общем то хорошая реализация. У меня на разных температурах стола стол винтом по разному крутит. Автоуровень офигенно спасает. Был Bltouch, горя не знал, но после установки толкового охолождения, места для него не осталось.
А что делать с соплями, которые неизбежно текут? Даже если в конце печали забрать пруток 50мм, F1000, все равно текут. Или греть хотэнд, а после G29? но это в некотором роде не корректно. Или греть минут 15 пока все не вытечет? Кто как делает?
Уж не знаю насколько родным был bltouch, повторяемость 0,05, а на тензо 0,003.

Для написания комментариев, пожалуйста, авторизуйтесь.

Читайте в блогах

Первые впечатления о Flyingbear Tornado

Из Anet A8 до "Ultimaker" за несколько шагов. Шаг первый!

Противогаз из S.T.A.L.K.E.R.

Сканеры - наш друг и помощник в жестоком мире репРапа

3Dtoday за 60 секунд от 17 ноября

Во время печати оккультной статуэтки сгорел 3D-принтер. В поджоге подозреваются нечистые силы