Улучшение работы кнопок на принтерах с аналоговой клавиатурой
Итак у меня Anet A8 сильно модифицированный обычна просто не хватает времени описывать что и как я на нём улушел. Наверно многие сталкивались стем что по как ото причине на аналоговой клавиатуре принтера перестают работать некоторые кнопки особенно часто проявляется если в камере или возле пульта сильно тепло. Причина очевидна резисторы на пульте и за температуры меняют сопротивление и диапазон напряжений сменяется на каждой клавише! Вчера обновлял прошивку с Marlin-2.0.7.2 на Marlin-2.0.9.3 и долгих после танцев с бубном она наконечники скомпелировалась! Почему так долго пришлось плясать ? По поперечине того что в принтере сделано много модификаций на аппаратном уровне и они сконфигурированы в прошивке. Потому обычный переход на боле новую версию у меня выглядит так! Сперва закидаю конфиги со старой версии также фай с питнами, с картами термо дачиков и тд. После начинаю потихоньку устранять ошибки компиляции! Так как авторы Marlin просто обожают от версии к версии изменять имена примеренных то и ошибок естественно вылазите много но они легко устранимы! В общем добился того что файл наконец скомпелироаплся залил всё работает а клавитура молчит! Сперва подумал что что то накостылял начал разбираться всё правильно полез в исходники а именно в файл Marlin-2.0.9.3\Marlin-2.0.x\Marlin\src\lcd\marlinui.cpp да кстати в других версиях Marlin этот программный код для работы с клавиатурой хранится в других файлах! Итак нахожу я там вот это :
//---------------------------------------------------------------------------------------
#if HAS_ADC_BUTTONS
typedef struct {
uint16_t ADCKeyValueMin, ADCKeyValueMax;
uint8_t ADCKeyNo;
} _stADCKeypadTable_;
#ifndef ADC_BUTTONS_VALUE_SCALE
#define ADC_BUTTONS_VALUE_SCALE 1.0 // for the power voltage equal to the reference voltage
#endif
#ifndef ADC_BUTTONS_R_PULLUP
#define ADC_BUTTONS_R_PULLUP 4.7 // common pull-up resistor in the voltage divider
#endif
#ifndef ADC_BUTTONS_LEFT_R_PULLDOWN
#define ADC_BUTTONS_LEFT_R_PULLDOWN 0.47 // pull-down resistor for LEFT button voltage divider
#endif
#ifndef ADC_BUTTONS_RIGHT_R_PULLDOWN
#define ADC_BUTTONS_RIGHT_R_PULLDOWN 4.7 // pull-down resistor for RIGHT button voltage divider
#endif
#ifndef ADC_BUTTONS_UP_R_PULLDOWN
#define ADC_BUTTONS_UP_R_PULLDOWN 1.0 // pull-down resistor for UP button voltage divider
#endif
#ifndef ADC_BUTTONS_DOWN_R_PULLDOWN
#define ADC_BUTTONS_DOWN_R_PULLDOWN 10.0 // pull-down resistor for DOWN button voltage divider
#endif
#ifndef ADC_BUTTONS_MIDDLE_R_PULLDOWN
#define ADC_BUTTONS_MIDDLE_R_PULLDOWN 2.2 // pull-down resistor for MIDDLE button voltage divider
#endif
// Calculate the ADC value for the voltage divider with specified pull-down resistor value
#define ADC_BUTTON_VALUE(r) int(HAL_ADC_RANGE * (ADC_BUTTONS_VALUE_SCALE) * r / (r + ADC_BUTTONS_R_PULLUP))
static constexpr uint16_t adc_button_tolerance = HAL_ADC_RANGE * 25 / 1024,
adc_other_button = HAL_ADC_RANGE * 1000 / 1024;
static const _stADCKeypadTable_ stADCKeyTable[] PROGMEM = {
// VALUE_MIN, VALUE_MAX, KEY
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F1 }, // F1
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F2 }, // F2
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F3 }, // F3
{ ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_LEFT }, // LEFT ( 272 ... 472)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_RIGHT }, // RIGHT (1948 ... 2148)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_UP }, // UP ( 618 ... 818)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_DOWN }, // DOWN (2686 ... 2886)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_MIDDLE }, // ENTER (1205 ... 1405)
};
//---------------------------------------------------------------------------------------
Всё вроде как понятно вставил в код пару консольных команд чтоб при нажатии клавиш в терминал кидались показания АЦП клавиатуры так как по команде M43 пин находится нужном мести и изменяет аналоговый сигнал причем при расчётах делителя напряжения согласно схеме всё тоже практически в пределах нормы ! Пытаюсь разоружатся в коде вроде тоже всё правильно и при нажатии в консоль тоже показания АЦП клавиатуры попадают. Решил ещё пару феничак в код добавить чтоб массив с диапазонами посмотреть и какой Key при нажатии программа видет! И о ужас в массиве просто какой та бред с диапазонами клавиш. Пытаясь разобраться почему массив клавиш неправильно заполняется пенял что суть расчёта заключается в расчёте в расчёте напряжения для каждой клавише переводе его в программный формат и после этого +25 и -25 разброс диапазона для каждой клавиши! Много это или мала ? 5 вольт / 1024 итого 0.0048828125 вольта на единицу таким образом получается что для каждой кнопки есть окно в которое она должна попасть и оно всего 0.244140625 вольта а между кнопами достаточно большие диапазоны и эти окна если расширить до предела чтоб они не перекликались то клавиатура будет работать гораздо устойчивей! Итак беру часть программного кода и тупа блокирую
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
static const _stADCKeypadTable_ stADCKeyTable[] PROGMEM = /*{
// VALUE_MIN, VALUE_MAX, KEY
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F1 }, // F1
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F2 }, // F2
{ adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F3 }, // F3
{ ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_LEFT }, // LEFT ( 272 ... 472)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_RIGHT }, // RIGHT (1948 ... 2148)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_UP }, // UP ( 618 ... 818)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_DOWN }, // DOWN (2686 ... 2886)
{ ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) - adc_button_tolerance,
ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_MIDDLE }, // ENTER (1205 ... 1405)
};*/
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
Сразу за ним вписываю свой уже рассчитанный и измененный массив так что окна для каждой клавиши максимально расширены и на каждую кнопку окно теперь от 0,42 вольта до 0,89 вольта
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
{
// VALUE_MIN, VALUE_MAX, KEY
{ 50,136, 1 + BLEN_KEYPAD_LEFT }, // LEFT (5v/(4.7k+0.47k))/0.47k=~0.454*(1024/5)=~93
{ 137,253, 1 + BLEN_KEYPAD_UP }, // DOWN (5v/(4.7k+1.00k))/1.00k=~0.877*(1024/5)=~180
{ 254,419, 1 + BLEN_KEYPAD_MIDDLE}, // ENTER (5v/(4.7k+2.20k))/2.20k=~1.594*(1024/5)=~326
{ 420,604, 1 + BLEN_KEYPAD_RIGHT }, // RIGHT (5v/(4.7k+4.70k))/4.70k=~2.500*(1024/5)=~512
{ 605,789, 1 + BLEN_KEYPAD_DOWN }, // UP (5v/(4.7k+10.0k))/10.0k=~3.401*(1024/5)=~697
{ 1024, 25, 1 + BLEN_KEYPAD_F1 }, // F1
{ 1024, 25, 1 + BLEN_KEYPAD_F2 }, // F2
{ 1024, 25, 1 + BLEN_KEYPAD_F3 }, // F3
};
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
Копулирую заливаю всё чётка работает и на мой взгляд кнопки даже стали даже как то лутше реагировать!
Теперь хотя бы стала мне понятна причина недоработок кнопок и за узких окон!
Да кстати кому интересна можно ещё три кнопки прицепить F1, F2, F3 просто зачем они нужны ?
Если будет интересно могу рассказать как переподключить на A8 дисплей по I2C в чём преимущество ?
1) освобождаются 4 пина на микро контролере 2) экран перестаёт глючить тупить 3)провод пульта можно удлинить до метра и вынести за приделы камеры 4) Ну и главное появляется I2C шина на которую можно навесить всё что угодно часы реального времени или ещё что то типа измерителя влажности а может и то и другое и ещё что то ещё!
Еще больше интересных статей
Еще раз про WiFi, или ESP3D "для бедных".
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Народный менеджер проектов для производственников Eazy App!
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Придумал, экструдер.....
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.

Комментарии и вопросы
Поймут не только все! (С) :)...
Вы POM попробуйте.чего мелочит...
Собираю Stealthmax V2 можно ск...
Прошу помочь разобраться. В 3д...
Мужики, быть может кто нибудь...
Купил Anycubic Mono 4. Пробую...