ArduinoAsDevice
ArduinoAsDevice
Controlla una scheda Arduino da un'applicazione .NET via porta seriale: configura i pin come input/output, leggi e scrivi valori digitali e analogici, genera onde a frequenza e ampiezza regolabili e ricevi letture in continuo (streaming) direttamente dal firmware.
Il progetto è composto da due parti:
- Firmware Arduino — sketch generico compatibile con le schede AVR più comuni (Uno, Nano, Mega, Leonardo…)
- Libreria .NET — disponibile sia per .NET moderno (net8.0) sia per .NET Framework 4.8, con gli stessi sorgenti condivisi
Struttura del repository
ArduinoAsDevice/
├── firmware/
│ └── ArduinoAsDevice/
│ └── ArduinoAsDevice.ino # sketch firmware (parser comandi + streaming)
├── src/
│ ├── Shared/ # sorgenti C# condivisi tra i due target
│ ├── ArduinoAsDevice.Net/ # libreria .NET 8.0
│ └── ArduinoAsDevice.NetFx/ # libreria .NET Framework 4.8
├── samples/
│ ├── ConsoleDemo/ # applicazione console di esempio
│ └── WinFormsDemo/ # pannello desktop Windows per pin e stream
└── ArduinoAsDevice.sln
Installazione del firmware
- Apri
firmware/ArduinoAsDevice/ArduinoAsDevice.inocon l'IDE Arduino - Seleziona la scheda e la porta corretta
- Carica lo sketch
Il firmware apre la seriale a 115200 baud e risponde a comandi testuali (uno per riga).
Uso della libreria
Riferimenti
- .NET 8+: referenzia
src/ArduinoAsDevice.Net/ArduinoAsDevice.Net.csproj(richiede il pacchetto NuGetSystem.IO.Ports, già incluso) - .NET Framework 4.8: referenzia
src/ArduinoAsDevice.NetFx/ArduinoAsDevice.NetFx.csproj
Esempio
using ArduinoAsDevice; using var dev = new ArduinoDevice("COM3"); // oppure /dev/ttyUSB0 su Linux/macOS dev.Open(); // Configura un pin come output e scrivilo dev.SetPinMode(13, PinMode.Output); dev.DigitalWrite(13, true); // Lettura digitale e analogica bool stato = dev.DigitalRead(2); int valore = dev.AnalogRead(14); // A0 = pin 14 sulle schede AVR // Ampiezza PWM (duty cycle 0-255) dev.AnalogWrite(9, 128); // Onda quadra a frequenza regolabile (0 = stop) dev.SetTone(8, 440); // 440 Hz // Streaming: lettura automatica ogni 250 ms dev.ReadingReceived += (s, e) => Console.WriteLine($"pin {e.Pin} = {e.Value}"); dev.StartStream(pin: 14, analog: true, intervalMs: 250); // ... dev.StopStream();
API principale (ArduinoDevice)
Logging della comunicazione seriale
// Opzione 1: su console/file con timestamp automatico dev.LogOutput = Console.Out; // oppure su file: dev.LogOutput = new StreamWriter("serial.log") { AutoFlush = true }; // Opzione 2: callback personalizzata dev.Logger = (line, sent) => Console.WriteLine(sent ? $"TX: {line}" : $"RX: {line}");
Esempio di output su LogOutput:
22:31:04.512 >> PING
22:31:04.530 << PONG 1.0.0
22:31:04.612 >> DREAD 2
22:31:04.625 << D 2 1
Protocollo seriale
Un comando per riga (\n), risposte su una riga:
Lo streaming supporta un pin alla volta. Le righe S ... sono asincrone; le altre righe sono risposte sincrone ai comandi.
Build
dotnet build ArduinoAsDevice.sln
Compila entrambe le librerie (net8.0 e net48) e il sample console.
Eseguire il sample
dotnet run --project samples/ConsoleDemo -- COM3
Senza argomenti mostra le porte seriali disponibili.
Demo WinForms
Su Windows è disponibile anche un pannello grafico per:
- scegliere il profilo Arduino Uno, Nano o Mega e la porta COM;
- aprire e chiudere la comunicazione;
- configurare modalità, stato digitale, PWM e tone dei pin compatibili;
- leggere e rappresentare lo stato dei pin;
- visualizzare lo stream analogico o digitale di un pin in un grafico;
- consultare il log seriale con timestamp e direzione TX/RX;
- salvare e caricare porta, baud rate, pin e parametri stream in JSON.
dotnet run --project samples/WinFormsDemo
I pin D0/D1 sono mostrati ma protetti perché usati dalla seriale. Il caricamento di un file aggiorna la UI senza connettere il dispositivo né avviare lo stream: se il dispositivo è già connesso, usare Applica configurazione per inviare le impostazioni. Come il protocollo, il grafico gestisce un solo pin alla volta.
Note e limiti
- Sulle schede AVR i pin analogici A0-A5 corrispondono ai numeri 14-19
tone()usa un timer hardware: su alcune schede può interferire con il PWM dei pin 3 e 11- Lo streaming è limitato a un pin alla volta (per semplicità del protocollo)
- All'apertura della porta seriale le schede AVR si resettano: la libreria attende ~2 s prima di comunicare
Per il codice sorgente e gli altri progetti visita il profilo GitHub di rsodvd79 .
