A comunicação é algo essencial, seja nas nossas vidas ou na eletrônica. O Módulo Conversor USB-Serial entra nas nossas vidas como um facilitador entre a comunicação do Arduino com outros sistemas.
Apesar de termos a comunicação entre o computador e nosso sistema com o Arduino bem estabelecida pela própria IDE, as vezes se faz necessário a comunicação paralela entre dois computadores (ou mais) e o sistema com um único Arduino. E é nessa situação que o módulo conversor USB-Serial é essencial: ele permite a comunicação entre o Arduino com múltiplos computadores simultaneamente.
Se interessou? Então continue a leitura!
Lista de Materiais
- 1 Conversor USB TTL CP2102 Serial RS232
- 2 resistores de 220 Ω
- 2 LEDs (Cores a sua preferência)
- 1 Arduino Uno
- 1 Protoboard 400 pontos
- Jumpers Macho-Macho
Protocolos de Comunicação
Os protocolos de comunicação são como idiomas utilizados pelos sistemas, ou partes destes, para conversar entre si. Consideramos que para que ocorra um entendimento entre estes, eles devem falar a mesma língua.
Os sistemas eletrônicos tendem a conversar utilizando o sistema binário para isso. Analogamente, temos que o zero (0) e um (1) do sistema binário são as letras e o protocolo de comunicação é o idioma. Vários idiomas utilizam das mesmas letras para formar seus vocabulários, como por exemplo o inglês, português, francês e o espanhol, todos tem em comum as letras “A”, “B”, “C” e “D”, mas um nativo de Portugal não necessariamente irá entender um nativo da Espanha.
Protocolo Serial RX/TX
O protocolo de comunicação Serial utiliza de dois canais, um para envio (TX) e outro para recebimento de dados (RX). Este tipo de comunicação possui duas formas primárias, uma síncrona e outra assíncrona, sendo o segundo caso o mais comum.
Na transmissão síncrona, temos, além dos canais de transmissão e recebimento, um canal para o clock, para fazer a sincronia entre os dados recebidos. O clock na comunicação síncrona dita para o receptor quando ocorre a troca de um bit para outro, possibilitando assim a comunicação entre os 2 sistemas.
Na Comunicação Assíncrona, não existe um clock ditando quando ocorre a troca do bit. A troca de um bit para o outro é definida por um tempo, do qual começa a contar a partir do primeiro pulso de Start, definido por uma frequência chamada Baud Rate
Geralmente os dados seriais possuem algumas “partes” em seu sinal que são importantes para a comunicação entre os sistemas, sendo elas:
Start Bit – O start bit é utilizado na comunicação assíncrona e indica o início da transmissão de dados. Este não possui nenhum dado agregado a ele.
Stop Bit – O stop bit indica que a transmissão daquele dado foi encerrada, indicando que tudo o que está posterior a ele é um novo dado que não faz parte deste dado enviado.
Data Bits – Os data bits são os bits que possuem os dados da comunicação, seja elas uma letra, um número, uma string ou qualquer coisa enviada pelo transmissor.
Baud Rate – Na comunicação assíncrona, a velocidade com que ocorre a mudança entre um bit e outro é dada pelo baud rate. Ele dita a taxa de transmissão por segundo. Logo, a partir do momento que o receptor recebe um dado, ele começa a contar para saber quando trocou de bit no dado recebido. Na comunicação assíncrona, o baud rate no sistema deve ser configurado como o mesmo tanto no receptor quanto no transmissor, pois se não um sistema não consegue interpretar os dados do outro.
Protocolo USB
A comunicação USB possui diversos tipos de protocolos, sendo o funcionamento deles alterado apenas pela taxa de transmissão de dados. O protocolo USB possui um funcionamento completamente diferente do protocolo serial, onde existe 2 canais de comunicação, o D+ e o D-.
O canal D+ oscila entre as tensões de 2,5 V e 5 V , enquanto o D- oscila entre 0 V e 2,5 V. Através desta oscilação, temos a comunicação binária entre as portas, onde em ambas, são enviados e recebidos dados, respeitando a seguinte tabela.
D+ | D- | BIT |
2.5V | 0V | NULL |
2.5V | 2.5 | 0 |
5V | 0V | 1 |
5V | 2.5V | NULL |
Agora, os dados USB são enviados em pacotes, onde o primeiro pacote de dados indica a ação a ser elaborada: recebimento, escrita, envio ou leitura (em caso de comunicação com pendrives e células de armazenamento). O segundo pacote indica os dados. Enquanto o terceiro indica a confirmação dos dois pacotes anteriores para que ocorra o encerramento do envio deste dado.
Conversor USB-Serial
Como observamos, os dois protocolos possuem funcionamentos distintos, onde o computador tende a utilizar o protocolo USB e os microcontroladores tendem a utilizar o protocolo serial. A placa Arduino possui um módulo conversor para a efetiva comunicação entre a IDE e o Arduino, do qual utiliza um microcontrolador ATMEGA16U2 para realizar a conversão USB-Serial. Mas, quando se faz necessário a comunicação de múltiplos computadores com uma única plataforma Arduino, por exemplo, precisamos adicionar mais conversores no nosso projeto. Hoje utilizaremos o Conversor USB TTL CP2102 Serial RS232.
Circuito
Para testarmos o conversor, iremos montar o Arduino com dois LEDs ligados nos pinos 5 e 6 e com o nosso conversor ligado com o seu TX no pino 12 e o pino RX no 13 do Arduino. O nosso teste consistirá na montagem de um circuito que comunicará com o nosso computador por duas portas USB distintas, simulando dois sistemas diferentes, sendo um a própria IDE do Arduino e outro um programa externo. A montagem ficará da seguinte forma.
Lembrando que devemos conectar o GND do módulo conversor USB-Serial com o GND do Arduino. Não se faz necessário a conexão do 5 V do Arduino com o 5 V do módulo no nosso caso de teste, pois a alimentação da porta USB do computador já é responsável por alimentar o módulo conversor.
Código
Agora, iremos programar o nosso Arduino, que irá simular uma porta serial nos pinos 12 e 13 e irá controlar os pinos 5 e 6.
Um ponto importantíssimo no nosso código será a inclusão da biblioteca SoftwareSerial. A SoftwareSerial será responsável por simular uma porta com a comunicação serial nos pinos 12 e 13, sendo o 12 o receptor do Arduino e o 13 o transmissor. Devemos sempre lembrar que o receptor do módulo irá no transmissor do Arduino e o transmissor do módulo irá no receptor do Arduino, como ilustrado nas imagens acima.
#include<SoftwareSerial.h> // constantes referente aos pinos dos Leds #define GREEN 9 #define RED 8 SoftwareSerial portaUSB(11,12); // Criando uma instância para comunicação serial nas portas 11 e 12, criando assim um Receptor e um Transmissor virtual no Arduíno void setup() { Serial.begin(9600); portaUSB.begin(9600); // Inicializando a entrada Serial simulada com o Baud Rate de 9600 bits por Segundo pinMode(RED,OUTPUT); pinMode(GREEN,OUTPUT); } void loop() { if(portaUSB.available()) { // Verificação se há dados sendo recebidos pela porta Serial Simulada char buff = portaUSB.read(); // Armazenamento do Dado recebido na variável Buff do tipo Char Serial.println(buff); switch(buff){ case 'R': digitalWrite(RED,HIGH); break; case 'r': digitalWrite(RED,LOW); break; case 'G': digitalWrite(GREEN,HIGH); break; case 'g': digitalWrite(GREEN,LOW); break; } } }
O código tem um escopo de fácil entendimento, onde temos dois blocos lógicos IF. O primeiro está interpretando os dados do serial, que é o responsável pela IDE do Arduino. Já o segundo é responsável por interpretar os dados da porta serial simulada nos pinos 12 e 13.
Dentro dos “IF’s”, temos um shape shifting, onde o estado dos LEDs mudarão se o caractere ‘S’ for enviado para o RX do Arduino.
No início do código, dentro do Setup, temos a configuração dos pinos 5 e 6, logo depois temos a configuração do baud rate de ambas as portas seriais.
Para uma questão de padronização, setamos os LEDs como LOW logo no Setup, para evitarmos dualidades no nosso código e programação.
Processing
Após isto, o nosso código está pronto para ser usado no Arduino. Entretanto, para utilizarmos um único computador para testarmos esta aplicação, vamos criar um programa no Processing para enviar dados para uma porta USB enquanto o Arduino irá utilizar outra porta.
Este código em Processing ficará da seguinte forma:
import processing.serial.*; // Importação da "Biblioteca" Serial, responsável pela comunicação // Estados do LED's = On(true) e Off(false) boolean redLed = false; boolean greenLed = false; Serial portaUSB; // Instância do objeto portaUSB pertencente a classe Serial void setup(){ surface.setTitle("Controle do arduino"); // Título da janela criada size(300,300); // Tamanho da Janela criada background(54,54,54); // Cor de fundo da janela drawEllipse(); // "Call" para a função DrawEllipse, que criamos mais para baixo portaUSB = new Serial(this,"COM10",9600); // Alterar essa parte do código para a porta utilizada } void draw(){ //Método da linguagem Processing referente a parte visual do programa, da qual atualiza constantemente, funcionando como um loop if(keyPressed){ switch(key) { case 'a': redLed = true; portaUSB.write('R'); break; case 's': redLed = false; portaUSB.write('r'); break; case 'd': greenLed = true; portaUSB.write('G'); break; case 'f': greenLed = false; portaUSB.write('g'); break; } drawEllipse(); } } void drawEllipse() { Função responsável por alterar a elipse da janela para as cores vermelho claro, vermelho escuro, verde claro e verde escuro if (greenLed == true) { fill(50,205,50); // altera a cor utilizada como "pincel" ellipse(75,150,100,100); // Cria uma elipse com a cor do "pincel" } else { fill(0,100,0); ellipse(75,150,100,100); } if(redLed == true) { fill(255,0,0); ellipse(225,150,100,100); } else { fill(139,0,0); ellipse(225,150,100,100); } }
Grande parte desse código é para fazer a parte visual do programa. Ou ainda, diz respeito à sistemas supervisórios, dos quais não irei entrar a fundo neste post.
Resumidamente, nós importamos o diretório Serial da linguagem Processing, onde utilizamos para fazer a conexão com nosso módulo. Depois, definimos os dados que seriam enviados com as teclas que serão pressionadas (a,s,d,f), sendo responsáveis pelo controle do LED.
Devemos nos atentar ao fato de que as teclas diferenciam entre maiúsculas e minúsculas no envio de dados. Além disso, também devemos conferir o número da porta utilizada. No meu caso, utilizei a porta COM10, mas isso muda dependendo da porta USB que você estiver utilizando no seu computador. Uma forma simples de identificar isto, é entrando no gerenciador de dispositivos do seu computador, onde estará mapeado todas as entradas USB que estão em utilização.
Resultado
Como observamos, conseguimos fazer a comunicação entre dois sistemas distintos, a IDE do Arduino e o sistema em Processing, através de duas portas USB distintas do nosso computador. Este sistema é abstrato, porém, conseguimos fazer algumas modificações, por exemplo, para transforma-lo em um sistema supervisório.
Conclusão
Entender os protocolos de comunicação se faz necessário para que ocorra uma comunicação efetiva entre sistemas distintos, visto que para cada tipo de sistema (Computador, Microcontrolador, CLP, Wireless) existe um tipo de comunicação padronizada da qual devemos entende-la para integrar nossos sistemas.
Gostou de aprender a utilizar o módulo conversor Serial com o Arduino? Deixe um comentário aqui em baixo dizendo o que achou. Para mais posts como esse acesse nosso blog!
O arduino não está reconhecendo a comunicação serial no código abaixo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include
// constantes referente aos pinos dos Leds
#define GREEN 9
#define RED 8
SoftwareSerial portaUSB(11,12); // Criando uma instância para comunicação serial nas portas 11 e 12, criando assim um Receptor e um Transmissor virtual no Arduíno
void setup() {
Serial.begin(9600);
portaUSB.begin(9600); // Inicializando a entrada Serial simulada com o Baud Rate de 9600 bits por Segundo
pinMode(RED,OUTPUT);
pinMode(GREEN,OUTPUT);
}
void loop() {
if(portaUSB.available()) { // Verificação se há dados sendo recebidos pela porta Serial Simulada
char buff = portaUSB.read(); // Armazenamento do Dado recebido na variável Buff do tipo Char
Serial.println(buff);
switch(buff){
case ‘R’:
digitalWrite(RED,HIGH);
break;
case ‘r’:
digitalWrite(RED,LOW);
break;
case ‘G’:
digitalWrite(GREEN,HIGH);
break;
case ‘g’:
digitalWrite(GREEN,LOW);
break;
}
}
}
Obirgado pelo tutorial porém para rodar corretamente é necessário configurar os pinos de RX e TX no modo setup()
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
Código
#include
/*
PIN 13 USB Conversor RX, TX for Arduino
PIN 12 USB Conversor TX, RX for Arduino
*/
#define rxPin 12
#define txPin 13
…
SoftwareSerial portaUSB(rxPin, txPin); // RX, TX, inverse_logic
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
…
}