Cercando di rendere utilizzabile il circuito visto in questo post, ho pensato di rendere la versione definitiva come uno shield Arduino in modo da evitare al massimo cavi volanti
Per fare cio' e' stata presa una normale piastrina millefori tagliata sulle dimensioni di una Arduino a cui sono stati aggiunti pin mediante una strip (i pin inseriti sul lato dei contatti digitali dell'Arduino servono solo a rendere meccanicamente stabile lo shield e non sono elettricamente connessi)
I cavi dalla strumentazione vengono connessi alle morsettiere verdi (il contatto centrale non e' connesso...avevo solo morsettiere a tre posti)
Nelle foto e' mostrato il circuito completo per l'amplificazione da un solo canale dell'LM358 ma sono gia' stati predisposte la morsettiera ed il trimmer per regolare l'amplificazio (a destra nella foto sottostante) per il secondo canale
La lettura dei dati avviene sui Pin A3 (canale 1) e A5 (canale 2) dell'Arduino
Lo shield rovesciato
Alla fine la realizzazione e' piuttosto pulita ed ordinata (almeno per i miei standard)
Ho comprato per una decina di euro un clone cinese dell'Arduino Duemilanove da usare come scheda da battagli su DealExtreme
Arduino Duemilanove originale
Clone Cinese
come si vede dal confronto con l'originale, il clone cinese mostra una serie di pin aggiuntivi per montare dei servo ma si tratta solo di pin connessi ai normali PWM dell'Arduino
Al momento di provarla ho caricato lo skecth di esempio Blink ma il programmatore si rifiutava sempre di completare il lavoro
Sul momento ho pensato che si fosse corrotto il bootloader dell'Arduino (i led della scheda si accendono quindi l'alimentazione e' presente) e stavo per sostituire il processsore con uno originale comprato direttamente programmato da Arduino
Cercando meglio sul sito di DealExtreme, tra i commenti, viene riportato che le prime schede prodotte presentavano una resistenza denominata R2 che deve essere rimossa per permettere la programmazione (nelle nuove schede sembra che questa resistenza sia stata rimossa)
Francamente non so dissaldare un componente con saldatura SMD ed ho provato prima ad interrompere la pista con un trincetto ma senza risultato. Ho preso quindi il coraggio ed ho provato a rimuovere direttamente il componente sollevandolo con un trincetto
Scheda con R2 rimosso
Fatto cio' la scheda e' risultata programmabile e perfettamente funzionante....questo e' il divertente di comprare in Cina
Il progetto di lettore per il Force Gauge per il laboratorio di geotecnica e' ai suoi passi finali
Nell'immagine sottostante il cavo rosso e giallo (in basso) derivano dai cavi di lettura del forge gauge (la cui alimentazione e' stata effettuata con una comune pila da 9V)
Il cavo blu che entra nel pin A0 dell' Arduino e' la lettura amplificata del segnale
I cavi nero e giallo accoppiato derivano corrente dall'Arduino ed alimentano il circuito e piu' in particolare l'LM358
Sono presenti inoltre una resistenza da 220 Ohm ed un trimmer (in blu) da 10 KOhm per tarare il valore di amplificazione
La configurazione dell'amplificatore e' quella di un operazionale invertente
per completezza riporto anche il pinout dell'LM358 (nel caso in esame e' stato usato solo un operazionale dei due che sono inseriti nell'IC)
e per finire un breve video che mostra la lettura della forza applicata sul force gauge direttamente nel monitor seriale dell'IDE di Arduino (e' stato usato lo sketch di esempio AnalogReadSerial nella categoria Basic)
Sto lavorando ad amplificare il segnale del Force Gauge gia' visto in questo post
Gli integrati di cui si trovano informazioni e tutorial (non molti peraltro) su Internet sono sostanzialmente due:
LM741 e LM358 (con il primo piu' datato e quindi con meggiore supporto dalla rete)
Ho provato entrambi e ci sono alcuni aspetti che fanno propendere per l'uso dell'LM358
LM358 ammette una alimentazione a due fili (Vcc e GND) e puo' essere alimentato anche da una comune pila a 9 V (puo' essere alimentato direttamente anche da Arduino). LM741 necessita invece di trasformatore a tre uscite (V+, GND e V-) e viene indicato di usare una tensione di 15 altrimenti non e' garantito che l'integrato funzioni (alcuni sembra di si' ,altri no)
LM358 ha un doppio operazionale mentre LM741 ne ha uno solo (con lo stesso numero di piedini)
LM741 ha in piu' il controllo dell'offset mediante gli appositi piedini OFFSET NULL
Pinout LM741
Pinout LM358
Il circuito di amplificazione e' gia' pronto e lo mostrero nei seguenti post (e' basato su LM 358)
Un amico mi ha chiesto la possibilita' di monitorare uno strumento da laboratorio per taglio anulare (si tratta di una strumentazione geotecnica) mediante Arduino
Lo strumento e' sostanzialmente un Force Gauge SM 1000-N capace di misurare carichi fino a 1000 N.
I collegamenti sono piuttosto semplici. Vi e' una alimentazione da 15 Vcc e due cavi di misura
Il problema e' il tipo di uscita dello strumento che risulta essere di pochi milliVolt (al massimo di qualche decina di milliVolt) al contrario dello strumento visto in questo post
Per questo motivo avevo escluso a priori l'utilizzo dell'Arduino Uno perche' ha una sensibilita' (nel migliore delle ipotesi) di 5 mV
Arduino Due invece dovrebbe avere una sensibilita' nettamente superiore perche' monta un convertitore analogico digitale da 12 bit (4096 livelli al contrario dell'ADC a bit 10 e 1024 livelli della Uno) ed ha un fondo scala a 3.3 V (5.0 V Arduino Uno). Per questo motivo, con un rapido conto, la minima lettura dell'Arduino Due doveva essere 3.3V/4095 = 0.8 mV...perfettamente in linea con le tensioni che avevo bisogno di misurare
Una volta connessa l'Arduino Due al Force Gauge ed un multimetro per riferimento e' stato chiaro che qualcosa non tornava. Per tensioni misurate di circa 7 mV la risposta della Arduino Due era compresa tra 3-4 (in linea teorica doveva essere circa il doppio ovvero tra 8 e 9)
Frugando su Internet ho trovato questo interessante post che entra nel dettaglio dell'ADC di Arduino Due mostrando come l'offset possa essere anche molto alto (20 mV) rendendo difficoltose le misure di tensioni molto basse. Fra le altre cose e' interessante l'influenza di avere una tensione di riferimento stabile anche per l'Arduino oltre che per lo strumento di misura
Recentemente un amico mi ha chiesto un metodo per poter gestire in remoto (dove per remoto si deve intendere accendere una caldaia negli USA stando in Italia) usando una Raspberry.
La cosa e' piuttosto semplice da fare con Php ma visto che la ruota e' gia' stata inventata, e funziona bene, ho preferito usare questo strada
Prima di tutto la parte collegamenti
La Raspberry, con montata una Raspbian, e' stata collegata al rele' alla porta GPIO #23 (porta S del rele') e i classici +5V e GND
Per la parte software ho impiegato WEBIOPI , uno script in Python che crea un piccolo webserver interfacciato con le GPIO
Prima prima cosa di sscaricare il file wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
e lo si scompatta
A questo punto da utente root si digita
./setup.sh
(attenzione, durante questa fase la Raspberry deve essere connessa ad internet perche' vengono scaricate eventuali librerie non gia' presenti nel sistema...l'operazione dura qualche minuto)
al termine si puo' digitare (sempre da root)
/etc/init.d/webiopi start
a questo punto collegandosi all'indirizzo della macchina sulla porta 8000 (od in localhost:8000) si accede ad una interfaccia di questo tipo
La username di default e' "webiopi" e la password "raspberry"
All'inizio tutte le porte sono di Input. Quindi si deve cliccare sulla casellina grigia accanto alla porta di interesse (nel mio caso #23) e porta in modalita' output (OUT). Fatto cio' cliccando sul numero della porta si interagisce con il rele' aprendo e chiudendo il contatto
Nel video si osserva il led luminoso del rele' che si accende quando si apre il contatto via web
Per rendere il sistema sempre avviato all'accensione del sistema si deve digitare
Per tentare di recuperare un po' di elettronica ho smontato un telefono da tavolo
Con mia grande sorpresa la scheda si presentava come nella foto sottostanti
In pratica di elettronica discreta sono presenti solo
Nel caso reale di costruzione di un amplificatore e' stato utilizzato l'operazionale LM358 per operare una amplificazione di guadagno pari a 2 in modalita' invertente
per questo motivo le due resistenze sull'operazionale sono uguali a pari a 1 KOhm
Il cavo verde indica il segnale da amplificare (sul Pin 3)
Il cavo rosso indica l'uscita del segnale amplificato (sul Pin 1)
Il cavo nero indica la terra (sul Pin 4)
Le resistenza sul circuito di alimentazione dell'integrato sono entrambi da 10 KOhm
Il Pin 1 e' in alto a sinistra (una resistena da 10 KOhm e' parzialmente coperta dal filo verde)
Il diodo e' un componente semiconduttore che permette il passaggio di corrente quando l'anodo e' piu' positivo del catodo (forward biased)
Simbologia sul componente - La striscia indica il catodo
Simbologia sui circuiti
Nel corso di inversione della polarita' del diodo (reverse biased) c'e' un modesto passaggio di corrente (Corrente inversa Ir) che e' dell'ordine di qualche nanoampere. In caso di corrente inversa troppo alta si puo' avere la rottura del componente (PRV o PIV)
Per sviluppare un amplificatore di segnale da accoppiare ad un sensore e' stato impiegato l'integrato LM358 che consiste in due separati operazionali comandati da una sola sorgente (nell'esempio ne verra' usato solo uno)
PIN dell'Integrato LM358 con indicatore a punto
Pin dell'integrato LM358 con indicatore non puntuale
per creare un amplificatore deve essere realizzata una configurazione da amplificatore non invertente che e' determinato dalla grandezza delle resistenze R1 ed R2
Il fattore di amplificazione e' dato dal parametro Vi=1+(R2/R1)
La massima tensione di alimentazione Vcc e' +- 16V
Nella realta' devono essere collegati sulla breadboard
1) la resistenza R2 deve essere collegata al Pin 1 e Pin 2
2) la resistenza R1 deve essere collegata al Pin 2 e Pin 4
3) l'alimentazione deve essere collegata con il + al Pin 8 ed il - al Pin 4
4) il segnale in ingresso (da amplificare) deve essere inserito ai Pin 2 (-) e Pin 3 (+)
5) il segnale in uscita (amplificato) deve essere preso ai pin 4 (-) e Pin 1 (+)
Nel caso reale sono stati impiegati un valore di R1 = 1KOhm ed un valore di R2= 100KOhm per ottenere un fattore di amplificazione di circa 100, piu' precisamente 1+(R2/R1) (per avere una migliore scalabilita' si puo' mettere una resistenza variabile su R2). L'alimentazione e' fornita da una pila a 9 V
In configurazione invertente si presenta come segue
Sulla scheda Arduino non e' disponibile la porta analogica in modalita' output. Per generare quindi delle tensioni intermedie tra 0 e 5 V vengono impiegate le porte digitali in modalita PWM per simulare una tensione intermedia tra il valore off (0 V) e on (5 V) tipici degli stati digitali
In pratica la porta digitale funziona ad impulsi oscillando tra 0 e 5 V in modo da simulare che mediante l'uscita sia un valore intermedio. La velocita' di variazione, che e' circa 480 Hz, rende irriconoscibile allo strumento che si tratta di impulsi
Al contrario della lettura della porta digitale, in caso di scrittura si hanno solo 255 livelli per cui gli incrementi minimi di corrente sono 5V/255 circa 0.02 V
void loop() { analogWrite(9,127); }
---------------------------------------
variando il secondo parametro di analogWrite (in questo caso il 127) si puo' variare la tensione in uscita
Valore Output = 50
Valore Output =100
Valore Output =150
Valore Output =200
Valore Output =250
Nel caso si voglia una approssimazione ancora migliore di una corrente in uscita continua e non pulsata si puo' aggiungere un filtro passa basso con una resistenza da almeno 4.7 KOhm ed un capacitore da almeno 2 uF
Per il test di sensore di alta pressione 'e stato provato il modello Gefran TP867 2D che ha un range di misura 0-20 bar ed una uscita di 3 mv/V
Il sensore ha 6 connettori (2 alimentazione, 2 segnale, 2 calibrazione) ma nell'esemplare di test erano collegati solo alimentazione e segnale con colori differenti da quelli riportati in scheda tecnica
La pedinatura e'
A : segnale + (colore cavo marrone)
B : segnale - (colore cavo nero)
C : alimentazione + (colore cavo giallo)
D : alimentazione - (colore cavo blu)
Sull'alimentazione e' stata messa una batteria da 9V
alla pressione atmosferica il sensore segnala 2 mV; soffiando con la bocca all'interno dell'imboccatura il segnale sale a 4-5 mV
Non e' presente nessun circuito di amplificazione per cui dovra' essere costruito esternamente
L'uso di un transistor come interruttore permette di dividere il circuiti in due settori non in connessione elettrica tra di loro
La base e' il punto dove si applica la tensione; nel caso in cui si sia tensione tra base (+) ed emettitore (terra) la resistenza tra emettitore e collettore scende quasi a zero aprendo il circuito.
Sulla base e' sempre necessario inserire una resistenza da almeno 1 KOhm
Fonte Wikipedia
Nei grafici l'emettitore e' indicato con una freccia; nei transistor reali la posizione dei pin puo' essere variabile e si deve consultare la scheda tecnica
Vce - è la massima tensione che può essere applicata fra il collettore e l'emettitore Vbe - è la massima tensione che può essere applicata fra la base e l'emettitore Ic - è la massima corrente che può attraversare il circuito di collettore Ib - è la massima corrente che può attraversare il circuito di base hfe - e' il guadagno di corrente in uscita
Esistono diverse configurazioni:
1) A base comune (terminale di base a terra)
2) Ad emettitore comune (ovvero Base ed Emittore con in continuita' elettrica. Uso Amplificatore)
3) A Collettore comune (Inseguitore di Emettitore)
------------------------------------------------------------------------------------------------
Il mio transitor di test e' BC547B
Si tratta di un sensore NPNda 625 mW con
Vce = 45 V
Vcb = 50 V
Vbe = 6 V
Ic = 100 mA
hfe = 290 (2mA), 180 (100mA) a 5Volts
Disposizione della pedinatura del componente
Per il calcolo della resistenza R1 da mettere sulla base si deve prevedere quale e' la corrente che si vuole che scorra tra collettore ed emettitore
Per esempio se si vuole una corrente di 0.3mA sull'uscita del transistor si deve calcolare
Ib (corrente sulla base) = Ic/290 Ic dove Ic e' imposto a 0.3mA
n pratica si divide la corrente che vogliamo avere per il fattore di amplificazione in modo da calcolare quale deve essere la corrente sulla base
Risulta che Ib = 0.1 mA
Usando poi la legge di Ohm (R=5/0.0001) si ha che la resistenza da inserire sulla base e' 50KOhm
void loop(){ byte highByte, lowByte, fine; char pitch, roll; int bearing; byte high_x,low_x,high_y,low_y,high_z,low_z; int acc_x,acc_y,acc_z;
Wire.beginTransmission(ADDRESS); //starts communication with CMPS10 Wire.send(2); //Sends the register we wish to start reading from Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // Request 4 bytes from CMPS10 while(Wire.available() < 4); // Wait for bytes to become available highByte = Wire.receive(); lowByte = Wire.receive(); pitch = Wire.receive(); roll = Wire.receive();
bearing = ((highByte<<8)+lowByte)/10; // Calculate full bearing fine = ((highByte<<8)+lowByte)%10; // Calculate decimal place of bearing
display_data(bearing, fine, pitch, roll); // manda i dati alla seriale
Ho sperimentato il sensore CMPS10 (in pratica una bussola con compensazione di inclinazione) che fornisce indicazioni anche sull'inclinazione degli assi di pitch e di roll
Il sensore costa una quarantina di euro ed ammette voltaggi di ingresso da 3.3 a 5 V (ottimo per l'Arduino) con un consumo di 25 mA. La risoluzione di 0.1 gradi con una accuratezza minima dell'1%.
La comunicazione puo' avvenire su interfaccia I2C, SPI e Seriale .. io sono andato sulla S2C
Questa e' la pedinatura dell'I2C..dato che il componente non riporta sigle sulla scheda e che si monta a testa all'ingiu' sulla breadboard mi sono fatto un adesivo con i nomi dei connettori per non sbagliare.
L'orientamento dell' heading della scheda e' verso sinistra ovvero il valore di angolo tra il Nord e la scheda viene letto rispetto al lato con i pin
ATTENZIONE : per funzionare correttamente il sensore deve essere messo con i pin e con gli integrati rivolti verso l'alto (non come in fotografia, nelle prove e' stata rigirara la breadboard) altrimenti la compensazione dell'inclinazione della bussola non funziona e risponde in modo causuale
La scheda di prova montata
Per rendere piu' chiaro il montaggio della scheda riporto un disegno fatto con Fritzing
Lo skecth e' stato modificato rispetto a quello di esempio della ditta perche' sostanzialmente non funzionava per problemi sulla libreria Wire.h..cosi' funziona
void loop(){ byte highByte, lowByte, fine; // highByte and lowByte store high and low bytes of the bearing and fine stores decimal place of bearing char pitch, roll; // Stores pitch and roll values of CMPS10, chars are used because they support signed value int bearing; // Stores full bearing
Wire.beginTransmission(ADDRESS); //starts communication with CMPS10 Wire.send(2); //Sends the register we wish to start reading from Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // Request 4 bytes from CMPS10 while(Wire.available() < 4); // Wait for bytes to become available highByte = Wire.receive(); lowByte = Wire.receive(); pitch = Wire.receive(); roll = Wire.receive();
bearing = ((highByte<<8)+lowByte)/10; // Calculate full bearing fine = ((highByte<<8)+lowByte)%10; // Calculate decimal place of bearing
display_data(bearing, fine, pitch, roll); // Display data to the LCD03
delay(1000); }
void display_data(int b, int f, int p, int r){ // pitch and roll (p, r) are recieved as ints instead oif bytes so that they will display corectly as signed values.
Serial.print("Bearing = "); // Display the full bearing and fine bearing seperated by a decimal poin on the LCD03 Serial.print(b); Serial.print("."); Serial.println(f); Serial.print("Pitch = "); Serial.println(p); Serial.print("Roll = "); Serial.println(r); delay(1000); }
------------
Leggendo le specifiche mi sono accorto che nei registri da 16 a 21 (16-17 = X, 18-19 = Y, 20-21 = Z) sono inseriti i dati di accelerazione...potrebbe essere interessante
Per effettuare il reset ai valori di fabbrica si puo' usare la seguente procedura
Non essendo molto pratico di elettronica mi manda nei pazzi anche un solo Led (quale sara' la maledetta polarita'??) per questo mi metto questo appunto
Il pin piu' lungo di un led corrisponde al polo positivo
Per evitare di bruciare un led e' necessario inserire una resistenza che nel caso di un led rosso puo' essere da 220 Ohm (ma fino ad un 1KOhm vanno bene)
Nel caso di uso con Arduino il Pin 13 digitale e' gia' provvisto di una resistenza interna per cui non e' necessario aggiungerne altre
Per fare qualche prova mi sono comprato un rele' per vedere se riesco a pilotarlo con l'Arduino.
E' qualche anno che non ho piu' pratica di rele' e quindi e' necessario un ripasso
Il modello che ho comprato e' un Finder 40.52.9012 con 12 Vdc sul magnete (sono i due pin piu' a sinistra) ed 8A/250V sull'uscita con due invertitori .... probabilmente il primo errore e' stato prendere un rele' con 12 Vdc di alimentazione in quanto l'Arduino spara fuori 5 Volts dalle uscita analogiche ...diciamo con un pacco da 4 pile ricaricabili (meno 5 Volts) riesco a farlo scattare quindi potrebbe funzionare
Pedinatura
Considerando nel dettaglio la pedinatura
i due terminali separati pilotano la tensione della bobina
i 6 terminali raggruppati gestiscono di fatto due linee separate (divise lungo l'asse maggiore del rele')
quando non viene applicata corrente i pin 1 e 2 di ciascun canale risultano in corto (0 Ohm) mentre i pin 2 e 3 di ciascun canale hanno resistenza infinita (non sono in collegamento)
quando si applica corrente alla bobina (e si sente chiaramente il rumore dell'elettrocalamita che stacca i contatti) e pin 1 e 2 risultano a resistenza infinita mentre i pin 2 e 3 risultano in corto (0 Ohm)
AGGIORNAMENTO
Il problema con Arduino e' quello di trovare dei rele' con corrente di bobina di 5 V che pilotino il 220 sul rele'; inoltre la corrente di una Arduino disponibile sui pin digitali e' di circa 40 mA mentre la bobina ne consuma circa 150 mA per cui non e' fattibile di gestire direttamente i rele' dalla scheda.
Una soluzione e' quella di utilizzare gli appositi shield rele' che presentano alimentazioni separate
AGGIORNAMENTO 2
Per il calcolo della corrente da inserire in un rele' per la corrente di bobina non e' necessario conoscere la sola tensione ma anche l'amperaggio.
Se sono riportate solo le indicazione dei Volt di bobina si puo' prendere un multimetro, calcolare la resistenza ai pin della bobina, e tramite la legge di Ohm calcolare la tensione di attivazione della bobina