ESP32 WROOM Dev Kit + Encoder типа KY-40

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

Всем доброго дня.

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

Вид сзади энкодеров:

Сначала были попытки подключить их без питания. На удивление некоторые примеры из сети работали с левым энкодером, но не очень стабильно, были пропуски и не все "режимы" отрабатывались корректно.  Обязательно надо включить внутреннюю подтяжку. Правый заработал только если подать питание 3.3V

Если на левый подать питание 3.3v, то он тоже начинает работать гораздо стабильнее. Собственно подключал по простейшей схеме:

Висит он на GPIO 12 (DT), 13 (CLK), 5 (SW).

Но при подаче питания 3.3V на энкодер, начинаются проблемы с прошивкой через Arduino IDE:

Скетч использует 206530 байт (15%) памяти устройства. Всего доступно 1310720 байт.
Глобальные переменные используют 13448 байт (4%) динамической памяти, оставляя 314232 байт для локальных переменных. Максимум: 327680 байт.
C:\Users\AlexAr\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\3.0.0/esptool.exe --chip esp32 --port COM3 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:\Users\AlexAr\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/partitions/boot_app0.bin 0x1000 C:\Users\AlexAr\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/sdk/bin/bootloader_qio_80m.bin 0x10000 C:\Users\AlexAr\AppData\Local\Temp\arduino_build_967012/encoder_demo.ino.bin 0x8000 C:\Users\AlexAr\AppData\Local\Temp\arduino_build_967012/encoder_demo.ino.partitions.bin 
esptool.py v3.1-dev
Serial port COM3
Connecting........___
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
WARNING: Detected crystal freq 41.01MHz is quite different to normalized freq 40MHz. Unsupported crystal in use?
Crystal is 40MHz
MAC: 3c:71:bf:f8:ae:90
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MB
Compressed 8192 bytes to 47...

A fatal error occurred: Timed out waiting for packet content
A fatal error occurred: Timed out waiting for packet content

И после RESET в Serial летят вот такие ошибки (приходится снимать питание чтобы прошить и перезапустить ESP):

ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:0
ho 12 tail 0 room 4
load:0x00000000,len:0
load:0x80000000,len:-2147483648
1162 mmu set 00010000, pos 00010000
1162 mmu set 00020000, pos 00020000
1162 mmu set 00030000, pos 00030000
1162 mmu set 00040000, pos 00040000
1162 mmu set 00050000, pos 00050000
1162 mmu set 00060000, pos 00060000
1162 mmu set 00070000, pos 00070000
1162 mmu set 00080000, pos 00080000
1162 mmu set 00090000, pos 00090000
1162 mmu set 000a0000, pos 000a0000
1162 mmu set 000b0000, pos 000b0000
1162 mmu set 000c0000, pos 000c0000
1162 mmu set 000d0000, pos 000d0000
1162 mmu set 000e0000, pos 000e0000
1162 mmu set 000f0000, pos 000f0000
1162 mmu set 00100000, pos 00100000
1162 mmu set 00110000, pos 00110000

Что не так? Может по такой схеме нельзя его к ESP подключать?

На всякий случай сам скетч, но там ничего удивительного нету:

#define CLK 12
#define DT 13
#define SW 5

#include "GyverEncoder.h"
//Encoder enc1(CLK, DT);      // для работы без кнопки
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой
//Encoder enc1(CLK, DT, SW, TYPE2);  // для работы c кнопкой и сразу выбираем тип
//Encoder enc1(CLK, DT, ENC_NO_BUTTON, TYPE2);  // для работы без кнопки и сразу выбираем тип

// Варианты инициализации:
// Encoder enc;									// не привязан к пину
// Encoder enc(пин CLK, пин DT);				// энкодер без кнопки (ускоренный опрос)
// Encoder enc(пин CLK, пин DT, пин SW);		// энкодер с кнопкой
// Encoder enc(пин CLK, пин DT, пин SW, тип);	// энкодер с кнопкой и указанием типа
// Encoder enc(пин CLK, пин DT, ENC_NO_BUTTON, тип);	// энкодер без кнопкой и с указанием типа

void setup() {
  pinMode(CLK, INPUT_PULLUP); // Энекодер шаг
  pinMode(DT, INPUT_PULLUP); // Энекодер направление
  pinMode(SW, INPUT_PULLUP); // Кнопка Энкодера
  Serial.begin(115200);
  enc1.setType(TYPE2);
}

void loop() {
  // обязательная функция отработки. Должна постоянно опрашиваться
  enc1.tick();

  if (enc1.isTurn()) {     // если был совершён поворот (индикатор поворота в любую сторону)
    // ваш код
    Serial.print("Крутим ");
  }

  if (enc1.isRight()) Serial.println("Right");         // если был поворот
  if (enc1.isLeft()) Serial.println("Left");
  if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
  if (enc1.isLeftH()) Serial.println("Left holded");

  if (enc1.isPress()) Serial.print("Press ");         // нажатие на кнопку (+ дебаунс)
  //  if (enc1.isClick()) Serial.println("Click");         // одиночный клик
  if (enc1.isSingle()) Serial.println("Single");       // одиночный клик (с таймаутом для двойного)
  if (enc1.isDouble()) Serial.println("Double");       // двойной клик
  if (enc1.isHolded()) Serial.println("Holded");       // если была удержана и энк не поворачивался
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

12 при загрузке лучше оставить висящим.