Кремень FMZ Реклама
Kremen FMHM Реклама

Улучшение работы кнопок на принтерах с аналоговой клавиатурой

walll-es
Идет загрузка
Загрузка
03.01.2022
1623
11
Личные дневники

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

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

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

2
Статья относится к принтерам:
Anet A8

Итак у меня 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 шина  на которую можно навесить всё что угодно  часы реального времени или ещё что то типа измерителя влажности а может и то и другое и ещё что то ещё!

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

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

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

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