Как добавить в Marlin собственный драйвер двигателя?

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

Я знаю, что кто-то спросит, почему я спрашиваю, как мне добавить свои собственные драйверы...

  1. Чтобы узнать, было ли уже сделано кем-то другим то, что я пытаюсь сделать, или есть что-то близкое, что я мог бы настроить (повторное использование кода).

  2. Я пытаюсь создать абсолютно минимальную плату контроллера, которая будет управлять очень маленькими шаговыми двигателями. Я могу легко управлять шаговыми двигателями напрямую с помощью четырех TTL-выходов (конечно, с некоторой защитой выхода). Я уже экспериментально доказал, что это работает и надежно.

  3. Что еще важнее, я хотел бы попробовать это просто ради опыта. Как говорится, «путешествие – это пункт назначения».

, 👍2

Обсуждение

Добро пожаловать, Том. Я не понимаю предложение «Я знаю, что кто-то спросит, почему я спрашиваю, зачем мне добавлять собственные драйверы». Можете ли вы прояснить его, отредактировав свой пост?, @Bob Ortiz

@BobOrtiz - Хм, интересно, если подумать. Лучше сказать "Я знаю, что кто-то спросит, почему я спрашиваю, как я могу добавить свои собственные драйверы...". В текущем виде смысл таков: "Я знаю, что кто-то спросит меня, почему я спрашиваю, почему...", что неверно - хотя *реальный* смысл ясен. OP на самом деле спрашивает "*как* они могут добавить драйвер", ***а не*** "зачем им это нужно". Хороший улов :-), @Greenonline

Я обновил вопрос версией @Greenonline. Мой опыт публикации вопросов в сети показывает, что обычно возникает шквал ответов «зачем вы хотите это сделать?». Я пытался их предупредить., @Tom Cumming

Кроме того, это серьезный вопрос, и пока я получил только вербальные и орфографические правки. Я спрашиваю в правильном форуме? Где-то лучше задать этот вопрос?, @Tom Cumming

Я попытался ответить на ваш основной вопрос, хотя ваш второй подвопрос предполагает, что вы хотите написать драйвер с нуля, а заголовок предполагает, что вы интересуетесь только тем, «как добавить» уже существующий пользовательский драйвер., @Bob Ortiz

Может быть, вы могли бы включить stepper.h? Он поддерживает управление шаговым двигателем с помощью H-моста, например L298N. Затем вы могли бы использовать его функцию step() из кода Marlin для взаимодействия с библиотекой., @towe


2 ответа


1

Я предлагаю прочитать существующую документацию Marlin, касающуюся драйверов шаговых двигателей или драйверы Trinamic.

Возможно, также желательно ознакомиться с модульными файлами src/module/stepper.h, <code>src/module/stepper.cpp</code> или из репозитория Voxel8, например, stepper_indirection.h, поскольку они обрабатывают интерфейс шагового двигателя.

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

Кроме того, в зависимости от вашего опыта и требований, вы можете найти вдохновение в нескольких видеороликах на YouTube, таких как D IY Драйвер шагового двигателя с нуля или Учебное пособие по драйверу шагового двигателя EasyDriver A3967 с кодом Arduino.


,

Я уже прошел через все вышеперечисленное. Документация (в основном о том, как устанавливать #define, а не то, что я ищу), stepper.cpp, похоже, имеет дело в основном с высокоуровневыми вещами, т. е. я вижу много кода для сплайнов Безье и т. д. Возможно, моя проблема в том, что копаться в куче #if и #define, чтобы найти код, который действительно общается с оборудованием, так мучительно., @Tom Cumming

Что касается видео; я пишу такой код уже десятки лет, мне не нужны ответы на тему "как работает шаговый двигатель". Я уже использую Arduino для проверки концепции (как указано в моем вопросе). Мой вопрос касается конкретно того, как и где добавлять драйверы в Marlin., @Tom Cumming

Хотя этот вопрос также уместен на этом сайте, я думаю, что вам будет более удачно задать его на GitHub, используя контекст, который вы только что описали, то есть то, чего вы уже достигли и попробовали., @Bob Ortiz


2

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

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

Файлы заголовков в src/pins/pins_*.h определяют фактические контакты, которые взаимодействуют с оборудованием. Например, эти файлы содержат множество директив препроцессора #define, таких как этот #define, который определяет, какой вывод на определенном процессоре управляет направлением шагового двигателя Z;

#define Z_DIR_PIN 10

Файл заголовка indirection.h определяет «более высокий уровень»; #определить. Основываясь на приведенном выше примере, этот макрос определен в indirection.h и используется для фактической установки направления шагового двигателя.

#define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,INVERT_DIR(Z, STATE))

Наконец, stepper.cpp будет использовать приведенные выше макросы для фактической записи в оборудование. Как отмечалось выше, основная часть этого кода представляет собой директивы препроцессора #if/#else/#define для поддержки всех многочисленных конфигураций оборудования/процессора. . В Stepper.h есть макросы еще более высокого уровня, например

      #define Z_APPLY_DIR(FWD,Q) do{ \
        Z_DIR_WRITE(FWD); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, FWD)); \
        Z3_DIR_WRITE(INVERT_DIR(Z3_VS_Z, FWD)); Z4_DIR_WRITE(INVERT_DIR(Z4_VS_Z, FWD)); \
      }while(0)

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

Возможно, я столкнулся с большой проблемой с этим кодом. Тому, кто мало с этим работал, сложно внести простые изменения. Возможно, существует потребность в «простом шаговом двигателе». драйвер, не имеющий огромного количества аппаратных зависимостей, который можно использовать для таких людей, как я, которые просто хотят провести быстрый эксперимент.

,

Обратите внимание, что в приведенном выше ответе не упоминается, как осуществляется хронометраж., @Tom Cumming

Может быть, вы смотрите на другой код? #define Z_APPLY_DIR... определенно находится в моем stepper.cpp, а не в stepper.h., @Tom Cumming

Привет, Том, похоже, что твой последний комментарий пытается кому-то ответить. Комментарии работают так, что тебе (обычно) нужно обращаться к кому-то, используя символ @. Кроме того, ответный комментарий должен быть под тем же постом, где был сделан комментарий (на который ты отвечаешь). Как новый пользователь, ты можешь прочитать [Как работают комментарии?](https://meta.stackexchange.com/questions/19756/how-do-comments-work). Также, к твоему сведению, имейте в виду, что комментарии по своей природе недолговечны и, как правило, удаляются со временем. Поэтому любая дополнительная информация (которую необходимо сохранить) должна быть отредактирована в вопросе, а не помещена в комментарии., @Greenonline