# Arduino Macro Pad

Arduino Macro Pad è un dispositivo che ha in ingresso una tastiera formata da 12 pulsanti, dove – a ogni tasto – viene associato comando il quale viene inviato al computer tramite comunicazione seriale.
Il punto fondamentale quest'interfaccia è che i comandi (da taglia/copia/incolla in su) possono interagire con qualsiasi applicazione.
Il progetto si ispira a un altro prodotto già in commercio, ma dai costi notevolmente più elevati (oltre 150 €).

## Premesse

Nel considerare la realizzazione di un simile progetto bisogna considerare diversi fattori:
* il fatto che Arduino debba comunicare con il dispositivo al quale è collegato, genera un vincolo riguarda alla scelta della scheda da utilizzare tra Arduino Micro; Pro Micro o Arduino Leonardo. Volendo realizzare qualcosa che sia il più facilmente trasportabile possibile, la scelta ricade sulla scheda Arduino Pro Micro;
* dopo la scelta della scheda è bene tenere a mente la disponibilità dei pin da poter utilizzare per il progetto, di conseguenza stabilire il principio di funzionamento del dispositivo;
* se si desidera realizzare un prodotto finale ben fatto, occorre trovare una soluzione: in questo caso, tramite l'utilizzo di un CAD di modellazione 3D, modelleremo i pezzi necessari per il progetto, argomento che verrà approfondito in un paragrafo dedicato

## Principio di funzionamento

In primo luogo per aiutare l'utente a ricordare facilmente i vari comandi Macro utilizzeremo un display OLED di risoluzione 64 x 128, che risulta ideale in quanto non eccessivamente ingombrante e abbastanza visibile e leggibile. tramite 12 pulsanti collegati in una matrice, utilizziamo 7 pin digitali della scheda Arduino e questo ci dà la possibilità di implementare lo scorrimento tra diversi profili tramite l'utilizzo di un encoder rotativo.

## Modelli 3D

Per poter realizzare in maniera esteticamente piu accattivante questo progetto, sono stati realizzati attraverso l'utilizzo di un software di progettazione per modelli 3D (il CAD in questione è FreeCAD).
I file sono scaricabili in modo da poterli realizzare tramite l'utilizzo di una stampante 3D.
Da notare che spesso nel processo di stampa 3D potrebbero presentarsi degli errori di stampa che possono essere dovuti all'ambiente nel quale si stampa oppure anche ad impostazioni del programma di slicer (programma esterno al CAD che 'traduce il file STL in istruzioni per la stampante 3D, memorizzate in un file .gcode)

## Progettazione della PCB

Dopo aver realizzato un prototipo del progetto in maniera 'rudimentale', ho deciso di voler rendere il tutto riproducibile su una PCB (Printed Circuit Board). La realizzazione della PCB è stata fatta tramite il programma Fritzing, in seguito ordinate su internet da JLC PCB (azienda situata in cina che realizza PCB e altro su ordinazione). per effettuare l'ordine è sufficiente caricare il file gerber della PCB compresso in un file .zip (scaricabile su questo link di Google Drive)

## Codice
### Programma principale

Come prima cosa includiamo le librerie necessarie per il funzionamento dello sketch
Dopodiché proseguiamo con la scrittura del blocco setup:
Nel blocco loop va inserito il seguente codice che rappresenta l'intero funzionamento del progetto. Anche se apparentemente può sembrare estremamente complicato, in realtà alla base di tutto c'è la semplice struttura di codice della funzione switch case. In ordine di scrittura i 3 blocchi switch case si occupano di:
* Avviare l'esecuzione del profilo selezionato / accedere al menu dei profili;
* Eseguire il profilo selezionato e le rispettive macro;
* Mostrare sul display OLED informazioni per le macro del profilo selezionato
All'esterno del blocco del loop vanno definite alcune funzioni particolari che si occupano di definire le dodici macro in entrambi i profili. Per semplificare il codice, ad esempio, per la Macro 1 viene definita una sola funzione con all'interno un blocco switch case, con numero di casi pari al numero dei profili, contenente le istruzioni per la stessa macro nei vari profili.

### Definizione delle variabili globali

Nel file Define.ino sono riportate tutte le variabili globali utilizzate dal display, dalla tastiera, dall'encoder, oltre ad alcune variabili di sistema richiamate nel programma principale.