Тензодатчик для автоуровня.

15

Немного расскажу про эксперименты с тензодатчиком для автоуровня.

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

Желание делать автоуровень соплом возникло давно, часто дорабатываю принтер с разным успехом и обычный датчик типа bltouch мало того что постоянно мешался, так и любое изменение в хотенде приводило к необходимости калибровать сам датчик или переставлять крепление под разные конфигурации хотенда.

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

Простые датчики типа DF9-40 отверг, т.к. они на мой взгляд не отличаются особой повторяемостью и точность, плюс в документации указано что они склонны «уплывать» если постоянно находятся под нагрузкой.

В наличии имелись дешёвые китайские карманные весы на 100 грамм, я их брал для подсчёта количества мелких деталей при фасовке по пакетам. Вот такие:

Т к все детали были уже расфасованы, весы валялись без дела, разобрав их, я извлёк наружу тензометрический датчик довольно удачной формы, в виде бруска с резьбовыми отверстиями.

Вооружившись классической платкой с HX711 я приступил к настольным тестам. Скачал более менее свежую библиотечку с гитхаба https://github.com/olkal/HX711_ADC

Подключив всё к ардуине я стал проверять что и как.

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

Следующим шагом было отключение усреднения (по умолчанию в библиотеке набирается несколько измерений и выводится усреднённый результат) и перепайка платы HX711 на высокую частоту работы, 80 Гц, Перерезал дорожку на плате и замкнул 2 ножки.

Ситуация радикально улучшилась и появилась надежда на успех.

Прикинув датчик к крепления хотенда я понял что он неплохо туда вписывается.

У принтера ZAV хотенд крепится простой плоской стальной пластиной, что даёт простор для творчества.

Решено было выпилить аналог из алюминия, т.к. алюминий легче гнётся и показания с датчика будут выше.

Получилось страшненько но быстро. Принцип крепления понятен по фото, один край хотенда крепится к неподвижной пластине, второй край хотенда крепится к датчику, а датчик закреплён на пластине:

В процессе экспериментов с датчиком, я снимал показания и записывал их в эксель. Для примера график давления при одном из первых тестов повторяемости, крестом отмечена примерная точка подачи сигнала с датчика. 

Порог был настроен на 100. Сразу видно что стол успевает ощутимо перескочить.

Результат M48 одного из хороших тестирований:

22:22:11.732 : Bed X: 52.00 Y: 51.00 Z: 0.06

22:22:13.644 : 1 of 10: z: 0.050Mean: 0.050000 Sigma: 0.000000 Min: 0.050 Max: 0.050 Range: 0.000

22:22:15.552 : 2 of 10: z: 0.050Mean: 0.050000 Sigma: 0.000000 Min: 0.050 Max: 0.050 Range: 0.000

22:22:17.463 : 3 of 10: z: 0.045Mean: 0.048333 Sigma: 0.002357 Min: 0.045 Max: 0.050 Range: 0.005

22:22:19.372 : 4 of 10: z: 0.048Mean: 0.048125 Sigma: 0.002073 Min: 0.045 Max: 0.050 Range: 0.005

22:22:21.281 : 5 of 10: z: 0.048Mean: 0.048000 Sigma: 0.001871 Min: 0.045 Max: 0.050 Range: 0.005

22:22:23.190 : 6 of 10: z: 0.050Mean: 0.048333 Sigma: 0.001863 Min: 0.045 Max: 0.050 Range: 0.005

22:22:25.098 : 7 of 10: z: 0.052Mean: 0.048929 Sigma: 0.002259 Min: 0.045 Max: 0.052 Range: 0.008

22:22:27.008 : 8 of 10: z: 0.052Mean: 0.049375 Sigma: 0.002421 Min: 0.045 Max: 0.052 Range: 0.008

22:22:28.917 : 9 of 10: z: 0.055Mean: 0.050000 Sigma: 0.002887 Min: 0.045 Max: 0.055 Range: 0.010

22:22:30.825 : 10 of 10: z: 0.057Mean: 0.050750 Sigma: 0.003544 Min: 0.045 Max: 0.057 Range: 0.012

22:22:30.826 : Finished!

22:22:30.827 : Mean: 0.050750 Min: 0.045 Max: 0.057 Range: 0.012

22:22:30.829 : Standard Deviation: 0.003544

Были и менее удачные и несколько раз датчик вообще не срабатывал, стол врубался в хотенд…

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

Выяснил что в библиотеке HX711 используются стандартные медленные процедуры digitalread() и digitalwrite().

После готовности данных с АЦП срабатывает прерывание и запускается процесс чтения, нужно послать 27 импульсов и 27 раз считать сигнал, digitalread() и digitalwrite() занимали очень много времени, пришлось их заменить на битовые операции с портом PORTD | B00100000;  bitRead(PIND,3);

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

Следующим шагом я приступил к чтению даташита, там я нашёл пункт который почему-то не встречал в описании аналогичных конструкций в гугле, скорость работы HX711 можно легко поднять с 80 Герц до 140 Герц,  просто установив туда внешний кварц.

When using external clock or crystal, output data rate is directly proportional to the clock or crystal frequency. 

Перерезал ещё одну ножку на плате и запаял туда 20 мГц кварц.

Заодно припаял керамический конденсатор по питанию с тыльной стороны платы, что уменьшило шум АЦП. На результатах это не сказалось, но графики стали чуть более красивые в районе нуля, шум -7 +7 сократился до -1 +1

При 140 Гц  количество точек по прежнему не в избытке, но фронт стал более осмысленный и получилось ускорить срабатывание датчика. Синий — 80Гц, красный — 140 Гц. Графики в разном масштабе.

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

Пришлось активировать в прошивке пробинг по соленоиду #define SOLENOID_PROBE

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

В итоге после всех доработок получился вполне рабочий вариант.

Для примера 4 последовательные пробы стола из 9 точек.

21:08:23.913 : Bilinear Leveling Grid:

21:08:23.914 : 0 1 2

21:08:23.915 : 0 -0.704 -0.192 -0.294

21:08:23.916 : 1 -0.019 -0.015 -0.174

21:08:23.917 : 2 +0.127 +0.116 -0.035

21:16:17.736 : Bilinear Leveling Grid:

21:16:17.738 : 0 1 2

21:16:17.739 : 0 -0.714 -0.197 -0.301

21:16:17.739 : 1 -0.014 -0.006 -0.171

21:16:17.741 : 2 +0.119 +0.101 -0.032

21:17:00.647 : Bilinear Leveling Grid:

21:17:00.648 : 0 1 2

21:17:00.649 : 0 -0.721 -0.205 -0.300

21:17:00.650 : 1 -0.014 -0.006 -0.172

21:17:00.651 : 2 +0.152 +0.111 -0.043

21:19:43.254 : Bilinear Leveling Grid: 

21:19:43.256 : 0 1 2

21:19:43.257 : 0 -0.720 -0.205 -0.291

21:19:43.257 : 1 -0.012 -0.007 -0.166

21:19:43.259 : 2 +0.151 +0.112 -0.034

При этом из за медлительности датчика и контроллера, происходит перелёт кровати примерно на 0.1 мм. То есть после срабатывания датчика надо опустить кровать на 0.1 мм чтобы под соплом пролазила бумажка.

Дальше в планах использование китайской микросхемы CS1237, которая выдаёт данные с частотой 1.28kHz, Возможно получится ускорить срабатывание датчика. 

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

Идея подсмотрена у китайского Creality. На видео с 7 минуты хорошо видно место крепления плёночного тензодатчика под белой каплей герметика на кронштейне хотенда.

Исходные коды датчика не выкладываю, там всё примитивно, заменяем в библиотеке медленные функции digitalread() и digitalwrite() на более быстрый аналог или битовые операции, а в скетче из примера к библиотеке включаю сигнал по превышению показания датчика if (i > 100)    {       PORTB = PORTB | B00100000;

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

Из текущих преград к улучшению осталась невозможность использования прерывания для концевиков.

У меня TMC2209 и задействован software uart, который захапал под себя прерывания, marlin не даёт включить прерывание для концевиков при активном софтовом уарте. Хотя по факту UART используется однократно для парковки осей, а всё остальное время ничего не мешает использовать прерывания для других нужд.

Ссылка на источник
Читайте также

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here

Solve : *
24 − 13 =