M5Paper EPD power consumption



  • @felmue
    Indeed GPIO36 is only input.
    So I looked for another GPIO used only as input to reverse the 2 GPIO on the pcb.
    I found the GPIO27 which tells ESP32 that the IT8951 is ready for a SPI dialogue

    IT_SPI_HRDY (schema)
    #define M5EPD_BUSY_PIN 27 (M5EPD.h)
    EPD.begin(M5EPD_SCK_PIN, M5EPD_MOSI_PIN, M5EPD_MISO_PIN, M5EPD_CS_PIN, M5EPD_BUSY_PIN); (M5EPD.cpp)
    m5epd_err_t M5EPD_Driver::begin(int8_t sck, int8_t mosi, int8_t miso, int8_t cs, int8_t busy, int8_t rst)
    _pin_busy = busy;
    pinMode(_pin_busy, INPUT);

    0_1615456717810_50c5a8ea-8079-4817-a856-10c82417613c-image.png
    On my pcb, the resistance R87 is absent (unwelded)
    All you have to do is reverse the 5 and 16 tabs on the ESP32.
    I scraped the varnish and then scanned the pcb.
    You have to cut the 2 tracks between the 2 pins of the esp32 and the 2 vias.
    then solder 2 thin wires.





  • Hello @bricox

    very elegant solution. Thank you for sharing.

    I opted to leave GPIO36 as is and connected GPIO19 (from port C) in parallel which I can then set to output if I want to use touch sleep mode. (Yes, I loose port C, but it made the soldering a bit easier. Only one additional wire from a pin on port C to the unpopulated R87 pad.)

    Cheers
    Felix



  • @felmue
    I did a summary of the 3 ports A, B and C
    0_1615480305762_c98a3e9f-53d3-4dda-989f-1548a6530bac-image.png
    You made a good choice using GPIO19.
    Indeed, welding work is simplified.
    Do you share your source code?



  • Hello @bricox

    @bricox said in M5Paper EPD power consumption:

    Do you share your source code?

    Sure, you can find my touch sleep mode test sketch here.

    It's a extended version of the TOUCH example which uses the left/up button to set touch into normal mode and right/down button to set into sleep mode.

    Cheers
    Felix



  • @felmue
    To fully understand the GT911 controller, download these 2 pdf
    0_1615801735370_a92c71b1-cc76-49b8-9bef-90da8225880d-image.png
    https://www.crystalfontz.com/controllers/GOODIX/GT911/464/
    https://www.crystalfontz.com/controllers/GOODIX/GT911ProgrammingGuide/478/

    Several developments are desirable :

    • read position under interrupt and not in polling mode [GT911::update()]
    • Exploit more all modes
    • Check if the "green mode" (3.3mA) automatically change after 1 second of inactivity
    • Generate a sound when you touch it

    List of 21 other GT911 drivers :
    https://github.com/search?q=gt911
    including one in cpp:
    https://github.com/blackketter/GT911/blob/master/src/GT911.cpp



  • @bricox based on the documentation, it should be possible to set the touch panel in a gesture recognising mode - would be nice to be able to offload that from the ESP32, alongside the interrupt-instead-of-poll change. This would certainly improve battery life.



  • Hello guys

    @bricox - thank you for the links. I appreciate it. I already had the programming guide, but not the datasheet.

    @fonix232 - so far I have not tried the gesture mode.

    I am curious about what you guys are going to find regarding other modes.

    Thanks
    Felix



  • Hello guys .... @felmue, @fonix232, @tatar-andrei... and other enthusiasts ....

    I have others links for the GT911 driver in cpp
    With interrupt : https://github.com/nik-sharky/arduino-goodix/blob/master/Goodix.cpp
    No interrupt but handles 5 fingers : https://github.com/caiannello/ER-TFTM0784-1/blob/master/src/touch.cpp

    We’ll have to adapt these source codes.

    Sorry, i'm not a specialist for interrupts of Arduino framework....I am more familiar with the HAL framework of the STM32.

    Thank you for these sustained sharing



  • hello,

    a little bit of electronics (because no present in official doc) :

    0_1615907585552_012bf0da-f9ae-4cb6-90e6-45a8efbcad81-image.png
    The PFL with C1, C2, C3, C4 R1 and C5:
    0_1615907925252_16b48c7b-d348-47ab-860e-a68f73c0f68e-image.png
    Remark : pin 7&8 are "shield"



  • Hello @felmue

    Find 1 output, to put low the INT signal of GT911, have another way possible ....
    In the ESP pdf, I found this :
    0_1615924512661_1f8661ba-bd5a-4d76-a558-18ffea82d6d8-image.png
    For reuse these pins, an article : https://www.instructables.com/ESP8266-Using-GPIO0-GPIO2-as-inputs/
    I think that, in the M5paper, we can use GPIO0 as output.
    What you think about ?



  • Hello @bricox

    in M5Paper GPIO0 (together with ESP32_EN) already is connected to the boot / download mechanism which is controlled by CP_RTS and CP_DTR from the USB chip. ESP32_EN is also connected to the touch reset line which together with the touch INT line determine which I2C address the touch IC is going to use.

    If you also connect GPIO0 to the touch INT line, GPIO0 and ESP32_EN will not only determine the ESP32 boot mode but also the touch IC I2C address depending on what CP_RTS and CP_DTR are doing.

    On the other hand controlling GPIO0 from code to put the touch IC into sleep mode might have a negative effect on the automatic boot / download mechanism.

    I personally would leave GPIO0 alone, but in general it is correct that GPIO0 can be used as output if needed.

    Thanks
    Felix



  • Hello @felmue,

    While I was commenting on the source code, I found un bug in the GT911 driver :
    _fingers[] can be indexed up to 5
    0_1615984070738_8f7e3c61-28a7-42c1-8623-ea7928136753-image.png
    In declaration, _fingers[] can be indexed up to 2
    0_1615984224513_b83a9d9e-e32d-4ca9-905f-fc2a4eb6e57b-image.png

    In addition, it would be elegant to use bit fields for describing registers that have specific functions.
    An example : 0_1615984402868_5b228515-423f-44aa-ad3a-d75715da83e9-image.png



  • Structure

    typedef struct reg814E_s {		// 
     union {						// same location of 2 fields of 1 byte
       uint8_t reads;				// this byte
       struct {					// field bits of this byte
         uint8_t touchPts  : 4;	// b0 to b3 : number of touch points
         uint8_t haveKey   : 1;	// b4 : HaveKey
         uint8_t proxi     : 1;	// b5 : Proximity Valid
         uint8_t largeDet  : 1;	// b6 : large detect
         uint8_t status    : 1;	// b7 : buffer status
       };
     };
    } __attribute__((packed)) reg814E_t;	// minimize memory alignment
    

    or simpler writing

    typedef struct {
      union {              // same location of 2 fields of 1 byte
        uint8_t reads;     // this byte
        struct {           // field bits of this byte, starting with low weight
          uint8_t
            touchPts  : 4, // b0 to b3 : number of touch points
            haveKey   : 1, // b4 : HaveKey
            proxi     : 1, // b5 : Proximity Valid
            largeDet  : 1, // b6 : large detect
            status    : 1; // b7 : buffer status
        };
      };
    } reg814E_t;
    

    Declarations

    private:
        bool _is_finger_up = false;
        uint8_t _num = 0;
        uint8_t _rotate = ROTATE_0;
        tp_finger_t _fingers[2];
        reg814E_t r814E;
        uint8_t _iic_addr = 0x14;
        uint8_t _pin_int = -1;
        bool _sleeping = false;
    };
    


  • Use :

    void GT911::updateB()						// as update but modify by Bricox ...
    {
        r814E.reads = read(0x814E);				// "read struct" AND these 5 explicite bits fields
        if(r814E.status)
        {
            if(r814E.touchPts != 0)
            {
                _is_finger_up = false;
                _num = r814E.touchPts;			// "_num" could be definitively replaced by "r814E.touchPts"
                uint8_t data[num * 8];
                read(0x8150, data, _num * 8);	// read block of all fingers , up to 5*8 bytes
                for(int j = 0; j < _num; j++)	// for each finger
                {
                    uint8_t *buf = data + j * 8;// address base of each finger
    

    Sorry, comments that were aligned, in my notepad++ by multiple Tabs, are no longer aligned in the snippets viewer