Skip to content

Latest commit

 

History

History
150 lines (111 loc) · 8.84 KB

readme.md

File metadata and controls

150 lines (111 loc) · 8.84 KB

Таймлапс в стиле фильма матрица в разработке

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

На данный момент проект признан жизнеспособным, осталось только твердотельное моделирование и обкатка.

Для реализации нам понадобиться серво самая простая. sg90 подойдет. в дальнейшем планирую использовать на 270 грудусов, сейчас пока на время разработки используется 180 градусов, подключить ее достаточно просто, у нее три вывода G - земля, VC 5 вольт, и сигнал. ничего не напоминает? да, это практически любой разъём в нашей плате) я использовал PA8 3d touch.

желтый провод сигнал красный 5 вольт и черный или коричневый земля. цепляем к принтеру. в printer.cfg добавляем раздел:

[servo matrix]
pin: PA8 #  пин на плате
maximum_servo_angle: 180 # градус сервы
minimum_pulse_width: 0.0008 # по умолчанию 0.001 тут можно поиграться когда серва не поворачивается на полную
maximum_pulse_width: 0.0025 # по умолчанию 0.002 важно не только уменьшать но и увеличивать. тоесть играем парой значений одновременно
initial_angle: 0 # не меняем. это стартовый угол при загрузке принтера

После того как подсоеденили и прописали можем проверить. В консоли принтера пишем: SET_SERVO SERVO=matrix ANGLE=90 дальше пробуем максимальные углы, меняем размер импульсов. для этого можно использовать команду SET_SERVO SERVO=matrix WIDTH=0.001 значения выбирайте сами, 0 выключит серву и можно подвигать руками...

Как наиграетесь можно написать макрос. у меня в printer.cfg есть строчка [include macro.cfg] и рядышком файл рядышком с таким же именем macro.cfg куда я записываю макросы чтоб они мне не мешали читать конфиг в минуты раздумий)

Итак макрос нам нужен для того чтобы посчитать общее количество слоев и номер текущего слоя и вычислить градус на какой повернуть серву чтобы вначале был 0, а в конце 180\270 градусов соответсвенно. спасибо неравнодушным людям которые за несколько потных дней сваяли нам вот такой макрос:

[gcode_macro BEGIN_LAYER]
description: Start a new layer and notify system
gcode:

  {% set CUR  = params.NUM|default(0)|float + 1 %}
  {% if params.COUNT and params.COUNT != 0 %}
        {% set TOTAL = params.COUNT|default(0)|float %}
  {% elif printer["gcode_macro middle"].total_layer and printer["gcode_macro middle"].total_layer!= 0 %}
        {% set TOTAL = printer["gcode_macro middle"].total_layer %}
  {% else %}
         { action_respond_info("COUNT of Total layers is required!") }
  {% endif %}

  SET_GCODE_VARIABLE MACRO=middle VARIABLE=cur_layer VALUE={CUR}
  SET_GCODE_VARIABLE MACRO=middle VARIABLE=total_layer VALUE={TOTAL}
  {action_respond_info("BEGIN CUR: %s TOTAL: %s" % (CUR, TOTAL))}


[gcode_macro middle]
description: Variable_storage
variable_cur_layer: 0
variable_total_layer: 0
gcode:
#    {action_respond_info("MIDDLE TOTAL: %s TOTAL: %s" % (CURRENT_LAYER, TOTAL_LAYER))}

[gcode_macro MATRIX]
gcode:
    {% set CURRENT_LAYER = printer["gcode_macro middle"].cur_layer %}
    {% set TOTAL_LAYER = printer["gcode_macro middle"].total_layer %}

    {% set angle_move = 180 / TOTAL_LAYER * CURRENT_LAYER %} #задаем переменную сдвига на слой. вот здесь и задаем свою серву 180 или 270 градусов.
 #   { action_respond_info("MATIRIX TOTAL: %s CUR: %s" % (TOTAL_LAYER, CURRENT_LAYER)) } #вывод в консоль текущего слоя и всего слоев
 #   { action_respond_info("angle %s" % angle_move) } # вывод в консоль текущего угла
    SET_SERVO SERVO=matrix ANGLE={angle_move} #4 макрос сдвига

Для того чтобы он заработал нам необходимо сделать так чтобы слайсер нам посылал номера слоеев и их общее количество. (найдутся умники которые мне скажут что клиппер и так знает количество слоев но это не так, достаточно часто цифры там могут быть сильно далеки от реальных.)

В Cura нам надо найти раздел Расширения > Пост-обработка Изменить G-код.

Найти раздел search and replace и вписать в первую строчку: ;LAYER_COUNT:(\d.*)\n

а во вторую: ;LAYER_COUNT:\1\nBEGIN_LAYER COUNT=\1\n

Не забываем ставь галочку как на картинке "использовать регулярные выражения"

теперь открываем еще раз search and replace

и теперь в первую строку копируем это: ;LAYER:(\d.*);\n

во вторую это: ;LAYER:\1;\nBEGIN_LAYER NUM=\1\nMATRIX\n

Если у вас Prusa Slicer:

в раздел before layer change G-code вписать:

BEGIN_LAYER NUM={layer_num} COUNT={total_layer_count};
matrix;

Нарезаем модель, радуемся. Для того чтобы всё это заработало нам нужна модель. А вот её как раз нет) ждемс или моделируем сами)

TEST!!! NOT USE!!!!!

тест, не трогать не использовать. деальнейший код просто обсуждение разработки!!!!

[manual_stepper matrix]
step_pin: PD15
dir_pin: PA1
enable_pin: !PA3
microsteps: 16
rotation_distance: 5.625
full_steps_per_rotation: 200
velocity: 15
accel: 1000
#endstop_pin: !PC8 # раскоментировать при наличии концевика
position_max: 455 # надо померять расстояние и поставить чуть меньше


[gcode_macro BEGIN_LAYER]
description: Start a new layer and notify system
gcode:

  {% set CUR  = params.NUM|default(0)|float + 1 %}
  {% if params.COUNT and params.COUNT != 0 %}
        {% set TOTAL = params.COUNT|default(0)|float %}
  {% elif printer["gcode_macro middle"].total_layer and printer["gcode_macro middle"].total_layer!= 0 %}
        {% set TOTAL = printer["gcode_macro middle"].total_layer %}
  {% else %}
         { action_respond_info("COUNT of Total layers is required!") }
  {% endif %}

  SET_GCODE_VARIABLE MACRO=middle VARIABLE=cur_layer VALUE={CUR}
  SET_GCODE_VARIABLE MACRO=middle VARIABLE=total_layer VALUE={TOTAL}
  {action_respond_info("BEGIN CUR: %s TOTAL: %s" % (CUR, TOTAL))}


[gcode_macro middle]
description: Variable_storage
variable_cur_layer: 0
variable_total_layer: 0
gcode:
#    {action_respond_info("MIDDLE TOTAL: %s TOTAL: %s" % (CURRENT_LAYER, TOTAL_LAYER))}

[gcode_macro MATRIX]
gcode:
    {% set CURRENT_LAYER = printer["gcode_macro middle"].cur_layer %}
    {% set TOTAL_LAYER = printer["gcode_macro middle"].total_layer %}

    {% set angle_move = 450 / TOTAL_LAYER * CURRENT_LAYER %} #задаем переменную сдвига на слой.  первая цифра максимальное расстояние по балке
 #   { action_respond_info("MATIRIX TOTAL: %s CUR: %s" % (TOTAL_LAYER, CURRENT_LAYER)) } #вывод в консоль текущего слоя и всего слоев
 #   { action_respond_info("angle %s" % angle_move) } # вывод в консоль текущего угла
    MANUAL_STEPPER STEPPER=matrix MOVE={angle_move} SPEED=5 #4 макрос сдвига