quarta-feira, 31 de agosto de 2016

Placas de desenvolvimento feitas em casa para o MSP430G

        Para continuar meu estudo da arquitetura do MSP430, construí três pequenas placas de desenvolvimento. Duas com barramento I²C e uma com SPI. A menor delas, já mostrei em um post anterior sobre o medidor de corrente/tensão com o INA219.
        Todas possuem um header de programação Spi-by-wire, um header para display I²C ou SPI, um header para alguns terminais do microcontrolador, um regulador low drop-out TPS76933 de 3,3V e, com exceção da menor, um cristal de quartzo tubular de 32.768Hz. Há também um LED bicolor ao lado do conetor para o display.

As três placas de desenvolvimento. A menor é para apenas o MSP430G2210/2230. As maiores, são para o MSP430G2553/G2452 de 20 pinos ou G2231/F2012/F2013 de 14 pinos.

Placas com os microcontroladores removidos. Note o regulador de tensão TPS76933 e o cristal de quartzo tubular.
Esquema da placa para o MSP430G2210/2230 com barramento I²C que está disponível para o display e para o header da direita.

Esquema da placa para o MSP430G2553/G2452/G2231/F2012/F2013 com barramento I²C que está disponível para o display e e para o header da direita junto com outros terminais.

Esquema da placa para o MSP430G2553/G2452/G2231/F2012/F2013 com barramento SPI que está disponível para o display e e para o header da direita junto com outros terminais.

Placa com display OLED azul I²C (controlador SSD1306) em operação.

Placa com display OLED branco SPI (controlador SSD1306) em operação.
Placa com display LCD SPI do Nokia5110 (controlador PCD8544) em operação.





quarta-feira, 24 de agosto de 2016

Antena biquadrática para Wi-Fi 2,4GHz

        Estava precisando de uma antena para usar na minha rede Wi-Fi que tivesse um ganho maior que as comuns que vem junta às placas de rede.
        Uma solução são as antenas direcionais que concentram o sinal em uma área ao invés de propagarem em todas as direções como a omnidirecional.
        Como o orçamento está muito limitado e estas antenas muito caras, resolvi construir uma. Achei vários projetos, uns com antena tipo Yagi e até com tubo de batata Pringles. Mas este me chamou a atenção: antena biquadrática cuja a construção é facil e os materiais são fáceis de encontrarNeste outro site, há um formulário para calcular as dimensões da antena para Wi-Fi de 2.4GHz e 5GHz.
        Montei a antena com fio rígido de 2,5mm² desencapado de instalação elétrica. Dobrei-o em 90° para formar os quadrados com as dimensões sugeridas no site do Martybugs, mas usei um conector SMA fêmea na antena em vez do tubo de cobre. Para o plano de terra, em vez de uma placa de fibra de vidro revestida de cobre, usei uma chapa de alumínio com bordas dobradas que tinha no meu "ferro-velho". A conexão da antena é feita por uma conector SMA reverso nesta chapa e um adicional TNC. A antena deve uma excelente performance, com alcance maior que uma omnidirecional. Também construí a biquadrática dupla, com resultados levemente melhores.

Detalhe da antena. Usei um conector SMA macho com a parte do cabo removida.

Antena vista de baixo mostrando o conector SMA.

Conector SMA reverso na chapa de alumínio com bordas dobradas.

Antena no conector.

Outra vista da antena.

Conector TNC ao lado.

Pig-tail no lado interno com os conectores SMA e TNC
Antena biquadrática dupla na chapa de alumínio dobrada.

Detalhe da antena biquadrática dupla.

Mesma chapa mostrando uma antena omnidirecional para comparar os resultados.
Por curiosidade, algumas antenas caseiras.


Drive de motor trifásico de corrente contínua sem escovas (BLDC Motor) com o TDA5143T

        Uma vez comprei numa loja HDDs IDE antigos como sucata, algo em torno de R$2,00 por unidade. Observando o circuito que aciona o motor que gira os discos de um deles, notei que era um TDA5143T da Philips (agora NXP). Este IC é bem simples perto dos outros acionadores pois não possui controle de velocidade, mas tem uma característica interessante: não usa sensores Hall para chavear as fases, usa a técnica de detecção da contra-força eletromotriz (back-EMF sensing technique). Há vários artigos explicando esta técnica portanto não postarei aqui. Montei o circuito conforme o exemplo do datasheet. O TDA5143T vem num SOIC de 20 pinos, portanto tive que usar um adaptador DIP.
        Ele tem proteção térmica, proteção contra curto-circuito nas saídas e se o rotor travar ele limita a corrente nas saídas. É um IC bem robusto, testei com vários motores e com tensões de 4V a 12V.
Diagrama interno do TDA5143T
Circuito de exemplo do datasheet. Usei o mesmos valores nos capacitores.

Placa com o TDA5143T ligado a um motor de disco rígido.


segunda-feira, 22 de agosto de 2016

Reaproveitando telas LCD de Net/Note Book com conversor VGA/LVDS

        Agora que alguns sites chineses estão aceitando boleto bancário, resolvi comprar uma placa milagrosa para aproveitar as telas LCD de Net/Note Book que tenho.
        Há diversos modelos que convertem VGA, DVI, HDMI e até TV Digial para LVDS (interface da maioria das telas LCD atualmente).
A placa que comprei é esta:
Placa VGA para LVDS com jumpers de seleção de bits/cor e resolução.
Vista inferior, com a legenda.
        Baseada no deconhecido MT6820-B, esta é rara de encontrar pois tem uma característica que é crucial para mim: a resolução e número de bits por cor é selecionada via jumper, ao contrário da maioria que é fixa e tem que ser programada por um programador específico com os parâmetros da tela LCD a ser usada.
        A programação por jumper dispensa o programador mas não tem muitas opções de resolução. Prefiro com jumper, pois conserto computadores e monitores, e a seleção por jumper facilita muito ajustar a placa para cada tela. Além disso, esses programadores tem pouco suporte dos fabricantes xing-ling. Tenha sempre a documentação (datasheet) da tela LCD, pois os pinos do conector não são padronizados. Os canais de dados LVDS até são iguais para a maioria, mas outras funções como backlight e alimentação não, e fica fácil de queimar.
        Comprei no Aliexpress, o PicaretaMercadoLivre chinês. A placa já foi enviada e estou aguardando chegar para testar com as minhas telas. Farei um novo post com os testes.

terça-feira, 16 de agosto de 2016

Computador para bicicleta

        Iniciei o projeto do computador para bicicleta que deve ter as seguintes funções/características:
- Medir a velocidade, obviamente;
- Medir distância em dois registros: um volátil e resetável (distância percorrida) e outro inresetável com cópia na E²PROM (odômetro);
- Medir tempo trascorrido e hora;
- Medir carga da bateria com um gaussímetro;
- Consumir muito pouca energia quando ocioso;
- Display visível à noite;
- Apenas dois botões de interface para facilitar a montagem mecânica e operação;
        Como tenho mais experiência com microcontroladores da Microchip, decidi usar o PIC18F14K22, pois tem bastante memória para guardar os bitmaps dos caracteres (16x16 e 32x32 mais alguns ícones), comunicação via barramento SPI, oscilador de baixo consumo de 32768Hz para base de tempo e módulo CCP (capture and compare).
        Para o display, usei um OLED branco baseado no controlador Solomon Systech SSD1306 com interface SPI. Entre OLED e LCD com backlight, preferi o primeiro, pois é barato, fácil de encontrar no PicaretaLivre MercadoLivre, e mais importante: está bem documentado e cheio de exemplos já que é muito usado no Arduíno. Tentei displays LCD de celulares antigos, como o externo do NOKIA2660, mas tem muito pouca informação, usa conectores muito pequenos e estão difíceis de encontrar. A muito custo consegui fazer um funcionar perfeitamente. E tem a questão do acionamento do backlight: são dois LEDs azuis devendo usar um conversor step-up para ligá-los. Por isto, só estou usando estes displays OLED. Usando um brilho minimamente aceitável, o consumo de corrente fica entre 10~20mA, parecido com o consumo do LCD com backlight ligado.

Placa do computador vista de cima mostrando o PIC18F14K22 e o conector para o display OLED ao lado.

Computador em ação, mostrando a velocidade e função odômetro. O B com seta em cima e circulo ao lado é para indicar o sinal do sensor que vai na roda. A cada volta, este muda de estado.

Cheguei a considerar a usar um LCD com lâmpada eletroluminescente, como este que fiz para um relógio e cuja postagem será feita algum dia. Este LCD é do motorola C115, com interface I²C.

       O sensor da roda está sendo um grande problema. Sensores óticos, qualquer sujeira já deixa de funcionar (sem falar do consumo). De aproximação usando indução ou capacitância, consumo altíssimo. E o sensor tem que estar sempre ligado. Resta os magnéticos, que usam o efeito Hall. Comecei a pesquisa com o confiável e robusto sensor UGN3132 da Allegro, mas este não opera nem nos 4V da bateria de Li-ION e tem uma corrente típica de operação de 4,3mA. Em seguida, o A3245, que opera em com 1,5mA, menor mas inaceitável apesar de operar com o mínimo de 3,6V. Decidi fazer como é feito nos computadores comuns de bicicleta: usar um reed switch. O problema agora é como este sinal chega no microcontrolador. Para calcular a velocidade, meço o intervalo de tempo entre cada pulso (um pulso por volta da roda) através do módulo MCCP do PIC. Ele usa o oscilador de 32768Hz e conta quantos ciclos deste que estão entre os pulsos de cada volta. Tendo o perímetro do pneu, chega-se na velocidade (em km/h):

Velocidade = (32768 x 36 / PR) / (COUNT x 1000)

Onde PR = perímetro do pneu em centímetros e COUNT = contagem do MCCP do PIC. Esta fórmula é bem próxima da real, foi simplificado os valores para ficar fácil implementar na programação do microcontrolador já que estou fazendo tudo em assembler, pois ainda patino no C.
        O problema é que o reed switch é um interruptor mecânico, e quando fecha e abre os contatos gera vários pulsos que são introduzidos na entrada do MCCP bagunçando a leitura. Assim deve ser feito um circuito de debouncer para filtrar este sinal. Mais um circuito para consumir energia. Usei um CMOS astável-monoestável 4047 para esta tarefa.

Circuito de debouncer do reed switch baseado no 4047.

        Funciona consumindo pouca energia. Mas tem um problema: quando a roda fica parada e o imã está ao lado do sensor, é gerado vários pulsos fazendo a velocidade variar. De vez em quando este circuito insere vários pulsos fazendo o odômetro disparar.








Dimmer digital com o MOC3023 e PIC12F675

        Lendo uma Elektor dos anos 90, vi um circuito de relé por estado sólido composto por um opto-acoplador muito especial e um TRIAC. Este opto-acoplador, MOC3041, tem um opto-TRIAC e um zero crossing circuit (aciona o TRIAC no início de cada semi-ciclo da rede independente do momento de disparo). Esta solução está sendo muito usada nas máquinas de lavar-roupas de baixo custo.

        O MOC3041 não pode ser usado em um dimmer pois o propósito dele é funcionar como um interruptor, mas existe a versão sem zero crossing circuit, o MOC3023, da qual usei.

        Fiz este dimmer com um microcontrolador para ter as seguintes características:
- Quando energizado, deve iniciar num estado definido. Neste caso, iniciar com ângulo de disparo nulo, ou seja, desligado.
- Ter um temporizador que desliga sozinho depois de um tempo, 8 horas por exemplo.
- Prover isolação entre rede elétrica e interface.
- Acionado por um encoder rotativo.
- Ter 32 níveis de potência que ficam numa tabela na E²PROM do PIC.

Foto de cima mostrando todos os componentes.

Foto de baixo. Note a linha de furos delimitando e isolando a parte ligada à rede elétrica.

TRIAC BTA24 com bornes de parafuso abaixo.
Esquema dos pinos.

      O sinal de sincronismo da rede elétrica vem da saída do transformador que alimenta o circuito do dimmer, sendo limitado por um diodo Zener. Este vai para o comparador interno do PIC12F675 que deve ter sua saída habilitada no pino correspondente para utilizar um resistor de histerese externo.

Circuito de sincronismo. Note o resistor de histerese no comparador.

Acionamento do TRIAC. Note que com este opto-acoplador o TRIAC é disparado nos quadrantes I e III.

        Quando a saída do comparador muda de alto para baixo, é gerada uma interrupção que desliga o LED do opto-acoplador e inicia uma temporização com o TIMER1 com um dos 32 valores guardados na E²PROM. Ao final desta temporização, é gerada outra interrupção que liga o LED. O circuito opera em cada semi-ciclo, no dobro da frequência da rede.
Teoria de operação.
Azul: Metade da senóide;
Vermelho: potência entregue à carga em função do ângulo de disparo;
Verde: faixa onde o firmaware opera.
Note que abaixo de 40° e acima de 140° a variação de potência é muito pequena.
Entrada do comparador em verde e senoide da rede elétrica em amarelo. As escalas estão erradas pois mudei as pontas de prova do osciloscópio e não mudei a escala.
Entrada do comparador em verde e saída em amarelo, usado como sinal de sincronismo pelo firmware. Note a leve distorção na entrada causada pelo histerese do comparador.
Ângulo de disparo nulo (desligado) em verde.
Ângulo de disparo para mínimo de potência em verde. 
Ângulo de disparo para metade de potência em verde.
Ângulo de disparo para potência máxima em verde.

        Testei somente em 127V, com uma lâmpada dicróica e uma furadeira, falta testar em 220V. Também falta testar com o BCR50GM, um TRIAC de 50A/600V para o controle de chuveiro elétrico onde quero testar uma interface capacitiva (sem contato direto e à prova d'água).
        Também testei com motores de indução monofásico com polo fantasma. Funciona, porém a resposta de velocidade não é linear, compensei isto mudando os valores da tabela de temporização.



segunda-feira, 15 de agosto de 2016

Adaptador MSP430G2230/2210 para o LaunchPad

        Dando continuidade ao estudo da arquitetura do MSP430, fiz este adaptador para o MSP430G2230/2210, sendo usado no MSP-EXP430G2 modificado.
         A pinagem do adaptador segue a do MSP430G2231 mas com menos pinos obviamente, de forma que seja fácil portar o software escrito para este:

MSP430F2231                     MSP430F2230

 1 DVCC                         1 DVCC
 2 P1.0/TA0CLK/ACLK             N/C
 3 P1.1/TA0.0                   N/C
 4 P1.2/TA0.1                   2 P1.2/TA0.1/A2
 5 P1.3                         N/C
 6 P1.4/SMCLK/TCK               N/C
 7 P1.5/TA0.0/SCLK/TMS          3 P1.5/TA0.0/A5/SCLK
 8 P1.6/TA0.1/SDO/SCL/TDI/TCLK  4 P1.6/TA0.1/A6/SDO/SCL
 9 P1.7/SDI/SDA/TDO/TDI         5 P1.7/A7/SDI/SDA
10 RST/NMI/SBWTDIO              6 RST/NMI/SBWTDIO
11 TEST/SBWTCK                  7 TEST/SBWTCK
12 XOUT/P2.7                    N/C
13 XIN/P2.6/TA0.1               N/C
14 DVSS                         8 DVSS

         No datasheet do MSP430G2230/2210 diz que os pinos da porta P1 e P2 ausentes são implementados mas não ligados externamente, assim devem ser definidos como entrada com pull-down ativado.

Adaptador destacado.

Adaptador no MSP-EXP430G2 modificado.


Servidor de arquivos com o Raspberry PI

        Estava muito curioso para saber como é o famoso Raspberry Pi. Comprei um usado no PicaretaLivre MercadoLivre por R$100 no ano passado. Estava como novo e veio com um case transparente de brinde. É o modelo B Rev.2, com dois furos de fixação e 512MB de RAM.
        Depois de muito fuçar no Raspibian e no hardware do Raspyberry Pi, decidi montar um servidor de arquivos. Modifiquei a placa retirando o conector de vídeo composto e áudio analógico e substituí o conector duplo USB por barra de pinos. Adicionei um dissipador de calor no SoC Broadcom BCM2835 para fazer overclock. Aliás, muito interessante o encapsulamento do mesmo: uma memória RAM BGA em cima do SoC também BGA. O gabinete veio de um receiver de TV via satélite com fonte chaveada, três botões em um conetor USB no painel.


Gabinete do receiver de TV por satélite reaproveitado.

        A fonte de alimentação, baseada no excelente IC da Power Integrations TOP254, retirei os componentes das saídas desnecessárias de ±7,5V e 3,3V, modificando o circuito de realimentação para usar somente a saída de 5V restante, além de por um trimpot para ajustar precisamente esta saída. Troquei também o conector de saída por um de três pinos. Substituí o interruptor por um com lâmpada neon.

Placa da fonte de alimentação chaveada.


Detalhe mostrando os componentes retirados, a adição do trimpot e troca do conector.

        O cabo de alimentação interno, fiz com duas saídas: uma com o mini-USB para o Raspberry e outra para o HDD de 2,5" de 500GB. Sugiro usar HDD de 2,5", pois só usa 5V simplificando muito a montagem. Importante alimentar o HDD direto da fonte, não pela saída USB do Raspberry, pois esta pode não suportar a potência necessária ao HDD, ativando os circuitos de proteção.
        Usei uma placa de case de HDD USB-SATA para ligar o mesmo no Raspberry. Substitui o conector USB por barra de pinos e adicionei mais uma para o LED de atividade ligada ao painel do gabinete.

Detalhe da placa USB/SATA com o conector USB substituído por barra de pinos e a alimentação vinda direta da fonte. Há também os dois fios para o LED de acesso no painel.

        A interface Ethernet, cortei um cabo e usei um passa-cabos na parte traseira do gabinete, crimpando um conector novo. Para a saída HDMI, a mesma coisa, porém foi muito trabalhoso ressoldar todos os fios no conetor HDMI. Este cabo usa quatro pares diferenciais com blindagens individuais, difíceis de desencapar sem estragar os fios.

Cabo Ethernet com novo conector e cabo HDMI com o conector ressoldado.

Cabos Ethernet e HDMI saindo pelos passa-cabos no lado de trás do gabinete. Note os adaptadores adicionais.

Detalhe dos passa-cabos, aproveitando a furação original do gabinete.
        Neste gabinete, há uma placa no painel contendo três botões, dois LEDs, um display, um IC TTL e um receiver infravermelho para controle remoto. Retirei tudo menos os botões. Os LEDs, substituí por um vermelho e outro azul de 2mm e adicionei mais um vermelho do adaptador USB-SATA. Há também um conector USB no painel que liguei no USB do Raspberry, assim posso ligar um teclado e mouse PS/2 com uma adaptador USB-PS/2.

Placa do painel modificada vista por trás. Note os resistores de pull-up e capacitores nos três botões.

Conector frontal USB do gabinete.
Esquema do conector do Raspberry Pi, mostrando a ligação dos botões POWER, UP e DOWN bem como os LEDs. O barramento I²C comentarei em um futuro post.

        Por hora, apesar de os três botões estarem ligados ao Raspberry Pi, somente o botão POWER está em uso. Ao ser pressionado, roda um script em Python que executa o comando "sudo shutdown -h now". Futuramente farei os botões UP e DOWN controlarem o volume.

Conectores USB do Raspberry Pi, um ligado ao conector USB do painel e outro no adaptador USB-SATA.

Visão geral do interior do gabinete. Para fixar o HDD e o Raspberry Pi, furei a chapa e fixei-os com parafusos e espaçadores. Note a bateria de Lítio do RTC ligado ao barramento I²C. Neste barramento ainda sai um cabo para ligar um futuro display OLED no Painel.

        Num equívoco, achando que daria mais performance ao servidor de arquivos, usei o sistema de arquivos exFAT, ficando muito lento. Depois testei com FAT32, um pouco menos lento, com NTFS tendo problemas de permissão e performance e finalmente com o nativo do Linux: o EXT4 que funcionou com a performance esperada. Recomendo usar este, os outros funcionam mas com muita dificuldade e limitações. Com o EXT4 e rede Ethernet de 100Mbits, consigo transferir arquivos a pouco mais de 8Mbytes/s, condizente para uma rede de 100Mbits/s. Testei o acesso com Wi-Fi pelo roteador e mesmo conectado a 72Mbit o desempenho é triste: mal consegue transferir 1Mbyte/s. É um problema que tenho notado em redes domésticas com Wi-Fi: o desempenho pífio mesmo conetado a mais de 100Mbit/s. Pesquisei muito e ainda não consegui uma resposta satisfatória.
        Para funcionar como servidor, usei o SAMBA. Tive bastante dificuldade no início por não saber muito de Linux, do SAMBA e de permissões de arquivos no EXT4.

Ajustes e oveclock: abaixo está o config.txt simplificado (sem os comentários) que usei no servidor. Desabilitei a saída de vídeo composto e fixei a resolução da saída HDMI em 1360x768 60Hz. Fiz o overclock do BCM2835 para 900MHz e habilitei o power-saver (quando ocioso, o clock cai para 450MHz). Habilitei a interface I²C, SPI e UART. Alterei o LED de atividade para a gpio25.

disable_overscan=1

hdmi_force_hotplug=1

hdmi_group=2

hdmi_cvt=1366 768 60 3 0 0 0

hdmi_drive=2

initial_turbo=60
arm_freq=900
arm_freq_min=450
core_freq=333
core_freq_min=175
sdram_freq=450
sdram_freq_min=250
over_voltage=2
gpu_mem=128

boot_delay=0
disable_splash=1

dtparam=i2c_arm=on
dtparam=i2c_arm_baudrate=100000
dtparam=spi=on
dtparam=uart0=on

dtoverlay=lirc-rpi

dtoverlay=i2c-rtc, ds3231

dtoverlay=pps-gpio,gpiopin=23
dtparam=act_led_activelow=on
dtparam=act_led_gpio=25

dtoverlay=bmp085_i2c-sensor

audio=on


        Futuramente pretendo trocar a placa do Raspberry para o 3, com processador quad-core e 64bits.