Кастомизация Repetier: добавляем физические кнопки для управления принтером

admtw
Идет загрузка
Загрузка
19.05.2019
732
1
печатает на RepRap
RepRap

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых постах.

Отписаться от уведомлений вы всегда сможете в профиле автора.

12
Нравится мне repetier за относительно простую кастомизацию прошивки. Но почему-то сложилось так, что на repetier тяжелее найти какую-либо информацию из-за не слишком большой популярности. В основном все предпочитают пользоваться Марлином. Да и сообщества у Marlin побольше будет

В общем с добавлением физических кнопок в прошивку repetier оказалось проще чем я думал.

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

CustomEventsImpl.h

CustomEvents.h

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

Разработчик Repetier уже сделал некоторую реализацию функций, через которые можно расширять возможности прошивки. В файле Events.h можно найти пару десятков функций, которые помогают улучшить или взаимодействовать с прошивкой. Можно использовать имеющиеся, а можно написать свои(об этом как нибудь в другой раз).

В первую очередь нужно подключить эти файлы ко всей прошивке. В файле CustomEvents.h нужно всего лишь добавить несколько следующих строк

---------------------CustomEvents.h--------------------------

#ifndef CUSTOM_EVENTS_H_INCLUDED

#define CUSTOM_EVENTS_H_INCLUDED

extern void Custom_Timer100MS();

#undef EVENT_TIMER_100MS

#define EVENT_TIMER_100MS {Custom_Timer100MS();}

#endif

--------------------------------------------------------------------

Первые две строки подключают файлы к общей прошивке. Функция extern void Custom_Timer100MS() нужна для опроса кнопок каждые 100 миллисекунд.

Остальные две строки просто переопределяют функцию EVENT_TIMER_100MS

Идем дальше. Для начала нужно объявить новую функцию в файл CustomEvents.h. Функцию нужно объявить после #define CUSTOM_EVENTS_H_INCLUDED

---------------------CustomEvents.h--------------------------

#ifndef CUSTOM_EVENTS_H_INCLUDED

#define CUSTOM_EVENTS_H_INCLUDED

extern void Custom_Timer100MS();

extern void CustomButton1(); // <---------

...

---------------------------------------------------------------

(Вместо CustomButton1 может быть абсолютно любое имя.)

Теперь можно переходить непосредственно к файлу CustomEventsImpl.h.

Для создания самой кнопки внутри этого файла нужно объявить пару переменных. Собственно, это pin, на который будет задействована кнопка и вспомогательная переменная k.

---------------------CustomEventsImpl.h--------------

#define custom_pin_1 45

uint8_t k;

---------------------------------------------------------------

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

Контакт 45 у меня в прошивке определен как концевой выключатель на X_MIN. На моей дельте концевики задействованы только на максимуме. В большинстве случаев используются либо минимальные концевики, либо максимальные. И как минимум три физические кнопки можно повесить на эти контакты.

Теперь можно переходить к функции обработки кнопки. Функция Custom_Timer100MS() вызывается с частотой 100мс. В ней и будет вызываться функция опроса кнопки.

Custom_Timer100MS() в прошивке реализована изначально и переопределена из файла Events.h

---------------------CustomEventsImpl.h--------------

...

void Custom_Timer100MS(){

CustomButton1(); // первая кнопка

}

...

---------------------------------------------------------------

И наконец в CustomButton1() нужно описать действие кнопки. Для этого нужно добавить следующий код:

---------------------CustomEventsImpl.h--------------

...

void CustomButton1(){

#if (custom_pin_1>-1)

if (READ(custom_pin_1) != 1 && k<100){

k+=1; // Count time

if(k>5 && k<100){

k=100;

GCode::executeFString(PSTR('G28')); //<----

}

}

else if(READ(custom_pin_1) != 0 && k>5 ){

k=0; // Reset position

}

else if(READ(custom_pin_1) != 0 && k>0 && k<=5){

k=0; // Reset position

GCode::executeFString(PSTR('M140 S90')); //<----

}

#endif

}

---------------------------------------------------------------

А теперь по подробнее.

Физически кнопка срабатывает при замыкании пина 45 на землю. При размыкании, пину 45 нужна подтяжка к плюсу питания через резистор 10kOm. в противном случае контакт будет висеть в воздухе и ловить наводки.

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

Переменная k необходима для отслеживания длительности нажатия кнопки, плюс защита от дребезга контактов.

Команды прошивка получает в виде G-code, поэтому в строку GCode::executeFString(PSTR('G28')) вместо G28 можно вписать любой другой код, обрабатываться который будет по нажатию кнопки.

Однако нужно запомнить: функция GCode::executeFString() капризна. Лучше не пытаться отсылать другие команды во время обработки незавершенной текущей операции. Может возникнуть зависание.

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

Однако работать это у вас это конечно же не будет, пока вы не подключите вышеупомянутые файлы. В Файл Configuration.h нужно раскоментировать или добавить строку #define CUSTOM_EVENTS.
Надеюсь кому-нибудь помог этим постом.

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых постах.

Отписаться от уведомлений вы всегда сможете в профиле автора.

12
Комментарии к статье

Комментарии

19.05.2019 в 10:32
1

Благодарю!

Приятно видеть реализацию действительно полезного функционала без привлечения ресурсоёмких библиотек.

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

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

КОНКУРС "Мое знакомство с Tiger3D"

Покрышки с отверстием.

Настольные боевые роботы - Спиннер

5. Калибровка

Папина машинка

Светильник Wb Nightlight