Pesquisar este blog

segunda-feira, 11 de maio de 2020

Grilo Eletrônico

Grilo Eletrônico


Um pequeno e simples circuito que fiz há muito tempo. Ele usa um fototransistor para detetar se há luz ambiente e quando fica escuro ele habilita que o PIC comece a emitir sons de um grilo, em períodos de tempo aleatórios. No caso de alguém acender a luz, ele suspende o som de grilo.  Um bom brinquedinho para as crianças.
O buzzer deve ser daqueles que emite som só com a alimentação, sem precisar de um oscilador. A combinação com os pulsos vindos do PIC é que formam o som parecido com o cri-cri de grilos.  

Código para gravar no PIC:
:100000006928210820040319A00A8030201AA106BB
:100010002019A106A018A106210DA00DA10D64288C
:10002000A301A200FF30A207031CA307031C64283E
:100030000330A100DF301E201228A101E83EA000FD
:10004000A109FC30031C2728A00703182428A007B7
:100050006400A10F242820182D28A01C312800009E
:1000600031280800A20001303828A20006303828C4
:10007000A80023082102031D3F2822082002043083
:1000800003180130031902302805031DFF306428CE
:10009000A501A4011030A600210DA40DA50D220874
:1000A000A4022308031C230FA50203185E282208BC
:1000B000A40723080318230FA5070310A00DA10D03
:1000C000A60B4C28200864288313031383126400B2
:1000D00008000730990083162F30850083128501B0
:1000E000B801B9016400851A76288F203A08A0006B
:1000F0003B08A10001202008BA002108BB003A08F3
:10010000A0003B08A1000A30A200A3014820BC00C7
:100110002108BD003D08A3003C08112070283A08C2
:10012000A0003B08A10001202008BA002108BB0064
:100130003A08A0003B08A100EA30A3006030352057
:10014000031DA6282730A300103011200330A30080
:10015000E83011200130B800B9013808A000390892
:10016000A100A30128303220031DC028051603304A
:100170001020051204301020B80A0319B90FAD2859
:08018000051208006300C2280B
:02400E008C3FE5
:00000001FF




sábado, 22 de fevereiro de 2020

Módulo de display para Raspberry Pi

Monitor de Temperatura e Uso do Processador do Raspberry Pi


Há muito tempo eu tinha montado uma plaquinha com 3 displays de 7 segmentos e um tecladinho para usar com projetos com PICs.  Mas eles também servem para ser usados com outras plataformas, como o Arduíno e o Raspberry Pi.  
Eu uma revista inglesa eu vi um projeto interessante para usar um display OLED para monitorar a temperatura, o uso de processamento e a memória do Raspberry Pi.  Eu até tenho o display OLED, mas resolvi usar um display de leds para fazer esse monitoramento.
A linguagem utilizada é o Python, que é bem fácil de aprender e programar. A parte mais importante é saber quais módulos importar para ter algumas funções que desempenhem o trabalho.  Dois módulos são importantes nesse caso: o "psutil" e o "gpiozero", além do "time".  O primeiro vai permitir que se leia o nível de processamento do Raspberry, e o módulo gpiozero facilita para acionar os segmentos e os displays através das portas GPIO do Raspberry.

O esquema da plaquinha do display é o seguinte:
É importante lembrar que as portas do Raspberry tem capacidade de corrente bem menor do que os PICs ou do Arduíno.  Uma GPIO do Pi pode fornecer até 16mA individualmente e até 50mA somadas todas as portas.  Além disso a tensão delas é de 3,3V.  Considerando que a tensão sobre o segmento led seja de 1,7V e a tensão Vce do transistor chaveador esteja por volta de 0,3V, a corrente por porta chegaria a um valor aproximado de 1,3V/330ohms = 4mA por porta/segmento, o que está bem confortável.  Como os transistores são PNP e os displays são anodo comum, os acionamentos se farão com nível lógico baixo nas portas GPIO.  Além disso, os displays serão multiplexados.

Uma foto da minha plaquinha e tecladinho:

 Aqui a placa com mais detalhe:
Os resistores estão pelo lado de baixo e são SMDs 1206.

Para interligar com o Pi, eu uso aqueles fios com conectores fêmea nas duas pontas, vendidos já prontos e comuns nos kits de Arduíno.

Agora a listagem do programa em Python 3:

##################################################################
from gpiozero import Button, LED
from time import sleep
import psutil

segma = LED(14)      #designa as portas para cada segmento
segmb = LED(15)
segmc = LED(18)
segmd = LED(23)
segme = LED(24)
segmf = LED(25)
segmg = LED(8)
segmp = LED(7)

anod1 = LED(11)    #designa as portas para chavear os displays
anod2 = LED(9)
anod3 = LED(10)

anod1.on()      #desliga os displays
anod2.on()
anod3.on()

tempo = 0.005    #tempo de acionamento de cada display 5ms
unidade = 0
dezena = 0
centena = 0

def digito(x): #função para codificar os segmentos de acordo com o digito
   
if x == 0:
        segma.off()
        segmb.off()
        segmc.off()
        segmd.off()
        segme.off()
        segmf.off()
        segmg.on()

    elif x == 1:
        segma.on()
        segmb.off()
        segmc.off()
        segmd.on()
        segme.on()
        segmf.on()
        segmg.on()       
       
    elif x == 2:
        segma.off()
        segmb.off()
        segmc.on()
        segmd.off()
        segme.off()
        segmf.on()
        segmg.off() 

    elif x == 3:
        segma.off()
        segmb.off()
        segmc.off()
        segmd.off()
        segme.on()
        segmf.on()
        segmg.off()
       
    elif x == 4:
        segma.on()
        segmb.off()
        segmc.off()
        segmd.on()
        segme.on()
        segmf.off()
        segmg.off()
       
    elif x == 5:
        segma.off()
        segmb.on()
        segmc.off()
        segmd.off()
        segme.on()
        segmf.off()
        segmg.off() 
       
    elif x == 6:
        segma.off()
        segmb.on()
        segmc.off()
        segmd.off()
        segme.off()
        segmf.off()
        segmg.off()
       
    elif x == 7:
        segma.off()
        segmb.off()
        segmc.off()
        segmd.on()
        segme.on()
        segmf.on()
        segmg.on() 


    elif x == 8:
        segma.off()
        segmb.off()
        segmc.off()
        segmd.off()
        segme.off()
        segmf.off()
        segmg.off()
       
    elif x == 9:
        segma.off()
        segmb.off()
        segmc.off()
        segmd.off()
        segme.on()
        segmf.off()
        segmg.off()
       
def scan():   #faz a multiplexação dos displays
   
digito(unidade)
    anod1.off()
    sleep(tempo)
    anod1.on()
    digito(dezena)
    segmp.off()
   
if dezena == 0 and centena == 0:
        anod2.on()
    else:
        anod2.off()
    sleep(tempo)
    anod2.on()
    segmp.on()
    digito(centena)
    if centena == 0:
        anod3.on()
    else:
        anod3.off()
    sleep(tempo)
    anod3.on()

while True:
    #print(centena,dezena,unidade)    #mostra os valores no shell
   
for i in range(50):
        scan()         #chama a multiplexação
    #obtem o valor da temperatura do processador
    f=open("/sys/class/thermal/thermal_zone0/temp","r")
    t=f.readline()
    t=float(t)
    t=round(t/1000,2)
    # mostra a temperatura no shell
    print(t)
   
centena = int(t/10)
    dezena = int(t-(10*centena))
    unidade = 10*(t-(10*centena)-dezena)
    for i in range(50):
       
scan()  #chama a multiplexação
    # obtem o uso de processamento da CPU
    cpu=psutil.cpu_percent(interval=1)
    cpu=round(cpu)
   
print(cpu)   # mostra o uso no shell
    centena = int(cpu/100)
    dezena = int((cpu-(centena*100))/10)
    unidade = cpu - (10*dezena) - (100*centena)

################################################################

 O programa em Python lê o valor do sensor de temperatura interno do processador e mostra o valor no display em °C  (o valor de 3 dígitos), em seguida obtém  o valor porcentual de uso do processador (de 0 a 100) e mostra no display.  Não implementei o valor de uso da memória RAM.

No programa Python é importante se ater ao indentamento correto de cada linha (a tabulação é de 4 espaços por vez).

Aqui um vídeo mostrando o monitoramento da temperatura e do processamento:

https://youtu.be/5Pkx20tYdWs

Houve algum problema no acionamento do ponto decimal, portanto a temperatura não é de 444°C, mas de 44.4°C.

E o vídeo com o Raspberry rodando Minecraft:

https://youtu.be/NlfPD95fYDw

Eu rodei o programa e a placa ligados a um Raspberry Pi 1 modelo B, com 512M de RAM.  Deve rodar sem problemas nas versões mais modernas do Raspberry.





quinta-feira, 12 de dezembro de 2019

Firmware original do Nestor

Código Original do Computador Nestor

Para quem for montar o circuito original do Nestor da revista Nova Eletrônica, segue a listagem hexadecimal do código a ser gravado na EPROM 2716.

:020000040000FA
:100000000620804F305E963A47D44520140439DAF2
:10001000A201512245910C292932D04049C14806FC
:1000200020B1016B53081D501107B292D500C502D3
:10003000B2B807820062C02E97E822E1800001106A
:100040000620804F305E963A47D44520140439DAB2
:10005000A201512245910C292932D04049C14806BC
:1000600020B1016B53081D501107B292D500C50293
:10007000B2B807820062C02E97E822E1800001102A
:100080000620804F305E963A47D44520140439DA72
:10009000A201512245910C292932D04049C148067C
:1000A00020B1016B53081D501107B292D500C50253
:1000B000B2B807820062C02E97E822E180000110EA
:1000C0000620804F305E963A47D44520140439DA32
:1000D000A201512245910C292932D04049C148063C
:1000E00020B1016B53081D501107B292D500C50213
:1000F000B2B807820062C02E97E822E180000110AA
:100100000620804F305E963A47D44520140439DAF1
:10011000A201512245910C292932D04049C14806FB
:1001200020B1016B53081D501107B292D500C502D2
:10013000B2B807820062C02E97E822E18000011069
:100140000620804F305E963A47D44520140439DAB1
:10015000A201512245910C292932D04049C14806BB
:1001600020B1016B53081D501107B292D500C50292
:10017000B2B807820062C02E97E822E18000011029
:100180000620804F305E963A47D44520140439DA71
:10019000A201512245910C292932D04049C148067B
:1001A00020B1016B53081D501107B292D500C50252
:1001B000B2B807820062C02E97E822E180000110E9
:1001C0000620804F305E963A47D44520140439DA31
:1001D000A201512245910C292932D04049C148063B
:1001E00020B1016B53081D501107B292D500C50212
:1001F000B2B807820062C02E97E822E180000110A9
:100200000620804F305E963A47D44520140439DAF0
:10021000A201512245910C292932D04049C14806FA
:1002200020B1016B53081D501107B292D500C502D1
:10023000B2B807820062C02E97E822E18000011068
:100240000620804F305E963A47D44520140439DAB0
:10025000A201512245910C292932D04049C14806BA
:1002600020B1016B53081D501107B292D500C50291
:10027000B2B807820062C02E97E822E18000011028
:100280000620804F305E963A47D44520140439DA70
:10029000A201512245910C292932D04049C148067A
:1002A00020B1016B53081D501107B292D500C50251
:1002B000B2B807820062C02E97E822E180000110E8
:1002C0000620804F305E963A47D44520140439DA30
:1002D000A201512245910C292932D04049C148063A
:1002E00020B1016B53081D501107B292D500C50211
:1002F000B2B807820062C02E97E822E180000110A8
:100300000620804F305E963A47D44520140439DAEF
:10031000A201512245910C292932D04049C14806F9
:1003200020B1016B53081D501107B292D500C502D0
:10033000B2B807820062C02E97E822E18000011067
:100340000620804F305E963A47D44520140439DAAF
:10035000A201512245910C292932D04049C14806B9
:1003600020B1016B53081D501107B292D500C50290
:10037000B2B807820062C02E97E822E18000011027
:100380000620804F305E963A47D44520140439DA6F
:10039000A201512245910C292932D04049C1480679
:1003A00020B1016B53081D501107B292D500C50250
:1003B000B2B807820062C02E97E822E180000110E7
:1003C0000620804F305E963A47D44520140439DA2F
:1003D000A201512245910C292932D04049C1480639
:1003E00020B1016B53081D501107B292D500C50210
:1003F000B2B807820062C02E97E822E180000110A7
:100400000620804F305E963A47D44520140439DAEE
:10041000A201512245910C292932D04049C14806F8
:1004200020B1016B53081D501107B292D500C502CF
:10043000B2B807820062C02E97E822E18000011066
:100440000620804F305E963A47D44520140439DAAE
:10045000A201512245910C292932D04049C14806B8
:1004600020B1016B53081D501107B292D500C5028F
:10047000B2B807820062C02E97E822E18000011026
:100480000620804F305E963A47D44520140439DA6E
:10049000A201512245910C292932D04049C1480678
:1004A00020B1016B53081D501107B292D500C5024F
:1004B000B2B807820062C02E97E822E180000110E6
:1004C0000620804F305E963A47D44520140439DA2E
:1004D000A201512245910C292932D04049C1480638
:1004E00020B1016B53081D501107B292D500C5020F
:1004F000B2B807820062C02E97E822E180000110A6
:100500000620804F305E963A47D44520140439DAED
:10051000A201512245910C292932D04049C14806F7
:1005200020B1016B53081D501107B292D500C502CE
:10053000B2B807820062C02E97E822E18000011065
:100540000620804F305E963A47D44520140439DAAD
:10055000A201512245910C292932D04049C14806B7
:1005600020B1016B53081D501107B292D500C5028E
:10057000B2B807820062C02E97E822E18000011025
:100580000620804F305E963A47D44520140439DA6D
:10059000A201512245910C292932D04049C1480677
:1005A00020B1016B53081D501107B292D500C5024E
:1005B000B2B807820062C02E97E822E180000110E5
:1005C0000620804F305E963A47D44520140439DA2D
:1005D000A201512245910C292932D04049C1480637
:1005E00020B1016B53081D501107B292D500C5020E
:1005F000B2B807820062C02E97E822E180000110A5
:100600000620804F305E963A47D44520140439DAEC
:10061000A201512245910C292932D04049C14806F6
:1006200020B1016B53081D501107B292D500C502CD
:10063000B2B807820062C02E97E822E18000011064
:100640000620804F305E963A47D44520140439DAAC
:10065000A201512245910C292932D04049C14806B6
:1006600020B1016B53081D501107B292D500C5028D
:10067000B2B807820062C02E97E822E18000011024
:100680000620804F305E963A47D44520140439DA6C
:10069000A201512245910C292932D04049C1480676
:1006A00020B1016B53081D501107B292D500C5024D
:1006B000B2B807820062C02E97E822E180000110E4
:1006C0000620804F305E963A47D44520140439DA2C
:1006D000A201512245910C292932D04049C1480636
:1006E00020B1016B53081D501107B292D500C5020D
:1006F000B2B807820062C02E97E822E180000110A4
:100700000620804F305E963A47D44520140439DAEB
:10071000A201512245910C292932D04049C14806F5
:1007200020B1016B53081D501107B292D500C502CC
:10073000B2B807820062C02E97E822E18000011063
:100740000620804F305E963A47D44520140439DAAB
:10075000A201512245910C292932D04049C14806B5
:1007600020B1016B53081D501107B292D500C5028C
:10077000B2B807820062C02E97E822E18000011023
:100780000620804F305E963A47D44520140439DA6B
:10079000A201512245910C292932D04049C1480675
:1007A00020B1016B53081D501107B292D500C5024C
:1007B000B2B807820062C02E97E822E180000110E3
:1007C0000620804F305E963A47D44520140439DA2B
:1007D000A201512245910C292932D04049C1480635
:1007E00020B1016B53081D501107B292D500C5020C
:1007F000B2B807820062C02E97E822E180000110A3
:100800000620804F305E963A47D44520140439DAEA
:10081000A201512245910C292932D04049C14806F4
:1008200020B1016B53081D501107B292D500C502CB
:10083000B2B807820062C02E97E822E18000011062
:100840000620804F305E963A47D44520140439DAAA
:10085000A201512245910C292932D04049C14806B4
:1008600020B1016B53081D501107B292D500C5028B
:10087000B2B807820062C02E97E822E18000011022
:100880000620804F305E963A47D44520140439DA6A
:10089000A201512245910C292932D04049C1480674
:1008A00020B1016B53081D501107B292D500C5024B
:1008B000B2B807820062C02E97E822E180000110E2
:1008C0000620804F305E963A47D44520140439DA2A
:1008D000A201512245910C292932D04049C1480634
:1008E00020B1016B53081D501107B292D500C5020B
:1008F000B2B807820062C02E97E822E180000110A2
:100900000620804F305E963A47D44520140439DAE9
:10091000A201512245910C292932D04049C14806F3
:1009200020B1016B53081D501107B292D500C502CA
:10093000B2B807820062C02E97E822E18000011061
:100940000620804F305E963A47D44520140439DAA9
:10095000A201512245910C292932D04049C14806B3
:1009600020B1016B53081D501107B292D500C5028A
:10097000B2B807820062C02E97E822E18000011021
:100980000620804F305E963A47D44520140439DA69
:10099000A201512245910C292932D04049C1480673
:1009A00020B1016B53081D501107B292D500C5024A
:1009B000B2B807820062C02E97E822E180000110E1
:1009C0000620804F305E963A47D44520140439DA29
:1009D000A201512245910C292932D04049C1480633
:1009E00020B1016B53081D501107B292D500C5020A
:1009F000B2B807820062C02E97E822E180000110A1
:100A00000620804F305E963A47D44520140439DAE8
:100A1000A201512245910C292932D04049C14806F2
:100A200020B1016B53081D501107B292D500C502C9
:100A3000B2B807820062C02E97E822E18000011060
:100A40000620804F305E963A47D44520140439DAA8
:100A5000A201512245910C292932D04049C14806B2
:100A600020B1016B53081D501107B292D500C50289
:100A7000B2B807820062C02E97E822E18000011020
:100A80000620804F305E963A47D44520140439DA68
:100A9000A201512245910C292932D04049C1480672
:100AA00020B1016B53081D501107B292D500C50249
:100AB000B2B807820062C02E97E822E180000110E0
:100AC0000620804F305E963A47D44520140439DA28
:100AD000A201512245910C292932D04049C1480632
:100AE00020B1016B53081D501107B292D500C50209
:100AF000B2B807820062C02E97E822E180000110A0
:100B00000620804F305E963A47D44520140439DAE7
:100B1000A201512245910C292932D04049C14806F1
:100B200020B1016B53081D501107B292D500C502C8
:100B3000B2B807820062C02E97E822E1800001105F
:100B40000620804F305E963A47D44520140439DAA7
:100B5000A201512245910C292932D04049C14806B1
:100B600020B1016B53081D501107B292D500C50288
:100B7000B2B807820062C02E97E822E1800001101F
:100B80000620804F305E963A47D44520140439DA67
:100B9000A201512245910C292932D04049C1480671
:100BA00020B1016B53081D501107B292D500C50248
:100BB000B2B807820062C02E97E822E180000110DF
:100BC0000620804F305E963A47D44520140439DA27
:100BD000A201512245910C292932D04049C1480631
:100BE00020B1016B53081D501107B292D500C50208
:100BF000B2B807820062C02E97E822E1800001109F
:100C00000620804F305E963A47D44520140439DAE6
:100C1000A201512245910C292932D04049C14806F0
:100C200020B1016B53081D501107B292D500C502C7
:100C3000B2B807820062C02E97E822E1800001105E
:100C40000620804F305E963A47D44520140439DAA6
:100C5000A201512245910C292932D04049C14806B0
:100C600020B1016B53081D501107B292D500C50287
:100C7000B2B807820062C02E97E822E1800001101E
:100C80000620804F305E963A47D44520140439DA66
:100C9000A201512245910C292932D04049C1480670
:100CA00020B1016B53081D501107B292D500C50247
:100CB000B2B807820062C02E97E822E180000110DE
:100CC0000620804F305E963A47D44520140439DA26
:100CD000A201512245910C292932D04049C1480630
:100CE00020B1016B53081D501107B292D500C50207
:100CF000B2B807820062C02E97E822E1800001109E
:100D00000620804F305E963A47D44520140439DAE5
:100D1000A201512245910C292932D04049C14806EF
:100D200020B1016B53081D501107B292D500C502C6
:100D3000B2B807820062C02E97E822E1800001105D
:100D40000620804F305E963A47D44520140439DAA5
:100D5000A201512245910C292932D04049C14806AF
:100D600020B1016B53081D501107B292D500C50286
:100D7000B2B807820062C02E97E822E1800001101D
:100D80000620804F305E963A47D44520140439DA65
:100D9000A201512245910C292932D04049C148066F
:100DA00020B1016B53081D501107B292D500C50246
:100DB000B2B807820062C02E97E822E180000110DD
:100DC0000620804F305E963A47D44520140439DA25
:100DD000A201512245910C292932D04049C148062F
:100DE00020B1016B53081D501107B292D500C50206
:100DF000B2B807820062C02E97E822E1800001109D
:100E00000620804F305E963A47D44520140439DAE4
:100E1000A201512245910C292932D04049C14806EE
:100E200020B1016B53081D501107B292D500C502C5
:100E3000B2B807820062C02E97E822E1800001105C
:100E40000620804F305E963A47D44520140439DAA4
:100E5000A201512245910C292932D04049C14806AE
:100E600020B1016B53081D501107B292D500C50285
:100E7000B2B807820062C02E97E822E1800001101C
:100E80000620804F305E963A47D44520140439DA64
:100E9000A201512245910C292932D04049C148066E
:100EA00020B1016B53081D501107B292D500C50245
:100EB000B2B807820062C02E97E822E180000110DC
:100EC0000620804F305E963A47D44520140439DA24
:100ED000A201512245910C292932D04049C148062E
:100EE00020B1016B53081D501107B292D500C50205
:100EF000B2B807820062C02E97E822E1800001109C
:100F00000620804F305E963A47D44520140439DAE3
:100F1000A201512245910C292932D04049C14806ED
:100F200020B1016B53081D501107B292D500C502C4
:100F3000B2B807820062C02E97E822E1800001105B
:100F40000620804F305E963A47D44520140439DAA3
:100F5000A201512245910C292932D04049C14806AD
:100F600020B1016B53081D501107B292D500C50284
:100F7000B2B807820062C02E97E822E1800001101B
:100F80000620804F305E963A47D44520140439DA63
:100F9000A201512245910C292932D04049C148066D
:100FA00020B1016B53081D501107B292D500C50244
:100FB000B2B807820062C02E97E822E180000110DB
:100FC0000620804F305E963A47D44520140439DA23
:100FD000A201512245910C292932D04049C148062D
:100FE00020B1016B53081D501107B292D500C50204
:100FF000B2B807820062C02E97E822E1800001109B
:00000001FF


segunda-feira, 7 de outubro de 2019

Driver de motores de passo

Driver para Motores A4988


Há um tempo eu ganhei duas plaquinhas com o driver de motor A4988 da Allegro que facilita enormemente o uso de motores de passo, sem precisar fazer uma programação voltada para acionar as bobinas em sequência correta. Com esse driver, basta selecionar o microstepping desejado, a direção do motor e enviar os pulsos. E ele ainda aceita níveis lógicos de 5V de 3.3V, facilitando tanto o uso por Arduinos como Raspberry Pi.

As dimensões da plaquinha são reduzidas e já vem com duas fileiras de barras de pinos, facilitando o uso com protoboard. Segundo a datasheet, o driver permite o controle de altas correntes (2A) e mesmo com o tamanho reduzido, não esquenta muito (apesar do dissipador pequeno).

Veja como pode ser o interfaceamento com um microcontrolador:


Mas o acionamento do driver e do motor de passo não precisa de um microcontrolador (ou Arduino ou RPI).  Basta uma fonte de pulsos (eu usei um simples 555 em modo astável) e fornecer os níveis lógicos adequados para os pinos RESET, ENABLE, DIR (direção), MS!-3 (que definem o microstepping) e jogar os pulsos vindos do 555 no pino STEP.  

O vídeo com a montagem usando o 555:





quinta-feira, 29 de agosto de 2019

Fonte para Raspberry Pi

Fonte de Alimentação para Raspberry Pi

Eu estava com problemas para usar meus Raspberry Pis por causa da alimentação deles. Como eu não comprei uma fonte apropriada e original, pois diziam que os carregadores de celular poderiam funcionar, comecei a ter instabilidade no funcionamento das plaquinhas, sem falar no aparecimento inevitável do "raiozinho" amarelo no canto superior direito da tela (no Raspbian).  A causa é que apesar de pequeno, o Raspberry Pi consome uma corrente considerável a 5V.  E como ele é alimentado na maioria das vezes pela porta USB micro, muitas vezes o cabo usado tem uma resistência (ida e volta) que gera uma queda de tensão na alimentação da plaquinha, causando a instabilidade e reboot.

É recomendado que a fonte de alimentação tenha 5,25Vdc de tensão e forneça pelo menos 2A de corrente (3A no caso do novo Pi4). As portas USB normalmente fornecem 5V, talvez os 0,25V adicionais sejam para compensar as perdas no cabo. Como essa tensão não é comum nos reguladores lineares (ex. 7805), a alternativa seria fazer uma fonte com um regulador de tensão ajustável como o LM317T. Só que o LM317T só fornece até 1,5A (o 7805 só 1A). Existe a versão de 3A do LM317T que é o LM350T, mas o desperdício de energia em forma de calor seria muito grande e exigiria um dissipador enorme.  Um amigo (Eduardo) sugeriu usar os reguladores chaveados. Eu já usava um regulador LM2576T de 5V para alimentar os protótipos em protoboard.  O LM2576T tem uma versão ajustável cuja tensão de saída é programada por dois resistores externos. E o melhor de tudo é que ele fornece até 3A de corrente.

Pra obter os 5,25Vdc na saída, eu calculei que os resistores deveriam ser de 3300 ohms e 1000 ohms.
A fórmula é:  

Vout = Vref x (1 + R2/R1)     Sendo que Vref=1,23V   e R1 maior ou igual a 1000 ohms.

Assim:  Vout =  1,23V x (1 + 3300/1000) = 5,29V     um pouquinho a mais.

No caso, basta escolher um resistor de 3300 ohms com valor um pouco abaixo e um de 1000 ohms com valor um pouco acima (por causa das tolerâncias). Por exemplo, usar um de 3290 e outro de 1010 ohms, deixa a tensão de saída mais perto dos 5,25V.  Embora isso não seja crítico porque a tensão  vai ser derrubada por causa da perda no cabo, quem for preciosista pode selecionar os resistores mais acertados. Eu pensei em usar um trimpot, mas fiquei com medo de que uma mexida sem querer, possa alterar o valor e depois queimar o Raspberry Pi.

Um componente chato pra se usar com esse regulador é o indutor. Mas como ele não é muito crítico, eu usei um de 400uH que eu tinha, e ele funcionou sem problemas.  O LM2576 funciona com chaveamento a 52kHz e é um regulador tipo Buck (redutor de tensão com aumento da corrente de saída).

O circuito é este:


Eu optei por poder entrar com alimentação AC (transformador de 12Vac-0-12Vac) ou uma fonte de tensão de 12Vdc a 15Vdc 1A de parede que é muito comum de se achar.  Na saída coloquei um borne de parafusos e também um conector fêmea USB A duplo para ligar os cabos USB para o Raspberry Pi.

A montagem eu fiz em uma plaquinha de 10 x 5 cm, face simples, desenhada a mão mesmo.





No teste, usei uma carga de 1,66 ohms (dois resistores de 4 ohms em paralelo com um de 10 ohms) para consumir perto dos 3A.  O consumo foi de 2,8A e a tensão na fonte ficou em 5,14Vdc.  Depois no teste com o Raspberry Pi 3, usei até o meu cabo USB mais longo de 2m e a tensão medida no barramento da plaquinha do Pi3 foi de 5,05Vdc (com teclado, mouse, wifi, Bluetooth tudo ligado e rodando programa Python), com mínimo de 4,90Vdc no boot.




quarta-feira, 10 de outubro de 2018

Osciloscópio de matriz de leds

Osciloscópio com Matriz de Leds


Há muitos anos eu achei um artigo da revista Popular Electronics de novembro de 1996, onde havia um projeto de osciloscópio digital. O cerne do projeto era um baseado em um microcontrolador PIC 16C71, um dos primeiros da Microchip a ter conversores analógico-digitais. O PIC realizava a conversão de um sinal analógico para 8 bits, que em seguida eram encaminhadas através de uma porta paralela de PC (a usada em impressoras paralelas) e processadas por um software (em MS-DOS) para apresentar a plotagem na tela do PC.

Pois bem, eu redesenhei o layout da placa e montei o projeto, com algumas alterações: eu usei o PIC 16C711 que é muito parecido com o 16C71, alterando algumas linhas do código em assembly fornecido. Entretanto, o osciloscópio não funcionou. A parte do software no PC se mostrou não funcional e assim por muitos anos guardei a plaquinha.

Mas havia outro projeto de eletrônica que sempre me deu vontade de fazer, que era um osciloscópio de matriz de leds. Recentemente adquiri dois displays de matriz de leds de 8x8.  A maioria dos projetos que se encontra na internet usa os cis LM3914 que é um acionador de leds tipo VU, e contadores Johnson CD4017.  Eles são fáceis de se achar e conseguem cada um acionar 10 saídas (portanto 10 linhas para o LM3914 e 10 colunas para o CD4017).  O LM3914  liga uma de suas 10 saídas de acordo com o nível de tensão na sua entrada, enquanto que o CD 4017 faz ligar uma coluna por vez, fazendo a varredura horizontal da matriz de leds.  A maioria dos projetos não tem ajuste de trigger (disparo da varredura), o que torna a visualização da forma de onda instável e difícil de parar na tela.

Mas, os dois cis tornam difícil a utilização dos meus displays  (vai sobrar ou faltar saídas de acionamento), além disso, os displays são mais fáceis de se usar se estiverem lado a lado e não empilhados. Logo, a minha tela seria mais viável no formato 8 linhas x 16 colunas.

Pensei então em aproveitar a plaquinha do projeto com o PIC para fazer a conversão e acionar as linhas dos displays.  Haveria então a possibilidade do PIC realizar a conversão e acionar apenas uma das linhas do display a cada coluna, ele mesmo enviar o clock para a varredura horizontal e realizar o trigger da varredura, sincronizando o sinal automaticamente e estabilizar a visualização do sinal na matriz.

Só que usei agora um PIC 16F819, que é mais moderno que o 16C711 (que era OTP - programável uma vez) por um PIC que tem memória de programa FLASH, o que facilita de sobremaneira o desenvolvimento e teste do programa.  Ao invés de o PIC enviar 8 bits (o que significava 256 pontos de resolução vertical), agora o 16F819 apenas lê o sinal de entrada e aciona apenas uma das 8 saídas ligadas às linhas dos displays. O conversor aceita de 0 a +5V na entrada, Ou seja, cada linha representa uma faixa de tensão de 5/8 = 0,625V.  O 16F819 tem conversores de 10 bits, mas a conversão é feita em 8 bits,  o que significa 256 valores, assim cada faixa de 0,625V representam 32 valores na conversão (256/8).

O esquema é o seguinte:




Cada vez que o PIC faz uma conversão, ele também envia um pulso para que a varredura horizontal avance uma coluna (duas opções: 1ms  / led e 100us / led).  Como esse PIC tem poucas portas, há a necessidade de circuitos auxiliares para fazer a varredura horizontal: um contador binário de 4 bits  74197, e dois decodificadores de 3 para 8 linhas  74138.  O contador recebe os pulsos do PIC e conta de 0 a 15 (ou seja as 16 colunas), onde 3 linhas menos significativas vão endereçar as saídas dos 74138, e o bit mais significativo do contador habilita ou desabilita cada um dos 74138.
Por fim, o PIC realiza o trigger automático, através do monitoramento de uma nova passagem por zero (na verdade passagem de 2,5V) após a varredura chegar na última coluna.  Ele fica esperando o evento e quando a passagem ocorre, ele envia um reset para o contador e recomeça o envio dos pulsos para contagem da varredura.

O condicionamento do sinal de entrada é o do projeto original da revista.  O sinal analógico entra em um divisor de tensão formado por resistores (no total 1M ohm que é a resistência de entrada). Há 3 faixas possíveis de entrada de sinal: 10Vpp, 25Vpp e 50Vpp.  No caso de 10Vpp, o sinal é dividido por 2, o que fornece até 5Vpp para um amplificador operacional LF347, que soma o sinal com um offset de 2,5Vdc para que a entrada do PIC receba um sinal não negativo e dentro da faixa de 0 a +5Vdc.  A entrada do PIC tem um zener de 5,1V para proteção.

Originalmente, o projeto da revista era alimentado com apenas uma fonte de tensão de +9V (bateria de 9V ou fonte de alimentação).  Um ci ICL7662 convertia os +9V para fornecer -9V para que o LF347 tenha fonte simétrica, e mais dois cis 78L05 e 79L05 para fornecer +5V (para o PIC) e -5V para o ajuste de offset.

Esse circuito serve apenas para brincadeira e tem um visual muito legal.  A varredura horizontal é de 1ms por coluna, o que permite apenas a visualização de sinais de até poucas centenas de hertz.  Veja o resultado:

A matriz de leds e os cis TTL foram montados na protoboard, enquanto que o PIC e o resto do circuito está na plaquinha antiga, ligada pelos fios na parte inferior da foto.

Aqui dois vídeos demonstrando o funcionamento. O primeiro vídeo está sem o autotrigger, e o segundo já com o autotrigger:



Lista de componentes:
PIC 16F819
Cristal de 16MHz
2 capacitores de 15pF
6 capacitores de 100nF
3 capacitores de 10uF
2 capacitores de 1uF
4 resistores de 100k
2 resistores de 1M
9 resistores de 1k
2 resistores de 2k2
1 resistor de 1k5
1 resistor de 1,82k (ou 1k5 + 120R)
1 trimpot de 1k
1 chave 1 pólo 3 posições
1 ci 74197
2 cis 74138
1 ci LF347
1 ci 78L05
1 ci 79L05
1 diodo zener 5,1V

A listagem do firmware para o PIC (arquivo HEX):

:100000004828A000A00DA00D200D383981389F0090
:100010000030A1001E3013201F151F190D28A1014B
:100020001E084328A101FB3EA000A109FF30031CCC
:100030001C28A00703181928A0076400A10F19287D
:1000400000000800A101A301A20001302C28A10199
:10005000A301A20004302C28A80023082102031DBC
:10006000332822082002043003180130031902301B
:100070002805031DFF3043280038031DFF30040509
:10008000031DFF3043288313031383126400080009
:1000900080309F0083160E309F00A33085008601BC
:1000A0008312BF01BC018030BD0085153F08BD0033
:1000B00000300120BF00640020303F020318622896
:1000C0000130BE003F08A0001F302220B8003F08CA
:1000D000A00040302720BA00380884003A083C20AD
:1000E000BA00BB0064003A083B04031979280230C7
:1000F000BE003F08A0003F302220B8003F08A0000B
:1001000060302720BA00380884003A083C20BA0042
:10011000BB0064003A083B04031990280430BE0079
:100120003F08A0005F302220B8003F08A0008030C8
:100130002720BA00380884003A083C20BA00BB00E7
:1001400064003A083B040319A7280830BE003F08A2
:10015000A0007F302220B8003F08A000A030272058
:10016000BA00380884003A083C20BA00BB0064009A
:100170003A083B040319BE281030BE003F08A00017
:100180009F302220B8003F08A000C0302720BA00CE
:10019000380884003A083C20BA00BB0064003A08E2
:1001A0003B040319D5282030BE003F08A000BF3013
:1001B0002220B8003F08A000E0302720BA0038080D
:1001C00084003A083C20BA00BB0064003A083B04B3
:1001D0000319EC284030BE006400E0303F02031CED
:1001E000F3288030BE0064000F303C020318FA2868
:1001F000FB28FB280B293E08860005116400851E9C
:1002000006290330A100CA301320082946301220E5
:100210000515BC0A56283D08A00080302720B800EC
:100220003F08A0007F302220BA00380884003A0836
:100230003C20BA00BB0064003A083B040319332990
:10024000BC013E088600851114301220851564001B
:10025000851E2F290330A100CA30132031294630D2
:0C02600012205628342956286300342947
:02400E00023F6F
:00000001FF

sexta-feira, 14 de abril de 2017

Voltímetro Eletrônico de altíssima resistência de entrada

Voltímetro Eletrônico usando Amplificador Operacional


Muitas vezes ao medir tensões em um circuito eletrônico não pensamos no efeito de carga que o medidor pode inserir no circuito e alterar o valor medido. Muitos multímetro digitais atuais tem resistência de entrada de 10M ohms, o que é suficiente para a maioria das aplicações, mas alguns mais baratos tem somente 1M ohms de resistência de entrada.  

Com os multímetros analógicos, dificilmente se encontra um com resistência de entrada maior do que 20k ohms por volt (nesse caso multiplica-se esse valor pelo valor de fundo de escala pra saber qual a resistência de entrada). Assim na escala de 10V, de um multímetro que tenho, a resistência de entrada seria só de 200k ohms, o que não é muito. Basta querer medir um divisor de tensão com dois resistores de 100k ohms numa bateria de 9V, que a medição seria muito errada (ao invés de 4,5V, mediria 3,6V !).  Isso se deve à pouca sensibilidade do galvanômetro usado nesses multímetros mais baratos, que usam microamperímetros de 50uA  (daí o 20000 ohms por volt => 1/50uA = 20000).  

Multímetros de marcas boas (Hioki, Sanwa) tinham resistência de entrada melhores (50k ohm por volt e até 100k ohm por volt), mas são muito difíceis de se encontrar atualmente. 

Antigamente, no tempo das válvulas, fabricavam-se os VTVM (voltímetros valvulados) que aumentavam a resistência de entrada para mais de 10M ohm (a maioria 11M ohms) com válvulas triodo e usando um galvanômetro que não precisava ser tão sensível. Com a chegada dos transistores e em especial os transistores efeito de campo (FET), eles substituíram as válvulas nesse papel.

Hoje podemos utilizar amplificadores operacionais (AOs) para fazer esse papel de multiplicadores de resistência de entrada para um voltímetro e obter valores mais altos do que os disponíveis nos modelos comerciais. 

Em 1987, comprei uma revista japonesa (Eletronics Life - "Erekutoronikusu Raifu") que apresentava um projeto de circuito eletrônico para ampliar a resistência de entrada de multímetros analógicos mais simples. 

Basicamente era uma rede de atenuação resistiva que era ligada a um amplificador operacional TL071 em modalidade amplificador não inversor. Da saída do operacional ligavam um multímetro analógico.  Como o TL071 é um amplificador operacional (AO) com transistores efeito de campo de junção na entrada diferencial, ele possui uma resistência de entrada de 1 Tera ohms !  É claro que isso é muito alto, mas a resistência de entrada vai ser determinada pela rede resistiva atenuadora.

No projeto da revista, a resistência de entrada era aumentada pra mais ou menos 5M ohms, o que não é muito comparado aos modelos atuais, mas ainda assim bem mais do que a do multímetro ilustrado na capa da revista. O circuito era montado numa placa universal e precisava de duas baterias de 9V para alimentação (simétrica).  O multiplicador de resistência funcionava para voltímetro DC ou AC, bastava selecionar a escala correta no multímetro, mas ficava limitado a uma excursão de sinal de saída de mais ou menos 8V).

Veja a capa e o esquema do projeto:






















Resolvi melhorar um pouco este projeto e mudar os seguintes pontos:
- Usar fonte simples de 12Vdc e usar um conversor para gerar -12Vdc.
- Aumentar a resistência de entrada para 20M ohms
- Ter cinco escalas de medição: 1V, 5V, 10V, 50V e 100Vdc de fim de escala
- Usar um voltímetro fixo de 10Vdc como medidor

Para gerar os -12Vdc para alimentar o TL071 simetricamente, eu preferi o ICL7660S, já que o consumo vai ser muito baixo e o 7660 precisa de apenas dois capacitores externos (10uF de tântalo) para fornecer a tensão negativa.  

A seguir a rede resistiva de atenuação teria resistências de 10M ohms, 8M ohms, 1Mohms, 800k ohms e 200k ohms.  Os valores de 8M ohms e 800k ohms não são valores comerciais, e a precisão do atenuador depende muito da proporcionalidade das resistências usadas.  Nesse caso não é melhor usar resistores de precisão, mas escolher resistores com valores que atendam a proporção, entre vários resistores de 5% de tolerância.

Assim, escolhi resistores de 8M2 nominais que apresentassem a menor resistência medida num ohmímetro. Achei um de 8,12M numa fita de resistores de 8M2. Esse seria o valor base pra selecionar os outros. O resistor de 8,12M é 1,5% maior do que 8M ohms. Assim bastaria eu encontrar resistores que estivesse 1,5% acima do valor necessário inicial.  Achei resistor de 10,15M ohms, 1,015M ohms, 812k ohms e 203k ohms.  Mantem-se assim a proporcionalidade da rede de atenuação.  

Na escala de1V de fim (ou fundo) de escala, nada é atenuado para entrar no TL071. Na escala de 5V, a atenuação é de 50% (divisão de 1/2). Na escala de 10V, o divisor é por 10 (atenua para 10%). Na escala de 50V atenua para 5% e finalmente na escala de 100V, atenua para 1%.

Assim temos fatores de atenuação de 1  0.5  0,1  0.05 e  0.01.
Como o voltímetro é de 10Vdc de fundo de escala, o TL071 precisa amplificar o sinal (DC) para entregar o sinal ao voltímetro. Com 1 volt na entrada, o AO precisa amplificar por 10 vezes. Com 5V na entrada, multiplicado pelo fator de atenuação de 0,5, teremos que amplificar por 4 (5 x 0,5 x 4 = 10). Com 10V na entrada, atenuada para 1V, temos de amplificar novamente por 10. Com 50V, atenuado para 2,5V, a amplificação é novamente de 4 vezes. E finalmente com 100V atenuados para 1V, amplificamos 10V. Assim precisamos de que o AO amplifique ou 4 ou 10 vezes.

Usando resistores de 9k ohms (selecionar em resistores de 9k1) e 3k ohms como resistores de feedback e mais um resistor de 1k ohms, montamos a malha de realimentação do AO.  Uma chave de onda dupla de 5 posições, serve como seletor de escala.

Como o AO TL071 tem entradas JFET, a tensão de offset (balanceamento) de entrada dele é relativamente alta e pode influenciar na saída (multiplica pelo ganho programado do AO). AOs com transistores bipolares conseguem ser fabricados mais casados e menor tensão de offset, mas a resistência de entrada é bem menor e não serviriam para o projeto. Como é necessária altíssima 

resistência de entrada do AO, os tipos com JFET são inevitáveis. Por isso, o TL071 tem dois terminais para ajuste e compensação da tensão de offset. Ligando um trimpot, podemos ajustá-lo e zerar a saída, quando ligamos as duas entradas juntas.  Isso não é muito relevante quando usamos AOs em circuitos de áudio, filtros, etc. (por isso são usados os AOs duplos, quádruplos, sem esse ajuste). Mas em instrumentos, esse ajuste se torna necessário e é fácil de ser feito. Outro AO JFET que pode servir é o CA3140.

Abaixo segue o esquema final do voltímetro.




 As pontas de prova devem ser ligadas na entrada e no terra do circuito. Veja que apesar do circuito poder fornecer tensão positiva e negativa para o voltímetro, ele só mede tensões positivas, portanto a polaridade da medição e das pontas no circuito é importante.

Abaixo algumas fotos do aparelho montado numa caixa de plástico (PB-112 da Patola), o voltímetro Engro de 10Vdc. Para alimentar, pus um conector jack fêmea P4 na lateral da caixa, para alimentar com fontes de parede de 12Vdc.