Ir ao conteúdo
  • Cadastre-se

Projetos com Avr : Design, Programação em Basic e Assembly


Ir à solução Resolvido por aphawk,

Posts recomendados

Projeto de um Analizador Lógico Portátil com Atmega1284P - PARTE 6  -  Osciloscópio Digital

 

Vamos agora mostrar uma maneira de se implementar um osciloscópio para frequências de áudio até uns 10 Khz. Não que esse seja o limite, mas é q ue a quantidade de amistragem fica menor conforme a frequ6encia do dinal aumenta, interferindo na visualização.

 

Por exemplo, visualizei uma senóide em 20 Khz e com apenas 10 amostragens em toda a senóide fica muito ruim de visualizar....

 

O que é um osciloscópio ?

 

É um instrumento que fica amostrando o sinal na sua entrada, e aguardando um determinado evento para "marcar" o início do trecho a ser visualizado.

 

Então, a parte mais crítica é justamente saber qual o momento exato que queremos definir como o início de captura do trecho a ser analisado !

 

O processo que determina esse momento é o que chamamos de TRIGGER , isto é, é o "gatilho" que esperamos para saber que a partir deste instante vem a parte que nos interessa mostrar.

 

Dito isto, sabemos que quando o Trigger acontece, temos de capturar as amostras de nossa forma de onda, e mostrar na tela de nosso aparelho.

 

Então vamos pensar um pouco : nossa tela tem uma capacidade limitada de visualização, que é de 84 pontos horizontais por 48 pontos verticais.

 

Vamos considerar usar apenas 70 pontos horizontais, assim podemos fazer a divisão em 7 divisões de 10 pontos cada, e podemos mostrar alguma coisa na área que está sobrando, como por exemplo informação sobre o tempo de varrredura. Fica mais simples para se olhar e fazer contas.

 

Vamos imaginar agora que temos de capturar apenas 70 amostras, as quais podem tem um valor entre 0 e 47 . Qual a resolução de captura necessária para isto ? Lembro aqui que um AVR normal tem 10 bits de resolução, o que permite valores entre 0 e 1023.

 

Mas isto é muita coisa para o nosso pequeno osciloscópio, que só pode mostrar valores entre 0 e 47 ! Vamos usar MENOS resolução, em vez de 10 bits trabalharemos com apenas 6 bits, o que nos permitirá capturar valores entre 0 e 63 , mais do que o suficiente !

 

Com isto teremos uma enorme vantagem : Podemos usar um sample rate bem maior do que o recomendado pelo datasheet !!!!

 

Para manter a resolução de 10 bits, o fabricante recomenda frequência de clock máxima de 200 Khz para o conversor AD. Mas também deixa claro que pode-se atingir até 1 Mhz sem perda significativa da resolução, e muita gente já testou e afirma que com 1 Mhz voce consegue ter 9 bits de resolução. Imagine para o nosso caso, onde queremos apenas 6 bits, podemos subir ainda mais essa frequência !

 

Mas isso tem um custo : Quanto maior é a frequência de amostragem do conversor AD, menor é a impedância de entrada necessária para manter a precisaão da leitura ! Isto ocorre por que o conversor AD trabalha com um pequeno capacitor interno, o qual demora um certo tempo para ser carregado, e esse tempo depende muito da impedância apresentada na entrada, podemos pensar nisso como um circuito RC em série, que nada mais é que um filtro passa-baixa. Quanto maior o valor do resistor, mais tempo demora para se carregar o capacitor.

 

A frequência de amostragem é controlada por um Prescaler interno, o qual pode ter os valores de 2,4,8,16,32,64 e 128. Nossa frequência do oscilador é de 20 Mhz; usando um prescaler de 8, temos a frequência de 2,5 Mhz, a qual permite tranquilamente os nossos 6 bits de resolução.

 

Agora, vamos olhar a conversão A/D : uma vez tudo selecionado, a partir do momento em que que damos o comando para se fazer uma conversão, são necessários 13 ciclos de clock do conversor A/D. Ou seja, teremos uma taxa de amostragem de 2,5 Mhz / 13 = aproximadamente 192,3 Ksamples/seg.

Também significa que o tempo mínimo para termos uma captura é de 104 ciclos do clock principal, o que resulta em nossa caso em um tempo de cerca de 5,2 usegundos.

 

O que também significa isso :

 

Imagine que teremos na entrada do conversor uma onda senoidal de frequência 19,23 Khz.

 

Durante todo o tempo entre o início e o final dessa onda senoidal, teremos feito apenas 10 amostras o que permite uma visualização de baixa qualidade. Já se a frequência do sinal a ser medido for de 9 Khz, teremos mais de 20 amostras, e teremos uma visualização bem melhor !

 

Dá para perceber que quanto mais baixa for a frequência do sinal, melhor será a sua visualização na tela.

 

Com isto já podemos trabalhar com sinais de áudio, e também pode-se ter uma excelente visualização em sinais de 60 Hz , tipo dos sinais presentes em fontes de alimentação comum.

 

Só temos de tomar um único cuidado : o nosso Atmega1284P permite utilizar sinais entre 0 e 5 Volts em sua entrada ! Se usar tensão negativa, ou sinais maiores do que 5 Volts, vamos danificar o microcontrolador !

 

Podemos utilizar um circuito na sua entrada para garantir que esses limites não sejam ultrapassados, mas isto será visto apenas no final deste projeto.

 

Todo osciloscópio tem o chamado controle HORIZONTAL, que nada mais é do que um seletor de taxa de amosragem : indica quanto tempo representa uma divisão da tela ! Por exemplo, 1 uSegundo por divisão significa que temos de capturar 10 vezes em um único uSegundo ! Claro que em nosso caso temos um total de 70 pontos, divididos em 7 DIVISÕES de 10 pontos cada uma.

 

Mas vamos ser realistas. Nosso pequeno osciloscópio vai ter como a sua menor base de tempo o valor de 100 usegundos. Vamos usar os valores de 100u, 200 u, 500 u , 1000 uSegundos ( ou melhor 1 milisegundo ) , 2 mili, 5 mili, 10 mili, 20 mili, 50 mili, 100 mili, e chega, está muito bom !

 

Desta maneira vamos fazer as capturas de amostragem numa velocidade tal que coincidam 10 capturas na unidade de tempo escolhida.

 

Por exemplo, escolhendo 100 uSegundos por divisão, implica em 10 capturas a cada 100 uSegundos, ou 1 captura a cada 10 usegundos. Vamos usar um Timer para gerar a nossa base de tempo, que para acompanhar o que dissemos acima terá de gerar uma captura a cada 10 u, 20u, 50u, 100u, 200u, 500u, 1 mili, 2 mili, 5 mili, e 10 milisegundos.

 

Agora, já podemos dividir em "partes" o nosso programa :

 

1 - Gerar uma base de tempo variável entre 10 uSegundos e 10 mSegundos. Será a base de nossa captura de dados do ADc.

 

2 - Preencher o buffer de 70  ou 8192 leituras, convertendo para valores entre 0 e 47.

 

3 - Uma rotina, também baseada em Timer, vai atualizar o display cerca de 30 vezes por segundo, com os valores obtidos.

 

4 - Uma rotina que permita aumentar e diminuir a base de tempo do HORIZONTAL, mesmo após a captura ter sido efetuada, para     que possamos dar um Zoom na tela se for necessário.

 

5 - uma rotina inicial de configuração do hardware dos Timers e do conversor AD.

 

6 - Uma rotina que nos permita escolher qual será o tipo de Trigger, isto é, onde possamos determinar um valor para iniciar a captura dos dados e se esse valor tem de ser atingido na subida ou na descida do sinal. Também escolheremos o modo de trabalho, ou seja, podemos fazer uma única captura e mostrar, ou podemos ir capturando e mostrando em tempo real, ou podemos também fazer um monte de capturas, pois temos um um buffer em Ram de 8192 bytes e só terminar as capturas quando encher o buffer, assim podemos "passear" pelo sinal, andando e visualizando. Esta será uma parte bem interessante ....!

 

7 - Uma rotina que permite a captura de dados na mais alta velocidade possível, para casos especiais !

Apenas pensando na rotina de captura : temos uma captura em cada 10 uSeg, mas lembro que cerca de 5,2 uSeg é perdido na conversão, então temos cerca de 4,8 microsegundos para converter a leitura de 2 bytes para um único byte, guardar no buffer, e verificar se terminou de encher o buffer. São apenas cerca de 96 ciclos de clock principal, e vamos perder cerca de 30 ciclos apenas entrando e saindo da interrupção ( isso usando o modo Nosave na interrupção  e fazendo a rotina em ASM ! ). vamos usar o ASM para garantirmos o menor tempo possível perdido na execução.

 

Inicialmente vamos aprensentar a rotina que faz a captura da maneira mais rápida possível. Ela foi escrita em ASM, mas é bem simples de se entender. Ela pega a leitura em 10 bits, converte para 8 bits apenas, e guarda no buffer.

 

Usei o modo Free Run do ADC, assim ele fica reiciciando a conversão assim que completa uma.

 

No projeto completo, teremos uma outra rotina que vai pegar esses dados de 8 bits , e converter para um número entre 0 e 46, ( assim teremos uma posição central na tela e podermos desenhar 23 pontos acima e mais 23 pontos abaixo, totalizando os 47 pontos ).

 

Vamos ao circuito utilizado :

 

1177f3a.jpg

 

Mais simples, impossível !

 

Agora, segue o programa em BASCOM :

'*******************************************************************************
'  Rotina Rápida De Captura Para Osciloscópio Digital
'  Faz a captura da maneira mais rápida possível.
'  Menor possivel : uma captura a cada 5,15 microsegundos.
'*******************************************************************************
$regfile = "m1284PdefOK.dat
"$crystal = 20000000
$hwstack = 52
$swstack = 52
$framesize = 32
Disable Jtag
Dim Buffer_grande_captura(8192) As Byte
Dim B_temp As Word
Dim B_temp1 As Word
Dim B_temp2 As Word
Dim B_temp3 As Word
Dim B_temp4 As Word
Dim Flag_cap_mode As Bit
Config Pina.0 = Input
' vamos configurar o ADC para ficar sempre rodando
Config Adc = Free , Prescaler = 8 , Reference = Avcc
Enable Adc
Start Adc
' Agora, fazer pelo menos uma leitura para setar o canal desejado
B_temp = Getadc(0)
B_temp2 = 0
Flag_cap_mode = 0
' Esse flag determina quantas leituras faremos
' 1 = faz apenas 70 capturas
' 2 = faz 8192 capturas
' agora, vamos colocar o endereço do primeiro byte do buffer
'em B_temp.
$asm
Loadadr Buffer_grande_captura , X
MOV R24,R26
MOV R25,R27
Loadadr B_temp , X
ST X+,R24
ST X, R25
$end Asm
' copiaremos b_temp para b_temp2
B_temp2 = B_temp
' agora, determinaremos quantas amostras iremos ler !
If Flag_cap_mode = 1 Then
  B_temp1 = 70
Else   
  B_temp1 = 8192
End If
' Btemp_1 tem a quantidade de amostras, copiaremos para b_temp3
B_temp3 = B_temp1
' A seguir, a rotina que faz a captura das amostragens,
' com um intervalo exato de 5,15 microsegundos entre cada amostra !
Faz_amostra:
$asm
PUSH R0
IN   R0,SREG
PUSH R16
PUSH R17
PUSH R18
PUSH R26
PUSH R27
PUSH R30
PUSH R31
LDS   R26, {B_TEMP2}
LDS   R27,{B_TEMP2+1}
' X (R26:R27) aponta para o início do buffer
LDS   R30, {B_TEMP3}
LDS   R31, {B_TEMP3+1}
' Z (R30:R31) tem a quantidade de dados a serem lidos
De_novo:
' vamos ler se a conversão está pronta
LDS  R18, ADCSRA
' a seguir, esses NOPs acertaram a temporização para termos sempre
' exatos 5,1 microsegundos. Sem eles, a captura variava entre 5,15 e
' 5,35 microsegundos, o que pode afetar ligeiramente uma forma de onda.
NOP
NOP
NOP
NOP
'agora, vamos testar o bit da conversão
SBRS R18, 4
' se ainda não está pronta, volta pro começo
RJMP DE_NOVO
' sabemos que a conversão está pronta, vamos iniciar outra !
STS  ADCSRA,R18
' e agora vamos ler o resultado da conversão, que está em 10 bits
' mas como estamos forçando demais o clock do conversor A/D, vamos
' abaixar para 8 bits apenas, e de quebra conseguiremos guardar
' o resultado em um só Byte !
' vamos ler os dois bytes do conversor:
LDS  R16, ADCL
LDS  R17, ADCH
' agora, vamos juntar os dois bytes em um só
' fazendo um shift prá esquerda 2 casas no LSB
LSR   R16
LSR   R16
' agora, vamos fazer um shift prá direita de 6 casas no MSB
LSL   r17
LSL   R17
LSL   R17
LSL   R17
LSL   R17
LSL   R17
' e agora, é só juntar tudo em um só byte !
!OR    R16,R17
' agora, guardamos esse byte no buffer e já incrementamos a posição
ST    X+, R16
' e usamos um truque prá decrementar o contador de amostras
' não precisamos carregar nada em R17, mas é a maneira mais rápida
' de se decrementar o par (R30:R31) !
LD    R17, -Z
' e vamos testar se acabou, isto é, zerou o contador !
MOV   R0,R30
OR    R0,R31
' se ainda tem de ler amostras, volta pro início
BRNE  DE_NOVO
' Acabaram as leituras, o buffer está cheio !
POP  R31
POP  R30
pop  R27
POP  R26
POP  R18
POP  R17
POP  R16
!OUT SREG,R0
POP  R0
$end Asm
Stop
End

Utilizando um clock de 20 Mhz, conseguimos fazer uma captura em cada 5,15 microsegundos. Já estamos forçando o conversor A/D ao máximo, bem acima da especificação do fabricante ( 2,5 Mhz contra um máximo de 200 Khz de acordo com o datasheet !  ).

 

Reparem que esta é a máxima velocidade possível. A rotina normal, que será apresentada logo, vai permitir tempos de amostragem selecionáveis, a partir de 10 microsegundos , utilizando o controle horizontal na posição de 100 microsegundos / divisão.

 

Que maravilha usar o Bascom com Asm !

 

Em anexo, os arquivos para a simulação.

 

Paulo

scope_rapido.rar

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Douglaspp,

 

Valeu pelos vídeos. Seria muito útil se voce tivesse os links para os projetos, assim quem quisesse fazer um já teria todas as informações.

 

Para fazer isso, não precisa mais de um Attiny ou Arduino. Pode-se fazer a mesma coisa com um simples ESP8266 !

 

Tenho um kit de desenvolvimento NODEMCU DEVKIT 1.0 com um ESP8266-E , e olha, é fantástico, usando uma linguagem muito simples chamada LUA voce faz o diabo com ele; mas se preferir, pode utilizar um microcontrolador e fazer a comunicação com o chip através de simples comunicação serial usando comandos AT.

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Valeu pelos vídeos. Seria muito útil se voce tivesse os links para os projetos, assim quem quisesse fazer um já teria todas as informações.

Sugiro que o Fórum do Clube do Hardware crie uma organização no GitHub. Moderadores estariam acatando ou não a transferência para lá de cada projeto [inicialmente] pessoal em particular.

 

Para fazer isso, não precisa mais de um Attiny ou Arduino. Pode-se fazer a mesma coisa com um simples ESP8266 !

Por favor, dê-nos referências técnicas a respeito. Parece que é uma solução bem barata e fácil!

 

Tenho um kit de desenvolvimento NODEMCU DEVKIT 1.0 com um ESP8266-E , e olha, é fantástico, usando uma linguagem muito simples chamada LUA voce faz o diabo com ele; ...

 

Onde você o adquiriu e por quanto? Demorou muito pra chegar?Contradição pessoal, pois eu acredito que o Fórum do Clube do Hardware não é pra isso (indicar lojas e vendedores). Por favor, não me respondam.

 

Update

 

Por enquanto, achei uma comunidade, algo sobre a relação com Arduino via Espruino, e introduções: 1 e 2.

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

Fiz um Tópico  sobre o ESP8266 na área comum de microcontroladores. Existem algumas pessoas no Fórum do Bascom que estão utilizando o ESP8266 controlado por um Atmega com display colorido e tudo, é uma montagem de uma estação meteorológica, mas ainda não está completo.

 

Te adianto que usar esse ESP8266 é muito simples, ele cuida de tudo, só precisamos dar comandos básicos para ele !

 

O kit que comprei custou em torno de US$ 6, mas tenho também alguns modelos mais simples que funcionam igualzinho ( não possuem o regulador interno de 3.3 Volts, possuem menos I/O, e também não tem o espaçamento padrão entre pinos de 0.1" ) e que custaram menos de US$ 2.

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Estou quase entendendo o lance do ESP8266. Primeiramente eu pensei ele ser algo completo, que só precisaria ser programado, já incluindo microcontrolador. Depois eu vi que o controle provavelmente é sempre implementado com um Espruino ou outro Arduino da vida.

ESP8266_shim2.jpg

Vi esse cara, o tal Espruino Pico, pequeninho, e me animei equivocadamente. Pensei: deve ser algo só um pouco mais caro do que um Atiny. Que nada! Logo em seguida veio uma decepção inicial, com a qual estou até agora: uma breve consulta ao eBay me revelou valores próximos a R$ 140,00. Vixe!

 

"Como usar o ESP8266 para controlar iluminação com pouco dinheiro" é o que estou tentando responder primeiro.

 

Update

 

O Espruino pode ser programado a partir de uma extensão de Google Chrome, pelo uso da linguagem Javascript ou... fazendo-se programação visual baseada em blocos.

 

main-qimg-49752b8d2d76fe8d47bc044d53c57d

Link para o comentário
Compartilhar em outros sites

Estou quase entendendo o lance do ESP8266. Primeiramente eu pensei ele ser algo completo, que só precisaria ser programado, já incluindo microcontrolador. Depois eu vi que o controle provavelmente é sempre implementado com um Espruino ou outro Arduino da vida.

"Como usar o ESP8266 para controlar iluminação com pouco dinheiro" é o que estou tentando responder primeiro.

 

É exatamente esse o pulo do gato : voce pode trocar o firmware nativo do ESP8266 por um firmware muito mais legal, chamado de NodeMCU.

 

Esse firmware te dá o poder de escrever programas em linguagem muito simples, chamada LUA, que parece o Basic de tão simples, e voce pode rodar vários programas, pode carregar vários programas na memória do ESP8266 e rodar até mais de um, de maneira bem interessante.

 

Então, muitas coisas podem ser feitas, sem precisar de nenhum outro microcontrolador !

 

Aliás, para voce ter uma ideia : o microprocessador embutido no ESP8266 é um poderoso ARM rodando a cerca de 60 Mhz, é umas 6 vezes mais rápido que um Atmega a 16 Mhz , já tem um monte de memória SRAM, e se não me engano tem uns 48K para rodar os seus próprios programas !!!!

 

O que voce deve fazer é ler mais sobre o NodeMCU, e ver um tutorial simples sobre a linguagem de programação Lua. Assim, voce mesmo escreve os seus programas que vão rodar sem precisar de mais nada de hardware !

 

Ou, se preferir se ater a um velho padrão de comunicação serial, pode usar qualquer outro microcontrolador, tipo um Attiny da vida, e controlar o ESP8266 usando o set de comandos "AT" que é nativo.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Quer dizer que para ter um projeto eu só precisarei de um gravador USB, do ESP8266 com o NodeMCU, alguns outros  componentes eletrônicos mais simples, e um fonte de energia (bateria ou pilha)?

 

Qual seria o equipamento de gravação para embutir e usar o NodeMCU?

 

Ou, se preferir se ater a um velho padrão de comunicação serial, pode usar qualquer outro microcontrolador, tipo um Attiny da vida, e controlar o ESP8266 usando o set de comandos "AT" que é nativo.

 

Talvez até já exista biblioteca para abstrair esse uso, não é?

 

Update

 

Sobre o NodeMCU. O Pedro Minatel ensina um bocadinho de coisas (em português). Existe o ESP8266 Quick Start, em inglês. Inclusive encontrei que o Luatool pode nos ajudar muito a enviar os scripts Lua ao dispositivo. Mas parece que o kit de desenvolvimento é um investimento à parte, e tem gente descendo o pau nessa plataforma.

 

Merece destaque: 4refr0nt / ESPlorer, é como uma sofisticada interface gráfica Java para o Luatool

 

esplorer_tab.png

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

Pelo seu Update, voce já percebeu que bastam alguns pequenos programas e voce pode conectar seu ESP8266 em um computador, atualizar o firmware se necessário, e carregar o seu programa para ser executado.

 

Só precisa tomar cuidado com a tensão e a corrente. Veja bem, quando em modo de transmissão, esse ESP8266 pode consumir mais de 350mA, e isso complica bastante a quem quer ligar diretamente a um computador usando um chips conversor USB-SERIAL.

 

Eu recomendo sempre que use uma fonte em separado para alimentar o ESP8266, usando um regulador de 3,3 Volts, que suporte pelo menos 0,5 A de corrente.

 

Se voce gostar da plataforma Arduíno, pode ligar um desses chips USB-SERIAL no computador e pode fazer o upload dos programas diretamente usando a IDE do Arduíno. Essa é a maneira que eu testei meus devkit 1.0 quando chegaram.

 

Eu prefiro fazer as coisas usando um Atmega da vida ligado ao ESP8266, usando tudo por comandos usando a comunicação serial. Pelo menos é um ambiente em que estou bastante acostumado, usando o Bascom como linguagem. Assim, não uso o NodeMCU, uso o firmware nativo do ESP8266, bem documentado. Mas tenho sim em uso uma pequena aplicação que montei usando apenas um ESP8266-1 , Nodemcu e um pequeno script em Lua, vou descrever no final.

 

Existe uma maneira de compilar o script LUA e gerar diretamenteo código binario, assim você evita usar muita memória, alguns estão optando por este caminho, e dizem que dá bem menos problemas.

 

Quanto a ter um ou outro cara que fala mal do NodeMCU, infelizmente é sempre inevitável contentar a todos. Existem milhares e milhares de usuários com muitas aplicações rodando, e eles aprenderam a resolver os problemas que ocorreram. É como na vida, não nascemos sabendo.....

 

Eu uso em minha casa um ESP8266 com NODEMCU, está ligado a um relé de 3,3 volts , esse relé desliga a alimentação 110V do meu modem da NET, que de vez em quando insiste em ficar mudo e me obrigava a descer até a sala onde ele está instalado.... agora, quando dá algum tipo de problema, simplesmente pego o Iphone , entro no IP que definí no ESP8266, aparece uma tela com dois botões,  e clico no botão que criei, que dei o nome de "DESLIGA NET" , e o aparelho desliga o modem. Espero uns 5 segundos, e clico no outro botão que tem o nome "LIGA NET" , e o modem liga de novo. Aí é só sair e o problema foi resolvido. Isso é um simples script de servidor LUA que peguei na Internet, e funciona muito bem.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@aphawk, eu ainda ia entrar na questão da energia. Estava hesitando em prosseguir com o assunto neste tópico. Se moderador quiser, poderá mover todas essas mensagens sobre o ESP8266, por exemplo, para o tópico que você abrirá. Provavelmente ficaria melhor.

 

Mas já que você abordou um assunto tão importante, e com um exemplo de aplicação tão oportuna (que é basicamente o que desejo fazer: controlar relé), eu lhe pergunto:

  1. Com que você está alimentando o sistema?
  2. Qual tem sido a autonomia?
  3. Será que vale a pena adaptar um relé de 5 volts?

Tenho encontrado muita documentação técnica interessante no NURDs e no Electrodragon. Só que estou sem tempo de conhecê-la e interpretá-la agora.

 

Sobre os cuidados com a corrente de alimentação, talvez o segue seja o caso, até porque o CH340 é mais barato do que um programador FTDI:

 

CH340_esp8266.png

 

Usar USB to TTL me parece mais barato do que qualquer outra coisa. Pelo que estive vendo no randomnerdtutorials.com, usando um programador FTDI ele tanto grava o firmware como carrega os scripts Lua.

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

1 - Eu uso uma fontezinha de parede, que sai 9V / 1A , e uso um regulador de tensão com saída de  3,3 Volts por 1A . Assim, tenho na saída 3,3V e com suporte até 1A de corrente.

 

2 - Não é pilha.... então falar de consumo é complicado. Mas existem técnicas para diminuir bem o consumo médio, fazendo uma alimentação por pilhas durar vários dias. Existem alguns posts onde comentam mais de 50 dias ..... claro que tudo isso depende da aplicação e da frequência com que seja necessária essa comunicação.

 

3 - Eu comprei 10 relés de 3,3V no Ebay, custaram menos de US$ 1 cada um. Mas se voce quiser, use um transistor para poder acionar um relé maior, idealmente compatível com a fonte de alimentação. Por exemplo, se a fonte for de 9V, eu usaria um relé de no mínimo 6V pois essas fontes costumam cair a tensão.

 

Veja um exemplo do relé para 3,3 volts :

 

http://www.ebay.com/itm/5x-JRC-21F-3V-HK4100F-DC3V-SHG-Volt-Power-Relay-6PIN-/370487477291?hash=item5642c6442b

 

 

Note bem uma coisa : uma vez gravado o seu script LUA no ESP8266, não precisa mais do adaptador USB - serial !!!!! voce só precisa de uma interface serial para poder se comunicar com o ESP8266, atualizar o firmware se for preciso e poder transferir o seu programa em LUA para o ESP8266 !

 

Para gravar, não precisa de nenhum USBASP, basta apenas uma simples interface serial, é aí que entra o USB - SERIAL !!!

 

Por exemplo, eu tenho um conversor USB - SERIAL ( nivel TTL, SEMPRE !! )  com um chip da Prolific, e uma vez que o Windows reconheçeu o driver, uso sem problema.

 

Eu recomendo que voce verifique bem quando for comprar o seu adaptador USB-SERIAL :  ele tem de ter , além do TX e RX, os sinais DTR e CTS , o nível de saída serial tem de ser TTL, e de preferência ter um JUMPER para selecionar a tensão de saída entre 3,3 Volts e 5 volts. O ideal é um desses chamados FTDI232, existem muitos no Ebay, é uma pequena plaquinha vermelha. Mas preste atenção : evite a tentação de alimentar o ESP8266 com a tensão de alimentação que sai do conversor USB-SERIAL, ele suporte cerca de 100 mA, e o ESP8266 precisa no mínimo de 350 mA, ok ?

 

Veja aqui o FTDI 232 :

 

http://www.ebay.com/itm/FT232RL-FTDI-USB-to-TTL-Serial-Adapter-Module-for-Arduino-3-3V-5-5V-FTDI232-CG-/151604208485?hash=item234c50a365

 

Mas pode usar qualquer um USB-SERIAL desde que preencha os requisitos que falei.

 

E sempre alimente o seu ESP8266 com uma fonte de tensão à parte, mesmo quando ligar ele no seu USB - SERIAL, como já falei acima.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

[...] existem técnicas para diminuir bem o consumo médio, fazendo uma alimentação por pilhas durar vários dias. Existem alguns posts onde comentam mais de 50 dias ..... claro que tudo isso depende da aplicação e da frequência com que seja necessária essa comunicação.

 

Eu quero basicamente controlar relés de iluminação. Ainda falta avaliar se a solução total não ficaria mais barata com Atinys e RF. Talvez consumam menos, também.

 

Veja um exemplo do relé para 3,3 volts: [link substituído pela imagem abaixo]

$_57.JPG

 

Você não vê vantagem em usar um módulo como o que está abaixo?

3V-3-3V-relay-control-module-With-optoco

eu tenho um conversor USB - SERIAL ( nivel TTL, SEMPRE !! )  com um chip da Prolific, e uma vez que o Windows reconheçeu o driver, uso sem problema.

 

Eu recomendo que voce verifique bem quando for comprar o seu adaptador USB-SERIAL :  ele tem de ter , além do TX e RX, os sinais DTR e CTS , o nível de saída serial tem de ser TTL, e de preferência ter um JUMPER para selecionar a tensão de saída entre 3,3 Volts e 5 volts. O ideal é um desses chamados FTDI232, existem muitos no Ebay, é uma pequena plaquinha vermelha. Mas preste atenção : evite a tentação de alimentar o ESP8266 com a tensão de alimentação que sai do conversor USB-SERIAL, ele suporte cerca de 100 mA, e o ESP8266 precisa no mínimo de 350 mA, ok ?

 

Veja aqui o FTDI 232: [link omitido]

 

Mas pode usar qualquer um USB-SERIAL desde que preencha os requisitos que falei.

Estou muito atraído pelo CH340. Resta saber se atende aos requisitos que você acaba de me ensinar. Muito obrigado por observá-los. Eu sabia que tinha de procurar uma informação assim, mas não aonde.

sku_303521_1.jpg

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

Sinceramente, não vejo hoje em dia nenhuma outra solução que tenha o custo tão baixo como os ESP8266, e nem tão simples de se fazer !

Quanto a consumo, é bem baixo quando não está se comunicando com alguma coisa; mas durante a comunicação existem picos de consumo. Mesmo assim, não vai ser alto na média, acho que voce pode pesquisar isto na Net.

Quanto ao módulo que você mostrou :

1 - eles sempre são de no mínimo 5 volts, então vai ter de trabalhar com dois reguladores de tensão, 3.3 volts para o ESP8266 e 5 volts para o relé.

2 - não é necessário nenhuma interface entre o relé e a saîda do ESP8266, ela tem potência de sobra para acionar o relé diretamente.

 

Update : a grande maioria dos relés disponíveis no Ebay para 3,3 Volts são de baixo custo, e possuem bobina de baixa resistência, sendo que precisam de quase 95 mA para acionar !!!!  Nesse caso temos obrigatóriamente de usar um transistor na saída para acionamento !

 

Procure sempre pelos relés mais caros, e veja qual a impedância da bobina. Ela tem de ter acima de 300 ohms para ser ligada diretamente aos pinos de I/O !

3 - Um módulo custa muito mais do que um relé de 3.3 Volts !

Sobre o CH340 :

Existem versões mais atuais, onde existe um jumper para selecionar 3.3 ou 5 volts. Embora a entrada do ESP8266 seja tolerante a 5 volts, eu não usaria..... Mas essa que você mostrou também funciona para este caso.

Essa versão que voce mostrou é a mais antiga de todas. Para algumas aplicações, é necessário o uso de outros sinais além dos que esse seu modelo possui. Claro, para uso simples, não fazem falta. Mas a diferença de preço para esta sua versão e uma mais moderna, que possua os sinais adicionais conforme escreví acima, e também tenha o jumper de seleção de 3,3 / 5 volts é tão pequena que justifica pagar um pouco mais e ter o melhor produto.

Eu procuraria algo como esta aqui :

 

sku_96330_1.jpg



Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sinceramente, não vejo hoje em dia nenhuma outra solução que tenha o custo tão baixo como os ESP8266, e nem tão simples de se fazer !

Pois é, tem até o Home Automation Server a nossa disposição!

 

[o consumo] não vai ser alto na média, acho que você pode pesquisar isto na Net.

Entendi. Pode deixar. Até já encontrei, uma interessante tabela de correntes. Falta só interpretá-la. Depois pergunto no fórum.

 

1 - eles sempre são de no mínimo 5 volts, então vai ter de trabalhar com dois reguladores de tensão, 3.3 volts para o ESP8266 e 5 volts para o relé.

Existem os de 3.3 volts, mas são menos comuns. Parece-me que é procurar "para Arduino Framboesa", algo assim. Eu fiquei a pensar sobre ruídos, se eles módulos já não traria uma ajuda eletrônica contra eles.

 

2 - não é necessário nenhuma interface entre o relé e a saîda do ESP8266, ela tem potência de sobra para acionar o relé diretamente.

Informação valiosa! Como a grande maioria das que você nos trás. Muito obrigado.

 

Sobre o CH340: [não...] Eu procuraria algo como esta aqui: imagem

Sim, eu já estava pensando em fazer isso. Obrigado por este reforço.

 

Update

Talvez até já exista biblioteca para abstrair esse uso [dos comandos AT], não é?

 

Não exatamente isso, mas o projeto guyz / pyesp8266 parece ajudar, para quem não quiser Luatool ou ESPlorer:

send_cmd( "AT+CIPMUX=1" ) # multiple connection modesend_cmd( "AT+CIPSERVER=1,80" )

@aphawk, como é mesmo que você faz com a Arduino IDE? O que é exatamente o dev kit que você adquiriu?

 

"Como usar o ESP8266 para controlar iluminação com pouco dinheiro" é o que estou tentando responder primeiro.

 

Com o conhecimento do autor original, Rui Santos, comecei a organizar ESP8266 do Rui, em portuguêsUm guia para automação simples e barata. Se alguém daqui manifestar interesse em colaborar no GitHub (issues e Git com forks e pull requests), habilitarei o projeto do livro lá. Podemos abrir tópico para tratar do rumo da "redação".

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

Sobre ruídos de relés ... isto sempre é algo complicado. A norma é SEMPRE USAR UM DIODO REVERSAMENTE POLARIZADO em paralelo com o relé.

 

Outra coisa : a alimentação do relé sempre deve vir diretamente do ponto onde voce soldou o regulador de tensão, ou o mais próximo possível dele, e ter nesse ponto um capacitor eletrolítico em paralelo com um cerâmico de 0.1 uf. Ah, caprichar na trilha de terra de todo o circuito também ajuda muito. Muita gente fica reclamando que quando algum relé no circuito é acionado, ocorrem erros doidos, até Resets , e ficam procurando fantasmas.... é só seguir o bom senso e pronto, tudo se resolve ! Pensar antes de fazer ajuda muito !

 

Outra coisa interessante sobre os ESP8266, repare que existem mais de 10 versões dele..... as primeiras são bem baratas, embora limitadas em poucos pinos. Já as ultimas, como a que eu mais gostei e a que comprei 5 delas que é o ESP8266-12, tem 9 pinos de I/O que dá para serem entrada / saída , já pensou o que não dá para fazer com isso ?

 

O problema é que o espaçamento entre os pinos não é padrão, assim é preciso comprar uma plaquinha de adaptação para ele, a qual vai permitir o uso com espaçamenteo padrão de 0.1 " .

 

Veja aqui os tipos e diferenças :

 

http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family

 

Veja com atenção a tabela ao final da página do Wiki, mostra alguns detalhes muito úteis sobre os módulos. Ah, cuidado com o espaçamento dos pinos !

 

Aqui, um exemplo de plaquinha adaptadora :

 

20150519_ESP8266-adapter-apart.jpg

 

 

Enfim, isto tudo é um novo mundo....

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Veja aqui os tipos e diferenças [entre as mais de 10 versões de ESP8266]:

 

http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family

 

Veja com atenção a tabela ao final da página do Wiki, mostra alguns detalhes muito úteis sobre os módulos. Ah, cuidado com o espaçamento dos pinos !

 

Para quem está gostando do off-topic, um índice:

 

all_esp_modules1.pngall_esp_modules1.png

@aphawk, se você abrir o tópico, poderemos pedir para um moderador mover todos essas mensagens para ele?

[...] uma interessante tabela de correntes. Falta só interpretá-la. Depois pergunto no fórum.

 

Tópico criado: O consumo de um ESP8266

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

Sim, vou pedir para o moderador passar isto tudo para um tópico geral na área de microprocessadores, assim mais pessoas vão conheçer este pequeno brinquedo mágico !

 

Olha, sei que voce pode se perguntar o porque que eu chamo isto de mágico , mas olhe isto:

 

Para poder fazer algo semelhante a isto que o ESP8266 faz, usando um Attiny da vida, Bascom e qualquer outro tipo de chip que tenha uma pilha TCP/IP e permita fazer conexão via Wireless, dois anos atrás a quantidade de linhas de código passa fácilmente de 500 linhas e é de uma complexiade tal que eu mesmo nunca quis fazer nada deste tipo. Só de olhar códigos escritos por outros desanima qualquer um.

 

Agora, hoje, mesmo usando o firmware original, que responde aos comandos AT, e usando um Attiny da vida, ficou muito mais simples fazer um Web Server que permita acionar alguns relés.... creio que nem 70 linhas seriam usadas.

 

E usando LUA, a facilidade é absrdamente menor, fora a quantidade de exemplos prontos que encontramos na Internet !

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Existe o nRF24L01, você sabe, né? Mas, assim mesmo, é código C, bem mais gordo.

 

Não estou conseguindo olhar do mesmo ponto de vista que você. Sim, a interação usando comandos AT já traz grande simplicidade. Só que deixar o ESP8266 auto-contido, mediante a aplicação do NodeMCU, é muito mais atraente pra mim. Também pelo preço. Preciso conhecer mais as diferentes versões, com suas opções de GPIO. Por exemplo, suponho que as versões mais simples não tem pinos analógicos ou de PWM.

 

Você sabe dizer como se compila LUA para o NodeMCU? Por acaso é com o luac padrão mesmo?

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm,

 

Sim, eu entendo o seu objetivo. E esqueçe o NRF24LXX, eles são bem complicadinhos de se usar.

 

Mesmo a versão mais simples ESP8266-1 tem 1 entrada analógica e 1 saida PWM !

 

voce escreve o seu programa em Lua usando um editor de texto comum, e COPIA E COLA  na janela principal do ESPlorer. Aí basta mandar salvar no ESP8266, como o programa a ser executado quando se inicia. Existem muitos tutoriais em vídeo sobre isso também.

 

Não é necessário compilar, o NodeMCU interpreta os comandos Lua !

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Projeto de um Analizador Lógico Portátil com Atmega1284P - PARTE 6  -  Osciloscópio Digital

 

Vamos agora ver a rotina que faz a captura dos dados conforme o tempo que determinamos. Iremos usar um Timer para isto, que vai gerar a interrupção e nela será feita a captura.

 

Mais uma vez, recorro ao ASM, pois os tempos envolvidos são bem pequenos em termos de ciclos de clock. Por exemplo, com uma interrupção a cada 200 ciclos de clock, temos cerca de 190 ciclos apenas para fazer o nosso programa iniciar o conversor A/D, esperar pelo término da conversão, ( a qual demora 13*8 = 104 ciclos de clock !!!!!! ) , pegar a amostragem, converter para um único byte, armazenar no buffer, e testar para ver se chegou no fim !

 

Durante os testes, percebí que existe uma flutuação, isto é, às vezes a interrupção demora 201 ou 202 ciclos de máquina, pois existem algumas instruções em Assembly que podem demorar 2 ou até 3 ciclos de clock ! São justamente as que envolvem testes e desvios, então tive de bolar uma maneira de garantir que sempre ocorra uma interrupção quando está sendo executada uma instrução de um único ciclo de clock !

 

Para evitar ficar louco, fiz por tentativa e erro, olhando os tempos do Proteus, introduzindo algumas instruções NOP em dois lugares estratégicos, que são justamente o teste do CARRY flag no programa principal, e o teste do registro do conversor A/D que indica que a conversão está pronta.

 

O circuito é exatamente o mesmo do post anterior, então vamos ao programa :

$regfile = "m1284PdefOK.dat"
$crystal = 20000000
$hwstack = 52
$swstack = 52
$framesize = 32
Disable Jtag
Dim Flag_cap_mode As Bit
Dim Buffer_grande_captura(8192) As Byte
Dim B_temp As WordDim B_temp1 As Word
Dim B_temp2 As Word
Dim B_temp3 As Word
Dim B_temp4 As Word
Config Pina.0 = Input
'***************************** Program *****************************************
Config Adc = Single , Prescaler = 8 , Reference = Avcc
Enable Adc
Start Adc
B_temp = Getadc(0)
B_temp2 = 0
Compare3a = 199
' com este valor, teremos 1 interrupção a cada 200 ciclos de clock !
' que equivale a 10 microsegundos.
Config Timer3 = Timer , Prescale = 1 , Compare A = Disconnect , Clear_timer = 1
On Compare3a Faz_amostra Nosave
Didr0 = 255
'VAMOS LOGO TESTAR 8192 CAPTURAS
Flag_cap_mode = 0
'Agora, colocamos o endereço do buffer nas variáveis que queremos
$asm
Loadadr Buffer_grande_captura , X
MOV R24,R26
MOV R25,R27
Loadadr B_temp , X
ST X+,R24
ST X, R25
$end Asm
B_temp2 = B_temp
If Flag_cap_mode = 1 Then
  B_temp1 = 70
Else
  B_temp1 = 8192
End If
B_temp3 = B_temp1
' 1 = faz apenas 70 capturas
' 2 = faz 8192 capturas
Timer3 = 0
Enable Compare3a
Enable Interrupts
' Agora, a ideia é ficarmos em um loop em Assmbly, esperando que a
' captura de todos os itens termine. Isto será feito assim :
' Setamos o flag de CARRY, e ficamos testando ele até o momento
' que ele seja zerado pela rotina de captura, significando que
' a captura chegou ao fim.
$asm
' Salvamos alguns registros apenas, assim não precisaremos ficar
' salvando os mesmos os registros durante a rotina de interrupçao,
' e ainda ter de repor antes da saída !
PUSH R16
PUSH R17
PUSH R26
PUSH R27
SEC
' A seguir, reparem os NOPS ...... isto foi feito por tentativa e
' erro, até que TODAS as capturas sejam mesmo feitas a cada exatos
' 10 microsegundos, sempre ! Nesta hora, o Proteus foi uma enorme
' mão na roda !
' Este problema é causado quando ocorre uma interrupção do Timer
' justamente no início de uma instrução que use mais de um ciclo
' de clock, o que faria o intervalo da captura ser diferente em um
' ou 2 ciclos de clock. parece pouco, mas isto poderia gerar um erro
' de até 1% no intervalo de tempo !
Espera:
NOP
NOP
' Agora, vamos testar o flag de Carry, que determina se acabaram
' as capturas, então podemos sair para o programa principal, onde
' desativamos o Timer3 e as interrupções.
BRCS   espera
POP R27
POP R26
POP R17
POP R16
$end Asm
Disable Timer3
Disable Interrupts
Stop
Faz_amostra:
$asm
IN   R16,SREG
PUSH R16
'vamos iniciar uma conversão do ADC
LDS  R16, ADCSRA
ORI  R16, 80
ANDI R16,&B11110111
STS  ADCSRA,R16
' e agora vamos esperar terminar a conversão
Am1:
LDS  R16, ADCSRA
' Reparem os NOP's novamente, para acertar o tempo exato !
NOP
NOP
NOP
NOP
SBRC R16, 6
RJMP AM1
LDS  R16, ADCL
LDS  R17, ADCH
' se chegou aqui,a conversão foi feita e o resultado está em
' R16 e R17 . 
' agora, vamos juntar os dois bytes em um só
' fazendo um shift prá esquerda 2 casas no LSB
LSR   R16
LSR   R16
' agora, vamos fazer um shift prá direita de 6 casas no MSB
LSL   R17
LSL   R17
LSL   R17
LSL   R17
LSL   R17
LSL   R17
' e agora, é só juntar tudo em um só byte !
!OR    R16,R17
'agora, é só controlar a quantidade de amostragens que foram determinadas
' e armazenar no buffer correto !
'Lembrando que B_temp2 tem o endereço do início do buffer
'e B_temp3 tem a quantidade de leituras a serem feitas
' Caregamos X com o endereço do bufer
LDS   R26, {B_TEMP2}
LDS   R27,{B_TEMP2+1}
' agora guardamos a amostragem do ADC no buffer e já incrementamos
' o endereço para a próxima leitura
ST    X+,R16
' Salvamos o endereço já atualizado
STS   {B_TEMP2+1},R27
STS   {B_TEMP2},R26
' Agora, vamos saber se terminamos a amostragem
' carregamos X com a quantidade de amostras que faltam serem feitas
LDS   R26, {B_TEMP3}
LDS   R27, {B_TEMP3+1}
' truque rápido para decrementar a quantidade de leituras a fazer !
LD    R17,-X
' salvamos a quantidade de leituras já atualizada
STS   {B_TEMP3+1},R27
STS   {B_TEMP3}, R26
' Agora, testamos para ver se acabou 
!OR    R26,R27
' Se o resultado for zero, acabaram as leituras, é só sair
' e sinalizar para o programa principal com o CARRY flag
' ZERADO!
BRNE  SAI_NORMAL_CAP
' Se chegou aqui, acabamos com todas as amostras feitas !
POP  R16
!OUT SREG,R16
CLC
RETI

Sai_normal_cap:
' Se Chegou Aqui , Temos De Sair Normalmente Pois Ainda Faltam
' amostras a serem feitas....
POP  R16
!OUT SREG,R16
$end Asm
Return
End

Reparem que variando o valor de comparação do COMPARE3A, mudamos o tempo para cada amostragem.

 

Mas provavelmente terei de fazer algumas rotinas repetidas, onde mudarei os NOPS internos para que os tempos sejam exatos.

 

Seguem os arquivos para simulação.

 

 

 

 

 

 

@alexandre.mbm,

 

 

Vixi, juntou a minha resposta sobre o ESP8266 com o Post do osciloscópio ......

 

Sobre a entrada A/D, só tem pinos acessíveis em alguns tipos de ESP8266, mas TODOS os CI's ESP8266 tem esse pino e dá para soldar direto nele , mas em alguns tipos fica dentro do invólucro metálico e não dá para acessar sem ter de abrir tudo , o que dá um baita trabalho....

 

Já o PWM todos tem sim, pois é o pino GPI02.

 

Veja as informações aqui :

 

http://www.instructables.com/id/ESP8266-ADC-Analog-Sensors/step5/ADC-on-an-ESP8266-01-/

 

http://www.esp8266-projects.com/2015/03/internal-adc-esp8266.html

 

http://www.esp8266.com/viewtopic.php?f=6&t=545

 

Sobre a compilação, nem precisa se preocupar, pois é um microprocessador ARM 32 bits rodando a 80 Mhz.... Mas dá sim para compilar se voce quiser, só nào sei como fazer..... !

 

Paulo

SCOPE6.rar

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!