Dal browser ad Arduino: apri la porta, invia comandi, leggi le risposte. Con '1' accendi il LED, con '0' lo spegni.
Web Serial API è una funzionalità del browser (Chrome, Edge) che permette a una pagina web di parlare direttamente con dispositivi seriali come Arduino, ESP32, schede GRBL, ecc.
Niente plugin, niente software esterno. Solo HTML e JavaScript.
Collega Arduino con il programma che trovi nella sezione "Cosa succede dentro Arduino". Poi clicca "Connetti" e scegli la porta giusta.
Prova: invia '1' (accende LED su D13), invia '0' (spegne LED). Arduino risponde sempre con lo stesso carattere (echo).
let port, writer, reader — tre variabili che useremo per parlare con Arduino. Sono come tre scatole vuote.
async function connect() — fa tutto il lavoro di apertura:
navigator.serial.requestPort() — chiede al browser di mostrare la lista delle porte serialiport.open({ baudRate: 115200 }) — apre la porta scelta con velocità 115200 (deve matchare Arduino)writer e reader — prepara i canali per scrivere e leggerewhile (keepReading) — resta in ascolto per sempre, appena arriva un messaggio lo mostra nella casellaasync function disconnect() — chiude tutto quando hai finito
async function sendData() — prende il testo che hai scritto e lo spedisce ad Arduino
💡 Prova a modificare: cambia baudRate a 9600 se il tuo Arduino usa quella velocità.
Il browser invia byte. Dentro Arduino, questi sono i registri che si attivano:
| Registro | Indirizzo | Bit | Nome | Cosa fa |
|---|---|---|---|---|
| UBRR0L | 0xC4 | 7-0 | UBRR[7:0] | parte bassa della velocità (baud rate) |
| UBRR0H | 0xC5 | 7-0 | UBRR[15:8] | parte alta della velocità |
| UCSR0B | 0xC1 | 4 | RXEN0 | =1 per abilitare la ricezione |
| UCSR0B | 0xC1 | 3 | TXEN0 | =1 per abilitare la trasmissione |
| UCSR0C | 0xC2 | 2-1 | UCSZ0[1:0] | =11 per 8 bit di dati |
| UCSR0A | 0xC0 | 7 | RXC0 | =1 quando un byte è arrivato |
| UCSR0A | 0xC0 | 5 | UDRE0 | =1 quando buffer trasmissione vuoto |
| UDR0 | 0xC6 | 7-0 | UDR | il byte ricevuto (o da trasmettere) |
| DDRB | 0x04 | 5 | DDB5 | =1 per configurare pin D13 come OUTPUT |
| PORTB | 0x05 | 5 | PORTB5 | =1 per accendere LED (5V), =0 per spegnere (0V) |
Configurazione iniziale (si fa una volta sola):
Quando il browser INVIA un byte:
Quando Arduino RISPONDE (invia un byte al browser):
UDR0 (0xC6) è la cassetta postale.
UCSR0A bit7 (RXC0) è la bandierina "posta in arrivo".
UCSR0A bit5 (UDRE0) è la bandierina "posta in partenza - cassetta vuota".
PORTB bit5 (0x05.5) è l'interruttore del LED.
📥 Programma completo da caricare su Arduino:
Riceve byte, accende LED se '1', spegne se '0', e rispedisce sempre indietro il carattere (echo).
Con assembler uploader online costycnc: https://www.costycnc.it/avr1/compiler.html
Scrivere direttamente nei registri di un piccolo ATmega328 NON è un esercizio inutile per nostalgici. È ESATTAMENTE come funzionano i sistemi più complessi del pianeta.
Quello che vedi qui con UDR0 (0xC6) e PORTB (0x05) è la stessa identica logica che usano:
NVIDIA RTX 5090, AMD Radeon: migliaia di registri. Il driver scrive in indirizzi come 0x3C0 per risoluzione, 0x3C4 per frequenza. Stessa identica cosa: un indirizzo, un valore, e l'hardware reagisce.
📌 Il tuo sbi 0x05,5 = driver NVIDIA che scrive in 0x3C0
Realtek, Sound Blaster: centinaia di registri per volume, EQ. Scrivere 0x50 in registro 0x2A = volume 50%. Identico al tuo sts 0xC6, r17.
📌 Il tuo sts 0xC6, r17 = driver audio che scrive in 0x2A
Bosch, Denso: migliaia di registri via OBD2. Leggi 0x0C = giri motore, 0x0D = velocità. Come tu leggi UCSR0A.
📌 Il tuo lds r16, 0xC0 = scanner OBD2 che legge 0x0C
NVMe, USB, schede di rete: registri mappati in memoria. Il driver scrive in 0xF0008000. Stessa filosofia del tuo out 0x04, r16.
📌 Il tuo out 0x04, r16 = driver NVMe che scrive in 0xF0008000
Intel i9, Apple M4, STM32, ESP32: tutti hanno registri. Cambiano i nomi, il principio è identico. Sai già il 90% di come si programma qualsiasi micro.
📌 sbi 0x05,5 = GPIOB->BSRR su STM32
Intel Z790, AMD B650: gestiscono USB, SATA, PCIe via registri. BIOS scrive in 0xCF8/0xCFC. Stessa logica.
📌 Il tuo sts 0xC6, r17 = BIOS che scrive in 0xCFC
0x3C0
0x2A
0x0C
0xC6 (UDR0) · 0x05 (PORTB)
📢 È LA STESSA IDENTICA COSA!
Quando impari a scrivere sts 0xC6, r17 su Arduino, non stai imparando una cosa vecchia e inutile.
Stai imparando come FUNZIONA TUTTO IL MONDO DIGITALE.
═════════════════════════
NON C'È MAGIA. SOLO NUMERI IN REGISTRI.
═════════════════════════
Arduino non è un giocattolo. È la palestra dove impari le regole che governano TUTTO l'hardware.
Domanda: Quando arriva un byte dal browser, quale bit si alza e in quale registro? E per accendere il LED, quale registro e quale bit si usa?
Bit RXC0 (bit 7) nel registro UCSR0A (indirizzo 0xC0) indica l'arrivo di un byte. Per accendere il LED si usa PORTB (0x05) bit 5 = 1.