Pular para o conteúdo principal

Desafio da semana 11 a 16/05. Conversão de um caractere para frases binária, hexadecimal e Decimal


Conversão de um caractere para frases binária, hexadecimal e Decimal

O objetivo desse desafio é construir um circuito responsável pela leitura de um caractere e imprimir o valor em Decimal, Hexadecimal , Binário e Octal com base nos valores da tabela ASCII. 
Resumo teórico

Para fazer a conversão de um caractere em valores decimais, hexadecimais e binários é utilizada a tabela ASCII (American Standard Code for Information Interchange) como referência já que ela é responsável pela codificação de 127 sinais utilizando 7 bits para representar todos os símbolos. 
Antes de passarmos para a próxima etapa precisamos entender duas coisas. O que é o código ASCII e o que é um conversor Analógico-Digital. 
O código ASCII é usado para unificar a representação de caracteres que podem ser impressos em computadores, portanto quando é digitado algum caractere o computador realiza a leitura segundo a tabela ASCII, por exemplo, quando é digitada a letra "a" o computador lê em valores binários o valor referente a tabela, que por sua vez ficara nesta forma: 0110 0001.
O conversor Analógico-Digital (A/D) é responsável pela reprodução digital a partir de um um sinal analógico. Na placa arduino uno o pino analógico tem resolução máxima de 10 bits, onde as leituras são realizadas de 0(00000000000) a 1024(11111111111). Para realizar a conversão de vales de sinais analógico (bits) para sinais digitais (binário), realizamos a seguinte operação:
Suponhamos que o conversor apresente 3 bits, então iremos ter o valor de 23  em frases binárias, ou seja, serão 8 linhas com 3 colunas variando com valores de 0 ou 1. Para fazer o preenchimento de cada linha com seu respectivo valor devemos realizar a seguinte conta.

Conta para Conversão                 Resultado 
                  de bits para binário                   em Binário              
0x 2^2+ 0x 2^1+ 0x 2^0                0    0    0
0x 2^2+ 0x 2^1+ 1x 2^0                0    0    1
0x 2^2+ 1x 2^1+ 0x 2^0                0    1    0
        0x 2^2+ 1x 2^1+ 1x 2^0                0    1    1        
1x 2^2+ 0x 2^1+ 0x 2^0                1    0    0
1x 2^2+ 0x 2^1+ 1x 2^0                1    0    1
1x 2^2+ 1x 2^1+ 0x 2^0                1    1    0
1x 2^2+ 1x 2^1+ 1x 2^0                1    1    0
Portanto percebe-se que um conversor igual ao do arduino uno que apresenta um conversor de 10 bits logo tal conversor apresentará 1024 frases binárias.

A conversão dos caracteres é feita diretamente pelo próprio arduino, entretanto quando se trata de números também é possível realizar a conversão facilmente para valores hexadecimais (base 16) e binários(base 2). Por exemplo, se quisermos passar o número para um valor binário, devemos fazer sucessivas divisões até que o quociente chegue a um valor indivisível, e após chegar a um valor não divisível deve-se selecionar os valores do resto das divisões. Se quisermos passar um número decimal para Hexadecimal, deve-se seguir os mesmos passos de como foi feito em binário, entretanto deve-se fazer a divisão por 16. Os cálculos para o valor octal segue a mesma base, apenas mudando o divisor por 8
Base binária
Base Binária

Base Hexadecimal

Base Octal

Descrição do procedimento utilizado

Para a construção do circuito que será responsável pela leitura de um caractere a partir do monitor serial, iremos utilizar os seguintes componentes:

1 Potenciômetro 10KΩ;
1 Protoboard;
1 Arduino UNO;

1. Primeiramente devemos ligar a entrada GND no polo negativo da protoboard e a entrada de 5V no polo positivo da proboboard:
2. Após ter feito isso devemos posicionar o Potenciômetro na protoboard e ligar o terminal 2 no polo negativo e o terminal 1 no polo positivo:

3. Logo em seguida, para finalizar o circuito devemos ligar o terminal restante (meio) em uma entrada analógica (A escolhida foi A0):


Agora devemos partir para a programação responsável pela leitura do caractere e por sua conversão em seus valores correspondentes com base na tabela ASCII.


Primeiro devemos declarar a variável responsável por iniciar a porta serial

void setup() {
Serial.begin(9600);
}

Em seguida dentro do void loop iremos declarar algumas variáveis de leitura e conversão do valor lido.

void loop() {

char leitura = Serial.read(); //Leitura a partir do teclado
int sensorValue = analogRead(A0); //Leitura da porta analógica
int con = map(sensorValue,0,1023,0,255);//Conversão para 8 bits
float potenciometro = (5.0 * sensorValue)/1023;//Converte para volts o valor lido pelo potenciômetro

A variável leitura será a responsável pela leitura do caractere a partir do monitor serial. 
A variável sensorValue sensor será responsável por ler a porta analógica A0.
A variável con será a responsável por converter para 8 bits (0 a 255)os valores lidos originalmente em 10 bits (0 a 1023).
A variável potenciometro será responsável pela conversão para volts do valor lido pela porta A0. Portanto a tensão pode ser variada pelo potenciômetro.

Ainda dentro do loop, iremos fazer a parte de impressão e conversão para Decimal, Hexadecimal, Binário e Octal do caractere lido.

//Imprime os caracteres lidos pelo teclado
Serial.print (leitura,DEC);//Imprime o valor Decimal do caractere de acordo com a tabela ASCII
Serial.print (" ");
Serial.print (leitura,HEX);//Imprime o valor Hexadecimal do caractere de acordo com a tabela ASCII
Serial.print (" ");
Serial.print (leitura,OCT);//Imprime o valor Octal do caractere de acordo com a tabela ASCII
Serial.print (" ");
Serial.print (leitura,BIN);//Imprime o valor Binário do caractere de acordo com a tabela ASCII

Perceba que no final da variável leitura (responsável pela leitura do caractere) utilizou-se as abreviações DEC para decimal, HEX para Hexadecimal, OCT para octal e BIN para binário. Fazendo isso na linguagem do arduino, o valor é automaticamente convertido a partir da tabela ASCII, sem que precisemos realizar contas.

E por fim, iremos imprimir (também convertidos para DEC e BIN) os valores da tensão do potenciômetro

//Imprime o valor da ddp convertida
Serial.print (" || ");
Serial.print (con);//Imprime o valor convertido para 8 bits a partir da tensão do potenciômetro
Serial.print (" ");
Serial.print (con,DEC);//Imprime o valor Decimal da tensão do potenciometro
Serial.print (" ");
Serial.println (con,BIN);//Imprime o valor Binário da tensão do potenciometro
delay (1000); 


Link Tinkercad:

https://www.tinkercad.com/things/8exiZgffTh3 

Comentários

  1. Com relação a conversores, há muito mais para se falar. Acerca de resoluções, por exemplo. Desenvolvemos em sala de aula a visualização de resoluções para diferentes conversores variando de 3 a 5 bits. Este é um conceito importante e que deve ser abordado.Mostrar estas resoluções e os seus significados. Neste resumo ficou um pouco confuso o que é um conversor AD e o significado de código ASCII . Façam uma separação destas informações. Elas tem significado distintos . Questões do tipo.. O que é um conversor AD e como varia sua resolução. A partir da conversão AD como podemos representar este decimal em diferentes bases . O que é um sistema de numeração e as suas bases? Como transitar entre estas bases? etc

    ResponderExcluir
  2. Postagens paralisadas... Isso compromete a nota de P2. E preciso ter uma dedicação continua. Uma divisao de trabalhos na equipe de modo que as postagens nao fiquem defasadas

    ResponderExcluir
    Respostas
    1. A semana passada inteira foi para arrumar os pontos dos quais a senhora mencionou que precisavam de ajustes, isso nos consumiu muito tempo e agora estamos focados para finalizarmos o relatório.
      Você poderá notar que em todas as postagens na semana passada foram adicionados novos estudos e vídeos dos experimentos.

      Excluir
  3. para 10 bits 2^10 frases binarias = 1024 , decimal varia de 0 a 1024

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Desafio da semana de 04/05 a 09/05. Associações de Capacitores - Em Série e Paralela

Seguindo nosso estudo sobre capacitores, iremos analisar dois tipos de associação de capacitores e suas principais características. Associação em série Em uma associação em série, temos dois ou mais capacitores conectados lado a lado em um mesmo ramo do circuito. Nesse tipo de associação, todos os capacitores apresentam cargas iguais e a tensão do circuito é dividida entre eles. Exemplo de associação de capacitores em série Em uma associação em série, é possível substituir todos os capacitores por um só que tenha o mesmo efeito. Para isso, é necessário que esse capacitor possua uma capacitância equivalente . A fórmula da capacitância equivalente em um circuito em série pode ser expressa como: 1/Ceq = 1/C1 + 1/C2 + 1/C3 +...+ 1/Cn , sendo Ceq a capacitância equivalente e C1, C2, C3,...,Cn as capacitâncias dos capacitores associados. Associação em paralelo Em uma associação em paralelo, dois ou mais capacitores são colocados em ramos diferentes do circuito. Nessa a

Desafio da semana 11 a 16/05. Conversor A/D e Sistemas de Numeração (Teoria)

Um conversor Analógico/Digital (A/D) é um dispositivo capaz de converter sinais analógicos de tensão em sinais digitais trabalhando a partir de um intervalo bem definido de tensão. Sinais analógicos consistem em sinais que podem assumir infinitos valores entre um ponto e outro. Isso significa que, ao variar uma tensão de 1V até 2V, por exemplo, é possível encontrar infinitos valores (1.1V, 1.01V, 1.000001V, etc). Já um sinal digital possui uma quantidade limitada de valores entre dois pontos. No caso de um conversor A/D, a precisão da conversão e a quantidade de medidas possíveis depende de sua  resolução (medida em bits). Por exemplo: No caso de um conversor de 5 bits trabalhando em uma fonte que varia de 0V a 5V, os valores convertidos podem assumir  2 5   valores possíveis. Dessa forma, entre 0 e 5 volts, temos 32 valores medidos em intervalos de aproximadamente 0,156V. Ao aumentar a resolução do conversor, tais intervalos ficam menores e a precisão aumenta. A representação d