Prototipo di un sistema di parcheggio intelligente implementato a livello comunale, il cui obiettivo è dimostrare come l’introduzione di dispositivi IoT (Internet of Things) possa agevolare la vita delle persone.
- Il mondo dell'IoT 🌐
- Panoramica del progetto 🚗
- Materiali 🛠️
- Circuito 🔌
- Codice 👨💻
- Collegamenti interdisciplinari 🔗
- Conclusioni sull'esperienza 💭
Prima di esplorare il progetto in sé è opportuno fare un'introduzione al concetto di "Internet of Things".
Il mondo sta assistendo ad una rapida diffusione delle reti digitali, che consentono ai dispositivi di connettersi e trasmettere informazioni. Questo fenomeno, noto come trasformazione digitale, consiste nell’applicazione della tecnologia digitale al fine di stimolare innovazione ed progresso. I sensori sono ovunque ormai: grazie ad essi è possibile raccogliere una grande quantità di dati che possono essere archiviati, analizzati e utilizzati per una moltitudine di scopi differenti, come monitorare l'ambiente, prevedere la crescita demografica, gestire i rifiuti, migliorare la sicurezza domestica, e molti altri.
Curiosità 💡: La diffusione di processori economici e reti wireless ha facilitato la diffusione dei dispositivi IoT. Si prevede che entro il 2025 ci saranno 38,6 miliardi di dispositivi connessi a Internet, aumentando a 50 miliardi entro il 2030, con una media di 190 milioni di nuovi dispositivi ogni mese.
“Internet of Things” (IoT) è una rete interconnessa di dispositivi fisici (things), che comunicano e scambiano dati per migliorare l'efficienza e l'esperienza umana in svariati settori, tramite l’utilizzo di sensori, attuatori ed altre tecnologie.
- Connettività: capacità di connettersi in modo affidabile a reti, tramite tecnologie e protocolli di comunicazione efficaci.
- Sensori e attuatori: capacità di percepire l’ambiente attraverso sensori e di agire su di esso tramite attuatori; questa funzionalità consente al dispositivo di raccogliere dati, prendere decisioni basate su tali dati e potenzialmente influenzare l'ambiente circostante.
- Automazione: implementare processi autogestiti che riducono, per poi eventualmente eliminare, la necessità dell’intervento umano; l’IoT apre un nuovo mondo in cui le attività che prima richiedevano l’intervento umano possono diventare automatizzate.
- Scalabilità: dato che gli ambienti IoT possono variare notevolmente in termini di dimensioni e complessità, i dispositivi dovrebbero essere progettati per scalare facilmente in modo da poter essere utilizzati in piccole reti domestiche o in grandi reti industriali.
- Sicurezza: l'integrità e la sicurezza dei dati sono cruciali nell'ambito dell'IoT, specialmente quando si tratta di informazioni sensibili o di dispositivi critici.
- Interoperabilità: capacità di interagire con altri dispositivi e sistemi, essenziale per consentire una comunicazione efficace tra dispositivi di diversi produttori e piattaforme.
- Efficienza energetica: molti dispositivi IoT sono alimentati da batterie o sorgenti di energia limitate; l'efficienza energetica è un aspetto chiave per garantire una lunga durata della batteria e ridurre l'impatto ambientale.
- Manutenzione remota e aggiornamenti: essenziale per garantire che i dispositivi IoT rimangano sicuri e aggiornati nel tempo.
Un sensore deve essere collegato a una rete in modo che i dati raccolti possano essere archiviati e condivisi. Il controllore si occupa di raccogliere i dati dai sensori e di garantire la connettività: può avere la capacità di prendere decisioni immediate, oppure può inviare dati a un computer più potente per l’analisi. Tali elementi solitamente lavorano insieme a un dispositivo chiamato attuatore. Gli attuatori ricevono l'input elettrico e lo convertono in azione fisica.
L’IoT offre numerosi vantaggi, consentendo la raccolta e l'analisi efficace dei dati provenienti dai sensori. Le aziende traggono beneficio da informazioni dettagliate sui loro prodotti e clienti, ottimizzando la produzione e indirizzando il marketing in modo mirato. Le città gestiscono il traffico, il riciclaggio, le esigenze sanitarie e di trasporto. Gli individui traggono benefici in termini di salute, sicurezza domestica e costi energetici ridotti.
Allo stesso tempo, è importante considerare anche gli svantaggi: le imprese che sviluppano dispositivi indossabili hanno accesso a informazioni personali sugli utenti; affidarsi prettamente ad acquisti online potrebbe comportare la perdita di posti di lavoro; i rivenditori sono a conoscenza di tutti gli acquisti effettuati; un'interruzione della rete può avere conseguenze catastrofiche.
Il progetto prevede la realizzazione di un prototipo di sistema di parcheggio intelligente implementato a livello comunale. Si tratta di un modellino in scala di un percorso stradale comunale con tre diversi tipi di parcheggio, ciascuno dei quali ha l'obiettivo di dimostrare una possibile applicazione IoT che ne agevoli la gestione. I dati raccolti dai sensori vengono trasmessi a un'applicazione di rete, che permette di monitorare l'occupazione dei parcheggi in tempo reale e di conservare i dati storici, consentendo così di effettuare analisi e previsioni future.
Il progetto si propone di dimostrare come l'introduzione di dispositivi IoT possa migliorare significativamente la qualità della vita delle persone, applicandosi nello specifico al contesto dei parcheggi urbani.
L'integrazione di tali tecnologie offre diversi vantaggi pratici, tra cui la possibilità di ricevere aggiornamenti in tempo reale sulla disponibilità dei posti auto, riducendo così il tempo e lo stress associati alla ricerca di un parcheggio. Inoltre, l'uso di sensori e algoritmi di previsione consente di effettuare stime accurate sulla disponibilità futura dei parcheggi, aiutando gli automobilisti a pianificare meglio i loro spostamenti. Grazie a queste innovazioni, è possibile ridurre il traffico veicolare causato dalla ricerca di parcheggio, migliorare l'efficienza dei trasporti urbani e contribuire a un ambiente più sostenibile, riducendo le emissioni di CO2. I dati raccolti possono essere inoltre utilizzati dalle amministrazioni comunali per ottimizzare la gestione degli spazi urbani, identificando aree con alta domanda di parcheggi e pianificando interventi infrastrutturali mirati. Un ulteriore vantaggio è rappresentato dalla possibilità di integrare sistemi di pagamento automatizzati, che consentono agli utenti di prenotare e pagare il parcheggio tramite app, rendendo il processo più rapido e conveniente.
In sintesi, il progetto intende non solo dimostrare l'efficacia dei dispositivi IoT nel migliorare la gestione dei parcheggi, ma anche evidenziare come queste tecnologie possano contribuire a creare città più intelligenti e vivibili, migliorando la qualità della vita dei cittadini attraverso soluzioni innovative e sostenibili.
Il prototipo dispone di tre tipologie di parcheggio, ognuna con le proprie caratteristiche e funzionalità.
Nel progetto sono presenti due parcheggi liberi, con sosta gratuita a tempo indeterminato. Ognuno è dotato di un sensore ad ultrasuoni e di un indicatore LED che ne segnala lo stato. Quando il sensore rileva un ostacolo per un determinato periodo di tempo, il parcheggio viene indicato come occupato (LED acceso). Al contrario, se il sensore non rileva alcun ostacolo per un certo periodo, il parcheggio è segnalato come vuoto (LED spento).
Il progetto include due parcheggi a zona disco (o a sosta breve). Oltre a prevedere tutte le funzionalità dei parcheggi liberi, questi possiedono anche un limite massimo di occupazione, valido esclusivamente dal lunedì al sabato tra le 8:00 e le 20:00. Durante questo intervallo, in caso venga superato tale limite (considerando comunque una certa tolleranza), l'indicatore LED dello slot inizierà a lampeggiare (in un contesto reale, potrebbe essere prevista una segnalazione automatica). Al di fuori di questo orario, il parcheggio è libero.
Curiosità 💡: Il lampeggio del LED, segnale chiaro ed evidente a tutti, ha l'obiettivo di favorire il rispetto delle regole del parcheggio, poiché le persone sono naturalmente inclini a evitare comportamenti che le pongono in una luce negativa di fronte agli altri. Esiste infatti un principio psicologico secondo cui le persone tendono a modificare il proprio comportamento quando consapevoli di essere osservate o quando un'azione indesiderata viene resa visibile a tutti.
Il parcheggio a pagamento è composto da 5 posti auto, accessibili tramite un sistema di senso unico alternato. Dispone di una sbarra d'accesso (controllata da un servo motore), due sensori ad infrarossi per rilevare i veicoli, due indicatori LED in funzione di semaforo, un fotoresistore e altri tre indicatori LED per gestire l'illuminazione automatica. La copertura dei parcheggi è dotata di pannelli fotovoltaici fittizi, che in un contesto reale potrebbero fornire energia rinnovabile per alimentare i dispositivi del parcheggio.
Le entrate e le uscite dal parcheggio vengono monitorate tramite sensori che aggiornano costantemente il conteggio dei veicoli presenti. Il semaforo verde segnala che sono ancora disponibili posti auto e quindi è consentito l'ingresso, mentre il rosso indica che tutti i posti sono occupati e l'accesso è temporaneamente negato.
Ingresso nel parcheggio:
- L'utente si avvicina al sensore situato all'ingresso.
- Se gli spazi non sono tutti occupati (semaforo verde), dopo un breve periodo di rilevamento, l'utente ritira il ticket per il pagamento.
- La sbarra si apre, per poi chiudersi solo quando il sensore oltre la sbarra viene prima attivato e poi disattivato, indicando il passaggio completo del veicolo.
- Solo a questo punto il contatore dei parcheggi verrà incrementato di uno.
Uscita dal parcheggio:
- L'utente si avvicina al sensore situato all'uscita.
- Dopo un breve periodo di rilevamento, l'utente riconsegna il ticket pagato.
- La sbarra si apre, per poi chiudersi solo quando il sensore oltre la sbarra viene prima attivato e poi disattivato, indicando il passaggio completo del veicolo.
- Solo a questo punto, il contatore dei parcheggi verrà decrementato di uno.
Il parcheggio è dotato di un sistema di illuminazione automatica che si attiva tramite un fotoresistore. Questo sensore rileva quando il livello di luminosità scende al di sotto di una soglia prestabilita per un dato intervallo di tempo, attivando così i tre LED bianchi adibiti all'illuminazione del parcheggio.
Per praticità, sono stati apportati degli adattamenti a determinati parametri, i cui valori differiscono da quelli reali. Di seguito è riportata una tabella riassuntiva.
Parametro | Valore reale | Valore dimostrativo | Descrizione |
---|---|---|---|
Tempo di rilevamento | 30 secondi | 3 secondi | Tempo necessario per il rilevamento di un veicolo da parte di un sensore, per prevenire errori causati da interferenze momentanee. |
Distanza di rilevamento | 2,5 metri | 5 cm | Distanza di soglia entro cui un veicolo viene rilevato in un parcheggio. |
Tempo massimo della zona disco | 1 ora (+ 15 minuti di tolleranza) | 16 secondi (+ 4 secondi di tolleranza) | Tempo massimo di occupazione di un parcheggio a zona disco, con tolleranza del 25%. |
Tempo di stabilizzazione della luminosità | 20 secondi | 2 secondi | Tempo necessario prima dell'accensione o dello spegnimento delle luci crepuscolari, per evitare sfarfallii quando la luminosità è vicina alla soglia. |
- Non si è prevista un’uscita separata poiché la zona di parcheggio è relativamente piccola e in quanto non necessario ai fini dimostrativi del progetto. In alternativa, si è introdotta una funzione che impedisce l'ingresso e l'uscita (attraverso l'accensione del semaforo rosso) quando entrambi i sensori sono attivati, indicando due veicoli provenienti contemporaneamente in senso opposto.
- Il sistema di pagamento non è stato incluso poiché non rilevante ai fini dimostrativi del progetto, ma sarebbe necessariamente implementato in un contesto reale.
L'interfaccia è disponibile sia in versione "desktop" (orizzontale) che mobile (verticale).
Il progetto prevede anche un'applicazione (ospitata su Arduino IoT Cloud) che consente di verificare lo stato dei parcheggi in tempo reale, analizzare i dati storici sull’occupazione dei parcheggi e fornire informazioni relative alla distribuzione oraria dell’occupazione dello slot. Ciò può offrire svariati vantaggi, come agevolazione nella ricerca del parcheggio, stime sulla disponibilità futura, riduzione del traffico veicolare, contributo all'ambiente sostenibile, ottimizzazione della gestione urbana,...
I segnalatori mostrano lo stato dei parcheggi individuali, mentre i grafici facilitano l'analisi dei dati raccolti. Per un'indagine più dettagliata e su periodi più estesi, è disponibile il download del file CSV che contiene il riepilogo di tutti i dati storici, per poi essere analizzato tramite software appositi come Excel.
App in funzione.
- Scatola di cartone con coperchio: 62,0 x 44,0 cm x 10,0 cm
- Scatola di cartone argentato: 34,0 cm x 18,5 cm x 13,0 cm
- Nastro adesivo (trasparente e colorato) e biadesivo
- Cartone ondulato
- Cartoncino
- 3 legnetti
- 4 stuzzicadenti
- Plastilina grigia
- Stecco del ghiacciolo
(realizzata tramite il software CorelDRAW Essentials 2021)
La mappa illustra un percorso stradale che presenta 3 tipologie di parcheggio distinte, ciascuna con le proprie peculiarità e scopi dimostrativi.
N.B.: Si precisa che la mappa è concepita esclusivamente a fini teorici e concettuali, pertanto alcune delle sue caratteristiche potrebbero non essere praticamente applicabili in una situazione reale su strada.
La tabella sottostante riporta i diversi componenti impiegati nel circuito. Per le specifiche tecniche complete consultare i rispettivi datasheet.
Componente | Quantità | Descrizione |
---|---|---|
Arduino UNO R4 WiFi |
1 | Arduino è una piattaforma hardware e software open-source con cui realizzare dispositivi digitali in grado di interagire con il mondo esterno attraverso sensori e attuatori (datasheet). |
Breadboard |
1 | Una breadboard è una base di costruzione solderless utilizzata per costruire prototipi semipermanenti di circuiti elettronici. |
Sensori ad ultrasuoni HC-SR04 |
4 | Un sensore ad ultrasuoni è un dispositivo che misura la distanza di un oggetto emettendo onde sonore ultrasoniche e convertendo il suono riflesso in un segnale elettrico.
|
Sensori ad infrarossi |
2 | Un sensore a infrarossi (IR) è un dispositivo che misura e rileva la radiazione infrarossa nell'ambiente circostante, utilizzato spesso come rilevatore di prossimità.
|
LED |
9 | Un LED (Light Emitting Diode) è un dispositivo a semiconduttore che emette luce quando attraversato da una corrente elettrica.
|
Resistori |
10 | Un resistore è un componente elettronico che limita il flusso di corrente in un circuito, determinato dal suo valore di resistenza misurato in ohm, essenziale per regolare la quantità di corrente che attraversa il circuito e proteggere i componenti sensibili.
|
Fotoresistore |
1 | La fotoresistenza è un componente elettronico la cui resistenza è inversamente proporzionale alla quantità di luce che lo colpisce, il che lo rende adatto per la realizzazione di luci crepuscolari. |
Servo motore SG90 |
1 | Un servo motore è un dispositivo che converte un segnale di controllo in movimento preciso e controllato, comunemente utilizzato per il controllo di posizione in sistemi robotici e automazione industriale.
|
Jumper wires |
~200 | I jumper wires sono cavi elettrici corti e flessibili, utilizzati per connettere componenti elettronici tra loro in modo rapido e senza saldatura. Si distinguono in male-to-male, male-to-female e female-to-female in base al tipo di estremità. |
Powerbank 5V |
1 | Un powerbank è una fonte di energia portatile progettato per alimentare dispositivi USB, fornendo energia attraverso batterie interne ricaricabili. |
Batterie AA |
4 | La batteria AA è una fonte di energia portatile di dimensione standard, comunemente utilizzata in dispositivi elettronici di piccole dimensioni. |
6V case per batterie AA |
1 | Contenitore utilizzato per collegare 4 batterie AA in serie, generando una tensione totale di 6V. |
Il circuito che gestisce il funzionamento del prototipo si occupa delle seguenti funzioni:
- Alimentare il microcontrollore Arduino e il servo motore.
- Connettere i vari sensori e attuatori ad Arduino in modo che possano essere controllati tramite codice.
Analizziamone ora le caratteristiche nello specifico.
Tra le varie opzioni di alimentazione per la scheda, si è scelto di utilizzare il connettore USB-C® integrato. È il metodo più comune, semplice e sicuro, poiché la tensione (5 V) e la corrente (500 mA max) sono regolate e standardizzate secondo le specifiche USB. Oltre all'Arduino, il connettore USB consente di alimentare anche i vari componenti connessi al pin 5v della scheda.
Dato che la massima intensità di corrente concessa è di 500 mA, è stato necessario verificare che i dispositivi collegati ad Arduino non superassero complessivamente questo limite.
Componente | Corrente massima | Quantità | Corrente totale massima |
---|---|---|---|
Sensore ad ultrasuoni |
~5 mA | 4 | ~5 mA x 4 = ~20 mA |
Sensore ad infrarossi |
~5 mA | 2 | ~5 mA x 4 = ~10 mA |
LED |
~20 mA | 9 | 20 mA x 9 = ~180 mA |
(Il pin di controllo del servo motore e il fotoresistore consumano una quantità di corrente talmente bassa da potersi considerare trascurabile).
La corrente totale massima è quindi pari a ~210 mA, abbondantemente entro il limite di 500 mA.
N.B.: sebbene, a livello teorico, la massima corrente consumata da ciascun LED è pari a ~20 mA, nel circuito non supera mai gli 8 mA (per ragioni che saranno spiegate in seguito). Pertanto, la corrente massima (~100 mA) utilizzata risulta ancora minore.
Il servo motore si distingue dagli altri componenti per il suo consumo di corrente instabile, caratterizzato da picchi di corrente elevati che potrebbero danneggiare il microcontrollore. Per questo motivo, è consigliabile alimentarlo tramite una fonte esterna, avente una tensione compresa tra 4,8 e 6 V. Di conseguenza, si è optato per l'utilizzo di 4 batterie AA (1,5 V ciascuna) collegate in serie.
I sensori si occupano di rilevare alcune condizioni ambientali al fine di comunicarle al controllore.
Un sensore ad ultrasuoni funziona emettendo impulsi sonori ad alta frequenza, al di fuori dell'udibile dall'orecchio umano, e misurando il tempo che impiega per questi impulsi a riflettersi da un oggetto e tornare al sensore. Conoscendo la velocità del suono nell'aria, il sensore calcola la distanza basandosi sul tempo impiegato dagli impulsi per viaggiare avanti e indietro, in base alla seguente formula:
Il sensore è dotato di 4 connettori: VCC per l'alimentazione, GND per la terra, ECHO e TRIG per il controllo. I primi due sono collegati rispettivamente ai pin 5v e GND dell'Arduino, attraverso la breadboard. I connettori ECHO e TRIG gestiscono l'invio e la ricezione degli ultrasuoni e possono essere collegati allo stesso pin GPIO (General Purpose Input/Output) del microcontrollore, poiché operano in modo alternato.
La scelta di questo sensore per il rilevamento dei parcheggi è motivata dalla sua precisione nelle misurazioni della distanza dei veicoli, consentendo una facile regolazione per adattarsi a vari tipi di parcheggio. Inoltre, non è influenzato da luce, fumo, polvere e caratteristiche delle superfici riflettenti (eccetto superfici morbide, che possono assorbire gli ultrasuoni anziché rifletterli; tuttavia, questo non è un problema nel contesto del rilevamento dei parcheggi).
Un sensore ad infrarossi attivo funziona emettendo un fascio di luce infrarossa e poi rilevando la sua riflessione. Quando un oggetto si trova nel percorso del fascio, la luce infrarossa viene riflessa verso il sensore, il quale rileva la presenza dell'oggetto. Questa variazione nella riflessione della luce è interpretata come la presenza di un oggetto davanti al sensore.
Il sensore dispone di 3 connettori: VCC per l'alimentazione, GND per la terra e OUT per il controllo. Il collegamento ad Arduino è analogo a quello del sensore ad ultrasuoni.
La scelta di utilizzare questo sensore per la rilevazione dei veicoli all'accesso del parcheggio a pagamento è motivata dalla sua affidabile capacità di rilevare la presenza di un oggetto di fronte a sé, nonché dalla sua facilità di utilizzo. Tuttavia, a differenza del sensore ad ultrasuoni, non è in grado di fornire misurazioni precise, quindi non è raccomandato per il rilevamento dei parcheggi. È inoltre particolarmente sensibile alle condizioni di estrema luminosità, rendendolo inadatto per applicazioni esposte ad una forte luce solare.
La volontà di utilizzare due diverse tipologie di sensori nel prototipo deriva anche dalla volontà di effettuare un confronto tra i due, così da delineare i rispettivi vantaggi e svantaggi.
Il fotoresistore, pur non essendo un sensore vero e proprio ma una resistenza, costituisce l'ultimo componente di questa categoria. È un dispositivo elettronico che modifica la propria resistenza in base all'intensità luminosa a cui è esposto. Quando la luce colpisce il materiale fotosensibile all'interno del dispositivo, gli elettroni vengono eccitati, aumentando la conduttività del materiale e, di conseguenza, diminuendo la resistenza del fotoresistore. Questa variazione di resistenza viene sfruttata per controllare altri elementi del circuito elettronico, come, ad esempio, l'attivazione o la disattivazione di una luce crepuscolare in risposta ai cambiamenti di luminosità ambientale.
Poiché i pin di Arduino non sono in grado di misurare direttamente una variazione di resistenza ma solo di tensione, il collegamento del fotoresistore avviene tramite un circuito noto come "partitore di tensione". Questo circuito è composto da due resistenze collegate in serie a una fonte di tensione. La tensione si distribuisce sulle diverse resistenze in base ai loro valori, secondo le regole delle resistenze in serie e alla legge delle maglie di Kirchhoff. Nel nostro caso, le due resistenze sono il fotoresistore (variabile) e un resistore da 10 kΩ (un valore standard per garantire una buona sensibilità e un basso consumo di corrente), mentre la fonte di tensione è il pin 5V del microcontrollore. Successivamente, un GPIO pin analogico di Arduino (in questo caso A5), è connesso in mezzo alle due resistenze. Trattandosi di un pin analogico, esso è in grado di leggere una gamma di valori anziché solo un valore digitale. Il valore di tensione misurato può essere interpretato attraverso il codice per determinare il livello di luminosità ed effettuare le azioni necessarie.
Gli attuatori si occupano di convertire i segnali del microcontrollore in azioni fisiche.
Il circuito utilizza 9 LED, diodi a semiconduttore che emettono luce quando attraversati da corrente elettrica. Ciascun LED è controllato tramite un pin digitale GPIO di Arduino, con l'eccezione di 3 LED collegati a pin analogici, che possono funzionare anche come digitali (tuttavia tale flessibilità non vale al contrario, in quanto pin digitali non possono fungere da analogici). Nello specifico, ogni LED è dotato di un anodo (terminale positivo) connesso al pin della scheda e di un catodo (terminale negativo) collegato al GND del microcontrollore.
Ogni LED possiede 2 importanti proprietà:
- Caduta di tensione diretta (Vf): tensione necessaria affinché possa fluire corrente attraverso il LED.
- Corrente diretta massima (If): valore massimo di corrente che può attraversare il LED senza danneggiarlo. Nei LED utilizzati, equivale a 20 mA.
Inoltre, ogni pin GPIO dell'Arduino UNO R4 WiFi ha un limite massimo di corrente che può essere assorbito da un dispositivo collegato senza danneggiare il pin, pari a 8 mA. Quindi, per garantire che la corrente che scorre attraverso il LED sia inferiore a 8 mA, è necessario aggiungere un resistore in serie a ciascun LED. Per maggior sicurezza, si opta per una corrente ancora più ridotta, come 7 mA.
Il valore idoneo della resistenza è stabilito dalla prima legge di Ohm:
"La differenza di potenziale ai capi di un resistore è uguale al prodotto della resistenza per l'intensità della corrente che lo attraversa."
Definendo quindi Vs come tensione di alimentazione, pari a 5V (standard erogato dai GPIO pin di Arduino), possiamo determinare il valore dei resistori in base alla seguente formula:
Possiamo dunque determinare il valore della resistenza per ogni colore di LED utilizzato.
Colore del LED | Vf | If | Resistenza |
---|---|---|---|
Blu |
2,7 V | 7 mA | |
Bianco |
2,7 V | 7 mA | |
Verde |
2,5 V | 7 mA | |
Rosso |
1,9 V | 7 mA |
Dopo aver eseguito i calcoli e considerando la disponibilità del set di resistori, l'opzione migliore è utilizzare un resistore da 470 Ω per ciascun LED, in modo da assicurare che la corrente diretta attraverso ciascuno sia ben al di sotto del limite massimo di 8 mA.
Curiosità 💡: il valore di resistenza di un resistore è determinato dalle bande colorate visibili sulla sua superficie, rendendoli facilmente identificabili attraverso opportune tabelle o tool online.
Il servomotore è un dispositivo di ridotta potenza utilizzato per convertire un segnale di controllo in un movimento preciso e controllato. Questo processo è reso possibile grazie alla tecnica di modulazione chiamata PWM (Pulse Width Modulation). Un segnale PWM consiste in una serie di impulsi elettrici con una frequenza costante, ma con durata variabile. Questi impulsi assumono la forma di onde quadre, dove il valore può essere solo HIGH (5V) o LOW (0V). Quando Arduino controlla un servomotore, genera segnali PWM con diverse larghezze (che ne rappresentano la durata). Ad esempio, per spostare il servomotore in una posizione desiderata, Arduino invia impulsi PWM con una larghezza proporzionale a quella della posizione. Questa relazione tra larghezza dell'impulso e posizione del servomotore è stabilita nel datasheet del servomotore stesso e viene sfruttata da Arduino per controllarlo in modo preciso e deterministico.
Il servo motore possiede 3 connettori: rosso per l'alimentazione, marrone per la terra, arancione per il controllo. I primi due sono connessi al generatore da 6V, mentre il cavo di controllo è collegato ad un GPIO PWM digitale, nello specifico al pin D10.
Le funzionalità del progetto sono controllate e gestite attraverso il codice, il quale è redatto nell'editor cloud di Arduino e successivamente caricato sul microcontrollore. Quest'ultimo conserva una copia del codice e lo esegue immediatamente all'alimentazione.
Il linguaggio di programmazione utilizzato nel progetto è Arduino. È un linguaggio di alto livello basato su C/C++ che include librerie e funzioni specializzate per interagire con l'hardware specifico di Arduino, come sensori, attuatori e moduli di comunicazione.
Di seguito viene descritto in linea generale il funzionamento dei vari file di codice del progetto (definiti "sketches" nell'ecosistema Arduino). Per ulteriori approfondimenti, è possibile consultare direttamente i file, commentati nei minimi dettagli.
Lo sketch sfrutta diversi sensori e componenti per monitorare l'occupazione dei posti auto, regolare ingresso e uscita nel parcheggio a pagamento, adattare l'illuminazione in base ai livelli di luce ambientale, gestire la connettività al cloud e visualizzare lo stato del sistema su una matrice LED incorporata.
Servo.h
: controllo del servomotore.EEPROM.h
: memorizzazione permanente dei dati.NewPing.h
: uso dei sensori ad ultrasuoni.thingProperties.h
,ParkingSensor.h
,LedMatrixConfig.h
,Arduino_LED_Matrix.h
: gestione delle proprietà del dispositivo IoT, dei sensori di parcheggio e della matrice LED.
È eseguita una volta all'avvio del sistema e comprende:
- Inizializzazione della matrice LED e visualizzazione dello stato di setup.
- Connessione al cloud Arduino IoT.
- Configurazione delle modalità dei pin per i vari componenti.
- Inizializzazione delle luci automatiche e del servomotore.
- Lettura dei dati memorizzati nella memoria EEPROM.
- Impostazione delle luci dei LED allo stato iniziale.
È eseguita in modo continuo e include:
- Gestione della connettività con il cloud Arduino IoT.
- Aggiornamento della percentuale di occupazione del parcheggio.
- Gestione automatica delle luci in base alla luce ambientale.
- Regolazione dell'accesso al parcheggio a pagamento.
- Rilevazione dell'occupazione dei posti auto utilizzando i sensori di parcheggio.
Verifica la connessione al cloud Arduino IoT e tenta di riconnettersi in caso di disconnessione, con un numero limitato di tentativi per evitare blocchi indefiniti del codice.
Controlla l'accesso al parcheggio a pagamento utilizzando i sensori di ingresso e uscita e un servomotore per il movimento della sbarra. Gestisce le luci del sefamoro d'accesso e aggiorna il conteggio dei veicoli parcheggiati in tempo reale.
Imposta l'angolo del servomotore per aprire o chiudere la sbarra, con un breve ritardo per consentire il corretto posizionamento del motore, per poi disconnetterlo al fine di evitare vibrazioni e ridurre il consumo energetico.
Calibra il livello di soglia di oscurità basato sulla lettura iniziale del sensore di luce (LDR).
Monitora il livello di luce utilizzando il sensore LDR e attiva o disattiva le luci crepuscolari in base al superamento della soglia di oscurità per un determinato periodo di tempo.
Aggiorna il conteggio dei veicoli parcheggiati (aggiungendone o sottraendone uno) e memorizza il nuovo valore nella memoria interna EEPROM.
Calcola la percentuale di occupazione del parcheggio sommando i conteggi dei posti occupati e aggiornando la variabile corrispondente.
Lo sketch implementa una classe ParkingSensor
per l'utilizzo dei sensori ad ultrasuoni, destinati al rilevamento dei veicoli nei parcheggi. Essi consentono di misurare la distanza di oggetti e determinare se un posto è occupato o libero. Il codice gestisce anche degli indicatori LED che segnalano lo stato dei parcheggi e aggiorna le corrispondenti variabili nel cloud.
Time.h
: funzionalità di gestione del tempo.NewPing.h
: uso dei sensori ad ultrasuoni.
Rileva la presenza di un veicolo nel posto auto e aggiorna l'indicatore LED di conseguenza. Nello specifico:
- Misura la durata dell'ultrasuono e calcola la distanza dall'oggetto rilevato.
- Se un veicolo è rilevato, registra il tempo di rilevamento e controlla il tempo massimo di occupazione.
- Se il parcheggio è occupato per un certo periodo, accende il LED e aggiorna la variabile cloud.
- Nel momento in cui non è più rilevato alcun veicolo, registra il tempo di assenza e spegne il LED dopo un certo periodo.
Assegna lo stato di un parcheggio (occupato o libero) alle rispettive variabili nel cloud.
Verifica se il tempo massimo di occupazione è superato per i parcheggi a zona disco. Nello specifico:
- Verifica se l'ID inizia con "T", indicando un posto a sosta breve.
- Ottiene il timestamp corrente dal cloud.
- Se non è domenica e l'ora è tra le 8:00 e le 20:00, verifica il tempo di occupazione del parcheggio: in caso superi il tempo massimo consentito, attiva il lampeggio del rispettivo LED.
Lo sketch connette il dispositivo alla rete Wi-Fi e utilizza il cloud di Arduino IoT per monitorare e aggiornare lo stato dei parcheggi. Include variabili booleane, per indicare la disponibilità dei posti, e variabili intere, per contare i veicoli parcheggiati e calcolare la percentuale di occupazione. Le proprietà sono definite e registrate nel cloud di Arduino IoT per consentire il monitoraggio e gli aggiornamenti in tempo reale.
Lo sketch definisce quattro matrici bidimensionali che rappresentano diversi stati visivi per un display grafico. Queste matrici sono progettate per essere visualizzate sulla matrice LED integrata nell'Arduino UNO R4 WiFi. Ognuna rappresenta uno stato specifico:
- "running_matrix": rappresenta la forma di un cuore, che indica uno stato normale e funzionante.
- "setup_matrix": rappresenta la forma di una clessidra, che indica uno stato iniziale di configurazione.
- "attempting_reconnection_matrix": rappresenta il simbolo del WiFi, che indica un tentativo di riconnessione.
- "no_connection_matrix": rappresenta una faccia morta, che indica l'incapacità di stabilire una connessione di rete.
Ogni matrice è definita come una serie di righe e colonne, dove ogni elemento rappresenta lo stato di un singolo LED sulla matrice. I valori binari sono utilizzati per indicare se un LED è acceso (1) o spento (0).
Il progetto si presta inoltre ad alcuni possibili collegamenti interdisciplinari tra le materie scolastiche.
- Informatica: Nascita ed evoluzione delle reti digitali, in particolare il fenomeno della "trasformazione digitale";
- Fisica: circuiti in corrente continua, prima legge di Ohm, onde infrarosse;
- Letteratura italiana: Giovanni Verga e il mito del progresso, interpretato sia come "fiumana" inarrestabile e grandiosa che nei suoi aspetti più negativi (si veda Pro e contro dell'IoT).
- Storia dell'arte: Art Nouveau, l'uso di materiali assemblati a freddo e quindi smontabili (esempio: il "Palazzo di Cristallo" di Joseph Paxton) è analogo al concetto del circuito solderless utilizzato, ossia un tipo di circuito semipermanente molto pratico per progetti di questo genere.
Il progetto ha avuto origine grazie all'esperienza di PCTO "Programma in rete" 2023, organizzata dalla Cisco Networking Academy, durante il quale ho avuto la fortuna di conoscere per la prima volta il mondo dell'Internet of Things. Il corso mi ha permesso di acquisire molte competenze che, insieme alle mie conoscenze pregresse di programmazione, mi hanno consentito di provare a cimentarmi in questa attività.
Dopo mesi passati alla ricerca di un'idea da trasformare in un prototipo, il 3 marzo 2024 ho pensato di coniugare questa mia ambizione con una delle difficoltà che mi "attanagliava" di più in quel periodo: il parcheggio, nel tentativo di ottenere la tanto agoniata patente di guida. Nonostante le mie difficoltà fossero principalmente legate a "lacune tecniche", per empatia verso altri guidatori (meno "imbranati") ho pensato che quanto ho imparato potesse perlomeno aiutarli nel trovare un parcheggio...
Dopo quasi un mese di studio, documentazione e calcoli per la realizzazione del circuito, ho finalmente potuto iniziare a "divertirmi" con la corrente elettrica. Al di là di qualche sensore fuso e numerosi problemi da risolvere (sia hardware che software), col tempo sono riuscito a completare il circuito sperimentale. Pensando erroneamente di aver superato l'ostacolo più difficile, nei mesi seguenti mi sono trovato a dover affrontare la costruzione materiale del progetto, che si è rivelata più impegnativa del previsto, ma anche parecchio gratificante.
Nel complesso, questa esperienza non solo mi ha permesso di migliorare le mie competenze in un ambito che mi appassiona, ma mi ha anche insegnato l'importanza di non arrendersi di fronte alle difficoltà (e ce ne sono state molte...), di ripudiare l'eccessivo perfezionismo e di affrontare i problemi più ostici provando ad osservarli da una prospettiva diversa. Oltre alla soddisfazione del risultato finale, l'aspetto stimolante dell'esperienza è stato il processo nella sua interezza, di cui idea, studio, progettazione ed effettiva realizzazione.