Arduino — microcontrollore e programmazione

📋 Obiettivi di apprendimento
Descrivere l’architettura hardware di Arduino UNO: microcontrollore ATmega328P, pin digitali, analogici, alimentazione e comunicazione USB
Descrivere la struttura di uno sketch Arduino con setup() e loop() e spiegare il ciclo di esecuzione
Usare le istruzioni fondamentali: pinMode, digitalWrite, digitalRead, analogRead, analogWrite, delay, Serial.print
Leggere e scrivere su pin digitali e analogici, collegare LED, pulsanti e sensori semplici al microcontrollore
🎬
Video
Arduino blink di un LED
Guarda →
🎬
Video
Arduino blink alternato di due LED
Guarda →
🎬
Video
Arduino pulsante che attiva un LED
Guarda →
🎬
Video
Arduino pulsante come interruttore
Guarda →
🎬
Video
Arduino pulsante che attiva il blink alternato di due LED
Guarda →
🎬
Video
Arduino potenziometro che regola la luminosità di un LED
Guarda →
🎬
Video
Arduino fotoresistenza e tre LED
Guarda →
📄
Slides
Arduino — hardware, IDE e istruzioni fondamentali
📚
Risorse
Esercizi svolti con Tinkercad
Vedi →

Arduino — il microcontrollore per tutti

Nato nel 2005 al Politecnico di Ivrea (Italy!) per permettere a studenti di design e arte di creare prototipi interattivi senza un background di ingegneria elettronica, Arduino è diventato il punto di ingresso standard per il Physical Computing in tutto il mondo. Il suo successo si basa su tre pilastri: hardware aperto (i progetti sono open source e replicabili), software gratuito (l’IDE è scaricabile liberamente) e una comunità enorme (milioni di tutorial, librerie e forum).

A differenza di un computer tradizionale, Arduino non esegue un sistema operativo — il programma che carichi è l’unica cosa che gira, in modo continuo e senza interruzioni. Questo rende il comportamento del sistema predicibile e deterministico, caratteristica fondamentale quando si controllano dispositivi fisici in tempo reale.

Hardware — Arduino UNO nel dettaglio

Arduino UNO — componenti principali
🔲 Microcontrollore — ATmega328P
Architettura: RISC, 8 bit, Harvard (dati e istruzioni separati)
Clock: 16 MHz (16 milioni di istruzioni/sec)
Flash: 32 KB — qui risiede il tuo sketch
SRAM: 2 KB — memoria di lavoro (variabili)
EEPROM: 1 KB — dati persistenti dopo spegnimento
Tensione operativa: 5V
📌 Pin di interfaccia
Pin digitali: 14 (D0–D13) — ingresso o uscita, 5V / 0V
Pin PWM: 6 pin (~3, ~5, ~6, ~9, ~10, ~11)
Pin analogici: 6 (A0–A5) — ADC 10 bit, 0–5V → 0–1023
Corrente max/pin: 40 mA (totale scheda: 200 mA)
Alimentazione: USB 5V oppure jack 7–12V (regolato internamente)
USB: programmazione + Serial Monitor
⚠️ Attenzione ai limiti di corrente — la regola dei 40 mA

Ogni pin digitale di Arduino può erogare al massimo 40 mA. Un LED tipico ne richiede 20 mA — ok, con la resistenza da 220Ω. Ma un motore DC richiede centinaia di mA: collegarlo direttamente brucia il pin o l’ATmega328P istantaneamente. Per carichi superiori a 40 mA si usano sempre driver esterni (transistor, MOSFET, H-Bridge, relè).

Il pinout — mappa dei pin

ALIMENTAZIONE
VIN → ingresso tensione esterna (7-12V)
5V → uscita 5V regolata (da USB o VIN)
3.3V → uscita 3.3V (max 50 mA)
GND → massa (riferimento 0V)
PIN DIGITALI
D0, D1 → TX/RX seriale (occupati dalla USB)
~D3 → digitale + PWM
D4 → digitale puro
~D5, ~D6 → digitali + PWM
D7, D8 → digitali puri
~D9, ~D10, ~D11 → digitali + PWM
D12, D13 → digitali puri (D13 = LED onboard)
PIN ANALOGICI
A0–A5 → ingressi analogici 0–5V (ADC 10 bit)
A4=SDA, A5=SCL → usabili come bus I²C

L’IDE Arduino e la struttura di uno sketch

L’Arduino IDE (Integrated Development Environment) è l’ambiente di sviluppo con cui si scrivono, compilano e caricano i programmi. Scaricabile gratuitamente da arduino.cc, supporta Windows, macOS e Linux. I programmi per Arduino si chiamano sketch e hanno sempre la stessa struttura obbligatoria: due funzioni.

La struttura minima di ogni sketch Arduino
// SETUP — eseguita UNA SOLA VOLTA all'avvio
void setup() {
  // Inizializzazioni: configura pin, avvia librerie,
  // imposta velocità seriale...
}

// LOOP — eseguita IN MODO CONTINUO all'infinito
void loop() {
  // Il codice qui si ripete finché c'è alimentazione.
  // Leggi sensori → elabora → comanda attuatori
}
setup() è il “accensione”: si esegue una sola volta e serve a inizializzare tutto. loop() è il “cuore che batte”: si ripete migliaia di volte al secondo, finché la scheda è alimentata. Non c’è un main() come in C standard — Arduino lo gestisce internamente.

Le istruzioni fondamentali

Configurazione dei pin — pinMode()

// pinMode(numero_pin, modalità) — va chiamato nel setup()
// Modalità: OUTPUT (uscita) oppure INPUT / INPUT_PULLUP (ingresso)

void setup() {
  pinMode(13, OUTPUT);       // pin 13 come uscita (LED)
  pinMode(7,  INPUT);        // pin 7 come ingresso (pulsante)
  pinMode(4,  INPUT_PULLUP); // pin 4 con resistenza pullup interna
                                 // (HIGH quando aperto, LOW quando premuto)
}

Uscita e lettura digitale — digitalWrite() e digitalRead()

// Esempio 1 — Blink: LED lampeggiante
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);  // pin 13 → 5V → LED acceso
  delay(1000);              // aspetta 1000 ms = 1 secondo
  digitalWrite(13, LOW);   // pin 13 → 0V → LED spento
  delay(1000);              // aspetta ancora 1 secondo
}  // → loop() riparte → LED lampeggia all'infinito

// Esempio 2 — Button: legge un pulsante e accende il LED
int stato;

void setup() {
  pinMode(13, OUTPUT);
  pinMode(7, INPUT_PULLUP); // pulsante con pullup interno
}

void loop() {
  stato = digitalRead(7);    // legge il pin: HIGH o LOW
  if (stato == LOW) {        // LOW = pulsante premuto (pullup)
    digitalWrite(13, HIGH);  // accendi LED
  } else {
    digitalWrite(13, LOW);   // spegni LED
  }
}

Lettura analogica — analogRead()

// analogRead(pin) legge da A0 a A5 — restituisce un intero 0-1023
// (ADC 10 bit: 0V=0, 5V=1023, 2.5V≈512)

int valLuce;
float tensione;

void setup() {
  Serial.begin(9600); // avvia comunicazione seriale a 9600 baud
  // I pin analogici (A0-A5) sono sempre in INPUT di default
  // Non serve pinMode() per analogRead()
}

void loop() {
  valLuce = analogRead(A0);                    // legge LDR su A0
  tensione = (valLuce * 5.0) / 1023.0;        // converte in Volt

  Serial.print("Valore ADC: ");
  Serial.print(valLuce);
  Serial.print("   Tensione: ");
  Serial.print(tensione);
  Serial.println(" V");                       // println aggiunge a capo

  delay(500);                                 // aspetta mezzo secondo
}

Uscita analogica simulata — analogWrite() e PWM

// analogWrite(pin_PWM, valore) — valore da 0 a 255
// Solo sui pin con ~ : 3, 5, 6, 9, 10, 11

// Esempio: LED che si accende progressivamente (fade)
int luminosita = 0;
int incremento = 5;

void setup() {
  pinMode(9, OUTPUT); // pin 9 ha il PWM (~)
}

void loop() {
  analogWrite(9, luminosita);  // imposta duty cycle
  luminosita += incremento;    // aumenta luminosità

  if (luminosita <= 0 || luminosita >= 255) {
    incremento = -incremento;  // inverte direzione (dissolvenza)
  }
  delay(30);
}

Comunicazione seriale — Serial Monitor

// La comunicazione seriale è il ponte tra Arduino e il PC
// Permette di stampare valori per il debug e ricevere comandi

void setup() {
  Serial.begin(9600);      // 9600 baud = 9600 bit al secondo
  Serial.println("Arduino pronto!");
}

void loop() {
  Serial.print("Tempo (ms): ");
  Serial.println(millis());  // millis() = ms dall'avvio
  delay(1000);
}

/* Funzioni Serial principali:
   Serial.begin(baud)   → avvia comunicazione
   Serial.print(val)    → stampa senza a capo
   Serial.println(val)  → stampa con a capo
   Serial.available()   → bytes in arrivo disponibili
   Serial.read()        → legge un byte dall'input
*/

Esempio completo — Sensore di luce con risposta automatica

Questo sketch integra tutti i concetti visti: lettura analogica di un sensore (LDR), elaborazione con una soglia, uscita digitale su un LED, e debug via Serial Monitor. È un sistema ad anello chiuso semplice.

Schema di collegamento
LDR: un terminale → 5V | altro → A0 e [10kΩ] → GND
(partitore di tensione: la tensione su A0 varia con la luce)
LED: Anodo → [220Ω] → pin 13 | Catodo → GND
// Luce automatica con LDR — sistema ad anello chiuso

const int pinLDR = A0;   // fotoresistenza su A0
const int pinLED = 13;   // LED su pin 13
const int SOGLIA = 400; // sotto questa soglia = buio → accendi

int valLuce;

void setup() {
  pinMode(pinLED, OUTPUT);
  Serial.begin(9600);
  Serial.println("Luce automatica avviata");
}

void loop() {
  valLuce = analogRead(pinLDR);            // PERCEPISCI

  if (valLuce < SOGLIA) {                  // ELABORA
    digitalWrite(pinLED, HIGH);            // AGISCI — buio: LED acceso
    Serial.print("BUIO   - LDR: ");
  } else {
    digitalWrite(pinLED, LOW);             // luce: LED spento
    Serial.print("CHIARO - LDR: ");
  }
  Serial.println(valLuce);
  delay(200);
}

Riepilogo istruzioni fondamentali

IstruzioneSintassiScopoDove usarla
pinMode()pinMode(pin, OUTPUT)Configura un pin come ingresso o uscitasetup()
digitalWrite()digitalWrite(pin, HIGH)Scrive 5V (HIGH) o 0V (LOW) su un pin digitaleloop()
digitalRead()val = digitalRead(pin)Legge lo stato di un pin digitale — restituisce HIGH o LOWloop()
analogRead()val = analogRead(A0)Legge tensione 0–5V su pin analogico → restituisce 0–1023loop()
analogWrite()analogWrite(9, 128)Genera segnale PWM su pin ~ — valore 0 (0%) a 255 (100%)loop()
delay()delay(1000)Pausa di N millisecondi — blocca l’esecuzioneloop()
Serial.print()Serial.println(val)Invia testo/valori al PC via USB per il debugsetup() e loop()
📌 Riepilogo — Punti chiave
  • Arduino UNO monta un ATmega328P a 8 bit, 16 MHz, con 32 KB Flash, 2 KB SRAM. Dispone di 14 pin digitali (6 con PWM) e 6 ingressi analogici (ADC 10 bit). La corrente massima per pin è 40 mA
  • Ogni sketch ha due funzioni obbligatorie: setup() — eseguita una volta all’avvio per inizializzare; loop() — eseguita in modo continuo e ripetuto finché la scheda è alimentata
  • pinMode() configura ogni pin; digitalWrite()/digitalRead() gestiscono il segnale digitale; analogRead() legge 0–1023 dai pin A0–A5; analogWrite() genera PWM 0–255 sui pin ~
  • Serial.begin(9600) + Serial.println() permettono di inviare dati al PC via USB — fondamentale per il debug e per visualizzare i valori letti dai sensori nel Serial Monitor dell’IDE

Lascia un commento