Arquivo para outubro \29\UTC 2009

Arduino – parte 2

Lembram que falei que iria montar um Arduino?

Bem, tomei vergonha na cara e comecei:

Abaixo a foto feita antes de transferir do papel para a placa de Fenolite. Cortada com serra, acho que não está muito reta:

Imag089

Na primeira vez que passei na laminadora, umas trilhas soltaram então tive que refazer. Foto da placa pronta para ser corroida:

Imag093_d

Por fim, a placa foi tomar seu banho de percloreto de ferro.

Coloco mais fotos (da próxima vez com qualidade melhor) quando estiver pronto, com os componentes soldados. Aguardem os próximos capítulos.

Anúncios

Rot-13

Chegam uns paraquedistas do Google por aqui com coisas do tipo “programar o rot-13”.

Pra que alguém precisa programar isso, uma vez que já existe o comando tr, para substituir letras.

echo "Cnendhrqvfgnf qb Tbbbbbbtyr" | tr 'A-Za-z' 'N-ZA-Mn-za-m'

A idéia dessa “criptografia” que César usava pra enviar mensagens é que, pelo alfabeto ter 26 letras, se ele rodasse 13 letras para o lado, só precisa rodar mais 13 letras para ver a mensagem original. Assim, para criptografar ou descriptografar uma mensagem, o procedimento era o mesmo.

O único problema são as letras acentuadas que não serão criptografadas.

Por fim, se não quiser ficar escrevendo esse comando no shell ou se não tiver um, existe o http://rot13.com. E que fique claro que esse é apenas o nome do meu Blog, não seu conteúdo.

Cronômetro em VHDL

Meu último projeto em VHDL foi um simples cronômetro com precisão de centésimos de segundo que, com dois displays de sete segmentos, apresenta o tempo.

disp7-seg

Como só é possível apresentar dois dígitos de cada vez, foi adicionado suporte a um botão que, quando pressionado, muda o que o display exibe: Ele começa exibindo décimos e centésimos de segundo. Com um clique, passa a exibir os segundos. No clique seguinte, os minutos e depois, com mais um clique, as horas.

Para parar e continuar o cronômetro, foi usado mais um botão, ficando um sistema bem simples e funcional.

Cronometro funcionando

Cronômetro rodando numa MAX 7k da Altera

A imagem está em baixa resolução, mas mostra o cronômetro gravado numa CPLD MAX7128S da Altera, que deve ter uns 15 anos. Ela tem um clock de 25,175MHz, que permite um cronômetro com precisão de cerca de 40 nanosegundos (3,97 x 10⁻⁸ s), mas isso seria impossível de ver no display (centésimos de segundos já aparecem borrados). Então, no código, tem um divisor de frequência onde é usado um clock de 100Hz para a contagem de tempo.

O WordPress não permite anexar arquivos de texto, então coloquei no pastebin: http://pastebin.com/ythU4TjH. Para ver melhor, use o Notepad++ ou o Kate.

Para poder reutilizar esse código, será preciso trocar o valor do clock da sua CPLD ou FPGA para que o cronômetro marque o tempo certo. Nesse caso, o divisor de frequência usa o valor 125875 ou 11110101110110011, criando 200 descidas e subidas por segundo, que equivale a um clock de 100Hz.

Meu próximo projeto em VHDL será um controlador de interface serial RS232, aquela que provavelmente não existe mais no seu computador. Mesmo assim, é possível utilizar um conversor USB – RS232, como o que eu comprei por US$3,00 no DealExtreme.

Por hoje é só, pessoal.

Escrevendo na EEPROM

Um microcontrolador de 8-bit (PIC, AVR, Intel 8051) é formado, normalmente, por uma a CPU, uma memória de armazenamento para o programa que será executado (geralmente flash), memória RAM  e um punhado de uma memória para armazenamento “permanente” de dados.

Essa última memória normalmente é EEPROM (a EEPROM pode ser substituida por outras tecnologias, mas são as mais comuns nos microcontroladores).

A idéia inicial seria ter um pequeno espaço onde dados poderiam ser escritos pelo microcontrolador, para serem acessados mais tarde, preservando seu conteúdo mesmo sem energia elétrica. Algo que a memória Flash já faz, com a “única” diferença de ser escrita em blocos e não bit a bit, economizando espaço.

Antes de falar da EEPROM, vou falar um pouquinho de PROM e EPROM, nada que não seja encontrado na Wikipedia.

A memória PROM, como a sigla em inglês já diz, pode ser escrita uma única vez e, depois disso, se torna de “apenas leitura”. Em alguns casos, isso pode ser suficiente para aplicação em que ela está inserida, mas em outros, pode não ser interessante.

Se, numa empresa que vende sistemas microcontrolados descobrisse que existe um erro no programa armazenado na PROM dos seus microcontroladores, ela não poderia alterar antes de enviar aos clientes. Para isso, surgiu a EPROM, que pode ser apagada, como o E (erasable) do seu nome diz.

A EPROM pode ser apagada com o uso de luz ultra-violeta forte incidente em uma pequena janela no topo do encapsulamento do circuito integrado, sendo possível solucionar o problema anterior.

eprom

Por fim, vieram as EEPROM, título do post de hoje. Esse tipo de memória pode ser apagada eletricamente, podendo ser utilizada não só como armazenamento do programa do microcontrolador como um espaço onde o próprio pode usar como armazenamento que pode ser reescrito diversas vezes.

Essas diversas vezes em que a EEPROM pode ser reescrita resumem-se à aproximadamente 100 mil (é só ver no datasheet do seu microcontrolador para saber quanto dura a sua… isso pode variar bastante), que significa que, se seu sistema escreve na EEPROM muitas vezes, ela pode parar de funcionar corretamente em algum momento, fazendo com que seu programa não escreva mais nela (mesmo que ele não perceba que não está escrevendo). Isso acontece pela tensão muito mais alta que o normal aplicada para poder apagar o que estava escrito.

Aí você pode me dizer: Mas a memória flash onde o programa do microcontrolador está pode parar de funcionar com 10 ou 100 vezes menos operações de escrita! Claro, claro, mas teoricamente você coloca o programa nela e depois não muda com muita frequência. Seria muito difícil alguém precisar regravar a memória flash mil ou 10 mil vezes.

Por isso, volto à questão da EEPROM, que, como fica à critério do seu programa quantas vezes ele vai escrever nela, em um dado momento não vai mais funcionar. Lembre-se que um microcontrolador pode fazer alguns milhões de operações em um segundo, se forem todas de escrita na EEPROM, lá se vai a sua memória.

Uma possível solução para fazer uma rotina de escrita na EEPROM é, antes de escrever os dados, verificar se eles já não estão escritos naquele lugar.

Se seu programa faz uma leitura analógica, por exemplo, a cada tempo T e após salva essa leitura na EEPROM, pode acontecer de diversas vezes a última leitura ser idêntica à atual, fazendo com que você force uma escrita onde não seria preciso, diminuindo a vida útil da sua memória.

Luminosidade

Uso de sensores para executar tarefas pode ser muito divertido, uma vez que você pode fazer seu aparelho digital interagir com o mundo analógico, como se fosse uma pessoa, um animal ou até uma planta.

Falando de sensores de luz, poderíamos citar dois deles, que podem ser facilmente utilizados em projetos pequenos e de baixo custo: os fotodiodos e fotoresistores.

Os fotodiodos funcionam como diodos comuns que, quando inversamente polarizados, permitem a passagem de corrente de acordo com a intensidade de luz que chega neles. Fisicamente, eles podem ser bem parecidos com os LEDs (Diodo emissor de luz), que fazem o caminho inverso, transformando corrente em luz.

140px-Photodiode_symbol

Algo interessante nos fotodiodos é que, quando encapsulados em plástico fosco, eles não são mais afetados pelo espectro visível de luz, mas ainda o são por UV e raio X, podendo até ser usado como medidor de radiação. 😀

Eles são usados, entre outras coisas, para medir intensidade luminosa e em drives de CD, para dizer se um ponto da superfície do disco refletiu ou não.

Outra forma de detectar intensidade luminosa é com o fotoresistor (LDR – Resistor dependente de Luz, em inglês), que apresenta uma resistência que varia de modo inversamente proporcional à quantidade de luz incidente.

LDR

Os fotoresistores são bastante utilizados em sistemas microcontrolados e, para isso, é preciso criar um divisor de tensão, a fim de aplicar uma tensão a ser medida pelo microcontrolador.

Ao aplicar uma tensão contínua Vcc, a saída V será usada na medição:

photoresComo V = Ri, então V/Vcc = R2 / (R1+R2). Assim, no primeiro circuito da imagem acima, o aumento da resistência do fotoresistor irá implicar numa diminuição da tensão V. Ou seja, quanto menor a luminosidade, menor a tensão. No circuito seguinte, o contrário acontece. Luminosidade e tensão se tornam inversamente proporcionais.

As maiores utilizações para os fotoresistores são os postes de iluminação de rua, que acendem quando o dia escurece.

Trabalho de casa: Apontar um laser para a parte de cima do poste que fica na frente da sua casa e fazer ele apagar. 😀

Esses dois sensores para medir intensidade luminosa também podem ser usados em conjunto com um Amplificador Operacional (OPAMP) e, assim, fazer um controle “burro”, como para girar um motor quando houver uma fonte de luz, por exemplo.

Neste rápido vídeo a seguir, o cara usa um LDR para acender um LED quando a luz é apagada usando um OPAMP e um relé:

Uma outra aplicação interessante seria o uso de LEDs infravermelhos apontados para um sensor desses que apite um alarme de que tem uma pessoa entrando no seu quarto, quando interromper a passagem de luz. 🙂

Existem diversas aplicações para esses sensores. Invente a sua.