Nano rp2040 connect e web server asincrono

Salve, sto provando a mettere su un web server asincrono usando una scheda Nano RP2040 Connect ma senza riuscirci.

Avevo fatto, l’anno passato e con successo, uno sketch simile usando una scheda Nano 33 IOT.

Online ho trovato qualche cosa ma nessuna funzionante.
Mi è sembrato di capire che la libreria WiFiNINA (a detta dell’autore) non supporta le chiamate asincrone e mai lo farà….

Qualcuno ha avuto esperienze in tal senso?

Perché vorresti usare la libreria WiFiNINA quando il core del RP2040 ha già la sua ottima libreria WebServer inclusa?

Se non sbaglio si tratta di un porting della libreria analoga presente nel core ESP8266 (io avrei usato quella dell'ESP32 come ho fatto infatti per Arduino R4, però sono molto simili quindi cambia poco).

Cosa intendi con "asincrono"? Presumo che vuoi che il tuo webserver non blocchi il resto del firmware.

In tal caso potresti far girare un task dedicato usando FreeRTOS che è pienamente supportato.

Grazie per il sollecito interessamento :slight_smile:

Sì, in effetti per asincrono intendo “non bloccante”, (allego porzione di codice preso dallo sketch funzionante usato con la Nano 33 IOT)

  server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
    int paramsNr = request->params();
    if (paramsNr != 0) {
      AsyncWebParameter* p = request->getParam(0);
      str = p->value();
      AsyncWebParameter* q = request->getParam(1);
      t = q->value();
      AsyncWebParameter* r = request->getParam(3);
      s = r->value();
    } else {
      // Serial.print("niente");
    }
    request->send(200, "text/html", stringaHTML);
  });

La libreria WebServer non supporta chiamate asincrone.

Non cocosco FreeRTOS, adesso proverò a informarmi.

Comunque grazie

Ho installato FreeRTOS sulla Nano RP2040 Connect e creato questo sketch:


#include <Arduino_FreeRTOS.h>

void TaskLoop1(void *parms);
void TaskLoop2(void *parms);

void setup() {  
  Serial.begin(9600);
  xTaskCreate(TaskLoop1, "Loop1", 128, NULL, 2, NULL);
  xTaskCreate(TaskLoop2, "Loop2", 128, NULL, 1, NULL);
}

void loop() {}

void TaskLoop1(void *parms){
  // pinMode(2, OUTPUT);
  
  while(true) {
    Serial.println("T1");
    vTaskDelay(1000/portTICK_PERIOD_MS);  
    Serial.println("T1_");
    vTaskDelay(1000/portTICK_PERIOD_MS);  
  }
}

void TaskLoop2(void *parms){
  // pinMode(3, OUTPUT);
  
  while(true) {
    dSerial.println("T2");
    vTaskDelay(500/portTICK_PERIOD_MS);  
    Serial.println("T2_");
    vTaskDelay(500/portTICK_PERIOD_MS);  
  }  
}

Ma il compilatore mi da:

In file included from /home/minipc/Arduino/libraries/FreeRTOS/src/Arduino_FreeRTOS.h:58:0,
                 from /home/minipc/Arduino/OROLOGIO _29_12_2025 /prova_FreeRTOS/prova_FreeRTOS.ino:2:
/home/minipc/Arduino/libraries/FreeRTOS/src/FreeRTOSConfig.h:32:10: fatal error: avr/io.h: No such file or directory
 #include <avr/io.h>
          ^~~~~~~~~~
compilation terminated.
exit status 1

Compilation error: exit status 1

Questo è uno degli esempi inclusi nel core e come puoi vedere adotta lo stesso identico approccio andando a definire degli handler per ciascun endpoint del webserver.

server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.on("/gif", []() {
    static const uint8_t gif[] = {
      0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80, 0x01,
      0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00,
      0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x19, 0x8c, 0x8f, 0xa9, 0xcb, 0x9d,
      0x00, 0x5f, 0x74, 0xb4, 0x56, 0xb0, 0xb0, 0xd2, 0xf2, 0x35, 0x1e, 0x4c,
      0x0c, 0x24, 0x5a, 0xe6, 0x89, 0xa6, 0x4d, 0x01, 0x00, 0x3b
    };
    char gif_colored[sizeof(gif)];
    memcpy_P(gif_colored, gif, sizeof(gif));
    // Set the background to a random set of colors
    gif_colored[16] = millis() % 256;
    gif_colored[17] = millis() % 256;
    gif_colored[18] = millis() % 256;
    server.send(200, "image/gif", gif_colored, sizeof(gif_colored));
  });

  server.onNotFound(handleNotFound);

Per quanto riguarda FreeRTOS, anche qui non c'è nulla di esterno da installare. Il supporto è già definito nel core per Arduino.

Come regola generale, inizia sempre a spulciare gli esempi inclusi nel core. Per quanto riguarda FreeRTOS c'è l'esempio FreeRTOS-StaticMulticore.ino che mi sembra un buon punto di partenza.

L'unica accortezza è quello di abilitarlo tra le opzioni della scheda:

Come puoi vedere sullo sfondo, compila senza alcun problema,

Ciao, ho provato a compilare HelloServer sulla mia scheda ma mi da questo errore:

In file included from /home/minipc/Arduino/libraries/WebServer/src/HTTPServer.h:28:0,
                 from /home/minipc/Arduino/libraries/WebServer/src/WebServerTemplate.h:23,
                 from /home/minipc/Arduino/libraries/WebServer/src/WebServer.h:23,
                 from /home/minipc/Arduino/OROLOGIO _29_12_2025 /HelloServer/HelloServer.ino:3:
/home/minipc/Arduino/libraries/WebServer/src/HTTP_Method.h:3:10: fatal error: http_parser.h: No such file or directory
 #include "http_parser.h"
          ^~~~~~~~~~~~~~~
compilation terminated.
exit status 1

Compilation error: exit status 1

Per quanto riguarda FreeRTOS io uso l’IDE Arduino 2.3.7 su Ubuntu e un menu a tendina come da foto non c’è.

Perdona il mio “zoppicamento” nel trattare la materia ma sono alle prime armi con il linguaggio C e la compilazione

Ancora grazie

Da quello che descrivi, credo che ci sia un'incomprensione di base.

Io sto parlando del core "Raspberry Pi Pico/RP2040/RP2350" by Earle F. Philhower mentre tu con tutta probabilità stai usando il core "Arduino Mbed OS Nano Boards" oppure il "Arduino Mbed OS RP2040 Boards" (sono sostanzialmente la stessa cosa).

Il progetto Mbed OS si trova attualmente in una fase di transizione critica verso la sua chiusura definitiva da parte di ARM, quindi la scelta di adottarlo da parte di Arduino non è stata tra le più felici (infatti stanno cercando di correre ai ripari spostandosi su Zephyr per le nuove schede).

Io ti consiglio di passare al core citato Raspberry Pi Pico/RP2040/RP2350 che utilizza direttamente il Raspberry Pi Pico SDK, e come puoi immaginare è molto più completo, efficiente e veloce rispetto a quello Mbed.

Lo dovresti trovare direttamente nel Boards Manager, in caso contrario aggiungi il link per le schede aggiuntive nelle preferenze:
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

Una volta installato il core, troverai gli esempi inclusi ed anche l'opzione citata nel menu a tendina.

Ciao, ho installato il core Raspberry Pi Pico/RP2040/RP2350 ed ora riesco a compilare e caricare i file di esempio senza errori, però non riesco a collegarmi alla rete WiFi (il classico avanzamento dei puntini sul monitor seriale).

Ti viene in mente qualcosa sul perché?

Ho verificato che il menu ora presenta anche la possibilità di scegliere FreeRTOS (ma non l’ho ancora testato).

L’unica “anomalia” che riscontro è che la porta seriale mi compare due volte

my two cents ...

... FreeRTOS™ è un vero sistema operativo real time ... non è che uno piglia e lo usa così, senza STUDIARE ... è piuttosto complesso ed articolato e richiede un certo tempo per l'apprendimento ed il corretto utilizzo. Il sito ufficiale su cui trovare documentazione, tutorials, API guide e da cui partire è QUESTO.

Buon divertimento.

Guglielmo

Certamente lo studierò!

Comunque l’ho testato e funziona!! :slightly_smiling_face:

Mi rimane il problema che con il core Raspberry Pi Pico/RP2040/RP2350, pur usando gli esempi correlati, non riesco a collegarmi alla rete WiFi (cosa che usando il core Mbed OS, anche se non in modo asincrono come mi sarebbe necessario, riuscivo a fare).

Grazie a tutti

Il problema è più complesso di quanto ho inizialmente immaginato...
Spulciando le issue aperte nel repository, sembrerebbe che usando la Nano RP2040 Connect sia comunque necessario usare la WiFiNINA per quanto riguarda la connessione perchè il modulo U-blox® Nina W102 che monta non è supportato nativamente dal core di E. Philhower.

Il problema è che la classe WiFiServer di WiFiNINA non definisce il tipo interno ClientType richiesto da WebServer del core E. Philhower e quindi le due librerie messe insieme non compilano :tired_face:

Questo significa che purtroppo non si può usare la libreria webserver inclusa nel core con la Arduino Nano ed è necessario trovare una soluzione che supporti il modulo WiFi del Nano per la gestione dela connessione stessa.

Come ho accennato più su, io ho fatto un porting per Arduino Uno R4 che funziona sia con il modulo WiFi basato su ESP32-S3 della R4, ma anche con il modulo Nina W102 testato con successo con un Arduino Nano 33 IoT (funziona anche con Ethernet a dirla tutta).

Si tratta essenzialmente di quello che è stato fatto con la libreria WebServer in questione, ma l'ho pensato in modo "agnostico" rispetto all'hardware e quindi dovrebbe funzionare senza problemi anche su piattaforma RP2040 sia con il core Mbed "ufficiale" che con quello di E. Philhower.

Se vuoi fare un tentativo, ti allego un esempio leggermente modificato per compilare, ma non ho modo di provarlo perché non ho la tua scheda a disposizione.
La libreria dovrai installarla manualmente scaricando il file zip da Github perché per mancanza di tempo/interesse non l'ho aggiunta al gestore librerie di Arduino IDE.

TestNanoConnect.zip (8.1 KB)

Ciao, ho provato senza successo, tutto troppo complicato per le mie conoscenze….

Un ultimo consiglio: che scheda potrei acquistare che mi permetta di poter usare sia un web server asincrono sia FreeRTOS ?

Ancora grazie

Una delle tante dev-board basate su ESP32, o meglio ancora ESP32-S3.

Sono MCU a cui non manca nulla, economiche e trovi milioni di esempi.

@59alby:

Considera che, anche se non lo vedi, (vedi setup() e loop() come su ogni arduino), in realtà le ESP32 sono basate su FreeRTOS™ e anche setup() e loop() girano sotto il suo controllo.

Salvo casi particolari non ti serve nemmeno utilizzare le chiamate FreeRTOS™, tanto già gira in background e suddivide le varie operazioni sui due "core" del ESP32.

Se invece vuoi imparare a sfruttarlo a fondo, allora QUESTO libro potrebbe esserti utile (esiste anche in versione cartacea se preferisci).

Guglielmo

Tanto per concludere con un lieto fine…
Ho acquistato una scheda ESP32 WiFi e adesso riesco a fare tutto ciò che mi era necessario…
Grazie a tutti per la pazienza e gli utili consigli