Projetos

Comunicação Serial a Laser

Eletrogate 6 de julho de 20235 min

Introdução

A fibra óptica é uma tecnologia de transmissão de dados que utiliza cabos compostos por fios de vidro ou plástico extremamente finos para transmitir informações em forma de luz. É uma das formas mais rápidas e eficientes de transmissão de dados disponíveis atualmente, sendo amplamente utilizada em sistemas de telecomunicações, internet de alta velocidade, redes de televisão a cabo e outras aplicações que demandam transmissão de grandes quantidades de dados em altas velocidades e com baixa perda de sinal. Como usaremos essa mecânica de comunicação no Arduino? Como no funcionamento de qualquer comunicação, teremos um emissor e um receptor. O receptor consiste em um componente sensível à luz, ele será responsável por detectar os pulsos luminosos enviados pelo emissor. Já o emissor consiste em uma fonte de luz que será pulsada conforme o dado enviado, como a comunicação do Arduino é feita em bits (ligado ou desligado), aproveitaremos os bits para ligar ou desligar o laser a fim de apenas trocar a eletricidade pela luz. Agora que entendemos a mecânica do funcionamento, podemos ir para a montagem.


Material Necessário para o Projeto Comunicação Serial a Laser

Os jumpers M/M são para a conexão na própria protoboard, já os F/F são para conexão dos módulos no Arduino nano. Poderíamos usar qualquer outro Arduino, mas por questões de disponibilidade e custos, preferi o nano. Dependendo da aplicação pode ser necessário de jumpers M/F.


Receptor


O circuito receptor baseia-se na entrada de dados (bits) no pino RX (1) do Arduino pela incidência do “liga-desliga” (bits) do led serial. Quando o laser for ligado, o Arduino registra 1 e quando for desligado, é registrado 0. O V indica a direção da esfera do led, portanto atenção.

Código para o receptor:

void setup() { 
  pinMode(13, OUTPUT);  // Define o pino 13 como saída 
  Serial.begin(9600);   // Inicia a comunicação serial com uma taxa de transmissão de 9600 bps 
} 

void loop() {
  char entradaSerial = Serial.read();  // Lê o caractere recebido da entrada serial e armazena na variável 'entradaSerial' 

  if (entradaSerial == '2') {  // Se o caractere recebido for '2' 
    digitalWrite(13, HIGH);   // Liga o LED conectado ao pino 13 
    delay(100);               // Aguarda 100 milissegundos 
    digitalWrite(13, LOW);    // Desliga o LED 
    delay(100);               // Aguarda mais 100 milissegundos 
  } 

  if (entradaSerial == '1') {  // Se o caractere recebido for '1' 
    digitalWrite(13, HIGH);   // Liga o LED 
  } 

  if (entradaSerial == '0') {  // Se o caractere recebido for '0' 
    digitalWrite(13, LOW);    // Desliga o LED 
  } 

}

O código apresentado acende o led se for recebido 1, apaga se for recebido 0 e caso seja 2, ele piscará com um intervalo de 100 ms.

Explicação:

void setup() {  
pinMode(13, OUTPUT); // Define o pino 13 como saída  
Serial.begin(9600); // Inicia a comunicação serial com uma taxa de transmissão de 9600 bps
}

A função “setup()” é executada uma única vez, quando a placa Arduino é ligada ou resetada. Nessa função, é definido que o pino 13 será utilizado como saída para controlar um LED. Também é iniciada a comunicação serial com uma taxa de transmissão de 9600 bits por segundo.

void loop() {  
char entradaSerial = Serial.read(); // Lê o caractere recebido da entrada serial e armazena na variável 'entradaSerial'  
  
if (entradaSerial == '2') { // Se o caractere recebido for '2'  
digitalWrite(13, HIGH); // Liga o LED conectado ao pino 13  
delay(100); // Aguarda 100 milissegundos  
digitalWrite(13, LOW); // Desliga o LED  
delay(100); // Aguarda mais 100 milissegundos  
}  
  
if (entradaSerial == '1') { // Se o caractere recebido for '1'  
digitalWrite(13, HIGH); // Liga o LED  
}  
  
if (entradaSerial == '0') { // Se o caractere recebido for '0'  
digitalWrite(13, LOW); // Desliga o LED  
}  
}

  A função “loop()” é executada continuamente após a execução da função “setup()”. Nessa função, é lido o caractere recebido pela entrada serial e armazenado na variável ‘entradaSerial’.

Os condicionais “if” são utilizados para verificar qual caractere foi recebido e, em seguida, acender ou apagar o LED. Se o caractere ‘2’ é recebido, o LED pisca rapidamente, alternando entre ligado e desligado com um intervalo de 100 milissegundos entre cada estado. Se o caractere ‘1’ é recebido, o LED é ligado. Se o caractere ‘0’ é recebido, o LED é desligado.

O ciclo se repete indefinidamente, aguardando a chegada de novos dados pela entrada serial e executando as ações correspondentes a cada caractere recebido.


Emissor

O circuito emissor baseia-se no envio da leitura serial pelo pino TX (0), onde o led está conectado. Como o envio é digital em bits (ligado ou desligado, 1 e 0), então led ligará no bit 1 e desligará no bit 0.

Código para o emissor:

void setup() { 
Serial.begin(9600); // Inicia a comunicação serial com uma taxa de transmissão de 9600 bps 
} 
 
void loop() { 
if (Serial.available()) { // Verifica se há dados disponíveis na entrada serial 
Serial.write(Serial.read()); // Lê o caractere recebido e envia de volta pela saída serial 
} else { 
// Não há dados disponíveis na entrada serial, então a execução passa para essa parte do código 
// Essa parte do código está vazia, mas poderia ser usada para realizar outras tarefas enquanto o programa aguarda a chegada de dados pela entrada serial. 
} 
}

Explicação do código emissor:

void setup() { 
Serial.begin(9600); // Inicia a comunicação serial com uma taxa de transmissão de 9600 bps 
}

A função setup() é executada apenas uma vez, no início do programa. Neste caso, ela inicia a comunicação serial com uma taxa de transmissão de 9600 bits por segundo.

void loop() { 
if (Serial.available()) { // Verifica se há dados disponíveis na entrada serial 
Serial.write(Serial.read()); // Lê o caractere recebido e envia de volta pela saída serial 
}
else { 
// Não há dados disponíveis na entrada serial, então a execução passa para essa parte do código 
// Essa parte do código está vazia, mas poderia ser usada para realizar outras tarefas enquanto o programa aguarda a chegada de dados pela entrada serial. 
} 
}  

A função loop() é executada continuamente enquanto o Arduino estiver ligado. Ela verifica se há dados disponíveis na entrada serial utilizando a função Serial.available(). Se houver, ela lê o caractere recebido utilizando a função Serial.read() e envia de volta pela saída serial utilizando a função Serial.write().

Se não houver dados disponíveis, a execução passa para a próxima parte do código, representada pelos comentários “Não há dados disponíveis na entrada serial, então a execução passa para essa parte do código”.


Considerações finais

O sensor de laser geralmente vem desmontado. O receptor se assemelha com um led, mas terá 3 pinos, conecte de forma que a face que contém uma pequena esfera seja voltada para o lado dos terminais. O alto índice de luminosidade no local a ser realizado o experimento pode causar interferências no sensor. (AVISO: não é normal o sensor esquentar muito).

Por que não usar um LDR? Após minhas pesquisas, descobri que o LDR não é a melhor opção para esse projeto, além de dificultar a programação, esse componente tem uma demora para se adaptar à luz, o que torna quase impossível uma boa comunicação serial e aproveitar as altas velocidades de envio da luz.

 Se o código for editado, atente-se para a velocidade serial (Baud rate), pois devem estar sincronizados.



Daniel Vasconcelos

Tenho 14 anos, meu primeiro contato com eletrônica foi aos 5 anos, e com o Arduino aos 12. Desde então venho explorando mais desse mundo incrível.


Eletrogate

6 de julho de 2023

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!