quinta-feira, 28 de julho de 2016

Mais mudanças e recursos especiais do PIC (parte 1)

Pra galera que acompanha o blog, até então eu vinha usando os compiladores da Mikroe (tanto o mikroC quanto o mikroBasic no início), mas eles são pagos e limitam na versão demo os recursos e tamanho do programa que você pode escrever. Chegando ao limite dele, precisei achar uma saída, e resolvi então migrar para o compilador e IDE da própria Microchip: o MPLAB e como compilador o XC8. Então, a partir de agora, meus códigos serão todos para XC8.
As diferenças na linguagem não são tantas; a maior dificuldade é lidar com a falta de bibliotecas como havia no mikroC. Porém, como sou legal, me encarreguei de fazer o máximo que pude das bibliotecas mais usuais do mikroC e deixei neste link: só baixar e usar.
E nesse post já farei uso dessa nova plataforma. Hoje vou falar sobre um recurso interessante do PIC e que muitas vezes passa despercebido e raramente é usado, seja por não saber o que é ou por não achar referências muito claras, seja em português ou em inglês: o WatchDog Timer.

WatchDog Timer ou WDT

Vamos supor que seu PIC de alguma forma executou uma instrução que gerou uma operação inválida ou travou em um loop aguardando a resposta de um dispositivo que por algum motivo não respondeu, ou ainda, que sua fonte de clock primário parou. Para não deixar seu dispositivo parado/travado, existe esse módulo interno do MCU: o WDT. Vou deixar os maiores detalhes pra que vocês leiam na internet ou no datasheet, mas basicamente, o WDT opera com um clock próprio. É um timer que incrementa sozinho, mas a diferença é que automaticamente ao haver um overflow o PIC irá resetar. Cabe, então, ao seu programa constantemente limpar o WDT, e para isso temos a instrução clrwdt em assembly. Ela irá limpar o timer do WatchDog. No XC8 temos a função ClrWdt(); que fará o mesmo trabalho.
No exemplo de programa, usarei o PIC18F2550. Temos algumas pequenas diferenças, que explicarei. 

Prescaler e base de tempo

Primeiro de tudo, como falei, esse módulo tem seu próprio clock, e com isso, sua base de tempo. É importante se atentar a isso, que fica bem explícito no datasheet. No caso do PIC18F2550, com prescaler 1:1 temos 4 ms como base de tempo, ou seja, se a cada 4 ms o WDT não for limpo, o PIC irá executar a instrução de RESET. Fazendo uso do prescaler, podemos chegar a pouco mais de 2 minutos. É bom pensar no tempo escolhido, pois caso o PIC pare, ele ficará assim por esse determinado tempo.
E aqui entra uma pequena diferença: na família 12F e 16F, o prescaler é selecionado no registrador OPTION_REG, enquanto que na 18F há um um endereço especial dos bits de configuração para ele.

  

Controle por Software

No PIC18F2550 ainda temo outro recurso: o controle por Hardware do funcionamento do WDT. Quando este modo é ativado nos bits de configuração, temos um bit chamado SWDTEN (Software Controlled Watchdog Timer Enable bit) que nos permite, dentro do software, ligar ou desligar o módulo.

Limpando o Timer do WatchDog

Mais uma vez, aqui é bom uma conferida no datasheet: o WDT pode ser resetado por mais de um caminho. O comum a todos, como já citado, é a instrução própria para isso. Mas ainda há outros dependendo do PIC: mudança na fonte de clock primário, a instrução SLEEP, e etc.
Mas atentando ao principal: como vou ficar de tempo em tempo passando a instrução clrwdt? Tenho que ficar escrevendo isso linha a linha no código? Não! Aqui usamos um dos Timers disponíveis para gerar interrupções de tempo conhecido e assim passar a instrução. Sabendo a frequência do Clock e o tamanho do Timer podemos definir o prescaler e/ou postscaler para chegar a um tempo de interrupção menor que do WDT, e assim, limpá-lo antes do WDT estourar. Aqui você pode usar a calculadora que fiz :D (não deixe de conferir essa postagem).


Juntando tudo

Aqui segue um exemplo em C para o XC8, PIC18F2550:


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
/*
 * File:   WDT.c
 * Author: Stephen
 *
 * Created on 7 de Julho de 2016, 14:33
 */

// PIC18F2550 Configuration Bit Settings
// 'C' source line config statements
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1L
#pragma config PLLDIV = 5       // PLL Prescaler Selection bits (Divide by 5 (20 MHz oscillator input))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 2       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from the 96 MHz PLL divided by 2)

// CONFIG1H
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator (HS))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = ON        // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOR = ON         // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 0         // Brown-out Reset Voltage bits (Maximum setting 4.59V)
#pragma config VREGEN = OFF     // USB Voltage Regulator Enable bit (USB voltage regulator disabled)

// CONFIG2H
#pragma config WDT = ON         // Watchdog Timer Enable bit (WDT enabled)
#pragma config WDTPS = 256      // Watchdog Timer Postscale Select bits (1:256)

// CONFIG3H
#pragma config CCP2MX = OFF     // CCP2 MUX bit (CCP2 input/output is multiplexed with RB3)
#pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)


#define _XTAL_FREQ 20000000
#include  xc.h 
#include "delays.h"


void interrupt high_priority ISR()
{
    if(TMR0IF)
    {
        ClrWdt();
        TMR0H = 179;
        TMR0L = 180;
        TMR0IF = 0;
        LATC6 ^= 1;
    }
}

void main(void)
{
    ClrWdt();
    SWDTEN = 1;
    INTCON = 0xE0;
    INTCON2 = 0x74;
    IPEN = 1;
    T0CON = 0x87;
    TMR0H = 179;
    TMR0L = 180;
    TRISC = 0;
    LATC = 0;

    delay_ms(2000);
    LATC7 = 1;
    TMR0IE = 0;
    while(1);
}
Como podem ver, todos os #pragma são responsáveis por direcionar o compilador a gerar o código pros bits de configuração (essa parte não fica junto com a memória de programa). Explicando o importante, configurei meu PIC para rodar com Clock externo (HS) a 20 MHz, informado ao compilador em Hertz pelo #define _XTAL_FREQ 20000000. Meu prescaler do WDT ficou em 256, pois 256 x 4 ms = 1024 ms, ou aproximadamente um segundo para o WDT resetar o PIC. Habilitei o bit do WDT com opção de controle por software.
o #include "delays.h" inclui no programa o header delays, que será usado exatamente como a função delay_ms(); do mikroC;
Na interrupção, configurada para alta prioridade pelo modificador high_priority, vemos que a coisa é bem simples: executo a função para limpar o WDT, recarrego o Timer0 com seus valores calculados e limpamos a interrupção. De brinde tem um LED no PORTC6 que pisca para indicar que o WDT está sendo limpo. Simples assim! Ela está em modo de alta prioridade pois, se houver outra interrupção dentro do programa, é preferível que esta tenha prioridade, para evitar que o PIC reset por acidente.
Sobre a main, já começo o programa limpando o timer e habilitando via software o WDT. Em seguida, vem a configuração da interrupção para o Timer0 em modo de alta prioridade e a configuração do Timer0 para gerar a interrupção antes de 1024 ms. Dou um delay de 2 segundos e ligo outro LED, dessa vez no PORTC7, para indicar que desligarei a interrupção do Timer0, o que faço em seguida e ponho o PIC em loop eterno. Como desliguei a interrupção, a função de interrupção não será chamada, não limpando o WDT e assim permitindo seu estouro e consequente reset do PIC.
O que você verá mesmo é o LED do PORTC6 ligar (avisando que a interrupção foi chamada), o outro LED liga e um segundo depois os dois apagam, indicando que o PIC resetou.

E é isso! Esta é a base de uso do WDT. Agora é só implementar em seus programas sempre que possível para garantir que jamais seu projeto pare de funcionar. Próximo post falarei sobre o Fail-Safe Clock Monitor (FSCM). Até mais!

sábado, 9 de abril de 2016

Circuito anti-noob (é isso mesmo)

(ATUALIZADO 10/04/2016 22:09) 
Apesar da brincadeira no nome, o circuito é sério, afinal, difícil achar quem na eletrônica nunca queimou um componente ou circuito por ter invertido a polaridade ou fritou algo porquê não tinha um fusível ou custou a descobrir que nada funcionava pois o fusível estava queimado, não?
Este circuito, que pode ser usado na protoboard ou implementado em outro circuito vem pra resolver tudo isso: protege contra inversão de polaridade indicando se está certo ou não e indica se o fusível está queimado! Três circuitos em um!


o conjunto R2 D2 formam uma fonte de tensão baseada em um zener de 5V1 para o LED indicador , D3 protege contra alimentação reversa e R3 limita a corrente para o LED. Ao lado temos o mesmo circuito, porém invertido, para acender o LED caso a polaridade esteja errada. A ideia de se usar um zener é ter sempre o mesmo brilho no LED e segurança para qualquer tensão.
O indicador de fusível rompido é quase o mesmo circuito, porém com Q2 D8 e R8. Com o fusível
bom, a corrente flui por D8, cortando Q2. Se o fusível abrir, R8 liga a base ao negativo, acendendo o LED3.
D9, D10 e D11 impedem que a corrente circule pelos resistores associados de forma desnecessária.
Sobre o protetor contra reversão de polaridade, deixo a explicação para o vídeo de onde tirei o circuito. Aqui, inclusive, ele explica porque não usar a óbvia solução do diodo ou da ponte de diodos.
O circuito foi projetado para 12V. Para tensões maiores que 24V será necessário montar mais uma fonte zener, mas para a base de Q2. Para outras tensões, recalcular os resistores.


Essa é a PCB sugerida, pra vc usar em uma protoboard, por exemplo.
Para o MOSFET IRF9530, até 2,5A pode-se omitir um dissipador. Acima disso, recomendo por um dissipador de calor.
Caso ache um MOSFET de RDon menor, como o FQP27P06, será melhor usar ele para correntes maiores.

Então é isso! Monte o circuito e esteja protegido de noobs (e da sua falta de atenção)!
Boa sorte e boas montagens!

quinta-feira, 4 de fevereiro de 2016

Trilha curva pode?

Fala pessoal, tudo na paz?
Resolvi trazer essa postagem depois de ter visto muita gente questionando sobre a forma "correta" de se traçar as trilhas de uma PCB. Tem quem diga que não pode usar ângulos retos (trilha com "quinas"), tem gente que diz que não pode usar curvas. Enfim, não parece haver um consenso. Então resolvi, depois de pesquisar, trazer um compilado simples, com imagens, pra provar quem está certo ou errado nesta história.


O problema

Suponhamos a situação da seguinte imagem:


Considere que cada círculo seja uma ilha: terminais de resistores, diodo, MOSFET ou seja lá o que for, e você precisa conectar os dois. O caminho mais óbvio é ligar os dois em linha reta. Mas e se tem uma terceira ilha no meio do caminho e que não deve ser ligada com essas outras duas? Aí começa a dúvida.
Existem três caminhos lógicos e mais simples:


As três obviamente resolvem o problema. Interligamos os dois pontos  sem fazer uma reta já que hipoteticamente não podíamos. Mas vamos olhar isso de forma mais detalhada:


Se você somar os valores de cada trecho, verá que o primeiro desenho da esquerda para a direita possui maior comprimento seguido do com a curva e por fim o com um "chanfro". Aqui reside uma parte do problema: o comprimento da trilha. Em circuitos simples, não há o porque se preocupar com o comprimento das trilhas, mas em circuitos sensíveis, como ligações do tipo Kevin em sensores de corrente, circuitos que operam a altas frequências ou onde a resistência da própria trilha possa interferir, é preferível ter o menor comprimento o possível para evitar erros de medida ou interferências. Então a solução mais adequada é a do meio, que possui o menor comprimento.
O primeiro desenho da esquerda para a direita é bom quando você vai desenhar placas de coisas simples, como um pisca-pisca, uma lanterna com LEDs ou coisas que não tenha a preocupação de resistências mínimas ou interferências e que você fará na mão, usando a caneta, pois fica prático. 
E qual a situação ideal para as curvas? Aqui vejo apenas um caso que tenha uma justificativa na física para seu uso: circuitos que trabalhem com altas tensões (geralmente > 60 ~ 80V). Aqui entra um princípio da física chamado "Poder das Pontas", que resumidamente, diz que os corpos acumulam cargas de forma mais concentrada nas suas pontas, ou seja, em circuitos de alta tensão onde muitos elétrons estão circulando, quinas e pontas abrem margem para fugas ou até mesmo geração de arcos voltaicos (lembrando que tem toda a parte de isolamento, distância e etc.). Há quem diga que em circuitos de alta corrente também seja melhor usar curvas para "facilitar" o caminho, mas pela física (lei de ohm mandando abraço), quanto maior a corrente num resistor, maior a queda de tensão - o resistor aqui é sua trilha que, por mais que a idealizemos como um condutor perfeito (R = 0), ela tem uma resistência elétrica sim, e sob altas correntes, altas quedas de tensão.
Então, se não for passar alta tensão em uma trilha, não se justifica FISICAMENTE (depois explico o porquê desta ênfase) fazê-la curva.
Ainda na dúvida sobre essas dimensões acima? Vamos então observar cada uma de perto.
Para isso, colocarei todas as trilhas em ciclos trigonométricos pra facilitar a compreensão.


No nosso primeiro caso, notavelmente, o comprimento total da trilha em branco será 2L (L + L). Creio que aqui não há dúvidas. 


Quando adicionamos um ângulo (um chanfro) na trilha, a trigonometria entra em ação. "A soma dos catetos é sempre maior que a hipotenusa". Lembra do seu professor falando isso? Então, aqui está o exemplo. A trilha em sí que é a diagonal do triângulo branco será L / cos 45°, o que dá aproximadamente 1,4. Opa, 1,4 é menor que 2, então antes ter uma trilha que seja 1,4L do que 2L (30% menor). 


Por fim, o último caso é o da curva. Aqui já entra a parte de circunferência. Considere o arco sendo parte de uma circunferência. O comprimento total desta é 2 x pi x L, mas como temos apenas um quarto da circunferência (apenas 90°), o comprimento do arco será de (2 x pi x L) / 4, ou aproximadamente 1,57L. Ainda assim menor que o primeiro exemplo, mas maior que o segundo.

Mas e na prática?

Tirando os casos onde o uso de um desses tipos seja imperativo, de fato não há regra para o uso!
O que normalmente é levado em conta é o espaço disponível para cada trilha, a estética da placa e a facilidade de execução e confecção, seja na mão, tinta fotossensível, transferência de toner ou industrial mesmo.

Preferência para as curvas pela facilidade de desenho e estética. (Filtro PWM para Peltier)

Trilhas chanfradas para reduzir seus comprimentos, devido o trabalho com sinais (placa de desenvolvimento)

Veja que mesmo um circuito que trabalha com "altas" correntes (apróx. 6A) eu usei trilhas curvas, pois pra mim as quedas de tensão não eram importantes. Eu queria o protótipo funcionando para efetuar os ajustes, mas na placa onde trabalho com um microcontrolador, os cuidados com as trilhas já foi maior.
Então espero ter esclarecido essa dúvida de pode ou não pode cada tipo de trilha. Qualquer dúvida use o campo abaixo para comentários!
Valeu pessoal e até a próxima!

sábado, 16 de janeiro de 2016

Calculadora de Timer

Pessoal, estou de volta, e com boas novidades!
Como eu havia falado na publicação anterior, tive aula de programação na faculdade, e resolvi usar isso para algo. Da necessidade surgem as ideias, não é mesmo?
Eu já falei aqui no blogger sobre os Timers do PIC (mas praticamente todo microcontrolador tem o seu: ATMEL - que é a base do arduino -, Freescale, ST e etc), e quando você vai mexer com ele, você pode acabar fazendo algumas contas, que por vezes são chatas, trabalhosas ou você precisa ficar em tentativa e erro pra achar uma solução. Desta necessidade resolvi criar uma calculadora para uso com todo e qualquer Timer de qualquer Microcontrolador. O programa é simples, funciona em modo de texto mas é super intuitivo e simples. Ocupando só 37kB, vai ser uma mão na roda toda vez que você pensar em usar Timers.

Sim, eu gosto de azul.
Como pode ver, não é nada supremo, mas é o necessário: você entra com as informações desejadas e ele faz todo o trabalho de cálculo pra você e ainda salva os resultados em um arquivo .txt pra você poder ver de forma rápida e fácil depois os resultados. Outro ponto é que (quando possível) ele guarda os valores que você inseriu, pra facilitar as coisas se depois de fechar o programa você precisar alterar só um parâmetro.
Você pode baixar o programa aqui. Atente que existem três arquivos: TC_br (calculadora em português), TC_en (calculadora em inglês) e o config.bin. Baixe a calculadora da sua linguagem MAIS O ARQUIVO CONFIG.BIN. É nele que ficarão salvas suas configurações. Se você não o baixar, verá uma tela como essa sempre que abrir o programa:

Ela já diz tudo!
Espero que seja de grande valia e utilidade pra vocês. Lembrando que se gostar peço que compartilhe com seus amigos o blog (e não apenas o programa) pra me ajudar, até porque aqui ele lerá os termos de uso.  E quais são?

Ao baixar o programa TC_br, TC_br_UNIX, TC_en_UNIX ou TC_en você concorda publicamente em:
1. Não praticar engenharia reversa no software;
2. Redistribuir sem citar a fonte;
3. Comercializar, alugar ou obter qualquer tipo de lucro com ele;
4. Isentar o criador de quaisquer erros cometido pelo software ou prejuízos decorrentes da utilização deste.

Esclarecendo dois pontos alí: eu fiz esse programa com muito cuidado (afinal, eu vou usar ele também), testei ele várias vezes e não achei erros, mas pode acontecer de ter um erro ou outro. Se tiver, por favor não me xingue: seja educado e me comunique pelo e-mail que se encontra no programa para que eu corrija. Costumo fazer correções no mesmo dia e já atualizar o arquivo. Foram dois longos dias para criar esse programa, então espero sempre poder corrigir o mais rápido possível.
Outra que peço que não façam engenharia reversa porque eu apoio a comunidade OpenSource e a utilizo, então se quiser o código pra estudar ele está no SourceForge também. Só JAMAIS tire meus créditos, né! Qualquer dúvida, leia o arquivo LICENSE que está junto no diretório do projeto.

Espero que gostem. Utilizaremos ela na próxima aula! 

terça-feira, 15 de dezembro de 2015

Engenharia... de férias!

Blog voltando a ativa pessoal. Por pelo menos algum tempinho.
Pra quem não sabe ainda, entrei no curso de engenharia elétrica na UTFPR. Acabei de finalizar o primeiro período, e agora nas férias pretendo dar um up aqui no blog.
Mas tem uma mudança: agora passarei a ensinar em C. O motvo desta mudança é que no meu curso tivemos a matéria de computação, que foi em C, e pra me ajudar na adaptação à nova lingua resolvi passar a programar em C tbm para microcontroladores. Então a partir de agora estarei usando o mikroC. Vocês verão que pouca coisa irá mudar, e torço pra que se adaptem tão rápido quanto eu pude.

Em breve teremos mais coisas galera!

quarta-feira, 8 de julho de 2015

Dicas para reforçar a segurança em seu condomínio

Galera, a publicação de hoje foi gentilmente feita pelo Franklin Figueiredo da Ser-Tel segurança. Espero que seja útil a vocês, afinal, a eletrônica também está a serviço da segurança.  

 

Dicas para reforçar a segurança em seu condomínio

Nos dias de hoje, a segurança em prédios e condomínios deve ser cada vez mais eficiente e a tecnologia dos aparelhos de segurança se torna cada vez mais útil nas residências. A violência vem aumentando progressivamente no Brasil e todo o cuidado é pouco. Dicas de segurança
1-      Iluminação
As entradas do condomínio devem ser muito bem iluminadas, evitando que haja algum ponto cego para o porteiro ou seguranças.

2-      Kit CFTV
Instale câmeras de segurança internas, em corredores e elevadores. E externas para ter uma visão ampla do terreno e da rua.

3-      Cadastro dos moradores
Para ter o melhor controle de quem entra e sai do seu condomínio, fazer o cadastro dos moradores, como placa e cor de carro e dados pessoais, juntamente com um software de controle de acesso, ajudará muito no controle de segurança. Ele possibilitará um controle total da movimentação do edifício.

4-      Treinamento
Realize um treinamento eficiente de segurança e procedimentos com os seus funcionários periodicamente. Isso será importante para ter uma boa segurança e seu estabelecimento ou condomínio.

5-      Alarme
Instalando um alarme silencioso, que funcione através da ativação de um botão de pânico silencioso e um alarme comum para portas e portões. O botão de pânico irá acionar a empresa de segurança que há uma invasão.

6-      Sensores de proteção perimetral
A proteção perimetral acionará um alarme avisando que alguém tentou pular o portão ou o muro. Trazendo uma maior tranquilidade a todos.


7-      Passa Volumes
O ideal para receber entregas é ter um passa volumes, que evita o contato físico entre o porteiro e o entregador.

8-      Clausuras
As clausuras são um intervalo de espaço entre dois portões. Quando o visitante entra, o primeiro portão se tranca enquanto a entrada da pessoa é liberada, assim, o segundo portão se abre. Evitando que alguém não autorizado entre em seu estabelecimento.


Agência Trii
Franklin Figueiredo
Marketing Digital
(21) 3311-5030

terça-feira, 19 de maio de 2015

Driver para LED de potência

Eu amo LEDs. Acho que nenhum outro componente me fascina mais que os LEDs.
Mas eu só havia mexido com os comuns, pois na minha cidade eu nunca encontrava outras opções. Porém, um dia, enquanto eu comprava outros componentes, ví um homem ao lado comprando um LED de 1W. Era o que eu queria! Voltei lá outra hora e pedi um branco. Chegando em casa fui ver como ligar ele, e aqui começa o foco desta postagem.

Tensão constante vs. Corrente constante


Assim como os diodos LASER, os LEDs de alta potência possuem uma resistência interna baixa (um de 1W tem cerca de 10 ohms). Se ligados em uma bateria, eles drenarão quanta corrente eles puderem, e isso certamente levará eles à queima. Assim como nos outros LEDs, podemos colocar um resistor em série e ligá-los à uma fonte de tensão constante. Circuito mais simplista e barato, porém ineficiente. Duas coisas: se falamos de LEDs, temos que falar em eficiência. Usar um LED em um circuito que desperdice muita energia chega a ser absurdo. Um resistor sem dúvida não é a saída mais eficiente. Outra coisa é que se a tensão variar, pela lei de ohm a corrente também irá (uma vez que a resistência é fixa). Se ela variar pra menos, teremos apenas uma redução do brilho, mas se variar para mais, além de mais brilho teremos mais calor e consequentemente menor vida útil. Então a melhor saída é fazer como fizemos a alguns posts atrás com os LASERs: usar corrente constante. Não importa a tensão que você irá por no circuito, o LED sempre receberá a corrente necessária. O resto será dissipado em um transístor/MOSFET, o que é muito melhor, afinal é mais fácil por um dissipador em um deles do que conseguir um enorme resistor.

O circuito 


O circuito mais simples que achei e que mais me agradou foi a fonte de corrente constante. O circuito com minhas modificações é esse:

1R + 1R = 2R, não? 
Como eu disse, o circuito é simples. 
Começando pela alimentação, ela pode ir da tensão do LED + 1,5V pra assegurar um correto acionamento dos transístores até a tensão máxima do MOSFET. Mas aqui entra um ponto: ele estará trabalhando na região linear de funcionamento dele, então estará dissipando bastante energia, logo, quanto menor a tensão, menos calor produzido. 
Qualquer MOSFET tipo N servirá aqui, mas quanto menor o RdsOn dele, melhor, pois interferirá menos nos cálculos e produzirá menos calor. Escolhi o IRF3205 por ser barato, aguentar uma corrente de até 110A e pelo baixo RdsOn dele. 
R1 apenas limita a tensão em Q2, que funciona como um referencial de tensão, onde usamos a queda de tensão na junção (apróx. 0,7V) para calcular a corrente e mantê-la constante.
JP1 serve como um header para ligar um controle, onde quando EN estiver em nível alto, acenderá o LED.
Por fim, R2 e R3 são os responsáveis por ajustar a corrente no LED. Os motivos de eu usar dois de 1R ao invés de um de 2R são dois: reduzir a dissipação de calor e aproveitar mais os resistores, uma vez que aqui eles são vendidos apenas em dezenas.

Agora vem a parte matemática da coisa.
Um LED de 1W aceita em média um corrente de 320mA. Usarei esta corrente para os cálculos, mas  o circuito atende tranquilamente LEDs de outras potências. (considere Ra como R1+R2).
Considerando o BC547 que tem uma tensão de queda (Vce) de 0,7V (olhe no datasheet se for usar outro como o BC337).

iLED = (Vce) / (Ra+RdsOn)

iLED: corrente no LED;
Vce: tensão de queda na junção do transístor;
Ra: resistência do resistor de ajuste;
RdsOn: resistência interna do MOSFET quando ligado.

É isso. Achavam que fosse pior, não? Mas não acabou. Precisamos dimensionar a potência do resistor de ajuste. Para isso, usaremos a lei de ohm:

P = iLED² . Ra para o resistor e;
P = (Vcc - VLED)² . i para o MOSFET.

Alimento os meus dois circuitos com 5V e para ambos achei conveniente por dissipador nos MOSFETs, pois eles aqueceram. Em um circuito usei o IRF3205 e no outro o IRF640N. 

Essa foi a placa que usei. Dimensões em mm.

E segue as fotos dos meus dois circuitos montados. Perceba que em um deles dispensei o header de controle JP1.

Circuito usando o IRF640N

Circuito mais completo, com o IRF3205 e instalado em uma caixa.

LED azul, sem a lente.

Os dois funcionando.


Como vocês observaram, comprei o LED em sí, sem a placa "estrela" como você acha no ML. Achei melhor assim pois além de reduzir uma interface térmica sairia bem mais barato (não pagaria frete).
Se optar por fazer assim, sem usar a MCPCB, certifique-se de ter um bom dissipador (um dissipador de uns 4cm x 4cm com boas aletas) e uma boa pasta térmica. Passe uma camada bem fina no LED (parte chamada de slug, parte metálica circular na parte inferior do LED que é por onde o calor será emitido), posicione ele no centro do dissipador e cole-o firmemente. Pode ser que você precise levantar os terminais para que eles não toquem no dissipador. Recomendo usar tubos termo retráteis nos terminais para finalizar a soldagem. 

Pela internet existem vários outros circuitos, que usam diodo zener, divisor de tensão entre outros. Optei por esse por ter uma tensão de referência pequena, o que possibilita os resistores de ajuste de dissiparem menos potência. Veja que se você usasse o LM317, a tensão de referência é de 1,25V, o que exigiria um resistor de 3,9R, que dissiparia mais potência fora o desperdício do próprio LM317.