Author |
Message |
30/01/2021 08:22:49
|
#1
|
chirrindulari
Joined: Jan 23, 2021
Messages: 22
Offline
|
Hi, everyone.
In my project, I have touch sensors instead of mechanical switches to control tcMenu. I have used the ESP32 built in touch sensors. There are five: UP; DOWN; LEFT; RIGHT and OK (ENTER)
I've developed a PoC wich receive in a FreeRTOS task an int representing in every bit if a key has been pressed. This is the receiving task:
void receiveKeys (void *unused) {
uint32_t keysStatus = 0;
while(1)
{
if(xQueueReceive(qh, &keysStatus, 10)) {
log_v("rx keys: %x", keysStatus);
mustUpdate = true;
vTaskDelay(125 / portTICK_PERIOD_MS);
touch_pad_clear_status();
touch_pad_intr_enable();
}
}
I have two questions:
1. Can I adapt these touch sensors in tcMenu? Could anyone recommend me something to read in order to be able to write the code?
2. Can I use FreeRTOS at the same time that tcMenu, or tcMenu uses some kind of RTOS jet?
Thanks.
|
|
|
30/01/2021 09:23:45
|
#2
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
It would most certainly be quite easy to integrate, I would imagine there would be many ways to do it, but the easiest may be to make a simple IoAbstraction implementation around the touch sensors.
If you did this you would then not need an RTOS task, instead you'd just pass your new IoAbstraction to switches instead of the regular one. If you did this you'd get all the debouncing and everything else for free. However, you could just service the keyboard yourself and just tell tcMenu when changes occur, again with the caveat that this must happen on the right thread, see the execute example below for that. All the methods to move around menu items are on menuMgr: https://www.thecoderscorner.com/products/arduino-libraries/tc-menu/menumanager-and-iteration/
An IoAbstraction is a simple interface that exposes methods similar to the Arduino pin functions. So you would need to implement the setup of each numbered sensor and the acquisition of data, you could skip anything to do with writing.
For example a starting point to look at would be: https://github.com/davetcc/IoAbstraction/blob/master/src/DfRobotInputAbstraction.h
The base class BasicIoAbstraction is implemented in https://github.com/davetcc/IoAbstraction/blob/master/src/BasicIoAbstraction.h
On the subject of RTOS, yes you can use RTOS and taskmanager / tcMenu at the same time, yes with a few limitations. You can create as many threads as you like, you can schedule work to be done from those tasks by using any task manager scheduling function. You can raise any events against task manager either from an interrupt or another thread. However, and this applies generally to all multithreaded software, you need to be very careful about object state. Currently, menu items are not thread-safe, you should only interact with them from taskManager.
However, if you have another thread, and you wanted to update a menu item you either create an event, or do something like
void runningOnAnotherThread() {
taskManager.execute(someTaskToExecuteOnTaskManagerThread);
}
Think of tcMenu like you would a desktop UI, it has a compositing thread, and you should honour that when working with menu items. I recommend you read the task manager documentation thoroughly around creating events and muli-threading before proceeding.
|
|
|
31/01/2021 09:46:17
|
#3
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
If you can give me a sample program that deals with the touch sensors, I'll turn it into an IoAbstraction so you can use it with tcMenu. I have an ESP32 board as one of my main development boards, so testing should be easy.
What I'd need to avoid needing to read the docs:
* How to set up a pin as a touch sensor and prepare it for use.
* How to read the current value of a touch sensor.
* Anything else specific to the touch sensor support.
* Any circuit that I'd need to build in order to test at least one pin.
|
|
|
01/02/2021 11:18:29
|
#4
|
chirrindulari
Joined: Jan 23, 2021
Messages: 22
Offline
|
It would be very helpful. Thanks a lot Dave.
Attached is a PlatformIO project that was working. It reads values form a temperature sensor and displays in an SSD1306. Also prints in the serial port the keys detected by the touch sensors. If the key is "GPIO13-Touch4" the display is cleared (mustErase = true
Also I attach the hardware schematics. There you can see the pis of the touch sensors (cuadrant D1)
* How to set up a pin as a touch sensor and prepare it for use.
In the source code is all detailed. This is based on an example from Espressif ( https://github.com/espressif/esp-idf/blob/master/examples/peripherals/touch_pad_interrupt/main/esp32/tp_interrupt_main.c). I added the queue (maybe is a bad idea). It send the value detected by the interrpt routine (touchpad.c - tp_rtc_intr) to a receiving task (main.cpp - receiveKeys)
* How to read the current value of a touch sensor.
It is interrpt-driven, so you don't need to read. Only set a threshold which is set to 2/3 of the initial value (nobody has to touch any sensor at boot time).
* Anything else specific to the touch sensor support.
Additional info in https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/touch_pad.html#touch-triggered-interrupts
* Any circuit that I'd need to build in order to test at least one pin.
You can solder a small coin or similar to cables connecting the touch sensor pins, this is the only hardware needed. This is an example https://hackaday.com/wp-content/uploads/2019/04/esp32clock_detail.jpg
Filename |
thermostat_sch.pdf |
Download
|
Description |
Hardware |
Filesize |
116 Kbytes
|
Downloaded: |
66349 time(s) |
Filename |
thermostat_v0.2.tar.bz2 |
Download
|
Description |
Source code for PlatformIO |
Filesize |
12 Kbytes
|
Downloaded: |
56132 time(s) |
|
|
|
02/02/2021 15:23:51
|
#5
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
Thanks for the information, I'll try and get something done later today or tomorrow.
|
|
|
12/02/2021 08:44:14
|
#6
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
Sorry, we've got really behind with stuff this past week.
I'll honestly try and do this in the next few days. It's near the top of my task list.
|
|
|
12/02/2021 11:09:37
|
#7
|
chirrindulari
Joined: Jan 23, 2021
Messages: 22
Offline
|
Don't worry, I know you are doing your best.
I've tried to understand your code, but honestly objects are not my strong point.
Good weekend.
|
|
|
14/02/2021 14:48:02
|
#8
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
Hi there, I finally think I have something that works. Was quite complex to understand to be honest.
It will be fully integrated into TcMenu V2.0 and the code generator will do this for you, however here are some simple steps to be able to use it right now (and hopefully give me some feedback on how it works for you).
Step 1. Copy the files from this directory into your project: https://github.com/davetcc/tcMenuXmlPlugins/tree/master/core-display/esp32Touch
Step 2. Add the new encoder in your sketch, where threshold is the point below which a button is considered pressed, the other parameters are straight from the ESP32 IDF guide on touch pad:
ESP32TouchKeysAbstraction* esp32Touch = new ESP32TouchKeysAbstraction(threshold, TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_1V);
Step3: Choose up/down button encoder from code generator as the input type, set the IoExpander reference to esp32Touch. Set the up/down/select buttons to the touch sensor number (not gpio). They are not pull up so ensure that is turned off, you can interrupt mode.
Step 4 (if you are using interrupts only)
After the setupMenu() call in your sketch do the following:
esp32Touch->ensureInterruptRegistered();
Also see this documentation, but it is very much in flight at the moment: https://www.thecoderscorner.com/products/arduino-libraries/tc-menu/tcmenu-plugins/touch-pad-sensor-plugin/
|
Filename |
coin-touch-sensor.jpg |
Download
|
Description |
No description given |
Filesize |
36 Kbytes
|
Downloaded: |
58025 time(s) |
|
|
|
15/02/2021 12:40:43
|
#9
|
chirrindulari
Joined: Jan 23, 2021
Messages: 22
Offline
|
Thnaks a lot Dave.
I'm afraid I'm going to need some time. After trying to install the 2.0.0 version of the generator the app does not work any more (I mean 1.7.0)
Now I cannot generate the structure to test.
|
|
|
15/02/2021 14:29:34
|
#10
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
I recommend that you completely remove the designer build and rebuild from the last 1.7 tag which was 1.7.0 : https://github.com/davetcc/tcMenu/tree/1.7.0
We'll be building our first linux image in the next week or so, we have a Linux VM with graphics.
For now:
git checkout 1.7.0
mvn clean install
then try and run it again.
|
|
|
15/02/2021 16:56:37
|
#11
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
I have a package built now on my 64-bit ubuntu distro, for 2.0.0-SNAPSHOT, it works properly and all tests pass, it should be fully compatible with library version 1.7 too.
I'm trying to build a native package that can go in the store, but at the absolute minimum I'll put out an image for 64 bit Ubuntu later today.
|
|
|
15/02/2021 20:02:18
|
#12
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
I have now prepared a ready-made build of tcmenu designer on Linux that should need no additional dependencies. It is based on the 2.0 beta, but it is compatible with the 1.7 plugins and library. I have tested it myself considerably on Windows, and now on Linux. Only the documentation links don't appear to work for some reason. It is packaged as a deb file.
See the linux section on https://www.thecoderscorner.com/products/apps/tcmenu-designer/
I'll announce this more widely, as it is probably good news for many.
|
|
|
23/02/2021 19:20:42
|
#13
|
chirrindulari
Joined: Jan 23, 2021
Messages: 22
Offline
|
Dear Dave.
I have been a bit busy lately and couldn't test your solution.
Just to be sure... In the Rotary Encoder configuration I must write "esp32Touch" in the cell marked in the picture.
The code is as follow (modified after the code generation)
void setupMenu() {
prepareBasicU8x8Config(gfxConfig);
gfx.begin();
renderer.setGraphicsDevice(&gfx, &gfxConfig);
ESP32TouchKeysAbstraction* esp32Touch = \
new ESP32TouchKeysAbstraction(TOUCH_threshold, TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_1V);
switches.initialise(esp32Touch, false);
menuMgr.initForEncoder(&renderer, &menuCalefaccion, 6, 8, 4);
}
The numbers 6, 8 and 4 in the last line are the touch sensors (not pins numbers)
Thanks for your support!!!
|
Filename |
RotaryEncoderMenu2.jpg |
Download
|
Description |
No description given |
Filesize |
78 Kbytes
|
Downloaded: |
55160 time(s) |
|
|
|
23/02/2021 22:31:11
|
#14
|
chirrindulari
Joined: Jan 23, 2021
Messages: 22
Offline
|
I have understood that the correct election is the <<Control menu with UP/DOWN buttons>>. All is working as expected, I think.
The only problem I've found is that the up and down buttons seems to be interchanged. If I push UP, the little arrow in the menu goes DOWN.
Maybe another issue... In the desginer, when you select ESP WIFI as a remote capability, the limit of the listen port is 65355. I think it shuld be the maximum 16 bit value (65535, 2^16-1)
Thanks for your work.
|
|
|
24/02/2021 15:53:49
|
#15
|
davetcc
Joined: Jan 19, 2019
Messages: 686
Offline
|
In the desginer, when you select ESP WIFI as a remote capability, the limit of the listen port is 65355. I think it shuld be the maximum 16 bit value (65535, 2^16-1)
Thanks, that is a bug, I will fix that typo for the next version.
I have understood that the correct election is the <>. All is working as expected, I think.
So in your sketch you'd create the touch Io expander EG
ESP32TouchKeysAbstraction* esp32Touch = new ESP32TouchKeysAbstraction(TOUCH_threshold, TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_1V);
Then choose "Control menu with UP/DOWN buttons" and in the IoExpander provide 'esp32Touch', the buttons numbers are 0..9 for each touch-capable pin.
The only problem I've found is that the up and down buttons seems to be interchanged. If I push UP, the little arrow in the menu goes DOWN.
From Arduino / pio library manager Make sure you are on tcMenu 1.7.1 and the IoAbstraction 1.7.3 too, these have a fix for joystick navigation to make it more natural.
|
|
|
|