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
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
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.
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.
// 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
- 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