sexta-feira, 24 de março de 2017

Sensor de luz ambiente com o IC OPT3001.

        O IC OPT3001 da Texas Instruments é um sensor de luz ambiente com interface I²C. Ele mede a intensidade de luz visível cuja resposta espectral é idêntica à resposta do olho humano. Só esta disponível em encapsulamento SMD, assim adaptei-o em uma placa com um conector de 5 pinos em um capacitor de filtro na alimentação.
        Um exemplo de uso é o controle automático do brilho do display OLED com o SSD1306 em função da luz ambiente.

Placa com o OPT3001 colado no furo maior. Suas ligações estão no lado inferior.

        O resultado da medição da luz ambiente é dado por:
Luz ambiente (em LUX) = 2^EXP × RES/100
Onde EXP é o registro de exponente e RES o resultado fracional.

Firmware que mostra os registros EXP (Expoente) e RES (Resultado fracional).  Neste caso: 2^2 * 2156 / 100 = 86,24 Lux.







quinta-feira, 23 de março de 2017

PWM com o PIC10F322.

        Mais um uso para o PIC10F322: um PWM. Este microcontrolador possui dois módulos PWM, que por compartilharem o mesmo TIMER2, só funcionam na mesma frequência, porém com duty cycle diferentes, podendo serem ativos em nível alto ou baixo. A frequência é definida como:

PWMFREQ=FOSC/((PR2+1)*4*TMR2PRESCALE)

Onde TMR2PRESCALE pode ser 1, 4 ou 64. Usando o clock interno de 16MHz pode-se ter até 62,5kHz com resolução de 8bits.

O duty cycle é definido como:

PWMDUTYCYCLE=PWMxDCH&PWMxDCL[bits7&8]/((PR2+1)*4)


PMW a 6.2%.


PWM a 25%.


PWM a 50%.


        Adicionalmente, o CLOCK (FOSC/4) do PIC10F322 pode ser disponibilizado no pino RA2 com as frequências 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62,5kHz e 7,75kHz (esta última originada do LFINTOSC).

Clock interno (16MHz) no pino RA2 (FOSC/4=4MHz).









Teste do IC MPU6050.

        O IC MPU6050, da InvenSense, é um acelerômetro (g) e um medidor de razão de rotação (graus por segundo) em três eixos.

Placa do MPU6050 com um regulador de tensão e demais componentes.

       Assim como o magnetômetro do post anterior, o firmware apenas lê os valores do MPU6050 e mostra em um display OLED. Os valores variam muito e ainda estou estudando este IC. Há muitos parâmetros de configuração.

Valores dos registros do MPU6050: Eixo (X, Y e Z), Aceleração (16,384 LSB/g) e taxa de rotação (65,5 LSB/°/s). A última linha é a temperatura (340 LSB/ºC).

Teste do IC HMC5883.

        O IC HMC5883 é um magnetômetro de três eixos de baixo custo da Honeywell. Sua função é ser uma bússola eletrônica medindo a intensidade do campo magnético em três eixos (X, Y e Z), tem comunicação I²C e opera em 3,3V.

Placa do HMC5883 com um regulador de tensão e demais componentes.

        Por enquanto o firmware apenas lê os valores do HMC5883 e mostra em um display OLED. O HMC5883 foi ajustado para fazer uma média de 8 amostragens, modo de medição contínua a 75Hz, e 390LSB/Gauss de resolução.


Valores dos registros do HMC5883 e status dos bits LOCK e RDY.


sábado, 18 de fevereiro de 2017

Chave de toque capacitiva com o TTP223N.

        Recentemente, comprei umas plaquinhas com o sensor de toque capacitivo baseado no IC TTP223N-BA6 da Tontek, cuja função é substituir os tradicionais botões mecânicos para interface digital.
     Este IC tem uma entrada ligada a uma pequena área cobreada na placa que mede continuamente a sua capacitância. Ao encostar o dedo nesta área, que é isolada eletricamente, a capacitância é alterada e se passar de certo limite, a saída digital do IC muda de estado, que pode ser ajustada para ativa em nível alto ou baixo. Há também um histerese para evitar acionamentos indevidos, porém a sensibilidade não pode ser alterada.

Á direita, primeira placa que comprei. Á esquerda, uma  placa do lote de 30. ela é menor e mais fácil de colar em painéis plásticos.
Placas vistas do outro lado. Na maior, a área sensora não é isolada por verniz.

Saída ligada ao osciloscópio. Para minhas aplicações, fechei o jumper "A" da placa para que a saída fosse ativa em nível baixo. Note a ausência de glitches.

Desacionamento.

Sinal no terminal sensor.

Detalhe do sinal no terminal sensor.

Teste do módulo sintonizador de rádio FM com o IC RDA5807M.

     Em uma compra da Aliexpress, para aproveitar o frete, mandei vir um módulo de rádio FM baseado no IC RDA5807M. Seu circuito é inacreditavelmente simples, no módulo além do IC propriamente dito há apenas mais dois capacitores e um cristal de 32kHz. Já havia comprado um módulo baseado no IC TDA5767, receptor de rádio FM da NXP, mas nunca consegui fazê-lo funcionar.
        O módulo tem as seguintes características:
Duas bandas de frequência;
Saída de áudio Mono ou Stereo com potência suficiente para acionar um fone de ouvido;
Indicador de força do sinal ( RSSI );
Controle de volume;
Comunicação I²C;
Tensão de alimentação de 1,8V a 3,3V;

Pinagem do módulo.
Módulo montado em uma placa com os headers para o barramento I²C e alimentação à direita e saída de áudio à esquerda. O fio branco é um cabo coaxial que serve como antena.
Firmware que lista todos os endereços I²C: 0x78 é do controlador do display OLED SSD1308 e 0x20 é do RDA5807M, não descobri porque é listado os endereços 0x22 e 0xC0.

Inicialização:

        O RDA5807M possui vários registros de 16 bits. Para iniciá-lo, usei somente os registros 0x02 a 0x05 que são escritos enviando primeiro a parte alta e em seguida a baixa. Estes registros são enviados nesta ordem e em sequência:

Mapa de bits dos  registros 0x02 a 0x05.

RDA5807 REGISTER 0x02 HIGH
Valor: 0xD0

RDA5807 REGISTER 0x02 LOW
Valor: 0x0D

RDA5807 REGISTER 0x03 HIGH
Valor: 0x00
    BAND = 2 (76~108 MHz, world wide)
    Channel Spacing = 100kHz, sendo a frequência de sintonização = (Channel Spacing x Channel_Select + 76000)/1000, que neste caso é 76,0MHz

RDA5807 REGISTER 0x03 LOW
Valor: 0x18

RDA5807 REGISTER 0x04 HIGH
Valor: 0x00

RDA5807 REGISTER 0x04 LOW
Valor: 0x00

RDA5807 REGISTER 0x05 HIGH
Valor: 0x88

RDA5807 REGISTER 0x05 LOW
Valor: 0xA4
Volume = 4 (0 a 15).
Os bits 7 e 5 são reservados mas se não tiverem setados a recepção não funciona, ainda bem que peguei estes valores em um fórum do Arduino, nunca iria descobrir.

Operação:

        Para ler status e valores de operação, mando o firmaware ler os registros 0x0A e 0x0B, que também são lidos nesta ordem e em sequência. Após a leitura, trato os valores para serem mostrados do display.

Mapa de bits dos registros 0x0A e 0x0B.
Status e valores do RDA5807M: Bargraph é do RSSI (nível de recepção), modo da saída de áudio (mono ou stereo), status da sintonia (Tuned ou Seeking), frequência de sintonização, volume da saída de áudio (0 a 15) e os oito zeros são os RDS blocks (Informações de texto transmitidas pela estação FM que ainda não descobri como funciona).

RDA5807M procurando uma estação. Usei o modo de banda que abrange de 76 até 108MHz (world wide). Aqui no Brasil é usado de 88 até 108MHz (100 canais), porém com a migração de estações AM para FM e com o fim de canais de TV analógicos, esta faixa deve aumentar.

        Enviando o comando para procurar estações de rádio acima da frequência atual:
Seta bit SEEKUP de RDA5807 REGISTER 0x02 HIGH (1 = SEEK UP)
Reseta bit TUNE de RDA5807 REGISTER 0x03 LOW (0 = DISABLE TUNE)
Seta bit SEEK de RDA5807 REGISTER 0x02 HIGH (1 = ENABLE SEEK)
Escreve os registros 0x02 a 0x05 novamente

        Enviando o comando para procurar estações de rádio abaixo da frequência atual:
Reseta bit SEEKUP de RDA5807 REGISTER 0x02 HIGH (0 = SEEK DOWN)
Reseta bit TUNE de RDA5807 REGISTER 0x03 LOW (0 = DISABLE TUNE)
Seta bit SEEK de RDA5807 REGISTER 0x02 HIGH (1 = ENABLE SEEK)
Escreve os registros 0x02 a 0x05 novamente

segunda-feira, 13 de fevereiro de 2017

Usando displays de caracteres LCD comuns compatíveis com o contolador HD44780 via barramento I²C com o PCF8574/PCF8574A.

        Há displays de caracteres LCD com interface I²C, como o Winstar WO1602 (controlador Sitronix ST7032), usado no relógio com temperatura e umidade relativa, tema de um post anterior, porém são mais caros e difíceis de encontrar. Mas existe uma maneira de usar displays comuns compatíveis com o controlador Hitachi HD44780 no barramento I²C com o IC PCF8574/PCF8574A. Este IC fornece 8 entradas/saídas digitais através do barramento I²C. Também pode fornecer mais de 20mA no nível baixo por porta, muito útil para ligar LEDs. Esta solução é muito usada nos Arduinos, havendo vários modelos de placa para tal finalidade.

Exemplos de placas com o PCF8574 disponíves.
        Porém, apesar de funcionarem com 3,3V, estas placas não servem para minhas aplicações, pois o display não alcança o contraste necessário porque requer uma diferença de tensão maior, algo entre 4 e 5V. Assim fiz uma placa que tivesse um inversor de baixa potência para que o LCD operasse abaixo dos 5V habituais. Para tal, usei o IC CAT660 da Catalyst (agora ON Semiconductor), compatível com o ICL7660 da Intersil, que converte os 3,3V em -3,3V, resultando em 6,6V totais que passa por um divisor resistivo (trimpot de 1k) que vai para o terminal Vo (ou VLCD) do display.
        Tanto o PCF8574 quanto o PCF8574A operam com clock máximo do barramento I²C de 100kHz. A comunicação com o Display é feita no modo de 4 bits, requerendo duas transmissões por caractere e no fianl de cada transmissão lê-se a posição atual do caractere bem como o busy flag. A leitura do busy flag após cada transmissão permite a operação na máxima velocidade do controlador, além de não causar problemas de temporização em controladores mais lentos. A última porta (P7), é ligada a um MOSFET-N para controlar o backlight oriundo de uma fonte externa.

Placa montada. Note que usei o PCF8574A da Texas Instruments, não o comum PCF8574. Mesma função mas com endereços I²C diferentes, um cuidado a ser tomado no firmware. Testei também com o original PCF8574 da NXP para não haver dúvidas quanto ao funcionamento e compatibilidade.
Esquemático. Note o jumper de seleção de tensão Vo (ou VLCD) que pode ou não usar a tensão fornecida pelo CAT660, quando alimentado por 5V.
Display 16x2 antigo com o HD44780 em operação alimentado com 3,3V, comprovando o funcionamento e compatibilidade do mesmo. Este display não possui backlight.
Vista inferior do mesmo display antigo, mostrando o HD44780 auxiliado por um HD44100 (usado quando se tem mais de 16 caracteres).
Display 20x4 moderno com controlador desconhecido em operação com o mesmo firmware.

        Nota: quase a totalidade do displays de caracteres vendidos atualmente usam ICs compatíveis com o HD44780 da HITACHI (agora RENESAS). Este IC não é mais fabricado, podendo ser encontrado somente em displays bem antigos como mostrado anteriormente, porém outros fabricantes dispõe seus clones ou compatíveis. Segue a lista:

KS0066 SAMSUNG
KS0076 SAMSUNG
KS0070 SAMSUNG
S6A0069 SAMSUNG
LC7985NA SANYO
SED1278 EPSON
NT3881D NOTATEK
SPLC780 SUNPLUS
MSM6222 OKI
NJU6408B NJR
NJU6468 NJR
NJU6470 NJR
UM3881B UMC (Não tenho certeza se é compatível)
T7934 TOSHIBA (Não tenho certeza se é compatível)