From 4ace59fc185174dfee59116c78656434e126dab4 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Fri, 14 Jul 2023 16:12:30 -0500 Subject: [PATCH] Partial Heltec Wireless Paper and Wireless Tracker support (#2594) * WIP * Comment * WIP * TFT_CTRL * Update platformio.ini update to current latest version available * Update EInkDisplay2.cpp Is the e-ink Display a DEPG0213BN ? * Logging * trunk fmt --------- Co-authored-by: Mark Trevor Birss --- src/gps/GPS.cpp | 6 ++- src/graphics/EInkDisplay2.cpp | 27 ++++++++-- src/graphics/TFTDisplay.cpp | 4 ++ src/main.cpp | 10 ++++ src/platform/esp32/architecture.h | 4 ++ variants/heltec_wireless_paper/platformio.ini | 8 +++ variants/heltec_wireless_paper/variant.h | 39 ++++++++++++++ .../heltec_wireless_tracker/platformio.ini | 23 ++++++++ variants/heltec_wireless_tracker/variant.h | 53 +++++++++++++++++++ 9 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 variants/heltec_wireless_paper/platformio.ini create mode 100644 variants/heltec_wireless_paper/variant.h create mode 100644 variants/heltec_wireless_tracker/platformio.ini create mode 100644 variants/heltec_wireless_tracker/variant.h diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index c6298f575..f4041c25f 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -181,10 +181,14 @@ bool GPS::setupGPS() config.position.tx_gpio = GPS_TX_PIN; #endif +//#define BAUD_RATE 115200 // ESP32 has a special set of parameters vs other arduino ports #if defined(ARCH_ESP32) - if (config.position.rx_gpio) + if (config.position.rx_gpio) { + LOG_DEBUG("Using GPIO%d for GPS RX\n", config.position.rx_gpio); + LOG_DEBUG("Using GPIO%d for GPS TX\n", config.position.tx_gpio); _serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, config.position.rx_gpio, config.position.tx_gpio); + } #else _serial_gps->begin(GPS_BAUDRATE); #endif diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index 048e8dd6e..066f63be8 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -7,6 +7,10 @@ #include "main.h" #include +// #ifdef HELTEC_WIRELESS_PAPER +// SPIClass *hspi = NULL; +// #endif + #define COLORED GxEPD_BLACK #define UNCOLORED GxEPD_WHITE @@ -19,13 +23,13 @@ #define TECHO_DISPLAY_MODEL GxEPD2_213_BN // 4.2 inch 300x400 - GxEPD2_420_M01 -//#define TECHO_DISPLAY_MODEL GxEPD2_420_M01 +// #define TECHO_DISPLAY_MODEL GxEPD2_420_M01 // 2.9 inch 296x128 - GxEPD2_290_T5D -//#define TECHO_DISPLAY_MODEL GxEPD2_290_T5D +// #define TECHO_DISPLAY_MODEL GxEPD2_290_T5D // 1.54 inch 200x200 - GxEPD2_154_M09 -//#define TECHO_DISPLAY_MODEL GxEPD2_154_M09 +// #define TECHO_DISPLAY_MODEL GxEPD2_154_M09 #elif defined(MAKERPYTHON) // 2.9 inch 296x128 - GxEPD2_290_T5D @@ -41,6 +45,9 @@ // 1.54 inch 200x200 - GxEPD2_154_M09 #define TECHO_DISPLAY_MODEL GxEPD2_154_M09 +#elif defined(HELTEC_WIRELESS_PAPER) +//#define TECHO_DISPLAY_MODEL GxEPD2_213_T5D +#define TECHO_DISPLAY_MODEL GxEPD2_213_BN #endif GxEPD2_BW *adafruitDisplay; @@ -62,6 +69,10 @@ EInkDisplay::EInkDisplay(uint8_t address, int sda, int scl, OLEDDISPLAY_GEOMETRY // GxEPD2_154_M09 // setGeometry(GEOMETRY_RAWMODE, 200, 200); + +#elif defined(HELTEC_WIRELESS_PAPER) + // setGeometry(GEOMETRY_RAWMODE, 212, 104); + setGeometry(GEOMETRY_RAWMODE, 250, 122); #elif defined(MAKERPYTHON) // GxEPD2_290_T5D setGeometry(GEOMETRY_RAWMODE, 296, 128); @@ -218,6 +229,16 @@ bool EInkDisplay::connect() (void)adafruitDisplay; } } +#elif defined(HELTEC_WIRELESS_PAPER) + { + auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); + adafruitDisplay = new GxEPD2_BW(*lowLevel); + // hspi = new SPIClass(HSPI); + // hspi->begin(PIN_EINK_SCLK, -1, PIN_EINK_MOSI, PIN_EINK_CS); // SCLK, MISO, MOSI, SS + adafruitDisplay->init(115200, true, 10, false, SPI, SPISettings(6000000, MSBFIRST, SPI_MODE0)); + adafruitDisplay->setRotation(3); + adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); + } #elif defined(PCA10059) { auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index 8c07a4204..d667490fc 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -65,6 +65,10 @@ bool TFTDisplay::connect() digitalWrite(TFT_BL, HIGH); pinMode(TFT_BL, OUTPUT); #endif +#ifdef TFT_POWER_EN + digitalWrite(TFT_POWER_EN, HIGH); + pinMode(TFT_POWER_EN, OUTPUT); +#endif #ifdef ST7735_BACKLIGHT_EN digitalWrite(ST7735_BACKLIGHT_EN, HIGH); diff --git a/src/main.cpp b/src/main.cpp index c7cbb7680..5eff8262b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -214,6 +214,16 @@ void setup() digitalWrite(VEXT_ENABLE, 0); // turn on the display power #endif +#ifdef VGNSS_CTRL + pinMode(VGNSS_CTRL, OUTPUT); + digitalWrite(VGNSS_CTRL, LOW); +#endif + +#if defined(VTFT_CTRL) + pinMode(VTFT_CTRL, OUTPUT); + digitalWrite(VTFT_CTRL, LOW); +#endif + #ifdef RESET_OLED pinMode(RESET_OLED, OUTPUT); digitalWrite(RESET_OLED, 1); diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h index 7a1e9ba49..23346d493 100644 --- a/src/platform/esp32/architecture.h +++ b/src/platform/esp32/architecture.h @@ -97,6 +97,10 @@ #define HW_VENDOR meshtastic_HardwareModel_HELTEC_V3 #elif defined(HELTEC_WSL_V3) #define HW_VENDOR meshtastic_HardwareModel_HELTEC_WSL_V3 +#elif defined(HELTEC_WIRELESS_TRACKER) +#define HW_VENDOR meshtastic_HardwareModel_HELTEC_WIRELESS_TRACKER +#elif defined(HELTEC_WIRELESS_PAPER) +#define HW_VENDOR meshtastic_HardwareModel_HELTEC_WIRELESS_PAPER #elif defined(TLORA_T3S3_V1) #define HW_VENDOR meshtastic_HardwareModel_TLORA_T3_S3 #elif defined(BETAFPV_2400_TX) diff --git a/variants/heltec_wireless_paper/platformio.ini b/variants/heltec_wireless_paper/platformio.ini new file mode 100644 index 000000000..0bc7f14d1 --- /dev/null +++ b/variants/heltec_wireless_paper/platformio.ini @@ -0,0 +1,8 @@ +[env:heltec-wireless-paper] +extends = esp32s3_base +board = heltec_wifi_lora_32_V3 +build_flags = + ${esp32s3_base.build_flags} -D HELTEC_WIRELESS_PAPER -I variants/heltec_wireless_paper +lib_deps = + ${esp32s3_base.lib_deps} + zinggjm/GxEPD2@^1.5.2 diff --git a/variants/heltec_wireless_paper/variant.h b/variants/heltec_wireless_paper/variant.h new file mode 100644 index 000000000..84c16c884 --- /dev/null +++ b/variants/heltec_wireless_paper/variant.h @@ -0,0 +1,39 @@ +#define LED_PIN 18 + +#define USE_EINK +/* + * eink display pins + */ +#define PIN_EINK_CS 4 +#define PIN_EINK_BUSY 7 +#define PIN_EINK_DC 5 +#define PIN_EINK_RES 6 +#define PIN_EINK_SCLK 3 +#define PIN_EINK_MOSI 2 + +#define VEXT_ENABLE Vext // active low, powers the oled display and the lora antenna boost +#define BUTTON_PIN 0 + +#define BATTERY_PIN 1 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage +#define ADC_CHANNEL ADC1_GPIO1_CHANNEL +#define ADC_ATTENUATION ADC_ATTEN_DB_2_5 // lower dB for high resistance voltage divider +#define ADC_MULTIPLIER 4.9 + +#define USE_SX1262 + +#define LORA_DIO0 -1 // a No connect on the SX1262 module +#define LORA_RESET 12 +#define LORA_DIO1 14 // SX1262 IRQ +#define LORA_DIO2 13 // SX1262 BUSY +#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled + +#define RF95_SCK 9 +#define RF95_MISO 11 +#define RF95_MOSI 10 +#define RF95_NSS 8 + +#define SX126X_CS RF95_NSS +#define SX126X_DIO1 LORA_DIO1 +#define SX126X_BUSY LORA_DIO2 +#define SX126X_RESET LORA_RESET +#define SX126X_E22 \ No newline at end of file diff --git a/variants/heltec_wireless_tracker/platformio.ini b/variants/heltec_wireless_tracker/platformio.ini new file mode 100644 index 000000000..ec28fe6ca --- /dev/null +++ b/variants/heltec_wireless_tracker/platformio.ini @@ -0,0 +1,23 @@ +[env:heltec-wireless-tracker] +extends = esp32s3_base +board = heltec_wifi_lora_32_V3 +build_flags = + ${esp32s3_base.build_flags} -D HELTEC_WIRELESS_TRACKER -I variants/heltec_wireless_tracker + -DUSER_SETUP_LOADED + -DTFT_WIDTH=80 + -DTFT_HEIGHT=160 + -DST7735_GREENTAB160x80 + -DST7735_DRIVER + ;-TFT_RGB_ORDER=TFT_BGR + -DTFT_CS=38 + -DTFT_DC=40 + -DTFT_RST=39 + -DTFT_WR=42 + -DTFT_SCLK=41 + ;-DSPI_FREQUENCY=40000000 + ;-DSPI_FREQUENCY=27000000 + ;-DSPI_READ_FREQUENCY=16000000 + ;-DDISABLE_ALL_LIBRARY_WARNINGS +lib_deps = + ${esp32s3_base.lib_deps} + bodmer/TFT_eSPI@^2.4.76 \ No newline at end of file diff --git a/variants/heltec_wireless_tracker/variant.h b/variants/heltec_wireless_tracker/variant.h new file mode 100644 index 000000000..f1bb071ef --- /dev/null +++ b/variants/heltec_wireless_tracker/variant.h @@ -0,0 +1,53 @@ +#define LED_PIN 18 + +#define TFT_POWER_EN 46 + +#define ST7735_RESET 39 // Output +#define ST7735_CS 38 +#define ST7735_BACKLIGHT_EN 45 +#define ST7735_RS 40 +#define ST7735_SDA 42 +#define ST7735_SCK 41 + +// #define RESET_OLED 21 +// #define I2C_SDA 17 // I2C pins for this board +// #define I2C_SCL 18 + +#define SCREEN_TRANSITION_FRAMERATE 1 // fps + +#define VEXT_ENABLE Vext // active low, powers the oled display and the lora antenna boost +#define BUTTON_PIN 0 + +#define BATTERY_PIN 1 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage +#define ADC_CHANNEL ADC1_GPIO1_CHANNEL +#define ADC_ATTENUATION ADC_ATTEN_DB_2_5 // lower dB for high resistance voltage divider +#define ADC_MULTIPLIER 4.9 + +#undef GPS_RX_PIN +#undef GPS_TX_PIN +#define GPS_RX_PIN 33 +#define GPS_TX_PIN 34 +#define PIN_GPS_RESET 35 +#define PIN_GPS_PPS 36 +#define VGNSS_CTRL 37 // Heltec Tracker needs this pulled low for GPS + +#define VTFT_CTRL 46 // Heltec Tracker needs this pulled low for TFT + +#define USE_SX1262 + +#define LORA_DIO0 -1 // a No connect on the SX1262 module +#define LORA_RESET 12 +#define LORA_DIO1 14 // SX1262 IRQ +#define LORA_DIO2 13 // SX1262 BUSY +#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled + +#define RF95_SCK 9 +#define RF95_MISO 11 +#define RF95_MOSI 10 +#define RF95_NSS 8 + +#define SX126X_CS RF95_NSS +#define SX126X_DIO1 LORA_DIO1 +#define SX126X_BUSY LORA_DIO2 +#define SX126X_RESET LORA_RESET +#define SX126X_E22 \ No newline at end of file