Creative Commons BY-NC-ND 2.5Questo sito e tutto il suo contenuto sono distribuiti sotto la licenza Creative Commons Attribuzione - Non Commerciale - Non opere derivate 2.5 Italia e con le condizioni d'uso definite nel disclaimer: siete pregati di leggere entrambi questi documenti prima di usufruire dei contenuti di questo sito. Per alcuni contenuti è necessaria una registrazione gratuita: non è necessario pagare e non è necessario accumulare punteggi per accedere agli articoli e scaricare i sorgenti: basta solo essere onesti. Se volete che questo sito continui a rimanere attivo, a contribuire ogni giorno alla diffusione della cultura libera, non copiate il materiale per ripubblicarlo in altri luoghi. Se volete partecipare su settorezero e rendere le vostre idee, i vostri progetti, fruibili da tutti senza limitazioni potete farlo tranquillamente.

Alcool Tester (breathalyser) con PIC12F683

Autore: Giovanni Bernardo | Data pubblicazione: 4 marzo 2012
Categorie: PICmicro 10/12/16 Sensori

Vi ho parlato tempo fa di come funzionano i sensori di alcool e vi ho quindi illustrato il sensore MQ-3. Abbiamo inoltre visto come sia semplice pilotare una bargraph da 30 led utilizzando soltanto 3 IO di un picmicro e qualche shift register tipo 74HC595. Per cui vi invito, se non l’avete già fatto, a leggere questi due articoli linkati prima di proseguire perchè, specie quello sul sensore MQ-3, è indispensabile per proseguire.

In questo progetto semplice semplice, fatto giusto per rilassarmi un po’ durante gli studi sui PICmicro a 32bit, non ho fatto altro che unire le due cose e l’ho fatto utilizzando un picmicro di quelli “piccoli”: il PIC12F683. Per cui, anche se non siete interessati a realizzare un alcool tester, può sempre essere utile per avere sottomano un esempio di utilizzo del modulo A/D su questo picmicro.

Il circuito è molto semplice, l’ho realizzato su una breadboard.

Conoscete bene il mio odio verso le breadboard ma ogni tanto le uso anch’io. Probabilmente a causa di questo mio odio, la prima breadboard che ho usato ha deciso di farmi impazzire un be po’: il circuito difatti non funzionava correttamente a causa di qualche strano falso contatto, che poi si è tramutato in altro tipo di problema spostando tutto il circuito in un’altra zona della breadboard…. Tutto si è risolto utilizzando una breadboard differente. Per cui, se avete problemi, usate una millefori perchè vi assicuro che il circuito funziona correttamente!

Settando opportunamente la word di configurazione è possibile utilizzare i pin dedicati all’oscillatore come normali IO e MCLR come ingresso. Sia il sensore di Alcool MQ-3 che la Bargraph Breakout Board le ho acquistate da Robot-Italy (qui e qui). Lo schema è il seguente (perdonatemi ma non mi andava di disegnarlo con Eagle, ogni tanto mi riposo pure io!):

Nello schema non è presente il connettore ICSP, potete aggiungerlo voi o programmare il picmicro a parte su un adattatore tipo questo come ho fatto io.

In realtà non è possibile, con questo schema/sorgente, realizzare un alcool tester molto preciso per svariati motivi: primo su tutti c’è il fatto che l’MQ-3 (ma quasi tutti i sensori di gas) necessitano un tempo di preriscaldamento che spesso supera le 24 ore, e poi il valore in uscita non è lineare in funzione della concentrazione di alcool (il che rende abbastanza difficile eseguire una conversione volt/ppm) ed è fortemente influenzato dalla temperatura.  Non dico che è impossibile realizzare un sistema preciso: sto dicendo che è molto difficile farlo e questo progetto esula dallo scopo: è più che altro un sistema per illustrare un utilizzo “ludico” di questo tipo di sensore, divertitevi con gli amici e basta.

In particolare la resistenza da 10KΩ andrebbe sostituita con un trimmer o con una resistenza di valore molto più elevato (200KΩ o più) per eseguire rilevazioni più precise. Provate a mettere la resistenza da 200KΩ e osservate il comportamento della bargraph: all’inizio sarà tutta illuminata (alla prima accensione tutta spenta e dopo alcuni secondi si illumina), man mano che il sensore si riscalda la tensione scende e il valore sulla barra di conseguenza si abbassa. Questo è il funzionamento corretto: usare il sensore dopo un adeguato tempo di riscaldamento. La resistenza di valore più basso consente di leggere un valore prossimo allo zero subito dopo l’accensione, ma ovviamente questo sistema non va bene per realizzare un apparato preciso.

Il sistema che ho utilizzato qui può andar bene per svariati tipi di sensori, ad esempio mi suggeriscono “dalla regia”, mentre scrivo questo articolo, che sarebbe ancora più simpatico, rimanendo sempre in ambito ludico, sostituire l’MQ-3 con un MQ-4 (sensore di metano e gas naturali) e realizzare quindi un flatulenzometro (vogliate perdonarmi ma non ho idea di come chiamare uno strumento del genere, forse andava meglio un termine anglosassone del tipo Fart-o-meter come hanno già fatto su instructables). Pare invece che l’MQ-7 (Sensore di monossido di carbonio, e probabilmente altri) non possa essere utilizzato con questo schema perchè richiede un’alimentazione “circolare” (la resistenza di riscaldamento va alimentata prima a 5V, poi a 1.4, quindi di nuovo a 5V e così via per tempi di 60sec).

Qui c’è un video che illustra il funzionamento:

Vedete che l’MQ-3 è molto sensibile e necessita di un certo tempo per “riprendersi” dopo essere stato invaso dai vapori di alcool. Provate a bere un po’ di liquore ed alitare sul sensore, ma dopo ovviamente non guidate!

Vi lascio con il sorgente… fatene buon uso e divertitevi ! Ma soprattutto se realizzate un fart-o-meter, fatemelo sapere e non usate il materiale che trovate qui per fare le raccolte a punti!

Downloads

PDFAlcool tester con PIC12F683 e bargraph (41.48 kB - 179 downloads)

PDFDatasheet PIC12F683 (2.92 MB - 1437 downloads)

PDFDatasheet MQ-3 - Sensore Alcool Etilico (54.95 kB - 71 downloads)

L'articolo ti è piaciuto o ti è stato utile per risolvere un problema? SettoreZero è realizzato soltanto con contenuti originali: tutti gli articoli sono curati con passione dagli autori e nulla viene copiato da altri siti. Supporta e mantieni in vita SettoreZero con una donazione: basta soltanto un caffè o una birra. Puoi supportare SettoreZero anche con uno dei progetti elencati nella sezione servizi o partecipare anche tu con un tuo articolo/progetto personale.

Se desiderate che SettoreZero continui a rimanere gratuito e fruibile da tutti, non copiate il nostro materiale e segnalateci se qualcuno lo fa.

Puoi andare alla fine dell'articolo e lasciare un commento. I trackback e i ping non sono attualmente consentiti.

  1. #1 da volcane il 4 marzo 2012

    Ciao!

    Come sempre proponi cose interessanti che permettono di capire come si programma, per l’ennesima volta non posso farti che dei complimenti.

    P.s. cosa usi per fare i video che metti su youtube?

  2. #3 da mrcamarium il 5 marzo 2012

    bel progetto l’ho inserito tra i miei preferiti, vorrei sapere una cosa, riguardate la configurazione del pic che hai usato tu, per usare il quarzo interno si possono usare due comandi: FOSC_INTRCCLK e FOSC_INTOSCIO, quest’ultimo l’ho hai usato tu, mi diresti la differenza?

    • #4 da Giovanni Bernardo il 5 marzo 2012

      La questione è piuttosto banale ed è comune a tutti i picmicro con l’oscillatore interno, compresi quelli a 16 e 32 bit. FOSC_INTOSCIO ti permette di utilizzare l’oscillatore interno e liberare completamente i 2 IO normalmente destinati al quarzo. FOSC_INTRCCLK ti permette di utilizzare sempre l’oscillatore interno ma dei 2 IO uno soltanto lo puoi utilizzare come normale IO mentre l’altro tira fuori in uscita il segnale dell’oscillatore: questo può essere utile per capire se ad esempio hai settato correttamente l’oscillatore (ma sui pic12f è difficile sbagliare dato che non hanno quasi nessuna opzione, sui pic da 16 bit a salire invece le opzioni sono tantissime ed è facile sbagliare), o per fornire il segnale di clock ad altri dispositivi.

  3. #5 da mrcamarium il 7 marzo 2012

    grazie della tua risposta, avrei un’altra domanda al riguardo ho visto che nel tuo sorgente hai utilizzato questa funzione: OSCCON=0x70; // Internal oscillator running @ 8MHz visto che io uso un pic 12f675 la dovrei usare anche io? io ho fatto cosi: OSCCAL=0b11111100; // Setto il l’oscillatore interno alla sua massima frequenza.

  4. #9 da mrcamarium il 17 marzo 2012

    Giovanni Bernardo :
    Il registro di calibrazione a cosa serve? Ti misuri la frequenza in uscita impostando la modalità che prevede l’utilizzo dell’oscillatore interno con il clock out. Se non è precisamente 4MHz puoi agire su OSCCAL per regolare finemente la frequenza.

    avevo letto il datasheet te lo chiedevo solo perchè il comando OSCCON quamdo me lo compilava mi dava errore, in pratica ti spiego perchè ti ho fatto la mia domanda iniziale, ho realizzato un circuito in grado di far ruoatre tre led ma non funziona allora pensavo che avessi sbagliato a configuare il quarzo interno ho notato che nel tuo programma usavi quel comando e l’ho usato, ma mi dava errori nella compilazione allora ho in serto il OSCCAL pensando che andasse bene, infatti mi compila il programma senza darmi errori.

    • #10 da Giovanni Bernardo il 18 marzo 2012

      Penso che siamo d’accordo tutti che anche se il programma lo compila, non è detto che hai fatto le cose giuste, giusto? OSCCAL serve per calibrare l’oscillatore. Punto. Se scrivi OSCCAL=NUMERO, hai impostato il registro di calibrazione, non l’oscillatore. Ci sono alcuni pic che hanno l’oscillatore interno a frequenza fissa, per cui non hai OSCCON, ed è ovvio che su quei pic se metti OSCCON ti da errore, perchè OSCCON non esiste. Ma possono avere OSCCAL per calibrarlo con precisione. Spero che hai capito la differenza tra calibrare e impostare.

      • #11 da mrcamarium il 18 marzo 2012

        si ho capito grazie! Allora penso che sia rotto il PIC visto che il programmatore legge e scrive correttamente.

        • #12 da Giovanni Bernardo il 18 marzo 2012

          Allora se continui così mi sa che non hai capito. E’ ovvio che legge e scrive correttamente! Il 12F675 ha l’oscillatore interno a 4MHz FISSO! Non puoi mettere una frequenza diversa da 4, fin qui ci siamo? Con OSCCAL regoli la precisione… Non ottieni ad esempio 4,00 MHZ ma 4,10 o 3,98 ecc ecc ma non lo puoi mettere a 8MHZ o a 16MHz. Non arrivo a capire dove ce l’hai il problema a capire questo concetto e perchè insisti a dire che te lo programma e non fa errore ecc ecc. Che c’entra il fatto che lo programma con la calibrazione e con il settaggio io non lo arrivo a capire

  5. #13 da mrcamarium il 19 marzo 2012

    Per capirci meglio ti posto il codice.
    #define XTAL_FREQ 4000000
    #define Blu GPIO3 // Led Blu
    #define Rosso GPIO4 // Led Rosso
    #define Verde GPIO5 // Led Verde
    #define Luce AN1 // Foto Resistore
    #include // Pic 12F675
    #include “delay.c”

    __CONFIG (FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & BOREN_OFF & CP_OFF & CPD_OFF);

    // Funzione principale, eseguita all’avvio del picmicro
    void main(void)
    {
    TRISIO=0b00000010; // imposto il registro in maniera tale che la GP1 sia come ingresso e il resto come di uscita
    ADON = 0; // Disattivo A/D
    ANSEL = 0b00000000; // Disattivo A/D
    OSCCAL=0b11111100; // Internal oscillator running @ 4MHz
    CMCON=0b00000011; //setto il comparatore su GP1 in modo da confrontarlo con VREF interno
    VRCON=0b10101000; //setto la tensione di riferimento a 2,5 VOLT

    while(1) // eseguo un ciclo infinito
    {
    if(CMCON & (1<<6)) // se il comparatore legge valore 1 passa al programma RGB
    {
    Rosso=1;
    Verde=1;
    Blu=1;
    DelayMs(1000);
    Blu=0;
    DelayMs(1000);
    Blu=1;
    Verde=0;
    DelayMs(1000);
    Blu=0;
    DelayMs(1000);
    Rosso=0;
    Verde=1;
    Blu=1;
    DelayMs(1000);
    Blu=0;
    DelayMs(1000);
    Verde=0;
    DelayMs(1000);
    Blu=1;
    DelayMs(1000);
    }
    else // se il valore è 0 passa a eseguire un altro effetto
    {
    Rosso=1;
    Verde=0;
    Blu=0;
    DelayMs(500);
    Rosso=0;
    Verde=1;
    Blu=0;
    DelayMs(500);
    Rosso=0;
    Verde=0;
    Blu=1;
    DelayMs(500);
    } // Fine main
    }
    }

    • #14 da Giovanni Bernardo il 19 marzo 2012

      Mi dispiace ma se c’è qualcuno che deve capire sei tu.

      OSCCAL=0b11111100; // Internal oscillator running @ 4MHz

      NOOOO !!!!!!! OSCCAL non serve a far girare l’oscillatore 4MHZ MA A CALIBRARE L’OSCILLATORE A 4MHZ : che sono due cose completamente differenti! Anche se quella riga la togli, l’oscillatore interno del 12F675 gira SEMPRE a 4MHz!! Prova a toglierla!

      E poi fai un’altra prova:
      Ce l’hai un oscilloscopio? Se non hai un oscilloscopio non arriverai mai a capire la differenza. Se hai l’oscilloscopio metti OSCCAL a zero e vedi su CLKOUT la frequenza (sarà LEGGERMENTE meno di 4MHZ), dopodichè metti OSCCAL a 0xFF e controlla di nuovo (sarà LEGGERMENTE superiore a 4MHz).

      Quindi, per piacere, prendi il datasheet, pagina 18:

      “The Oscillator Calibration register (OSCCAL) is used to calibrate the internal 4 MHz oscillator. It contains 6 bits to adjust the frequency up or down to achieve 4 MHz.”

      Ripeto: il 12F675 ha un’unica opzione, per cui quando imposti l’oscillatore interno è SEMPRE 4MHZ. PUNTO. OSCCAL non lo setta a 4MHZ (ci sta già a 4mhz! non puo assumere altri valori!). OSCCAL serve a fare una regolazione FINE dei 4MHZ!
      Quel valore 11111100, poi, da dove l’hai preso? Per tirare fuori quel numero devi per forza avere un oscilloscopio e aver fatto delle prove sul TUO picmicro, perchè non è detto che vada bene per tutti i 12F675.
      E con questo argomento chiuso! Se sei convinto che OSCCAL serve ad IMPOSTARE la frequenza, tienitelo per te ma non lo dire in giro, perchè sul datasheet non c’è scritto così e di certo non è il datasheet ad essere sbagliato. E ora non ne voglio discutere più. Argomento chiuso.

  6. #16 da Giorbe il 22 marzo 2012

    Non so se avevi gia’ visto questo blog:
    http://www.electronics-lab.com/blog/?p=17459

    • #17 da Giovanni Bernardo il 22 marzo 2012

      Questa specie di blog la conoscevo. Si limitano a ripubblicare i post di altri siti. Nella fattispecie hanno copiato pari pari il post di dangerous prototypes.

  7. #18 da Marcohm il 15 gennaio 2013

    Ciao, complimenti per il progetto!
    Sto tentando di realizzarlo, ma al posto delle barre led che usi tu utilizzo 7 led.
    Ho modificato la riga di conversione scrivendo: conversion=(valore*7)>>10;
    Nella funzione di serializzazione dei bit devo modificare qualcosa?

    Grazie.

Devi essere collegato per lasciare un commento.

  1. Ancora nessun trackback
settorezero.com e il logo Zroid™ ©2007÷2015 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore.
I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia a cui vanno aggiunte le condizioni d'uso definite nel disclaimer.
settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge. Settorezero fa uso dei cookie leggi l'informativa estesa.
Creative Commons BY-NC-ND 2.5
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti.
Per essere aggiornato con tutte le novità di settorezero.com seguici anche anche su Facebook Twitter Tumblr Blogspot Youtube.