Arduino: come creare un clone maggiorato.

McMajanino640x320

In questo breve articolo vi illustrerò come creare un clone Arduino basato su ATMega644. Oltre ad essere già di per se più dotato del classico ATMega328 dell'Arduino UNO, l'ho fornito di ingressi ed uscite digitali aggiuntivi grazie all'uso di alcuni shift registers. In più troveremo un display LCD onboard per un più facile debug, gestito anch'esso da shift register, un'interfaccia RS485 un ricevitore ed un LED emettitore ad infrarossi oltre ai classici connettori FTDI e ICSP.

Le origini

Quanti di voi hanno mai usato Arduino? Immagino la gran maggioranza. Quindi saprete che è un'ottima piattaforma per realizzare prototipi in maniera veloce e semplice. Vi è però un rovescio della medaglia. Ogni volta dovete usare una breadboard con una miriade di cavi e cavetti e, cosa non sempre possibile, avere la porta seriale libera per il debug. Quante volte vi è capitato di voler collegare in modo veloce alcuni pulsanti o alcuni relè per comandare dei carichi e magari avete rinviato perché semplicemente non avevate voglia di collegare resistenze, transistor, diodi e quant'altro?

Il progetto

Questo piccolo progetto vuole venire incontro proprio a chi ha l'esigenza di avere una scheda di sviluppo un po' più completa dell'Arduino originale. L'intenzione non è quella di creare una scheda specifica per una certa applicazione, ma lasciare all'utente ampia libertà di personalizzazione.

Cosa offre questo piccolo progetto? Avrei potuto utilizzare il classico ATMega328 che tutti conosciamo e che equipaggia Arduino UNO, ma ho preferito andare oltre per cui ho usato il meno noto 644, lo stesso usato da Sanguino e che è la versione più “grossa” fra quelle con package DIP. Fate attenzione che deve essere il 644A e non il 644, il secondo infatti, più vecchio, non ha la seconda UART per cui pur essendo usabile per il progetto, non vi fornisce la seconda porta seriale. Di seguito le differenze fondamentali con il 328:

Caratteristica

ATMega 644

ATMega328

GPIO

32

20

Analogici

8

6

Memoria Flash

64K

32K

RAM

4K

2K

EPROM

2K

1K

UART

2

1

Ma non è tutto. Ho collegato una catena di shift registers sia per incrementare le uscite che gli ingressi. Per chi non lo sapesse, gli shift register ricevono un segnale inviato per via seriale, bit per bit, e lo trasformano in un'uscita parallela, o viceversa, più ingressi paralleli vengono trasformati in un segnale seriale. In questo modo con soli 3 conduttori si possono leggere / scrivere 8 ingressi o uscite digitali. Inoltre più shift register possono essere collegati uno all'altro in una catena per cui è estremamente semplice aggiungere al progetto ulteriori ingressi o uscite digitali. Unico neo è una leggera perdità di velocità che in certe applicazioni può diventare eccessiva.

L'Hardware

Più nei particolari ho usato due 74HC165 per aggiungere 16 ingressi digitali, e 3 74HC595 per aggiungere 16 uscite digitali ed un display LCD HD44780 compatibile gestito direttamente dal primo degli shift register. E' stata implementata anche l'accensione e spegnimento della retroilluminazione. Le 16 uscite sono a loro volta collegate a degli ULN 2803A in modo da poterci collegare direttamente dei carichi come ad esempio dei relè, senza aggiungere altri componenti, permettendo di sfruttare tensioni fra 5 e 50V. I 16 ingressi sono, invece, già connessi a resistenza di pulldown, per cui è possibile collegarci dei pulsanti in modo diretto senza ulteriori componenti.

Sono stati previsti due connettori per le due UART e sulla prima è stata aggiunta una connessione RS485 che permette di interfacciarsi con altri dispositivi. Le uscite libere dell'ATMega sono state riportate su rispettivi connettori. Si noti che tutta la porta C è riportata su un unico connettore, cosa che permette di gestire dispositivi comandati da 8 pin digitali in maniera estremamente rapida, come ad esempio alcuni display grafici. Sono compresi i connettori FTDI e ICSP per la programmazione. A completare il tutto ho usato due dei pin liberi per collegare un emettitore ed un ricevitore ad infrarossi, in questo modo è facile controllare la scheda con un semplice telecomando o fare in modo che la scheda stessa funga da telecomando per altre apparecchiature. In definitiva le caratteristiche principali di questa scheda sono:

  • 13 GPIO (di cui 8 usabili come ingressi analogici);
  • 16 ingressi digitali;
  • 16 uscite digitali;
  • 2 porte seriali (se non usate possono essere usate come 4 pin digitali);
  • 1 interfaccia rs485;
  • 1 display LCD HD44780 compatibile con possibilità di accendere o spegnere la retro illuminazione;
  • Connettori FTDI e ICSP per la programmazione dell'ATMega;
  • Ingresso ed uscita IR.

 

Il circuito, come vedete dal disegno qui sopra, è composto da alcune macro aree che sono:

  1. Arancio: ATMega644 con relativo quarzo, condensatori, led di accensione e quant'altro serva al suo funzionamento e programmazione;
  2. Violetto: Ingressi aggiuntivi tramite shift register HC165;
  3. Rosso: Uscite aggiuntive tramite shift register HC595 e ULN2803A;
  4. Verde: shift register con display lcd ad esso collegato;
  5. Grigio: interfaccia RS485;
  6. Giallo: ricevitore e trasmettitore infrarossi.

A dirla tutta volevo aggiungere anche l'interfaccia USB, ma i componenti dedicati sono tutti SMD mentre il mio scopo era quello di creare un progetto amatoriale montabile anche su breadboard / mille fori.

Avrei potuto usare un'ATTiny programmata con il software V-USB , ma nulla vieta di aggiungere questo dettaglio anche a posteriori, magari grazie ai connettori UART che sono stati predisposti. Lo scheletro base del nostro clone Arduino non differisce da quello classico, l'unica differenza sta nell'uso dell'ATMega644 al posto del 328 ma per il resto non ci sono differenze se non il fatto che c'è un maggior numero di pin fra cui una UART aggiuntiva e la mappatura dei pin che ovvimamente e diversa. Ci dovranno essere il quarzo con i relativi condensatori e la resistenza sul pin di reset. Il led di alimentazione con la relativa resistenza può essere eliminato se non lo si desidera.

Per quanto riguarda le uscite aggiuntive ho sfruttato le possibilità offerte dalla mia libreria di gestire in contemporanea uscite digitali e display LCD sulla stessa catena si shift register. Faccio notare la presenza del transistor che permette di attivare o spegnere la retroilluminazione. Inoltre si faccia attenzione al fatto che il pin di clock è stato condiviso fra gli hc595 e gli hc165 per risparmiare al massimo l'occupazione di pin digitali. L'interfaccia IR non è nulla di particolare, per l'emissione degli IR è sufficiente un led IR con relativa resistenza purché collegato ad un'uscita PWM, mentre per la ricezione ho usato il classico TSOP2238. L'interfaccia RS485 riprende un articolo del mio blog per cui viene sfruttato un 555 per gestire in maniera temporizzata i pin che abilitano la ricezione / trasmissione del max485, cosa che permette di semplificare il software e liberare un pin digitale. Di base il Max485 viene mantenuto in stato di “ricezione”, non appena decidiamo di inviare dati il 555 intercetta il bit di start e mantiene il Max485 in trasmissione per un tempo che si prolunga di circa mezzo bit rispetto la fine trasmissione. Per maggiori dettagli vi rimando però all'articolo in quanto troppo complesso per essere riassunto in poche righe.

Faccio notare che non ho inserito una sezione di alimentazione, ho infatti previsto un connettore per l'ingresso 5V esterno ed un ingresso 5-50V da usare per alimentare i carichi connessi agli ULN2803A (nella mia esperienza lavoro con un sacco di relè 12V e da qui deriva questa scelta).

Il software

Una volta costruito il circuito non dovete far altro che usare una distribuzione software compatibile Arduino-ATMega644, come ad esempio quella di Sanguino. Vi consiglio poi di scaricare il mio McMajan Libray pack. Sul mio blog trovate dettagliati articoli che spiegano l'utilizzo delle singole librerie ma le caratteristiche principali che vi possono interessare sono:

1) C'è una libreria dedicata all'utilizzo di catene di 74HC595 che oltre a comandare le singole uscite digitali, permette di utilizzare i display LCD HD44780 compatibili. Oltre al display già montato sulla scheda, potete aggiungerne altri aggiungendo ulteriori shift registers ed utilizzando lo stesso schema di connessione che fra le altre è lo stesso usato dalla LiquidCrystal modificata per shiftregister.

2) C'è una versione modificata della IR-Remote, con supporto al protocollo Samsung e parziale supporto a climatizzatori Daikin. Una, anche se non l'unica delle modifiche più importanti, è la possibilità di disabilitare i protocolli che non utilizzate in modo da risparmiare un sacco di risorse.

3) Grazie alla porta C lasciata libera potete usare la libreria SS_TFT per comandare questa shield (display grafico a colori con touch screen) alla massima velocità. Per farlo dovrebbe (non ho un ATMega644 per fare il test) bastare editare il file Ss_TFT.cpp e sostituire PORTD=data; con PORTC=data;.

Non appena mi sarà possibile comprerò l'ATMega644A e renderò la libreria nativamente compatibile con la schede di sviluppo che vi ho proposto quest'oggi

Bene non ho altro da aggiungere. Mi rendo conto che l'articolo descrive superficialmente il circuito senza entrare troppo nei dettagli, ma qui si potrebbe scrivere un libro intero per cui ho preferito soffermarmi sulle peculiarità e rimandare agli articoli già scritti gli eventuali approfondimenti per chi è interessato.

A questo indirizzo trovate lo schema elettrico a piena risoluzione.

Esempio

Ora, vediamo almeno un piccolo esempio giusto per toccare con mano le potenzialità della scheda.

#include <Ss_FastArduino.h>
#include <Ss_hc595.h>
hc595 My595(1,2,0,3); // latch,clock,data,number of 74hc595
unsigned char relays1,relays2;

void setup()
{
 relays=relays2=0;
 My595.DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES ,0); // multiline display
 My595.SetBackLight(0,HIGH,0); // pin 0, set HIGH on first 595 (number 0
 My595.SetCursor(0,0,1,0); // cursor at 0,0, display type 1 on first 595
 My595.DisplayWrite("Setup is OK...",0); // Write string
 delay(1500); // waiting for...
 My595.DisplayClean(0); // clear display
}

void loop()
{
 My595.SetCursor(relay1%13,relay1%2,1,0);
 My595.DisplayChar(32+relay1%96,0);
 Set595Pin(relay1,1);
 Set595Pin(relay2,2);
 relay1++;
 relay2+=3;
 delay(800);
}

Le prime due righe iniziali sono inclusioni alle mie librerie.

hc595 My595(1,2,0,3); crea l'istanza My595 all'oggetto hc595 che è deputato al controllo degli shift registers. Come scritto nei commenti, i parametri sono in serie il latch, clock e serial data. L'ultimo parametro rappresenta il numero di shift register in catena, per cui se ne aggiungete altri sarà sufficiente cambiare quest'ultimo parametro.

Successivamente vengono inizializzate due variabili che ho chiamato relay1 e 2 che terranno in memoria lo stato dei due shift registers, quelli deputati ad uscite digitali, non quello legato al display.

L'istruzione DisplayReset è necessaria per inizializzare il display; la setBackLight attiva la retroilluminazione. I tre parametri di questa istruzione sono l'uscita dello shift register che può essere 0 o 2 (il transistor è collegato sulla zero), HIGH è lo stato alto, di accensione, e 0 è lo shift register collegato al display. Si noti che l'uscita 2 del primo shif register è libera, e potete tranquillamente utilizzarla per i vostri scopi con l'istruzione Lcd_SetFreePin(2,HIGH o LOW,0);. L'istruzione SetCursor determina la posizione del cursore sul display e la DisplayWrite scrive una stringa in quella posizione. Più avanti la DisplayClean svuota il contenuto del display; si noti il parametro con il numero di shift register a cui è collegato. Se avessimo 3 display collegati per cancellarli tutti e tre dovremmo ripetere tre volte l'istruzione cambiando il numero di shift register corrispondente.

Il loop è molto semplice: le prime due righe non fanno altro che scrivere i caratteri ASCII in maniera alternata (riga alta, riga bassa) e le successive impostano le uscite degli shift register in base alle variabili relay1 e relay2. Si noti che le due vengono incrementate in maniera diversa proprio per contenere valori differenti. Sulle uscite degli ULN è discrezionale se utilizzare i relè che possono essere collegati in modo diretto piuttosto che dei led, l'importante è che funzionino da 5 a 15V con un massimo di 500mA (attenzione che con i led la resistenza dovete comunque mettercela). Si noti che l'alimentazione per gli uln è stata messa su un apposito connettore, per cui se avete dei relè a 12V non dovete far altro che collegare l'alimentazione 12V in quel connettore.

Se invece ne avete a disposizione una a 5V potete usare la stessa linea che alimenta Arduino, purché a monte ci sia la possibilità di erogare sufficiente corrente.

La lista della spesa

Per concludere vi lascio la lista del materiale necessario per costruire questo progetto (PCB escluso).

Quantità

Componente

Proprietà

4

Generic female header – 2 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 2; pin spacing 0.1in (2.54mm)

1

555 Timer

package DIP8 [THT]

2

74HC165N – 16 pins

package DIP (Dual Inline) [THT]; hole size 1.0mm,0.508mm; editable pin labels false; chip label 74HC165; variant variant 1; pin spacing 300mil; pins 16

6

Generic female header – 8 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 8; pin spacing 0.1in (2.54mm)

1

Generic female header – 1 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 1; pin spacing 0.1in (2.54mm)

2

Ceramic Capacitor

package 100 mil [THT, multilayer]; capacitance 22pF; voltage 5V

8

Ceramic Capacitor

package 100 mil [THT, multilayer]; capacitance 100nF; voltage 6.3V

2

Ceramic Capacitor

package 100 mil [THT, multilayer]; capacitance 10nF; voltage 50V

1

Ceramic Capacitor

package 100 mil [THT, multilayer]; capacitance 4.7µF; voltage 6.3V

1

Rectifier Diode

package 300 mil [THT]; tipo Rectifier; part number 1N4001

1

Generic female header – 3 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 3; pin spacing 0.1in (2.54mm)

1

Generic female header – 6 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 6; pin spacing 0.1in (2.54mm)

2

ULN2803A

package THT; variant ULN2803A

1

ICSP Header

package THT; hole size 1.0mm,0.508mm; row double; form ♀ (female); pins 6; pin spacing 0.1in (2.54mm); variant variant 1

1

220 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 220Ω; pin spacing 400 mil

1

LCD screen

tipo Character; pins 16

1

Green LED – 3mm

package 3 mm [THT]; leg yes; colore Green (560nm)

1

Infrared LED – 5mm

package 5 mm [THT]; leg yes; colore Infrared (850nm)

1

MAX485

package dil08; variant dil

1

Generic female header – 32 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 32; pin spacing 0.1in (2.54mm)

1

NPN-Transistor

package TO92 [THT]; tipo NPN (EBC)

1

470 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 470Ω; pin spacing 400 mil

17

10k Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 10kΩ; pin spacing 400 mil

1

1k Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 1kΩ; pin spacing 400 mil

1

Trimmer Potentiometer

package THT; size Trimmer – 12mm; track Linear; tipo Trimmer Potentiometer; maximum resistance 10kΩ

2

560 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 560Ω; pin spacing 400 mil

1

120 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 120Ω; pin spacing 400 mil

1

3.9k Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 3.9kΩ; pin spacing 400 mil

1

4.7k Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 4.7kΩ; pin spacing 400 mil

2

100 Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 100Ω; pin spacing 400 mil

1

15k Ω Resistor

package THT; tolerance ±5%; bands 4; resistenza 15kΩ; pin spacing 400 mil

3

Generic female header – 4 pins

package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 4; pin spacing 0.1in (2.54mm)

1

Pushbutton

package [THT]

1

TSOP312.., 314..

package THT; row single; pin spacing 0.1in (2.54mm); pins 3

3

74HC595

package DIP16 [THT]; tipo 74HC595

1

ATMEGA644PA-PU

package pdpi; version Atmega644; tipo Atmel AVR; chip label Atmega644; pins 40; variant pdpi40 THT

1

Screw terminal – 4 pins

package THT; hole size 1.0mm,0.508mm; pins 4; pin spacing 0.137in (3.5mm)

1

Crystal

package THT; frequency 16 Mhz; tipo crystal; pin spacing 5.08mm

Conclusioni

Ho cercato di riassumere in un solo articolo alcune delle cose più richieste nella comunità Arduino e spero di esserci riuscito. Se ad una scheda come questa collegate le uscite degli ULN e gli ingressi degli 165 a delle morsettiere, avete già pronta una bella scheda multi-purpose che permette di connettere relè pulsanti, sensori, e quant'altro con un display LCD on-board ed una rs485 già pronte all'uso, senza poi contare la possibilità di sfruttare gli infrarossi come interfaccia. Non ho avuto ancora l'occasione di disegnare il PCB, ma con un pò di pazienza sarà possibile anche garantire una buona compatibilità con le shield Arduino. Questo, però, lo riserviamo per il futuro.

9 Comments

  1. Piero Boccadoro Piero Boccadoro 5 aprile 2014
  2. Emiliano.Bianco 5 aprile 2014
  3. adrirobot adrirobot 5 aprile 2014
  4. smania2000 smania2000 5 aprile 2014
  5. Antonello Antonello 8 aprile 2014
  6. Emiliano.Bianco 8 aprile 2014
  7. smania2000 smania2000 8 aprile 2014
  8. Giorgio B. Giorgio B. 9 aprile 2014
  9. smania2000 smania2000 10 aprile 2014

Leave a Reply