En cuanto descubrí que era posible programar un ESP32 con C#, lo primero que se me ocurrió fue reescribir OpenRaceLed en C#.
El primer problema que me encontré es que no había una librería para controla la tira de leds NeoPixel, así que programé un primer ejemplo que puedes consultar aquí: Hardware.Esp32.Rmt NeoPixelStrip
En esta primera versión tuve en cuenta más la semántica y la orientación a objetos que el limitado hardware sobre el que se iba a ejecutar y al intentar ejecutarlo obtuve un OutOfMemory. La memoria disponible en un ESP32 es muy limitada (desde mi punto de vista que no estoy acostumbrado a programar microcontroladores) y tenía que limitar el código para gestionar solo los primeros 50 leds como máximo.
El siguiente paso, fue buscar un ejemplo de como se programa en Arduino esta tira led y tomarlo como referencia para hacer una versión más liviana. El resultado es este segundo ejemplo: Hardware.Esp32.Rmt NeoPixelStripLowMemory
Ahora si que puedo direccionar los 300 leds pero tengo otro problema es extremadamente lento en comparación con la versión que probé de Arduino.
#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "Arduino.h" #include "esp32-hal.h" #define NR_OF_LEDS 300 #define NR_OF_ALL_BITS 24*NR_OF_LEDS rmt_data_t led_data[NR_OF_ALL_BITS]; rmt_obj_t* rmt_send = NULL; void setup() { Serial.begin(115200); if ((rmt_send = rmtInit(5, true, RMT_MEM_64)) == NULL) { Serial.println("init sender failed\n"); } float realTick = rmtSetTick(rmt_send, 100); Serial.printf("real tick set to: %fns\n", realTick); } int color[] = { 0x00, 0xFF, 0x00 }; // GRB value int led_index = 0; void loop() { // Init data with only one led ON int led, col, bit; int i=0; for (led=0; led < NR_OF_LEDS; led++) { for (col=0; col<3 bit="" col="" color="" duration0="4;" duration1="8;" else="" for="" i="" if="" in="" led="" led_data="" led_index="" level0="1;" level1="0;" make="" pannel="" the="" travel="">=NR_OF_LEDS) { led_index = 0; } // Send the data rmtWrite(rmt_send, led_data, NR_OF_ALL_BITS); delay(10); }3>
Aquí tenéis un video a tiempo real de la velocidad máxima que consigo con el mismo hardware y los dos firmwares.
En un principio tiene sentido que al usar C# exista una penalización de rendimiento en comparación con una implementación nativa, pero ¿no es algo exagerada la diferencia? ¿estoy haciendo algo mal? ¿Es posible obtener mejor rendimiento de la versión nanoFramework? Seguro que a medida que aparezcan nuevas versiones se irán optimizando el código para conseguir mejor rendimiento.
0 comentarios:
Publicar un comentario