Улучшение работы кнопок на принтерах с аналоговой клавиатурой
Итак у меня 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 шина на которую можно навесить всё что угодно часы реального времени или ещё что то типа измерителя влажности а может и то и другое и ещё что то ещё!
Еще больше интересных статей
Обновление
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Ender 3 v3 se. Допилинг.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Записки тридэголика. Эпизод первый.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Комментарии и вопросы
Я всё в контексте нейлона. 80-...
очень хочется, чтобы такой пор...
Спасибо за информацию.
Какую смолу лучше всего исполь...
Мосты в пару см у меня норм пе...
Друзья, можете подсказать каки...
Добрый день. Замучал принтер )...