ALERTADOR FALANTE DE LANTERNAS LIGADAS – ADICIONANDO SONS A APLICAÇÕES COM PIC – C/ PIC 16F628A (REF205)

1

Nunca mais esqueça as lanternas de seu carro ligadas…

A bateria de seu carro descarregou porque você esqueceu as lanternas ligadas? Então está na hora de você fazer algo a respeito! Faça um alertador de lanternas ligadas ‘falante’!
Veja o circuito abaixo:

Como funciona o circuito?
Quando desligamos a chave de contato e abrimos a porta para sair do carro (situação de estacionar o veículo), se as lanternas ainda estiverem ligadas ocorrerá o acionamento do circuito, reproduzindo uma mensagem que diz: “Atenção! Desligue as lanternas”.
Enquanto a porta estiver aberta e as lanternas ligadas ocorrerá a repetição da mensagem a cada ciclo de 10 segundos. Desligando as lanternas ou fechando a porta, ou mesmo ligando a chave de contato, resultará no fim da reprodução da mensagem.
Para converter os sinais digitais da mensagem na EEprom, usamos o metodo PWM. Este fica bem fácil no PIC 16F628a, pois dispõem de hardware interno chamado ‘CCP MODULE’.
A frequência do PWM foi ajustada para trabalhar com 19530hz com o cristal de 20 MHZ. O problema de usar taxas de amostragem mais altas se resume na necessidade de aumento no tamanho da memória de armazenamento.
No entanto, usar taxas abaixo de 15khz para reduzir o tamanho do arquivo resulta em se ouvir um apito indesejável na reprodução. Como resolver este impasse?
Pensei em uma possibilidade. Porque não usar um arquivo com taxa de amostragem que seja a metade do circuito reprodutor, mas usando o artifício de usar a mesma amostragem, lida a partir da eeprom, duas vezes seguidas ao invés de uma?
Assim, iniciei os testes para ver qual seria o resultado na prática. O arquivo da mensagem foi convertido para taxa de amostragem de 9765 hz. No código, cada leitura da eeprom foi convertida 2 vezes seguidas. Também, foi mantido a frequência de PWM em 19530 hz. Não é que funcionou sem apresentar o apito inconveniente! Até fiquei surpreso com a qualidade do som!
Qual é o tempo máximo de reprodução usando uma eeprom 24c256?
Podemos fazer alguns cálculos para encontrar a resposta:

Sendo:

tamanho da memória 24c256= 32768 bytes;
taxa de amostragem= 9765hz;

Então:

32768/9765 = 3,355 segundos

Temos um tempo de reprodução pouco acima de 3 segundos, o suficiente para a reprodução de uma breve mensagem.
Veja no vídeo caseiro abaixo, como ficou o som com a taxa de amostragem de 9765hz, escolhida para esta montagem:

[stream base=x:/blog.larios.tecnologia.ws/iBlog/wp-content/photos/2015/12/ flv=DSCN4698.flv embed=false share=false width=640 height=360 dock=true controlbar=over bandwidth=high autostart=false /]

Cheguei a fazer mais testes, usando o método descrito acima e com taxas de amostragem mais baixas. A qualidade piora a medida que reduzimos a taxa de amostragem. Outro fato interessante é que ao utilizar frequências abaixo de 8Khz, o som reproduzido fica um tanto ‘metálico’ (voz de ‘robot’). No vídeo caseiro abaixo, mostra o som com taxa de amostragem a 4882hz, não sendo muito agradável:

[stream base=x:/blog.larios.tecnologia.ws/iBlog/wp-content/photos/2015/12/ flv=DSCN4697.flv embed=false share=false width=640 height=360 dock=true controlbar=over bandwidth=high autostart=false /]

Para amplificar o sinal PWM no pino 9, foi usado um amplificador integrado LM386, com encapsulamento de apenas 8 pinos, fornecendo por volta de 700 mWatts de potência.
Um ‘trimpot’ de 10K permite o ajuste do volume do som na reprodução. A alimentação do circuito deve se feita usando o fio das lanternas do veículo. Quando as lanternas estiverem desligadas, todo o circuito ficará desligado. Isto evita algum consumo indesejado por parte do circuito. O filtro de saída no pino 9 pode ser melhor afinado, trocando o valor do resistor de 1k e o capacitor de 220nF. Estes valores foram escolhidos na prática, sem o uso de alguma equação para determinar valores mais apropriados.
Mais dois fios devem ser ligados, além do fio da lanterna e do chassi (gnd): Um no interruptor de porta (do tipo que aciona ao negativo), e outro na chave de contato (+15). O alto falante pode ser um modelo pequeno, de boa qualidade, como aqueles usados em rádios AM/FM portáteis.
Obs. Esta montagem foi realizada apenas em placa experimental (do tipo Protoboard), sujeita a bugs ainda não observados. Está sendo fornecido os arquivos que poderão ser alterados conforme a necessidade do hobista.

Segue pasta com os arquivos desta montagem, com opção para CCS C compiler ou XC8 Compiler:

ALERTA_LANTERNA_LIG_FAL_FILES

Manuais:

PIC12F675
EEprom 24c256

Curiosidades:
Como adestrar seu cão
A arte de preparar um expresso
Tecnoestresse
O prego está com os dias contados!
Beber e pedalar não dá certo
Papel feito da bananeira
O poder de cura do mel

Outros assuntos:

Como gostar do seu trabalho
Como fazer seu segundo casamento dar certo
Recuperar a confiança no casamento
Como ensinar seu filho a usar a internet com segurança
Como controlar as birras
Preparar os adolescentes para a vida adulta
Coleção de Vídeos Educativos
Histórias Bíblicas Ilustradas

Até o próximo artigo!!!

1

6 comments

    1. 0

      Olá Cicero!
      Uma necessidade para funcionar o código apresentado é que exista no pic escolhido dois módulos internos:
      1) O módulo CCP (para gerar o PWM correspondente ao som reproduzido).
      2) O módulo SSP (para comunicação em alta velocidade com o SD Card, usando o protocolo SPI).
      O PIC 16f628a tem módulo CCP mas não tem módulo SSP. O código já não funcionará simplesmente migrando.

      Cláudio

  1. 0

    // Sound Recorder using SD card and PIC16F876A, by http://www.moty22.co.uk
    //
    // File will compile with the free Hi-Tech C compiler.
    // Recording is done by the ADC using only the LSB. Bytes are written to the SD
    // at the rate of 20KHz. It is similar to the format of .wav sound files.
    // For playback CCP is used as a DAC (Digital to Analogue Converter).

    #include

    __CONFIG(LVPDIS & WDTDIS & UNPROTECT & HS);

    #define CS RC0 //chip select input
    #define Stop RB0 //stop pushbutton
    #define Play RB1 //play PB
    #define Rec RB2 //record PB
    #define Pause RB3 //pause PB
    #define RecLED RB5
    #define errorLED RB4

    unsigned long loc; //pause location

    unsigned char SPI(unsigned char data) // send character over SPI
    {
    SSPBUF = data; // load character
    while (!BF); // sent
    return SSPBUF; // received character
    }

    char Command(unsigned char frame1, unsigned long adrs, unsigned char frame2 )
    {
    unsigned char i, res;
    SPI(0xFF);
    SPI((frame1 | 0x40) & 0x7F); //first 2 bits are 01
    SPI((adrs & 0xFF000000) >> 24); //first of the 4 bytes address
    SPI((adrs & 0x00FF0000) >> 16);
    SPI((adrs & 0x0000FF00) >> 8);
    SPI(adrs & 0x000000FF);
    SPI(frame2 | 1); //CRC and last bit 1

    for(i=0;i<10;i++) // wait for received character
    {
    res = SPI(0xFF);
    if(res != 0xFF)break;
    }
    return res;
    }

    void InitSD(void)
    {
    unsigned char i;

    for(i=0; i < 10; i++)SPI(0xFF); // min 74 clocks
    CS=0; // Enabled for SPI mode

    if (Command(0x00,0,0×95) !=1) errorLED = 1; // Reset SD command

    while (Command(0x01,0,0xFF) !=0) {} //wait for idle state

    SSPM1 = 0; // full speed 2MHz
    CS = 1;
    }

    void WriteSD(void)
    {
    unsigned int r,i;
    CS = 0;
    ADON = 1;
    RecLED = 1;

    r = Command(25,loc,0xFF); //multi sector write
    if(r != 0)
    {
    errorLED = 1;
    ADON = 0;
    RecLED = 0;
    }
    SPI(0xFF);
    SPI(0xFF);
    SPI(0xFF);

    while(Stop && Pause)
    {
    SPI(0xFC); //multi sector token byte
    for(i=0;i> 1);
    }
    SPI(0xFF); // CRC
    SPI(0xFF); // CRC

    if((r=SPI(0xFF) & 0x0F) == 0x05){ //data accepted = 0101
    for(i=10000;i>0;i–){
    if(r=SPI(0xFF)) break;
    }
    }
    else{
    errorLED = 1;
    }
    while(SPI(0xFF) != 0xFF); // while busy
    loc += 512;
    }
    SPI(0xFD); //stop transfer token byte

    SPI(0xFF);
    SPI(0xFF);
    while(SPI(0xFF) != 0xFF); // while busy

    CS = 1;
    ADON = 0;
    RecLED = 0;
    }

    void ReadSD(void)
    {
    unsigned int i,r;
    unsigned char data;
    CS = 0;
    r = Command(18,loc,0xFF); //read multi-sector
    if(r != 0)errorLED = 1; //if command failed

    while(Stop && Pause)
    {
    while(SPI(0xFF) != 0xFE); // wait for first byte
    for(i=0;i> 1);
    TMR2IF = 0;
    }
    SPI(0xFF); //discard of CRC
    SPI(0xFF);
    loc += 512;
    }

    Command(12,0×00,0xFF); //stop transmit
    SPI(0xFF);
    SPI(0xFF);
    CS = 1;
    }

    void main(void)
    {
    // unsigned char Pause = 0;
    // unsigned int i;
    loc = 512;

    // PIC I/O init
    TRISC = 0b10010000; // sck rc3, sdo rc5, sdi rc4, CS rc0, rc2 CPP1.
    TRISB = 0b1111; // switches
    RBPU = 0; //pullup on
    RecLED = 0;
    errorLED = 0;

    //analogue init
    CCP1CON = 0B1100; //PWM mode
    PR2 = 100; //20KHz
    T2CON = 0B100; //prescale 1, post scale 1, timer2 on
    ADCON1 = 0B11001110; // Fosc/16, ch1, ref=Vdd, right just.
    ADCON0 = 0B1000000; // Fosc/16.

    //SPI init
    SSPCON = 0B110010; //low speed osc/64(125kHz),enabled,clock idle=H
    CS = 1; // disable SD

    InitSD();

    while(1) {
    if(!Rec) WriteSD();
    if(!Play) ReadSD();
    if(!Stop) loc = 512;

    }
    }

  2. 0

    Ola Claudio Primeiramente Feliz ano Novo pra vc e toda sua Família, Claudio venho acompanhando seus Projetos são todos bons até hoje vc só faz Projetos bons, Parabéns mesmo, queria lhe perguntar porque vc não faz algo com um Micro SD Card, seria muito útil,,,
    Quero que vc veja este Link Claudio, sobre Um Gravador digital com Micro SD Card e um PIC, Se possível faz um projeto desse com PICS Mais facial e acessível de encontrar…
    http://320volt.com/pic16f876a-sandisk-sd-kart-ses-kayit-calma/

    1. 0

      Olá Cícero!
      Muito obrigado por seu comentário. Vendo o link do colega Moty notei que ele já fornece o que você deseja. Tem versão para 16f877 e 16f690 .Estes não são já fáceis de encontrar? Quais seriam os picos mais fáceis e acessíveis na sua opinião?

      Cláudio

Comments are closed.