Skip to content

Latest commit

 

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

Tastiera Analogica Arduino (Dual-Board I2C)

Sistema di input a 10 tasti basato su partitore resistivo, logica multi-tap stile T9, anteprima live su LCD 16×2 e comunicazione I2C tra due schede Arduino UNO.

Anteprima Progetto Tastiera Arduino


Panoramica del Sistema

Il progetto implementa un'interfaccia di inserimento testo completa distribuita su due schede Arduino interconnesse via bus I2C:

  • Arduino 1 (Master — Tastiera & Feedback LED):

    • Legge 10 pulsanti fisici collegati a un singolo pin analogico (A0) tramite una rete a partitore resistivo.
    • Riconosce la pressione, gestisce il debounce e la composizione dei caratteri in stile multi-tap T9 (con timeout di 1 secondo).
    • Fornisce feedback visivo istantaneo tramite 3 LED di stato (Verde = lettere, Blu = numeri/comandi, Rosso = cancellazione).
    • Invia comandi e caratteri in anteprima o definitivi all'Arduino Slave tramite protocollo testuale su bus I2C (0x12).
  • Arduino 2 (Slave — Display LCD 16×2 & Feedback Sonoro):

    • Riceve e decodifica i pacchetti I2C.
    • Gestisce un display LCD 16×2 con buffer a scorrimento (auto-scroll) e indicatore della modalità attiva in basso a destra.
    • Mostra l'anteprima live del carattere o comando prima della conferma definitiva.
    • Genera feedback sonoro differenziato per ciascun tipo di azione tramite un buzzer passivo.

Le Due Versioni: Guida e Confronto

All'interno della cartella code/ sono disponibili due implementazioni complete del progetto, concepite per esigenze differenti:

code/
├── v1_async/           # Versione ad alte prestazioni (FSM non bloccante)
│   ├── arduino_1.ino   # Master: FSM reattiva, millis(), struct Pending, LED asincroni
│   └── arduino_2.ino   # Slave: Buffer LCD dinamico e buzzer a frequenze dedicate
└── v2_didattica/       # Versione didattica (lineare e commentata)
    ├── arduino_1.ino   # Master: logica procedurale con delay(), commenti passo-passo
    └── arduino_2.ino   # Slave: gestione lineare semplificata dello schermo e toni

Tabella Comparativa

Parametro Versione 1 (v1_async) Versione 2 (v2_didattica)
Paradigma Macchina a Stati Finiti (FSM) reattiva Procedurale / Sequenziale
Gestione del Tempo Completamente non bloccante (millis()) Bloccante con delay() mirati
Debounce Digitale continuo non bloccante (DEBOUNCE_MS = 60ms) Ciclo di lettura con debounce a soglia temporale
Gestione Input struct Pending con enumerazione PendingKind Variabili globali semplici (taps, curKey, mode)
Temporizzazione LED Impulsi asincroni gestiti in background (pulseLed(), updateLedPulse()) Lampeggio sequenziale (flash() con delay(120))
Feedback Sonoro Frequenze audio differenziate (Lettere: 1600 Hz, Numeri: 1100 Hz, Speciali: 750 Hz, Delete: 320 Hz) Tono unificato parametrico (beep(freq, dur))
Leggibilità del Codice Strutturato per progetti avanzati Estremamente commentato, ideale per studio e didattica
Quando usarla? Se devi estendere il progetto con altri sensori, task paralleli o cerchi massima reattività Se stai imparando Arduino, per presentazioni scolastiche o laboratori

Schema di Funzionamento

[ Pressione Tasto ]
       │
       ▼
Lettura ADC A0 (media su 8 campioni)
       │
       ▼
Decodifica Tasto (confronto ±12 ADC)
       │
       ▼
Logica Multi-Tap / Timeout / Modalità
       │
       ├─────────────────────────────────┐
       ▼                                 ▼
LED Feedback (Master)             Bus I2C (Slave 0x12)
(Verde / Blu / Rosso)             (PREV|..., OUT|..., MODE|...)
                                         │
                                         ▼
                                  Aggiornamento LCD 16x2
                                  + Tono Buzzer

Protocollo di Comunicazione I2C

La comunicazione tra Master e Slave avviene inviando stringhe ASCII terminate dal carattere newline \n all'indirizzo 0x12:

Messaggio Descrizione
MODE|abc / MODE|123 / MODE|+*- Imposta la modalità attiva sul display
CAPS|1 / CAPS|0 Attiva o disattiva il flag maiuscola sul prossimo carattere
PREV|CHAR|<c> Mostra il carattere <c> in anteprima prima del commit
PREV|TEXT|<txt> Mostra un'etichetta in anteprima (es. SPC, MAI, DEL)
PREV|NONE Rimuove l'anteprima corrente
OUT|CHAR|<c> Conferma e scrive definitivamente il carattere <c> nel buffer LCD
OUT|CMD|ENTER Esegue il comando di a capo con eventuale scorrimento riga
OUT|CMD|BACK Cancella l'ultimo carattere inserito (Backspace)
OUT|CMD|CAPS Segnala il cambio di stato per le maiuscole

Mappatura dei Tasti

Il sistema supporta tre modalità di digitazione commutabili ciclicamente:

1. Modalità abc (Lettere)

  • Tasti 1–9: Digitazione multi-tap stile tastierino telefonico (T9):
    • 1: a, b, c
    • 2: d, e, f
    • 3: g, h, i
    • 4: j, k, l
    • 5: m, n, o
    • 6: p, q, r
    • 7: s, t, u
    • 8: v, w, x
    • 9: y, z
  • Tasto 10: Passa alla modalità 123.

2. Modalità 123 (Numeri)

  • Tasti 1–9: Inserimento diretto delle cifre 1 .. 9.
  • Tasto 10 (singolo tap): Inserisce la cifra 0.
  • Tasto 10 (doppio tap rapido): Passa alla modalità +*-.

3. Modalità +*- (Caratteri Speciali e Comandi)

  • Tasto 1: Spazio (SPC)
  • Tasto 2: Punto (.)
  • Tasto 3: Virgola (,)
  • Tasto 4: Invio / A capo (ENTER)
  • Tasto 5: Maiuscola prossimo carattere (CAPS)
  • Tasto 6: Backspace / Cancella (BACK)
  • Tasto 7: Punto interrogativo (?)
  • Tasto 8: Punto esclamativo (!)
  • Tasto 9: Trattino (-)
  • Tasto 10: Torna alla modalità abc.

Hardware e Collegamenti

Arduino 1 — Master (Tastiera & LED)

Componente Pin Arduino Uno Note
Partitore resistivo 10 tasti A0 Lettura analogica
LED Rosso Pin 4 Feedback cancellazione
LED Blu Pin 5 Feedback numeri / modalità
LED Verde Pin 6 Feedback lettere
I2C SDA Pin A4 Linea dati I2C
I2C SCL Pin A5 Linea clock I2C

Arduino 2 — Slave (Display & Buzzer)

Componente Pin Arduino Uno Note
LCD RS Pin 7 Controllo LCD
LCD EN Pin 6 Abilitazione LCD
LCD D4 – D7 Pin 5, 4, 3, 2 Bus dati parallelo a 4 bit
Buzzer Passivo Pin 8 Segnale acustico PWM/tono
I2C SDA Pin A4 Connessione verso Master
I2C SCL Pin A5 Connessione verso Master

Important

Collega insieme i pin GND delle due schede per garantire il riferimento di massa comune sul bus I2C. Sono consigliate due resistenze di pull-up da 4.7 kΩ su SDA e SCL.


Valori ADC e Calibrazione

I valori attesi per il partitore resistivo a 10 tasti sono:

const int expectedValues[10] = {
  990, 985, 969, 958, 945, 930, 913, 890, 867, 839
};

La tolleranza configurata è di ±12 unità ADC. Se utilizzi resistenze con tolleranze differenti, puoi leggere i valori effettivi tramite analogRead(A0) visualizzandoli sul Monitor Seriale e aggiornare l'array nei rispettivi file arduino_1.ino.


Istruzioni di Installazione e Caricamento

  1. Apri l'Arduino IDE.
  2. Scegli la versione desiderata (code/v1_async/ o code/v2_didattica/).
  3. Carica prima arduino_2.ino sulla scheda Slave (Arduino 2), così il listener I2C sarà attivo e pronto all'avvio.
  4. Carica arduino_1.ino sulla scheda Master (Arduino 1).
  5. Verifica i collegamenti I2C (A4 con A4, A5 con A5, GND con GND) e alimenta le schede.

Librerie Richieste

  • Wire.h (inclusa nel core Arduino per il bus I2C)
  • LiquidCrystal.h (inclusa nel core Arduino per display LCD paralleli)

Autore

Progetto realizzato da Andreito08
🔗 GitHub Profile


Licenza

Distribuito sotto licenza MIT. Consulta il file LICENSE per i dettagli.

About

Sistema di input custom basato su partitore resistivo e due Arduino in I2C: il primo gestisce la tastiera e i LED, il secondo il display LCD e il buzzer.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages