terça-feira, 25 de outubro de 2016

Pastilha de efeito Peltier

        O efeito Peltier é a geração de uma diferença de temperatura na junção de dois semicondutores de materiais diferentes quando submetidos a uma corrente elétrica. Atualmente é fácil e barato encontrar um pastilha de efeito Peltier, assim comprei uma para testar.
Efeito Peltier-Seebeck ou termo-elétrico.

Esquema de uma pastilha de Peltier.
Animação ilustrativa (tudo fica melhor com um GIF animado).
        A fonte para acionar uma pastilha precisa de uma saída de 14,4V até 16,4V com capacidade de no mínimo 8A. Há várias a venda mas são muito caras para esta brincadeira, assim resolvi modificar uma fonte ATX de PC. Comecei com estas fontes vagabundas que inundam o mercado nacional. Modifiquei 3 delas e todas explodiram pois não tem proteção contra sobre-carga. Só consegui um bom resultado com uma fonte de um computador HP com proteção completa que desarma por curto-circuito, sobrecarga ou temperatura. Nesta fonte, retirei todo os componentes do barramento de 5V e 3,3V, deixando somente os 12V e o 5V stand-by. Também alterei a realimentação para usar somente a saída de 12V com um acréscimo variável de 2V a 4V para fornecer os 14,4V da pastilha. Para habilitar/desabilitar a saída, usei um PIC10F200 para controle alimentado com os 5V stand-by, com um botão e um LED bicolor. Quando a saída está desabilitada, pisca o LED verde e quando a mesma é habilitada, o LED vermelho fica ligado sem piscar.

Fonte ATX aberta já com os componentes dos barramentos de 5V e 3,3V retirados.

Plaquinha com o PIC10F200 para fazer o controle Liga/Desliga através do sinal PS-ON da fonte ATX. Também controla o LED bicolor e faz o debouncer do botão.
Botão de controle ao lado do LED bicolor vistos por baixo. O corte da chapa da fonte ficou uma porcaria.
        A pastilha Peltier não é muito eficiente para converter energia elétrica em diferença de temperatura, assim além da energia térmica retirada do lado frio para o lado quente, ela adiciona mais energia ainda. Deve-se usar um dissipador bem grande com ventilação forçada. Outro cuidado a ser tomado é no acoplamento térmico. Na minha montagem fixei a pastilha com fixadores de transistores MOSFET de um regulador de tensão de uma placa da Dell e usei uma pasta térmica com base de prata. O resultado não foi empolgante, pois o dissipador é insuficiente.

Fixadores de MOSFETs com os parafusos M2.5 e espaçadores.
Pastilha com pasta térmica com base de prata aplicada. A furação no dissipador foi feita com uma broca para metal de 2,4mm e depois feita a rosca com um macho de 2,5mm, assim fica fácil aparafusar os 4 parafusos M2,5.
Pastilha posicionada assim como os espaçadores dos parafusos.
Pastilha fixada. Cuidado no momento de fixá-la, pois a pastilha é composta de duas chapas de cerâmica fáceis de quebrar.

Vista de lado.

        Para medir a temperatura, usei o LM73, um sensor de precisão com barramento I²C. Para medir a energia, usei o INA226 cujo projeto é mostrado em um post anterior.

Medição. A temperatura da pastilha ficou abaixo de zero mas com o dissipador aquecendo ela fico estabilizada em 4°C. Note a potência entregue à pastilha que passa de 85W.
Temperatura nas aletas do dissipador.

        Não consegui fazer a pastilha ficar abaixo de zero continuamente. Arrumei um excelente dissipador de Pentium4 (famosos por aquecer, pois alguns tinham TDP de mais de 100W!) de um computador da Dell que usa heat-pipes mas sua superfície é irregular nas bordas da pastilha, assim tenho que arranjar um jeito de deixar plano. Quando conseguir um dissipador melhor, refaço o teste e posto os resultados.

segunda-feira, 17 de outubro de 2016

Montagem do PC mini ITX

A Intel fez um excelente trabalho com a plataforma Bay Trail, pois é mais que um processador, é um sistemas em um único chip (SoC - System on Chip). Integram o processador, controlador de memória, hardware de vídeo e as interfaces básicas de um PC. Uma placa usando estes SoCs fica extremamente simples, pois só há o SoC e chips auxiliares com interface de rede e som além do regulador de tensão. Por serem fabricados com a técnica de 22nm, o consumo elétrico fica menor que 10W!, tão pouco que um dissipador sem ventoinha já é suficiente. Mais detalhes no Clube do Hardware.
Montei este PC para ser o secundário na casa. Precisava ser barato, pequeno e que consumisse pouca energia além de que sempre quis montar um PC com placa mini-ITX. O modelo que usei foi a MSI J1800I pois era a mais fácil de encontrar e custou quase R$200,00 na época. Queria ter montado com o a ASUS J1800I-C pois esta tem um soquete mini-PCIe para placa Wi-Fi.
O gabinete, comprei um minimalista com fonte externa de 12V. Este vem com uma placa com conversores DC-DC para 5V, 5V stand-by e 3,3V. Tem somente uma porta USB no painel frontal (poderia ter vindo com duas) e não tem saída para headphone.
Modifiquei o LED de acesso ao HDD pois ele fica no botão de liga/desliga junto com o LED POWER. Furei o painel e coloquei um LED vermelho de 2mm abaixo do botão.
Como esta placa não tem conector para mini-PCIe, usei um adaptador PCI-e/mini-PCIe para usar uma placa Wi-Fi. Também integrei as duas antenas ao gabinete, coladas na parte interior da tampa do painel frontal. Estas antenas são de um notebook e tem um baixo desempenho mas para meu uso são suficientes.
Também fiz um novo cabo de alimentação, pois o original só tem um conector de alimentação SATA e é muito longo, ocupando muito volume dentro do gabinete. Este cabo tem o comprimento certo e mais dois conectores SATA, ocupando bem menos volume.
O armazenamento, usei um SSD Kingstom de 64GB (para o sistema) herdado do upgrade do PC principal e um HDD Seagate de 320GB (para arquivos). Migrar para o SSD é uma experiência quase religiosa! O tempo de inicialização cai para menos da metade. Foi difícil espremer tanta coisa dentro deste gabinete.

Foto do site da MSI, J1800I vista de cima. Note que este dissipador sem ventoinha já é suficiente.
Foto do site da MSI, painel traseiro da J1800I.
Gabinete com a J1800I montada e cabos SATA, de alimentação e do painel frontal.
Placa Wi-Fi mini-PCIe no adaptador PCI-e/mini-PCIe. Note que tirei o espelho de fixação e para segurar o conjunto, usei uma borracha com adesivo. Os dois fios são cabos coaxiais das antenas.
Placa com os conversores DC-DC.
Parte interna do painel frontal.
Fonte de 12V que veio junto com o gabinete.
Cabo de alimentação ATX original.
Cabo que fiz. Como o consumo é muito baixo, não foi necessário colocar todos os fios do padrão ATX. Note que é no comprimento exato para não sobrar e ocupar volume.
Chapa/suporte com as unidades de armazenamento.
PC montado com a tampa removida.
Tampa fechada.
Painel traseiro.
Painel frontal.

sexta-feira, 7 de outubro de 2016

Termômetro digital de precisão com o LM73.

Termômetro digital de precisão com o LM73.

O LM73 é um sensor digital de temperatura de precisão com interface I²C, com resolução máxima de 1/32 de grau Celsius (0.03125°C/LSB). Para testá-lo e ver seu desempenho, montei uma placa tendo o cuidado de deixar sua face superior exposta para fazer o acoplamento térmico e assim medir a temperatura com maior precisão.
Para mostrar a temperatura, o firmware mostra a parte inteira simplesmente convertendo os bits mais significativos em decimal e a parte fracionária de 1/32 é usado uma tabela tabela de conversão na memória do PIC12F1822:

00000b ,00°
00001b ,03°
00010b ,06°
00011b ,09°
00100b ,13°
00101b ,16°
00110b ,19°
00111b ,22°
01000b ,25°
01001b ,28°
01010b ,31°
01011b ,34°
01100b ,38°
01101b ,41°
01110b ,44°
01111b ,47°
10000b ,50°
10001b ,53°
10010b ,56°
10011b ,59°
10100b ,63°
10101b ,66°
10110b ,69°
10111b ,72°
11000b ,75°
11001b ,78°
11010b ,81°
11011b ,84°
11100b ,88°
11101b ,91°
11110b ,94°
11111b ,97°

Placa do LM73. Note o IC abaixo das letras LM, um SOT23 de 5 pinos rodeado por resina epoxi cinza.
Placa com um PIC12F1822 e o minúsculo display OLED 128x32 mostrando a temperatura do LM73.
Medindo a temperatura da geladeira.









terça-feira, 4 de outubro de 2016

Complemento do post anterior do Relógio de precisão/Termômetro/Higrômetro

         Complementando o post sobre o Relógio de precisão/Termômetro/Higrômetro com o DS3231, HDC1080 e PIC16F1503.

Mesma placa do relógio mas com um display OLED cujas duas primeiras páginas são amarelas, o resto é azul. Por usar a mesma pinagem, fica intercambiável com o display LCD.
Na última linha é mostrada a temperatura interna do DS3231.

Display como veio do vendedor, ainda com a proteção. Abaixo dele o adaptador onde usei um conector de cartão de memória CompactFlash cortado.
Adaptador conectado ao display. Embaixo da resina epoxi cinza estão os capacitores do chargepump e o circuito RC de RESET.












segunda-feira, 3 de outubro de 2016

Relógio de precisão/Termômetro/Higrômetro com o DS3231, HDC1080 e PIC16F1503

        Recentemente a Texas Instruments me forneceu duas amostras de seu novo sensor de umidade/temperatura HDC1080 com interface I²C. Há muito tempo queria montar um relógio preciso que medisse estas grandezas assim como não perdesse a hora quando falta energia elétrica.
         Este sensor usa um encapsulamento com terminais muito pequenos, assim montei uma placa adaptadora.
Sensor HDC1080 montado por baixo da placa, com a abertura expondo a parte sensora no centro do furo.

        A medição do tempo é feita pelo DS3231, um RTC de alta precisão com o cristal de quartzo incorporado no encapsulamento, com compensação de temperatura e com interface I²C. Este RTC vem num SOIC de 16 pinos dos quais somente metade é usada. Fiz um adaptador DIP para ele.
        Para controlar tudo, usei um PIC16F1503, que só consegui com encapsulamento SOIC, também tendo que fazer um adaptador DIP.

Placa do relógio, com o PIC16F1503 e o DS3231 com seus horrendos adaptadores DIP. Há também a bateria de lítio pendurada.
Vista de baixo.
        O display usado é um Winstar WO1602, de 16x2 caracteres também com interface I²C (comprado na TATO Equipamentos Eletrônicos). Este tem um backlight simples de LED e usa o controlador Sitronix ST7032. Para operar em 3,3V, este display usa um charge pump composto de dois capacitores, assim montei uma pequena placa com os mesmos mais o IC TC54 para fazer o RESET e adaptar os pequenos pinos de interface.  Preferi usar um display LCD em vez do OLED porque este tem uma vida útil muito maior, pois o OLED perde o brilho com o tempo.

Pinagem do display Winstar WO1602.
Esquema para ligar em 3V ou 5V.

Display Winstar WO1602 com a placa adaptadora e os fios para ligar o backlight. Esta placa tem os mesmo 4 pinos do display OLED para ser intercambiável.
Vista de baixo. Note os terminais do display que tem metade do espaçamento dos furos da placa.
Vista de frente.

Relógio em operação mostrando a data completa, temperatura e umidade relativa.

     Para comunicar com o display, uso duas rotinas:

Rotina de envio de comando:
Envia I²C START bit
Envia ST7032_I2C_ADDRESS=0x7C + bit de escrita pela enterface I²C=0
Envia seleção de dado/comando 0x00 (Co, RS, 0, 0, 0, 0, 0, 0)
RS=0, COMMAND
Co=0, (continuation bit)
Envia I²C STOP bit

Rotina de envio de dado:
Envia I²C START bit
Envia ST7032_I2C_ADDRESS=0x7C + bit de escrita pela enterface I²C=0
Envia seleção de dado/comando 0x40 (Co, RS, 0, 0, 0, 0, 0, 0)
RS=1, DATA
Co=0, (continuation bit)
Envia I²C STOP bit


     Para iniciar o display, envio os seguintes comandos através das rotinas mostradas acima:

RESET,  feito por hardware pelo IC TC54;

FUNCTION SET=0x38 (0, 0, 1, DL, N, DH, 0, IS)
DL 1=8bit, 0=4bit
N 1=2lines, 0=1line
DH 1=double (N must be 0), 0=normal
IS 1=extended inst., 0=normal inst.

ENTRY MODE SET=0x06 (0, 0, 0, 0, 0, 1, I/D, S)
I/D 1=cursor/blink moves to right & ddram address is incremented, 0=cursor/blink moves to left & ddram address is decremented
S 1=shift of entire display, 0=no shift

CURSOR/DISPLAY SHIFT=0x14 (0, 0, 0, 1, S/C, R/L, 0, 0)
S/C 1=screen controlled by R/L, 0=cursor controlled by R/L
R/L 1=right, 0=left

FUNCTION SET=0x39 (0, 0, 1, DL, N, DH, 0, IS)
DL 1=8bit, 0=4bit
1=2lines, 0=1line
DH 1=double (N must be 0), 0=normal
IS 1=extended inst., 0=normal inst.

INTERNAL OSC FREQUENCY=0x14 (0, 0, 0, 1, BS, F2, F1, F0)
BS 1=1/4bias, 0=1/5bias
F2 F1 F0  3V FREQ.  5V FREQ. (2 LINE MODE)
0   0   0   122Hz     120Hz
0   0   1   131Hz     133Hz
0   1   0   144Hz     149Hz
0   1   1   161Hz     167Hz
1   0   0   183Hz     192Hz
1   0   1   221Hz     227Hz
1   1   0   274Hz     277Hz
1   1   1   347Hz     347Hz

CONTRAST SET=0x71 (0, 1, 1, 1, C3, C2, C1, C0)
C3~C0 contrast low nibble

POWER/ICON CONTROL/CONTRAST SET=0x54 (0, 1, 0, 1, ION, BON, C5, C4)
ION 1=display ON, 0=display OFF
BON 1=booster ON (OPF1=0, OPF2=0), 0=booster OFF
C5~C4 contrast high nibble

FOLLOWER CONTROL=0x6F (0, 1, 1, 0, FON, RAB2, RAB1, RAB0)
FON 1=internal follower ON (OPF1=0, OPF2=0), 0=internal follower OFF
RAB2~RAB0 V0 generator amplified ratio

DISPLAY ON/OFF=0x0C (0, 0, 0, 0, 1, D, C, B)
D 1=entire dsiplay ON
C 0=cursor OFF
B 0=cursor position OFF

CLEAR DISPLAY=0x01


        Para enviar os caracteres:
Envia o comando SET DDRAM ADDRESS=0x80 + DDRAM ADDRESS
Envia dado com o caractere ASCII


Inicialização do controlador de display OLED SSD1306.

        Dando sequencia aos posts sobre displays OLED, compartilho a seguir a inicialização destes displays baseados no controlador SSD1306.
        O controlador SSD1306 da Solomon Systech, é muito popular atualmente pois é usados em módulos OLED muito usados com o Arduino e similares. Estas módulos tem comumente resolução de 128x64 (máximo do controlador), mas também pode ter 64x32, 128x32, 64x48, etc. Variam de tamanho e cores (verde, amarelo e azul sendo o mais comum) e não possuem graduação de brilho, ou seja, ou o pixel está ligado ou não, sem meio termo. Podem ter interface I²C, SPI de 4 vias, SPI de 3 vias (pino D/C, data/command, susbstituído por mais um bit na comunicação), paralela de 8 bits 8080 ou 6800. A interface é definida por hardware via 3 pinos (BS0, BS1 e BS2).
        Como não sei que linguagem (C, assembler, python, etc.) de programação ou dispositivo (PIC, MSP430, etc.) você vai usar, preferi mostrar somente os passos de inicialização:

Observação: isto é um exemplo, que uso nos meus displays, assim consulte sempre a documentação dos mesmos e do controlador pois há parâmetros que podem variar assim como a sequência.

1
Aplica-se um pulso de RESET por no mínimo 3µs. Nos módulos com somente interface I²C, geralmente o RESET é feito via um circuito RC e o pino deste não está disponível.

Típico módulo OLED I²C. Note a ausência do pino RESET.
Típico módulo com interface SPI que pode usar 3 (somente CS) ou 4  (CS e D/C) sinais. Também pode usar I²C ajustando BS0 a BS2.
Módulo com interface paralela que também pode usar SPI e I²C. Note os resistores de 0R e a tabela para ajustar BS0 a BS2.

2
Após o RESET, envia-se o comando AEh (Set display OFF, Sleep mode).

3
Comando D5h (Set display clock divide ratio/oscillator frequency) seguido com o valor 80h (clock divide ratio=1).

4
Comando A8h (Set multiplex ratio) seguido com o valor 3Fh (64MUX).

5
Comando D3h (Set display offset) seguido com o valor 00h (display offset=0).

6
Comando 40h (Set display RAM display start line) + 00h (display RAM display start line=0).

7
Comando 8Dh (Charge pump setting) seguido com o valor 14h (Charge pump enabled). O charge pump deve ser habilitado antes de ligar o display (comando AFh, display ON).

8
Comando A1h (Set segment re-map, column address 127 is mapped to SEG0). Geralmente o mapeamento é feito assim, mas pode variar dependendo do módulo.

9
Comando C8h (Set COM output scan direction, remapped mode scan from COM[n-1] to COM0). Também é geralmente feito assim, mas pode variar dependendo do módulo.

10
Comando DAh (Set COM pins hardware configuration) seguido do valor 12h (Disable COM Left/Right remap & alternate COM pin configuration). Normalmente, usa-se o modo alternado, mas pode ser usado sequencial no caso do display de 128x32 (sequential COM pin configuration).

11
Comando D6h (Set zoom in) seguido do valor 00h (Vertical zoom disabled). Comando opcional, uso pois alguns microcontroladores tem pouca memória para guardar os bitmaps dos caracteres, assim consigo dobrar a altura dos mesmos sem consumir mais memória.

12
Comando 81h (Set contrast control) seguido do valor 28h (Contrast=40). O valor de contraste, ou brilho do display, varia de 0 a 255. 40 é um brilho razoável para não consumir muita energia, assim o display OLED fica com um consumo semelhante a um LCD com backlight de LED.

13
Comando D9h (Set pre-charge period) seguido do valor F1 (Phase 2 period=15DCLK & Phase 1 period=1DCLK).

14
Comando DBh (Set VCOMH deselect level) seguido do valor 20h (VCOMH deselect level=0.77*Vcc).

15
Comando 20h (Set memory addressing mode) seguido do valor 01h (Vertical addressing mode). Há 3 modos: horizontal, vertical e page address. Uso o vertical por ser mais fácil desenhar os bitmaps dos caracteres no display.

16
Comando A4h (Resume to RAM content display). O controlador mostra no display o conteúdo da RAM. Pode-se usar o comando A5h (Entire display ON) para testar o módulo.

17
Comando A6h (Set normal display). Cada bit 1 da RAM é um pixel aceso. Pode-se usar o comando A7h (Inverse display) onde cada bit 0 é um pixel aceso.

18
Comando 22h (Set page start and end address) seguido do valores 00h (start page=0) e 07h (end page=7). Opcional na inicialização, uso para apagar o conteúdo da memória RAM que inicialmente é aleatório.

19
Comando 21h (Set column start and end address) seguido do valores 00h (start column=0) e 7Fh (end column=127). Também opcional na inicialização, uso para apagar o conteúdo da memória RAM.

20
Opcional. Envia 1024 bytes de dados (00h) para limpar a memória RAM.

21
Por último, comando AFh (Set display ON) para ligar o maldito. Se tudo estiver funcionando, neste momento, o display estará sem um único pixel aceso.



Enviando os bitmaps dos caracteres:

        Há várias maneiras de desenhar um caractere no display, a que uso constituí de 4 variáveis e uma rotina de envio:
  • ASCII_Data - Caractere a ser desenhado de acordo com a tabela de bitmaps (Exemplo "T");
  • ASCII_Data_XOR_Mask - Máscara para inverter os pixels (o que é aceso fica apagado e vice-versa);
  • Char_Column - Coluna do caractere no display (0 a 15 com fonte 16x8);
  • Char_Row - Linha do caractere no display (0 a 3 com fonte 16x8);
  • Send_ASCII - Rotina que envia o bitmap do caractere contido em ASCII_Data nas posições Char_Column  e Char_Row. Esta rotina também incrementa automaticamente Char_Column e Char_Row para facilitar o envio de textos.
        Para tudo acontecer, primeiramente deve haver obviamente uma tabela contendo os bitmaps. Usei uma com apenas 64 caracteres para não ocupar muita memória e serve para quase tudo.
Bitmaps. Para ocupar menos memória, só considerei as letras maiúsculas, números e alguns caracteres. Também substituí alguns por outros mais funcionais.
          Antes de chamar a rotina de envio, define-se onde o caractere vai ser desenhado através das variáveis Char_Column e Char_Row. A rotina define a janela de operação através dos comandos 22h (set page) e 21h (set column) com a seguinte fórmula:

Initial page = Char_Row x 2;
End page = (Char_Row x 2) + 1;
Initial column = Char_Column x 8;
End column = (Char_Column x 8) + 7;

        Após definir a janela, envia-se os bytes referentes ao bitmap do caractere. Para esta fonte 16x8, envio 2 bytes em branco (1 coluna), 12 bytes do bitmap e mais 2 bytes em branco (mais 1 coluna).
        O modo de envio é o vertical:
Modo de envio vertical.
Envio dos dados da tabela.
     Após o envio do bitmap, a rotina Send_ASCII auto-incrementa Char_Column e Char_Row, assim pode-se enviar um texto definindo a posição uma única vez.