clessidra

Realizziamo insieme una Clessidra a Matrice LED con Arduino Nano e un accelerometro

Iniziamo il 2022 proponendovi un progetto con Arduino Nano, realizzando una clessidra con due Matrici LED, un MPU6050 e una batteria da 9V. Assembleremo tutto all’interno di una scocca realizzata in stampa 3D, non realizzata da noi ma che “ruberemo” da un progetto della Adafruit e adatteremo ad Arduino Nano.

Progetto

Era molto tempo che lo progettavamo e finalmente possiamo portarvi questa clessidra. Non nascondiamo che abbiamo preso gran parte del codice un po’ qua e là, mettendo tutto assieme e cercando di far funzionare il tutto. Per poter far funzionare il tutto sarà necessario armarsi di pazienza e un buon saldatore, visto che l’uso dei jumper è sconsigliato visto la scarsità di spazio. Fisseremo ogni parte con un po’ di colla a caldo e qualche puntina di super-colla. Intanto, potete scaricare stampare i file STL per questo progetto da questo LINK.

clessidra

Componenti

A controllare la clessidra sarà Arduino Nano, a cui non salderemo i pin header ma salderemo direttamente i cavi che poi lo collegheranno al sensore e alle matrici. Esse sono le classiche matrici 8×8 a LED con MAX7219. Il sensore che utilizzeremo è il MPU6050, un accelerometro a tre assi utile per quando ruoteremo la clessidra, mentre ad alimentare il tutto useremo una batteria a 9V con il relativo cavo. Per accendere e spegnere la clessidra ci affidiamo al classico switch.

  • clessidra

Lista acquisti su Amazon:

Lista acquisti su Aliexpress:

Lista acquisti su Banggood:



Collegamenti

Per la nostra clessidra collegheremo il pin Vin di Arduino Nano al polo positivo della batteria da 9V, mentre il GND al polo negativo, ricordandovi che tra il pin Vin e il positivo della batteria va posizionato lo switch per chiudere il circuito. Passando ai collegamenti con il sensore MPU6050, esso sfrutta l’interfaccia I2C, quindi colleghiamo i pin A4 e A5 di Arduino Nano ai pin SDA e SCL del sensore. Possiamo alimentarlo sia a 3,3V che a 5V, poiché il sensore lavora con entrambe le tensioni. I collegamenti alle matrici richiedono che il pin DIN della matrice sia collegato al pin digitale 5 di Arduino Nano, mentre il pin CS al pin digitale 6 e il pin CLK al pin digitale 4. Le matrici vanno, infine, collegate tra di loro come riportato in immagine. Ogni matrice ha dei pin in ingresso (INPUT) e dei pin di uscita (OUTPUT).

clessidra



Codice

Il codice della clessidra richiede alcuni preparativi; vediamo quali. Partiamo scaricando il tutto dal file compresso a questo LINK. All’interno troverete il file dello sketch, la libreria del sensore MPU6050, da caricare nelle librerie della IDE di Arduino e due cartelle: Delay e LedControl. Queste due cartelle non vanno spostate, ma anzi lasciate all’interno della stessa cartella in cui è contenuto lo sketch. Iniziamo così l’analisi del codice, inserendo le tre librerie citate, definendo le matrici e creando l’oggetto per gestire il sensore MPU6050. Definiamo pure i pin per collegare le matrici ad Arduino Nano, la rotazione delle stesse e i diversi tempi che andremo ad adoperare. Concludiamo con la creazioni di alcune variabili e l’oggetto lc per la gestione delle matrici.


#include <MPU6050_tockn.h>
#include "LedControl/src/LedControl.cpp"
#include "Delay/Delay.cpp"

#define MATRIX_A 1
#define MATRIX_B 0

MPU6050 mpu6050(Wire);

#define ACC_THRESHOLD_LOW -25
#define ACC_THRESHOLD_HIGH 25

#define PIN_DATAIN 5
#define PIN_CLK 4
#define PIN_LOAD 6#define ROTATION_OFFSET 90

// tempo in millisecondi
#define DEBOUNCE_THRESHOLD 500

#define DELAY_FRAME 100

#define DEBUG_OUTPUT 1

#define MODE_HOURGLASS 0
#define MODE_SETMINUTES 1
#define MODE_SETHOURS 2

byte delayHours = 0;
byte delayMinutes = 1;
int mode = MODE_HOURGLASS;
int gravity;
LedControl lc = LedControl(PIN_DATAIN, PIN_CLK, PIN_LOAD, 2);
NonBlockDelay d;
int resetCounter = 0;



Nel VOID SETUP inizializziamo il sensore MPU6050 e le matrici, avviamo il monitor seriale e richiamiamo la funzione resetTime().


mpu6050.calcGyroOffsets(true);
Serial.begin(9600);
mpu6050.begin();

for (byte i=0; i&lt;2; i++) {
lc.shutdown(i,false);
lc.setIntensity(i,0);
}

resetTime();

Tale funzione ci serve per pulire le matrici e far accendere i led delle matrici, richiamando la funzione getDelayDrop().


void resetTime() {
for (byte i=0; i<2; i++) {
lc.clearDisplay(i);
}
fill(getTopMatrix(), 60);
d.Delay(getDelayDrop() * 1000);
}

Questa funzione serve per indicare il tempo di accensione tra un led e l’altro, ricordandoci che dobbiamo adoperare 60 led.


long getDelayDrop() {
return delayMinutes + delayHours * 60;
}

Nel VOID LOOP rileviamo gli assi X e Y del sensore MPU6050, impostiamo la rotazione della clessidra richiamando la funzione getGravity(), poi la funzione updateMatrix() per far cadere le particella in modo causale a destra o a sinistra e, infine, la funzione dropParticle() per il movimenti di caduta della particelle.


mpu6050.update();
Serial.println("angleX : ");
Serial.println(mpu6050.getAngleX());
Serial.println("\tangleY : ");
Serial.println(mpu6050.getAngleY());

delay(DELAY_FRAME);

gravity = getGravity();
lc.setRotation((ROTATION_OFFSET + gravity) % 360);

if (mode == MODE_SETMINUTES) {
renderSetMinutes(); return;
} else if (mode == MODE_SETHOURS) {
renderSetHours(); return;
}

bool moved = updateMatrix();
bool dropped = dropParticle();



Una volta caricato il codice nel nostro Arduino Nano non resta che montare il tutto nella scocca, prestando attenzione a come fissare il sensore MPU6050, al giusto verso delle matrice e facendo attenzione a far passare tutti i cavi. Provate ovviamente prima il codice effettuando dei collegamenti temporanei coi jumper e, solamente dopo aver appurato che tutto funziona, riponente ogni componente nella clessidra stando attendi alle saldature. Noi abbiamo stampato il tutto in PLA nera e poi verniciata in aerografo, ma voi sentitevi liberi di stamparla nel colore che preferite.

clessidra