Sensore di gas e diodo Zener

Da raspibo.
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Sensore di fumo e diodi Zener

il risultato in tutta la sua bellezza

Il mini-progetto prevede la costruzione di un rilevatore di gas (CO, in particolare) ed è spunto per vedere un uso tipico dei diodi Zener.

Si ringraziano i partecipanti ed in particolare Paolo Sinigaglia ed Andrea Mennini per la chiarezza espositiva.

Come sensore, è stato scelto l'MQ-7 (il cui datasheet non è troppo chiaro, a dire il vero) con tanto di breakout board per adattare la sua singolare piedinatura alle millefori o breadboard.

Caratteristica di questo sensore è la necessità di alimentarlo a fasi alternate: 60 secondi a +5V, 90 secondi a +1.4V (durante la fase a +5V tenderà a scaldarsi: non allarmetevi); la lettura del sensore dovrà poi avvenire durante la fase ad 1.4V.

il diodo Zener

Per questo compito torna utile un diodo Zener: esso si comporta come un normale diodo se polazirrato direttamente (ovvero - entro certi limiti - fa passare corrente in un senso ma non nell'altro), se invece lo polazirriamo inversamente (tensione al catodo maggiore di quella all'anodo) nel momento in cui la differenza di potenziale applicata supera un certo livello si avrà un passaggio di corrente. Altra caratteristica notevole è il fatto che ai capi del diodo la differenza di potenziale si manterrà ad un valore fisso (la tensione di breakdown, che è caratterstica dello specifico modello di diodo) indipendentemente dal voltaggio applicato al circuito.

Per testare la tensione di breakdown di un dato diodo, potete usare un semplice circuito come questo:

Diodo-zener-test.png

Andando poi a misurare la differenza di tensione tra i capi del diodo si verificherà che essa corrisponde con buona approssimazione a quanto dichiarato dal produttore; ovviamente, ai capi della resistenza avremo la rimanente differenza di tensione (anche qui, al netto di cadute di tensione intrinseche ai componenti). Sarebbero qui necessarie alcune considerazioni su come scegliere la potenza del diodo stesso (altra caratteristica variabile a seconda del tipo) e/o la resistenza del resto del circuito in modo che il diodo resti all'interno dei parametri di costruzione, ma le farò appena ho tempo. :-)

Abbiamo quindi trovato un componente che mantiene ai propri capi una certa tensione; sapendo che un Arduino (o un hub USB) fornisce +5V e che il nostro sensore ha alternativamente bisogno di +5V e +1.4V, andiamo a scegliere un diodo Zener da 3.6V (e 0.5W) in modo che la tensione sul resto della maglia risulti 5V - 3.6V = 1.4V. Questa collegamento sarà sempre presente, alimentando quindi di continuo il nostro sensore ad 1.4V.

Il transistor

Ora abbiamo bisogno di fare in modo che ogni tanto sia possibile far passare tutti i +5V; per fare questo, aggiungiamo un transistor PNP. Colleghiamo l'emettitore al nostro +5V, ed il collettore sull'alimentazione del sensore (lo stesso punto a cui abbiamo collegato il diodo, per intenderci). Quando alla base verrà applicata tensione - calcolata rispetto all'emettitore - emettitore e collettore saranno collegati facendo arrivare i +5V al sensore; togliendo la tensione tra base ed emettitore, il circuito sarà aperto e quindi ad alimentare il sensore resterà soltanto il circuito che comprende il diodo Zener. Nota bene: in questo caso, avere una tensione tra base ed emettitore (quest'ultimo connesso a +5V) significa settare a LOW (zero, in pratica) l'uscita digitale a cui connetteremo la base.

Costruiamo il circuito

Usiamo il sensore

schema del rilevatore di gas

Una nota sulla piedinatura della breakout board: il sensore è simmetrico, quindi potete montarlo come preferite; una volta installato, avremo questa situazione:

  • dei piedini indicati come H sul datasheet dell'MQ-7, uno andrà a GND e l'altro su H1
  • i restanti piedini saranno collegati tra loro a coppie (nel rispettivo gruppo di 3 piedini dell'MQ-7) e finiranno rispettivamente su B1 ed A1'

Andremo quindi a collegare la nostra breakout board in questo modo:

  • H1 ed A1 al positivo (che alternativamente sarà +5V e +1.4V, avendo lì collegato sia il diodo Zener che il collettore del transistor); questi due piedini andranno collegati tra loro, in modo che entrambi ricevano sempre la stessa alimentazione
  • GND messo direttamente a terra
  • B1, con una resistenza di pull-up a terra, sarà collegato ad un ingresso analogico dell'Arduino (nell'esempio, A5)

Il codice di test

Ecco qui un breve listato di test (in cui il transistor è comandato dal pin digitale numero 8):

/* Copyright 2013 Davide Alberani <da@erlug.linux.it>
   Released under the terms of the GPL license, version 3 or later.
*/

// Library from http://www.pjrc.com/teensy/td_libs_MsTimer2.html
#include <FlexiTimer2.h>

const int gasVOutPin = 8; // pin to control the transistor
const int gasReadPin = 5; // analog pin for reading sensor's value
const unsigned long int HEATING_TIME_HIGH = 60000; // 1 minute
const unsigned long int HEATING_TIME_LOW = 90000; // 1.5 minutes

void setup() {
  Serial.begin(9600);
  pinMode(gasVOutPin, OUTPUT);
  // every second, read from the sensor
  FlexiTimer2::set(1000, 1.0/1000, readGasSensor);
  FlexiTimer2::start();
}


void readGasSensor() {
  Serial.print("GAS READ: ");
  int gas = analogRead(gasReadPin);
  Serial.println(gas);
}


void loop() {
  Serial.println("SETTING +5V on sensor");
  digitalWrite(gasVOutPin, LOW);
  delay(HEATING_TIME_HIGH);
  Serial.println("SETTING +1.4V on sensor");
  digitalWrite(gasVOutPin, HIGH);
  delay(HEATING_TIME_LOW);
}

Note

Da notare che il sensore andrebbe tarato con quantità note di gas. Esso ha inoltre bisogno di tempi molto lunghi per stabilizzarsi: nonostante sia possibile leggerlo fin da quasi subito (tenete comunque presente che prima di poterlo leggere dovete aspettare un ciclo ad 1.4V), inizierà a dare risultati stabili dopo 48 ore.

L'angolo del bullarsi

il sensore saldato su una millefori

Seguito, in rapidissima successione da...

L'angolo della sconfitta!

il sensore bruciato

Sono riuscito a bruciare il sensore... ma se non altro dalla sciagura si può trarre una lezione. :-)

Il sensore si è bruciato a causa di una fase a +5V troppo prolungata nel tempo. Il codice arduino che avevo scritto, aveva un bug non da poco: usavo la analogWrite(PIN, VALUE) invece della digitalWrite(PIN, VALUE). Così facendo, il PIN restava sempre nello stato iniziale (LOW) e di conseguenza il transistor PNP continuava a lasciar passare la corrente verso il povero sensore.