Hardware

Converter um número Real para o formato binário em vírgula flutuante segundo a Norma IEEE-754

Já são tantas as vezes que expliquei o processo de conversão de um número qualquer para o formato binário em vírgula flutuante de acordo com a Norma IEEE-754 que desta vez, apeteceu-me escrever sobre isto. 🙂 Quem não quiser ler o que segue e preferir saltar para a versão condensada, clique aqui.

Entre outras coisas, a Norma IEEE-754 especifica dois níveis de precisão: simples e dupla. O primeiro nível ocupa 32 bits, o segundo, 64 bits. Para quem programa em linguagem C, o primeiro nível de precisão corresponde a uma variável do tipo float, o segundo, a uma variável do tipo double.

Atente à distribuição dos bits, de acordo com o nível de precisão do formato:

Tomemos por exemplo o número 94.0254, para o converter para um número em vírgula flutuante com precisão simples (32-bits) de acordo com a Norma IEEE-754. Este número é composto por duas partes: uma inteira (94) e uma fraccionária (0.0254).

1) Comecemos por converter para binário a parte inteira. Não vou entrar nos detalhes da conversão de um número entre os formatos Decimal e Binário. Há muita literatura sobre este assunto e muitos conversores automáticos online…

Portanto, a parte inteira fica: 1011110

2) Em seguida, converte-se a parte fraccionária. Mais uma vez, abstenho-me de entrar nos detalhes deste tipo de conversão. Creio que tal como a imagem anterior, a imagem abaixo é self-explanatory.

Portanto, o número Real convertido para binário fica:

3) O passo seguinte consiste na normalização do número convertido para o formato 1.xxxxxx… Isto é, operar o número original por forma a que a parte inteira fique “reduzida” a uma unidade. Para tal, usa-se a operação SHIFT LOGICAL RIGHT, ou simplesmente, divide-se por 2 e multiplica-se por 2, tantas vezes quantas as necessárias:

A última linha do processo acima, apresenta o número 94.0254, convertido para um número binário normalizado, multiplicado por 2^6, para satisfazer um dos requisitos da Norma IEEE-754. A parte em fundo cor de rosa, corresponde à parte fraccionária que aparecerá na trama final de 32 bits. São apenas 23 bits (os que cabem na precisão simples). Os restantes bits ficam truncados, originando um erro na representação do número original.

4) O 6 a fundo amarelo do passo anterior será adicionado a um BIAS, definido pela Norma IEEE-754, de acordo com o nível de precisão pretendido:

float (32 bits): BIAS = 127 (expoente de 8 bits)
double (64 bits): BIAS = 1023 (expoente de 11 bits)

O resultado desta soma corresponde ao valor da parte correspondente ao EXPOENTE do número em vírgula flutuante. Este expoente fica então (a fundo verde):

5) Por fim, o bit mais significativo da trama de 32 bits (64, no caso da precisão dupla), corresponde ao bit de Sinal. Este bit é igual a 1 se o valor original for negativo. Neste exemplo, este bit (a fundo azul na representação abaixo) fica igual a Zero.

6) Juntanto as parcelas todas, obtém-se a representação de 94.0254 no formato vírgula flutuante com precisão simples de acordo com a Norma IEEE-754:

————————

Resumidamente:

Acender um LED com a tensão da rede eléctrica

Por diversos motivos, é útil saber se um determinado dispositivo está sob tensão. Por exemplo, um aparelho, apesar de estar desligado (OFF), pode estar conectado à rede eléctrica (230V-50Hz). Para este efeito informativo, muitos aparelhos têm um indicador luminoso (LED ou de outro tipo) que testemunha a presença da tensão da rede eléctrica no seu interior.

O circuito apresentado neste artigo, permite acender um LED com a tensão monofásica da rede eléctrica (230V – 50Hz). Pode então por exemplo, instalar este circuito num qualquer aparelho que funcione a 230V ou ainda instalá-lo num quadro eléctrico para indicar a presença de cada Fase, etc.

AVISO: Este artigo tem fins meramente informativos. Se não tem formação e experiência na montagem e manuseamento de circuitos eléctricos com tensão da rede eléctrica, procure ajuda de um técnico ou electricista qualificados. O autor deste artigo não se responsabiliza por quaisquer danos materiais ou fisiológicos que possam advir da consulta e implementação do conteúdo deste artigo. A sua utilização de qualquer informação ou materiais publicados neste artigo é da sua total responsabilidade. Se não concorda com o conteúdo deste aviso, queira abandonar este sítio.

O Esquema

Princípio de funcionamento

É possível simplificar este esquema, retirando dele o condensador. Funcionalmente, o resultado seria o mesmo; i.e., o LED acenderia sempre que se aplicassem 230V entre os terminais J1 e J2, desde que a resistência R1 tenha sido dimensionada apropriadamente. Porém, esta resistência seria demasiado “grande” pela potência que teria de dissipar como se pode verificar pelas operações seguintes:

UREDE = 230 V
ULED = 1,6 V
ILED = 20 mA (0,02 A) – Valor máximo, para um LED comum.

R1 = (UREDE – ULED) / ILED = (230 – 1,6) / 0,02 = 11420 Ω -> 12000 Ω (12 kΩ)

Com R1 = 12 kΩ, a corrente no LED passa a ser:

ILED = (UREDE – ULED) / R1 = (230 – 1,6) / 12000 = 0,019 A (19 mA)

A potência que a resistência terá de dissipar, pelo papel abaixador de tensão e limitador de corrente para o LED é calculada pela expressão:

PR = R1 x I2 = 12000 x 0,0192 = 4,33 W (Temos um aquecedor!)

Para evitar o uso de uma resistência “de aquecimento”, e baixar a tensão da rede para a necessária para o LED, recorre-se então ao uso de um circuito RC série. Esta técnica é frequentemente usada em fontes de alimentação sem transformador. Mas atenção!!! Esta técnica só funciona correctamente para cargas com corrente constante, pois a queda de tensão no par RC varia com a corrente solicitada pela carga.

Dimensionamento dos componentes

No dimensionamento de um “transformador de tensão” sem Transformador (máquina electromagnética), procura-se minimizar as perdas por Efeito de Joule (calor) na resistência, passando para o condensador a tarefa de baixar a tensão, já que este não sofre (tanto) de Efeito de Joule. Isto é possível porque o condensador, em corrente alternada adquire uma Impedância que tem o mesmo “efeito voltaico” que a resistência.

A resistência tem no entanto, de permanecer no circuito para limitar a corrente neste (circuito série).

Para proteger o LED contra eventuais flutuações da tensão da rede, limita-se a 15 mA, a corrente no mesmo, o que para um LED vulgar, permite um brilho muito bom. Assim,

UREDE = 230 V
fREDE = 50 Hz
ULED = 1,6 V
ILED = 15 mA (0,015 A)

Z = (UREDE – ULED) / ILED = (230 – 1,6) / 0,015 = 15227 Ω

Z = √ (R12 + XC12)

A questão agora consiste em arbitrar valores aos componentes R1 e C1 por forma a obter uma impedância total Z com cerca de 15,2 kΩ.

Se se utilizar uma resistência comum de 0,25 W e se limitar a potência desta a 0,2 W (por aplicação de um factor de cagaço), deduz-se o valor da resistência para uma corrente de 15 mA da seguinte forma:

R1 = P / ILED2 = 0,2 / 0,0152 = 889 Ω

Sabendo que a potência dissipada na resistência aumenta com o valor desta, reduz-se o valor obtido acima para o valor normalizado imediatamente abaixo (Série E12), isto é 820 Ω!

Conhecendo os valores de R1 e de Z, calcula-se o valor da impedância do condensador C1:

XC1 = √ (Z2 – R2) = √ (152272 – 8202) = 15205 Ω

Sabendo que XC1 = 1 / (2 . Π . fREDE . C1), obtém-se o valor da capacidade do condensador C1:

C1 = 1 / (2 . Pi . fREDE . XC1) = 1 / (2. Pi . 50 . 15205) = 209.10-9 = 209 nF

Sabendo que a impedância de um condensador diminui com o aumento da sua capacidade, ajusta-se o o valor obtido para um valor normalizado imediatamente abaixo (180nF). No entanto, é interessante verificar os valores teóricos das grandezas envolvidas no circuito, também para o valor imediatamente acima dos 209 nF (220nF). A tabela abaixo apresenta os resultados das grandezas relevantes no circuito para as diferentes combinações R1-C1.

Comparando as soluções 2 e 4 da tabela acima, verifica-se que para uma corrente aproximadamente igual (mesmo brilho do LED), a potência dissipada na resistência da solução 4 atinge valores próximos do limite nominal do modelo previamente escolhido (1/4W).

Optando-se pela solução 2, o esquema do circuito fica:

Cuidados adicionais

Conforme o esquema tratado aqui, existe ainda neste circuito um díodo (D1) de tipo 1N4007. Este díodo tem por função, proteger o LED durante a arcada negativa da tensão da rede eléctrica. De facto, sem este díodo, durante a arcada negativa, o LED ficaria submetido a uma tensão máxima de 230 . √ 2 = 325 V!!! Os LEDs não suportam este valor de tensão inversa. Uma forma de proteger o LED deste valor de tensão, consiste em ligar em anti-paralelo, um outro díodo (poderia ser um outro LED mas, para quê dois LEDs?). Assim, durante a arcada negativa da tensão da rede, o LED fica submetido a uma tensão inversa igual ao valor da tensão directa do díodo D1: cerca de 0,7 V.

Pelo que se conta no parágrafo anterior, deduz-se que o LED está aceso apenas durante a arcada positiva da tensão da rede. De facto, o LED só está aceso durante metade do período da tensão da rede; isto é, durante 10 ms (f=50 Hz).

Um outro pormenor a ter em atenção é a tensão de serviço do condensador C1. Se se tiver em consideração o momento em que a tensão da rede passa pelo seu valor máximo (cerca de 325 V), o condensador fica submetido a uma tensão de:

UC1 = UMAX – UR1 – ULED = 325 – (R1 . ILED) – 1,6 = 325 – 820 . 15,8.10-3 – 1,6 = 310 V

Como tal, o condensador deverá ter uma tensão de serviço superior a este valor; por exemplo: 400V.

Finalmente, aconselha-se (vivamente) a colocação de uma resistência de alto valor (e.g., 1MΩ), em paralelo com o condensador. Esta resistência descarregará o condensador quando o circuito não estiver a ser alimentado.

Lista de componentes

R1: 820 Ω – 1/4 W
C1: 220 nF – 400 V
D1: 1N4001
D2: LED standard

Não faz parte do âmbito deste artigo apresentar soluções de montagem deste circuito. Recomenda-se o máximo cuidado e respeito pelas regras de segurança na montagem, instalação e utilização deste circuito. Se tiver dúvidas acerca do que está a fazer, procure ajuda especializada! A sua vida, a de outras pessoas, de animais ou de bens, depende da atitude que tiver daqui em diante.

Implementação experimental

A imagem acima ilustra uma implementação tipo “Live” do circuito. Esta implementação foi usada para verificar experimentalmente a funcionalidade do circuito e efectuar diversas medições. Uma integração deste circuito numa qualquer aplicação final, carece de protecção física contra contactos acidentais; isto é, isolamento adequado dos componentes e de todos os condutores.

CT7AFR DIY CW-Keyer

ct7afr-cw-keyer

Finalmente, está pronto o meu keyer para CW!

Este projecto começou por ser apenas um oscilador para excitar um pequeno altifalante sempre que fechasse um pequeno botão de pressão  ou uma chave vertical de Morse. Mas durante o meu estudo de CW, apercebi-me de que existem diversos tipos de chave e diversos modos de operação. Então, abandonei o 555 em prol de um microcontrolador para criar um keyer que satisfizesse as minhas necessidades, não ficasse limitado a um único tipo de chave nem a um único modo de operação. Nasceu assim o CT7AFR-CW-Keyer.

Este pequeno circuito aceita chaves do tipo Vertical, Paddle e Bug, tendo as seguintes características:

  • Frequência do Tom: 400 ~ 800 Hz (aprox.)
  • Velocidade de transmissão: 5 ~ 60+ WPM
  • Tipo de chave: Vertical, Paddle, Bug
  • Orientação da chave iâmbica: Standard ou Reverse
  • Modos de Operação: Curtis Mode A, Curtis Mode B, Ultimatic, Bug
  • Relação Dit/Dah: 1:3 ou 1:4.4
  • Saída em Dreno aberto (MOSFET) para controlo de um emissor (modo A1A, ON-OFF)
  • Saída áudio para altifalante de 8 Ohms
  • Saída áudio para headphones ou Line-In de PC (32 Ohms), jack stereo 3,5 mm
  • Volume de som ajustável por potenciómetro
  • LED indicador de POWER ON
  • LED indicador do estado da saída MOSFET
  • Alimentação: 7 ~ 16 VDC

A divulgação do desenvolvimento deste projecto, no Facebook, suscitou curiosidade em alguns colegas de hobby que se mostraram interessados na aquisição de um exemplar. A partir daqui, o projecto ganhou um novo objectivo: ser um kit para aspirantes a CW com gosto pela arte de manusear o ferro de soldar.

Toda a informação técnica acerca deste kit está disponível no capítulo RADIO do AIRLOMBA.NET em http://www.airlomba.net/radio/?pagina=Tecnica&Project=CW_keyer

ct7afr-cw-keyer-webpage

Nesta página, estão também apontados dois vídeos alojados no canal CT7AFR do Youtube. Um destes vídeos demonstra o funcionamento deste keyer.

Finalmente, quem estiver interessado em adquirir um kit destes ou simplesmente solicitar informação adicional acerca do mesmo, poderá contactar-me através do endereço de correio electrónico RADIO <arroba> AIRLOMBA <ponto> NET (visível no banner vertical, no canto superior direito da referida página).

Escrito isto, vou praticar CW… dah-dit-dah-dit dah-dah-dit-dah…

VY 73 DE CT7AFR.

Shutdown button for the Raspberry Pi

shutdown_1
One thing that sometimes bothers me when using an headless embedded Linux system, is the workload I get when I need to power off the system for some hardware maintenance (e.g. adding some sensor, replacing some peripheral, moving the system to another location). Indeed, one cannot just cut the power supply; there is the risk that some files become corrupted. So, the proper way to shutdown a Linux system is to send a command like:

$ shutdown -h now

But to do this, one needs to be “online” with the system, via SSH for example, using another system (computer) that, at that moment, may precisely be OFF… Doh!

So, at the expense of a simple push-button (normally open), a couple of wires and some programming, I implemented a smart(?) way of shutting down my Raspberry Pi, safely, without the need of an extra computer, SSH and other complications.

Connecting the push-button

The push-button is connected to two of the 26 or 40 pins header, depending on the version of the raspberry Pi in use. From those two pins, one is GND and the other may be any free GPIO. Remember that some pins have multiple possible roles (I2C, UART, SPI, etc), so choose wisely. In my case, I plugged the button between pins 14 and 16, respectively GND and GPIO23.

raspi_pinout

Programming

To translate any action on the push-button into a Shutdown command, a script was written in the Pi’popular Python programming language.

In a folder of your choice (e.g., /home/pi), using the terminal command line, enter:

$ nano shutdown_button.py

Then, copy the following code into it and save as usual (CTRL-X + Y + ENTER):

shutdown_2

Testing the script

To test this script, just enter the following command and then press the button once.

$ sudo python shutdown_button.py

If everything is correct, the system should shutdown itself. You must then unplug and replug the power cord to start your system again.

Launching this script automatically after every system power-up

In order to launch this script automatically after every system boot, one must add the following line to the /etc/rc.local file (just before the line with exit 0) as shown in the image hereafter (assuming your script file is in the /home/pi folder):

python /home/pi/shutdown_button.py &

shutdown_3

Final notes

  1. If you prefer to have your Pi to reboot instead of shutting down after pressing the button, in the shutdown_button.py script, in the line containing os.system(“shutdown -h now”), replace the letter ‘h‘ (from halt) by a ‘r‘ (for reboot).
  2. The line stated in the above note is in fact a System Call. So, with this script, you can have your Pi doing “anything you want” after pressing the push-button, just by replacing the command between quotation marks, by another command invoking some application that suit your needs.

Have fun!

 

Simple C code to dump I2C device memory

I have been using I2C devices for a while and most of the times when I put my hands on a new device, I need to dump the contents of its registers on my screen, for debug purposes. For this task, I wrote a while ago a little script. Today, I feel I can share this code to whom it may be useful. Use it at your own risk.

This code was written in C language, on a Raspberry Pi and requires the WiringPi library to be installed.

Once you saved this code into a file (e.g., main.c), compile it with the following command in a shell:

$ gcc -o regdump main.c -lm -lwiringPi -Wall

If all went well and you have some I2C device plugged into your Raspberry Pi, your are good to go as long as you know the device’s bus address (try the command i2cdetect -y 1, if your are not sure of its address or if your device is connected to the bus).

So, once you are good to go, just type the following command, specifying the device’s I2C address and the first and last registers addresses to be read (all in Hexadecimal format):

$ ./regdump <device I2C address> <start address> <stop address>

For example, typing the command $ ./regdump 0x77 0x75 0xd3 returns the following result, from the reading of a BMP085 pressure sensor existing in my I2C bus.

regdump_screenshot

The code is available for download, here!

Feel free to change it to your needs. And if suits your needs, I will be glad to receive some feedback, opinions or critics about it; either via a comment below or via e-mail to webmaster @rrob@ airlomba dot net.

Have fun!

 

AOTA – Airlomba On The Air

A secção Radio Activa do AIRLOMBA.NET (até aqui CB) passou a ter um site autónomo que agrupa as actividades na Bandas do Cidadão bem como nas bandas de Amador (HAM), entre outras.
Trata-se de um site com desenvolvimentos ocasionais, mas cujos reportes de QSOs são actualizados no LOG respectivo em tempo-real.
Para aceder, clique na ligação: http://www.airlomba.net/radio/