Natale

Primo progetto con Seeeduino Xiao per realizzare un albero di Natale a Led con 18 effetti luminosi

Il progetto di oggi è il primo che realizziamo con la dev-board Seeeduino Xiao. La piccola schedina, vista in questo ARTICOLO, si presta perfettamente per piccoli progetti come questo, che è stato realizzato anche alla collaborazione con PCBWay, che potete raggiungere al link https://www.pcbway.com.

Progetto

Anche per questo Natale abbiamo voluto realizzare un piccolo progetto decorativo, molto semplice da riprodurre e realizzare. Come detto pocanzi, il controllo del piccolo albero di Natale è stato affidato al Seeeduino Xiao, con il quale interagiranno 2 chip 74HC959 ai quali collegheremo 16 LED. Il tutto va assemblato su un PCB che abbiamo realizzato grazie alla collaborazione con PCBWay. Potete scaricare il file Gerber a questo LINK.

  • Natale

Lo Xiao si interfaccerà con questi chip per creare diversi effetti luminosi; questa necessità deriva dal numero esiguo di pin a nostra disposizione e dalla possibilità di questi chip di interagire tra di essi ed essere programmati in modo da poter “disporre” di più pin a cui collegare i nostri LED. Per chi non avesse letto l’articolo dedicato, lo Xiao lavora non i 3,3V, ma possiede un PIN da 5V direttamente connesso alla porta USB Type-C, che sfrutteremo per alimentare la scheda, i chip e i singoli LED. Pertanto, per alimentare il nostro progetto avremo bisogno di un alimentatore da 5V esterno al progetto.

  • Natale



Componenti

Inutile ribadire che il Seeeduino Xiao sarà il nostro microcontrollore, mentre è utile ripetere che avremo bisogno di 2 chip 74HC959, composti ciascuno da 8 PIN, noti come Shift Register o Registro a scorrimento; il nome deriva dallo scorrimento dei bit nelle singole celle interconnesse che formano il chip. Per poter montare i chip sul PCB dovremmo anche adoperare gli specifici socket a 8 pin. Questi Shift Register accenderanno 16 LED ( ne abbiamo adoperati 5 rossi, 6 verdi e 5 gialli), che necessitano a loro volta di 16 resistori da 220Ω ciascuno.

Per montare tutte le nostre componenti abbiamo realizzato un PCB a forma di albero di Natale, grazie alla collaborazione con PCBWay. Potete recarvi sul loro sito per caricare il file Gerber [LINK] e scegliere la spedizione più favorevole per voi. Non dimenticate di inserire le dimensioni del PCB (108 x 143 mm) e selezionare quanti pezzi desiderati realizzare (il minimo è 5 unità) e il colore del vostro PCB.

Per alimentare il progetto ci servirà un alimentatore da 5V e un lungo cavo USB Type-C.

Acquista componenti su Amazon:

Acquista componenti su Aliexpress:

Acquista componenti su Banggood:



Collegamenti

I collegamenti da effettuar sono semplici, ma possono nascondere insidie. Il numero di connessioni è abbastanza alto e potremmo quindi incappare in errori. Al fine di facilitare la comprensione dei collegamenti da effettuare, vi mostriamo il pinout del chip 74HC959.

Natale

Iniziamo collegando i due chip 74HC959 tra di loro.: il pin SRCLK del primo va connesso al pin SRCLK del secondo, il pin RCLK del primo va al RCLK del secondo, il pin OE del primo al pin OE de secondo. I pin sinora menzionati vanno connessi a loro volta rispettivamente ai pin dello XIAO numero 2, 3 e 5. Il pin 4 dello Xiao va connesso al pin SER del primo chip 74HC959. Il pin QH’ del primo chip va connesso al pin SER del secondo, mentre i pin Vcc e SRCLR di entrambi i chip vanno collegati ai 5V del Seeeduino Xiao. I led da primo all’ottavo vanno collegati in successione dal pin QA fino al pin QH del primo chip 74HC959, mentre i LED dal nono al sedicesimo vanno connessi in successione dal pin QA fino al pin QH del secondo chip 74HC959. Di seguito lo schema dei collegamenti:

Natale

Vi alleghiamo anche lo scheda dei collegamenti realizzati con Fritzing.

Natale

Codice

Il bello di questo progetto è l’assenza di librerie. Per il nostro albero di Natale a LED basterà scaricare il codice da questo LINK e caricarlo direttamente dalla IDE di Arduino. Iniziamo definendo i pin che andiamo ad adoperare, il numero dei chip e il totale dei pin da gestire, nonché una variabile booleana che utilizzeremo più avanti.


#define CLOCKPIN 2
#define LATCHPIN 3
#define DATAPIN 4
#define ENABLE 5

#define CHIP 2
#define CHIPPINS CHIP * 8

boolean registers[CHIPPINS];

Nel VOID SETUP diamo la direzione ai pin dello Xiao, mentre richiamiamo la funzione clearLed() per ripulire il registro a scorrimento e diamo segnale LOW al pin 5. Il numero 0 tra le parentesi della funzione clearLed indica il suo delay.


pinMode(DATAPIN, OUTPUT);
pinMode(LATCHPIN, OUTPUT);
pinMode(CLOCKPIN, OUTPUT);
pinMode(ENABLE, OUTPUT);

Serial.begin(9600);

clearLed(0);

digitalWrite(ENABLE, LOW);

Prima di procedere, diamo un’occhiata alla funzione clearLed(). La funzione inizia dichiarando una variabile intera che indicherà la sua attesa. Infatti, più avanti, tale funzione verrà richiamata con un numero differente. All’interno di essa troviamo un ciclo for con cui incrementare il valore della variabile i fino a 16, il numero massimo dei led. Viene poi scritto il valore ad ogni singolo led tramite la funzione registersWrite().


void clearLed(int clearSpeed) {

for (int i = 0; i < 16; i++) {

registersWrite(i, LOW);

delay(clearSpeed);

}



Andiamo a questo punto a vedere la funzione registersWrite(). Dichiariamo due variabili intere (index e value) che poi richiameremo all’interno del codice, teniamo in LOW i pin 3 e 5, mentre all’interno di un ciclo for, partendo dal sedicesimo pin a disposizione sui chip 74HC959, ci assicuriamo che il pin del clock sia basso, poi carichiamo i dati sul pin 4 li facciamo scorrere tramite l’attivazione del clock.


void registersWrite(int index, int value) {

digitalWrite(LATCHPIN, LOW);

digitalWrite(ENABLE, LOW);

for (int i = CHIPPINS - 1; i >= 0; i--) {

digitalWrite(CLOCKPIN, LOW);

int val = registers[i];

digitalWrite(DATAPIN, val);

digitalWrite(CLOCKPIN, HIGH);

}

digitalWrite(LATCHPIN, HIGH);

registers[index] = value;

delay(5);

}

Un’ultima funzione è la updateShiftRegister() con cui aggiorniamo il registro a scorrimento. Iniziamo ponendo in LOW il pin del Latch, poi utilizziamo la funzione shiftOut. Lo scopo sarà spostare il singolo bit ogni volta che il clock risulta in HIGH e viene memorizzato sullo shift register. Per impostarne l’ordine utilizziamo MSBFIRST per il bit più significativo.


void updateShiftRegister(unsigned int leds) {

byte lowLED = lowByte(leds);

byte highLED = highByte(leds);

digitalWrite(LATCHPIN, LOW);

shiftOut(DATAPIN, CLOCKPIN, MSBFIRST, highLED);

shiftOut(DATAPIN, CLOCKPIN, MSBFIRST, lowLED);

digitalWrite(LATCHPIN, HIGH);

}

Nel VOID LOOP eseguiamo i singoli effetti che prepariamo, alternati dalla pulizia dello shift register. Questo sarà necessario per eseguire correttamente l’effetto luminoso e ripulire il registro a scorrimento.


void loop() {

effect_1(1);

clearLed(0);

effect_2(2);

clearLed(0);

effect_3(2);

...

clearLed(0);

effect_4(4);

clearLed(0);

}

Per ogni effetto esiste una funzione, che per non rendere questo articolo troppo lungo abbiamo deciso di non analizzare. Ad ogni modo, una volta che avrete scarico lo sketch e lo avrete caricato sul Seeeduino Xiao, testate tutto su breadboard prima di saldarlo su PCB. Il nostro consiglio è di partire saldando le resistenze, poi socket e led ed infine la dev-board. Collegate tutto all’alimentatore e godetevi il vostro albero di Natale con LED.