Tutti gli articoli di Salvatore Neglia

Lux: Arduino incontra la fotografia

11218312213_628ca5bb89_hAbbiamo già visto quanto sia versatile l’Arduino, mettetelo in mano ad un appassionato di fotografia e il risultato è incredibile.

Kevin Kadooka, un fotografo delle Hawaii nonché studente di Ingegneria Meccanica presso l’Università di Portland ha sviluppato Lux, una macchina fotografica open-source.

Le caratteristiche di questo progetto sono veramente interessanti ed ancora più interessante è l’avere a disposizione i codici sorgenti col quale programmare l’Arduino, l’elenco completo di tutti i componenti (incluse le indicazioni su dove acquistarli) e i disegni per costruirsi (o stamparsi con una stampante 3D) le varie parti della macchina fotografica.


Il progetto è veramente ben fatto e le indicazioni sono molto complete. Vengono elencate nel dettaglio persino tutte le viti necessarie e dove reperirle.

Oltre a un paio do problemi tecnici inerenti la fotografia (il tempo massimo di scatto è 1/125 e il mirino ha qualche problemino) vi è un problema di design che rendere un po’ noiosa la ricarica delle batterie. Bisogna infatti smontare la parte posteriore della macchina fotografica per accedere al vano contenente le batterie.

shutter-circuit

luxexplode2

via (MakingPhoto)

EveryCircuit: un simulatore di circuiti per Android

Di programmi per i nostri terminali con Android ne esistono a migliaia, ma la maggior parte sono pressoché inutili. Oggi vogliamo presentarvi un programma veramente interessante:

everycircuit

EveryCircuit. Grazie a questa app potrete disegnare e simulare circuiti elettronici con estrema facilità.

Questa applicazione integra al suo interno sia le leggi più basilari quali la legge di Ohm e le leggi di Kirchhoff , che svariati modelli matematici. Il numero di componenti presenti nella sua libreria è veramente elevato ed in continua espansione.

Vediamo brevemente le principali caratteristiche:

  • Animazioni di forme d’onda di tensione e flussi di corrente
  • Animazioni di condensatore si carica
  • Manopola di controllo analogico regola i parametri del circuito
  • Il routing automatico dei fili
  • Oscilloscopio
  • DC senza soluzione di continuità e di simulazione transitoria
  • Tasto play / pause singola controlla simulazione
  • Salvataggio e caricamento del circuito schematico
  • Motore di simulazione per cellulare costruito da terra-up
  • Scuotere il telefono per oscillatori a rilanciare
  • Interfaccia utente intuitiva
  • Niente pubblicità

I principali componenti presenti sono:

  • Fonti e generatori di segnale
  • Fonti controllate ( VCVS , VCCS )
  • Resistori , condensatori, induttori , trasformatori
  • Potenziometro , lampada
  • Interruttori , SPST , SPDT
  • Diodi , diodi Zener , diodi emettitori di luce ( LED )
  • Transistor MOS ( MOSFET )
  • Transistori bipolari a giunzione (BJT )
  • Amplificatore operazionale ideale ( opamp )
  • Porte logiche digitale , AND, OR , NOT , NAND , NOR , XOR , XNOR

[app]com.everycircuit[/app]

La versione Free presenta alcune limitazioni, ma è comunque priva di pubblicità.

[app]com.everycircuit.free&hl=it[/app]

Come trovare la giusta resistenza da mettere in serie ai LED

In quasi tutte le applicazioni di elettronica ciò che non manca mai sono i diodi LED (per approfondimenti riguardo i LED leggi il seguente articolo: Introduzione ai diodi). Specialmente quando si inizia con i primi progetti i LED la fanno da padrone stante la semplicità che richiede il loro utilizzo.

Precedentemente avevamo fatto un paio di applicazioni con i led usando l’Arduino per pilotarli. In particolare avevamo visto come Accendere un led mediante un pulsante, come effettuare il Blink (lampeggiamento), come  fare il Fade di un LED con un potenziometro e come regolare il Blink con l’ausilio di un potenziometro.

In particolare nelle prime due applicazioni non è stato necessario inserire alcuna resistenza in serie al LED poichè questo era collegato al pin 13 dell’Arduino. Infatti tale pin presenta già integrata una resistenza da 1 kΩ che protegge il LED da eccessive correnti.

Per calcolare la resistenza da mettere in serie ad un LED un primo dato che dobbiamo conoscere è il loro assorbimento di corrente (I):

  • LED a basso consumo: 3 ÷ 10 mA
  • LED normali: 10 ÷ 15 mA
  • LED Flash: 20 ÷ 40 mA
  • LED di potenza: 100 ÷ 20000 mA

Di seguito useremo, nei calcoli di esempio, i LED normali, ma il tutto avrà una validità trasversale a tutti i LED.

Fondamentale è anche la conoscenza della caduta di tensione ai capi del LED (Vled):

  • colore rosso: 1,8 V
  • colore giallo: 1,9 V
  • colore verde: 2,0 V
  • colore arancio: 2,0 V
  • colore blu: 3,0 V
  • colore bianco: 3,0 V

Nota la caduta di tensione ai capi del LED ed il suo assorbimento, l’ultimo dato mancante è la tensione di alimentazione (Val). Ipotizzando che la nostra applicazione preveda l’alimentazione del LED tramite l’Arduino questa risulta essere pari a 5V.

Lo schema dei collegamenti è veramente semplice implicando solo l’inserimento di una resistenza in serie:

blink_schem
Schema circuito resistenza in serie al LED
blink_bb
Schema circuito con Arduino e breadboard

Riepilogando stiamo ipotizzando di usare un led normale di colore rosso collegato all’Arduino.

Per il calcolo della resistenza basta applicare la seguente formula:

[latex]R=(Val-Vled)/I=(5-1,8)/0,015=213,333[/latex]

Con questa formuletta sarete in grado di calcolare il valore della resistenza da mettere in serie al led. Ovviamente non sempre vi verrà fuori un valore intero o di una resistenza esistente in commercio. Dovrete scegliere il valore della resistenza commerciale immediatamente superiore a quello risultante dai calcoli (nel nostro caso 213,333≈220).

Come costruire un driver per i motori DC con l’L298

Indipendentemente da quale applicazione di robotica siate interessati, quasi sicuramente vi ritroverete con la necessità di pilotare dei motori elettrici DC. Se per piccoli carichi, quali mini servomotori o motorini simili a quelli della vibrazione del telefonino, potrebbe essere sufficiente (anche se caldamente sconsigliato vista la natura induttiva del carico) collegarli direttamente al microcontrollore utilizzando l’alimentazione delle sue porte di uscita, per carichi più impegnativi sarà necessario avere una alimentazione esterna dei motori.

Per tale seconda evenienza ci vengono in aiuto degli integrati chiamati driver. Di driver ne esistono una infinità di tipologie, differenti a seconda della potenza erogabile, della tipologia di motori pilotabili (stepper, DC, ecc…) e dal tipo di pilotaggio. Uno dei driver maggiormente usati è l’L298, sia per la sua semplicità costruttiva (necessita di pochi altri componenti) che per la sua potenza erogabile.

Il circuito integrato L298 è un doppio driver per motori DC.

componenti

Il funzionamento di detto circuito è garantito a partire da tensioni di ingresso di 6V fino a tensioni di 30V e consente un pilotaggio di motorini fino aduna corrente di 4A.

Ma adesso veniamo a ciò che tutti voi aspettavate: che componenti mi servono? la risposta la trovate nella seguente “lista della spesa”:

Lista dei componenti

  • 1 x L298 motor driver chip
  • 1 x LM2937 regolatore di tensione
  • 1 x 22μF capacità
  • 1 x 0.1μF capacità
  • 2 x 47k Enable pull-up resistors (Yellow / Violet / Orange / Gold)
  • 2 x 2.2k LED current limit resistors – (Red / Red / Red / Gold)
  • 2 x Red LEDs
  • 2 x Green LEDs
  • 8 x 1N5818 Schottky EMF-protection Diodes
  • 1 – 3-position terminal block
  • 2 – 2-position terminal block
  • 2 – 3-position interface socket strips
schema_l298
Schema circuito driver

Nella configurazione che appresso vi presenteremo sono stati inseriti una serie di componenti opzionali che però rendono l’uso del driver, sia in fase di testing che di lavoro, molto più agevole. In particolare sono stati inseriti dei diodi di protezione (nello schema indicati con numerazione progressiva da D5 a D12) e 4 led (due per canale, quelli verdi D1 eD4 e quelli rossi D2 e D3) che ci segnaleranno il verso di rotazione dei motorini.

Sebbene l’inserimento dei led possa sembrare poco rilevante, devo ammettere che in fase di collaudo e durante i vari utilizzi ci ha permesso di riscontrare subito errori nei collegamenti (inversione dei poli).

Il driver presenta anche due pin di Current sensing (SEN_A e SEN_B), uno per canale, che ci consentono di misurare la corrente assorbita da ciascun canale ed eventualmente limitarla per evitare di bruciare il circuito.

Se non si vuole misurare la corrente (come abbiamo fatto al momento noi nel nostro prototipo) basta mettere a massa i due pin di sensing. Invece, se si vuole avere un controllo sull’assorbimento della corrente, bisogna inserire una resistenza di 0.1 – 1 Ohm (R5 e R6), avendo cura di scegliere una resistenza con il giusto valore di potenza dissipabile secondo la formula

[latex]P=I^2*R[/latex]

Sono state inserite due resistenze di pull-up (R1 e R4) che hanno il compito di inviare il segnale alto al canale dell’Enable così che, se non si vuole o non si può (per mancanza di uscite dal microcontrollore) pilotare i pin dell’Enable il circuito sarà sempre abilitato. I due pin di Enable hanno il compito di “abilitare”  o “disabilitare” i canali del driver.

ElectroDroid, l’elettronica nelle tue mani

Un’applicazione eccezionale che non deve mancare nel dispositivo Android di un appassionato di elettronica è ElectroDroid. Le funzioni di questo programma sono innumerevoli e vanno dal calcolo del valore di una resistenza dai suoi codici colore al calcolo dimensioni tracce PCB.

[nggallery id=43]

L’applicazione nei numerosi test effettuati è risultata molto stabile, non avendo dato alcun problema ne su tablet che su smartphone.

Eccovi alcune tra le principali caratteristiche:

  • codici colore resistore (3-6 bande);
  • codici colore induttanze;
  • legge Ohm;
  • calcolo reattanza capacitiva/induttiva;
  • partitore tensione;
  • rapporto resistenze;
  • valore resistenze in serie/parallelo;
  • amplificatori operazionali;
  • calcolatore resistenza per diodi led;
  • calcolatore LM317;
  • calcolo dissipazione calore;
  • calcolo durata batteria;
  • tool progettazione induttori;
  • calcolo caduta tensione;
  • calcolo dimensioni tracce PCB;
  • filtri;calcolatore NE555;

[app]it.android.demi.elettronica&hl=it[/app]

Viaggio nei cloni di Arduino – chipKIT Uno e Maxi

Nel panorama delle piattaforme cloni del famoso Arduino risulta degna chipKIT, prodotta dalla Digilent.

Questo microcontrollore è presente in due versioni la Uno32™ (con 42 I/O) e la Max32™ (con 83 I/O) entrabe perfettamente compatibili con tutti i codici sviluppati per l’Arduino nonchè per i vari shield sviluppati per la piattaforma Italiana.

La versione Uno32™ presenta:

tile_chipkit-uno32_150

  • Microchip® PIC32MX320F128 processor
    • 80 Mhz 32-bit MIPS
    • 128K Flash, 16K SRAM
  • Compatible with many existing Arduino™ code examples, reference materials and other resources
  • Can also be programmed using Microchip’s MPLAB® IDE (along with a PICkit 3 and our PICkit3 Programming Cable Kit, seen below)
  • Arduino™ “Uno” form factor
  • Compatible with many Arduino™ shields
  • 42 available I/O
  • User LED
  • Connects to a PC using a USB A -> mini B cable
Le caratteristiche della versione Max32™ sono:
tile_chipkit-max32_150
  • Microchip® PIC32MX795F512 processor
    • 80 Mhz 32-bit MIPS
    • 512K Flash, 128K RAM
    • USB 2.0 OTG controller
    • 10/100 Ethernet MAC
    • Dual CAN controllers
  • Provides additional memory and advanced communications peripherals
  • Compatible with many existing Arduino code examples, reference materials and other resources
  • Can also be programmed using Microchip’s MPLAB® IDE (along with a PICkit 3 and our PICkit3 Programming Cable Kit, seen below)
  • Arduino™ “Mega” form factor
  • Compatible with many Arduino™ shields
  • 83 available I/O
  • User LED
  • Connects to a PC using a USB A -> mini B cable
I costi sono inferiori rispetto ad Arduino, essendo di $26.95 per la Uno e di $49.50.
Lo sviluppo delle applicazioni per queste piattaforme avviene utilizzando un ambiente basato sull’originale Arduino ™ IDE opportunamente modificato per supportare PIC32. Tale ambiente di sviluppo modificato mantiene, comunque, anche il supporto per l’originale Arduino.
Link per l’acquisto:
Per il modello Uno32™
Per il modello Max32™

Il LED diventa sensore di luce

Abbiamo già visto in precedenza cosa sono i LED, ovvero dei perticolari diodi in grado di emettere luce (la sigla sta appunto per Light Emission Diode). In una serie di articoli vi avviamo mostrato come usarli per sviluppare dei progetti con l’Arduino.

Abbiamo anche parlato delle fotoresistenze dedicandogli un articolo apposito.

Fin quì nulla di nuovo, ma se volessimo usare un LED come se fosse una fotoresistenza? L’utilizzo di un LED è bidirezionale: se sottoposto ad una tensione opportuna emette luce (che può ricadere nel visibile, nell’UV o nell’infrarosso a seconda del led), ma se sottoposto ad una sorgente luminosa genera una tensione ai suoi capi.

Seppur tale tensione è dell’ordine di poco più di un Volt è sufficiente per una applicazione di misurazione dell’intensità luminosa di una sorgente. A dirla tutta esistono delle applicazioni sperimentali per l’uso dei LED come celle fotovoltaiche, ma i risultati non sono ancora molto soddisfacenti.

Quello che faremo sarà collegare il LED ad un ingresso analogico dell’arduino e visualizzare le letture di luminosità in seriale. In particolare collegheremo il polo positivo alla porta 3V3 dell’arduino ed il negativo alla porta analogica 3.

Per il montaggio del circuito seguite il seguente schema:

led_come_sensore

Il codice da usare per leggere sul monitor seriale i valori è:

[arduino]

void setup() {
Serial.begin(9600);
}

void loop() {
int LEDsensorValue = analogRead(3);
Serial.println(LEDsensorValue);
}
[/arduino]

Mi raccomando, nel codice usate il comando println così da avere un valore per ogni rigo, altrimenti la lettura risulta troppo confuzionaria.

Regoliamo il blinking con un potenziometro

Precedentemente abbiamo imparato a far lampeggiare (Blink) un LED mediante l’Arduino. In quel semplice esempio la velocità di lampeggiamento veniva impostata nel codice e, quindi, non era possibile farla variare (a meno di andare a cambiare il valore impostato nel codice).

Adesso vedremo come modificare il codice ed il circuito per permetterci di regolare il Blinking con un potenziometro.

Fare ciò vuol dire aggiungere un potenziometro al nostro sistema, collegarlo ad un ingresso analogico ed usare il valore letto da tale ingresso per stabilire la velocità del lampeggiamento.

Vediamo subito come fare il circuito:

analoginputoutput_bb

Nell’immagine ho usato il pin 3 (che supporta il PWM) solo perchè l’avevo già fatta per un altro esempio. Ovviamente potete usare anche una porta digitale senza PWM in quanto non è necessario per il blinking.

Adesso passiamo al codice:

[arduino]
int ledPin = 3;
int potPin= 0;
int pausa = 0;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(potPin, INPUT);
}

void loop()
{
pausa = analogRead(potPin);
 digitalWrite(ledPin, HIGH);
delay(pausa);
digitalWrite(ledPin, LOW);
delay(pausa);
}
[/arduino]

Come al solito nella prima parte del codice dichiariamo le variabili che ci serviranno nella seconda parte del codice.
Nel void loop abbiamo salvato il valore della lettura analogica del potenziometro all’interno della variabile pausa. Tale variabile è stata usata per impostare il tempo di lampeggiamento di un led.

Arduino e gli errori comuni

Come avete potuto vedere nei vari articoli presenti nel sito, l’arduino può avere un’infinità di applicazioni ed il suo utilizzo non è eccessivamente complicato.

Ciò nonostante, può capitare che qualcosa non funzioni restituendoci alcuni errori o in fase di compilazione del codice o in fase di funzionamento.

Spesso tali errori possono essere evitabili semplicemente stando attenti ad un paio di regole che, pur essendo molto semplici, per l’arduino risultano fondamentali. Principalmente gli errori derivano da un’errata programmazione e quindi, in fase di compilazione, riceverete un messaggio di errore. Tale messaggio vi verrà mostrato in colore rosso scuro nel riquadro posto in basso nell’ambiente di sviluppo.

Dal lato della programmazione state attenti a:

  • Selezionare la porta COM corretta nell’ambiente di sviluppo;
  • Controllare che nell’ambiente di sviluppo sia stato impostato il corretto modello del vostro arduino (Uno, duemilanove, etc…);
  • Assicurarsi di aver inserito tutti i “;” a fine rigo nel codice;
  • Vedere se tutte le parentesi graffe “}” sono state chiuse a fine blocco;
  • Essere sicuri di aver dichiarato tutte le variabili usate nel loop e di non aver commesso errori di battitura durante il loro uso;
  • Ovviamente accertarsi che il codice sia corretto.

Analizziamoli più nel dettaglio. A tal fine userò lo sketch del Blink per generare di volta in volta l’errore e mostrarvelo.

Porta COM erratacom

Scriviamo il seguente codice nell’ambiente di sviluppo e carichiamolo sull’arduino col tasto upload:

[arduino]
void setup() {
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
[/arduino]

Se la porta COM selezionata è quella sbagliata otterremo il seguente messaggio di errore:

Binary sketch size: 998 bytes (of a 32256 byte maximum)
avrdude: stk500_recv(): programmer is not responding

Il primo rigo ci avvisa che il codice è stato compilato correttamente, mentre il secondo è proprio il messaggio che ci avvisa che il compilatore non riesce a comunicare con l’arduino. Se ricevete questo messaggio selezionate la porta COM corretta dal menù Tools –> Serial Port.

Arduino e la funzione map()

La funzione map() serve a “ri-mappare” un numero (ad esempio la lettura di un sensore) da un intervallo ad un’altro.

La sintassi di tale funzione è molto semplice. Per prima cosa si indica la variabile che conterrà il valore “ri-mappati” (value), poi si scrive il valore minimo (fromLow) e massimo (fromHigh) prima della ri-mappatura e, a seguire, il valore minimo (toLow) e massimo (toHigh) dopo la ri-mappatura. Tutti i valori intermedi saranno automaticamente calcolati dalla funzione map().

Vediamo meglio come è fatta tale funzione:

[arduino]
map(value, fromLow, from High, toLow, toHigh)
[/arduino]

Per meglio comprendere tale funzione passiamo subito ad un esempio. Supponiamo di voler usare un potenziometro per regolare il fade di un LED. In questo articolo abbiamo già visto come farlo in maniera molto semplice. Noterete che in quel codice era stato necessario dividere per 4 il valore del potenziometro nell’ analogWrite() poichè mentre la “lettura” analogica dà 1024 valori (da 0 a 1023), la “scrittura” analogica dà 256 valori (da 0 a 255) ovvero 1024/4.

La funziome map ci permette di riassegnare i valori del potenziometro e quindi non è più necessario dividere per 4. Vediamo come impostare tale funzione per gestire il fade del LED:

[arduino]
map(potvalue, 0, 1023, 0, 255)
[/arduino]

Vediamo, quindi, come riscrivere il codice del fade con il potenziometro adoperando tale funzione. Prima, però, vi ripropongo lo schema di come montare il circuito.

[singlepic id=97 w=320 h=240 float=center]

Ed ecco il codice:

[arduino]
const int pot = 0;
const int ledPin = 3;
int potValue = 0;
int ledValue = 0;

void setup(){
pinMode (pot, INPUT);
pinMode (ledPin, OUTPUT);
}

void loop() {
potValue = analogRead(pot);
ledValue = map(potValue, 0, 1023, 0, 255);
analogWrite(ledPin, ledValue);
delay(10);
}
[/arduino]

Ovviamente in questo esempio non si ha un elevato guadagno nell’usare la funzione map(), ma in sistemi più complessi risulta essere uno strumento molto potente.