- Comunicação serial RS-485
- Componentes necessários
- Diagrama de circuito
- Programação STM32F103C8 e Arduino UNO para comunicação serial RS485
- Testando a comunicação RS485 entre STM32F103C8 e Arduino UNO:
Os protocolos de comunicação são parte integrante de um sistema eletrônico digital e embarcado. Sempre que houver interface de vários microcontroladores e periféricos, o protocolo de comunicação deve ser usado para trocar um monte de dados. Existem muitos tipos de protocolo de comunicação serial disponíveis. O RS485 é um dos protocolos de comunicação serial e é utilizado em projetos industriais e maquinários pesados.
Aprendemos sobre a comunicação serial RS485 entre o Arduino Uno e o Arduino Nano no tutorial anterior . Este tutorial é sobre como usar uma comunicação serial RS-485 no microcontrolador STM32F103C8. Se você é novo no microcontrolador STM32, comece com Introdução ao STM32 usando Arduino IDE: LED piscando e verifique todos os projetos STM32 aqui.
Neste tutorial, o Master STM32F103C8 possui três botões que são usados para controlar o status de três LEDs presentes no Slave Arduino Uno usando comunicação serial RS-485.
Vamos começar entendendo o funcionamento da comunicação serial RS-485.
Comunicação serial RS-485
RS-485 é um protocolo de comunicação serial assíncrono que não requer clock. Ele usa uma técnica chamada de sinal diferencial para transferir dados binários de um dispositivo para outro.
Então, o que é este Método de Transferência de Sinal Diferencial ??
O método de sinal diferencial funciona criando uma tensão diferencial usando 5 V positivo e negativo. Ele fornece uma comunicação Half-Duplex ao usar dois fios e comunicação Full-Duplex ao usar quatro fios.
Usando este método:
- RS-485 suporta maior taxa de transferência de dados de 30 Mbps no máximo.
- Ele também fornece distância máxima de transferência de dados em comparação com o protocolo RS-232. Ele transfere dados de até 1200 metros no máximo.
- A principal vantagem do RS-485 sobre o RS-232 é o escravo múltiplo com mestre único, enquanto o RS-232 suporta apenas escravo único.
- Pode ter no máximo 32 dispositivos conectados ao protocolo RS-485.
- Outra vantagem do RS-485 é imune ao ruído, pois eles usam o método de sinal diferencial para transferência.
- RS-485 é mais rápido em comparação com o protocolo I2C.
O Módulo RS-485 pode ser conectado a qualquer microcontrolador com porta serial. Para usar o módulo RS-485 com microcontroladores, um módulo chamado 5V MAX485 TTL para RS485 que é baseado no Maxim MAX485 IC é necessário, pois permite a comunicação serial em longa distância de 1200 metros e é bidirecional e half duplex tem uma taxa de transferência de dados de 2,5 Mbps. Este módulo requer uma tensão de 5V.
Descrição do pino RS-485:
Nome do Pin |
Descrição |
VCC |
5V |
UMA |
Entrada do receptor não inversora Saída de driver não inversora |
B |
Invertendo a entrada do receptor Invertendo a saída do driver |
GND |
GND (0V) |
R0 |
Receptor de saída (pino RX) |
RÉ |
Saída do receptor (LOW-Enable) |
DE |
Saída do driver (HIGH-Enable) |
DI |
Entrada do driver (pino TX) |
O módulo RS485 possui os seguintes recursos:
- Tensão de operação: 5V
- Chip MAX485 integrado
- Um baixo consumo de energia para a comunicação RS485
- Transceptor com taxa de variação limitada
- Terminal 2P de passo de 5,08 mm
- Fiação de comunicação RS-485 conveniente
- Todos os pinos do chip podem ser controlados através do microcontrolador
- Tamanho da placa: 44 x 14 mm
Usar este módulo com STM32F103C8 e Arduino UNO é muito fácil. As portas seriais de hardware de microcontroladores são usadas. Os pinos seriais de hardware no STM32 e no arduino UNO são fornecidos abaixo.
- Em STM32F103C8: Pins PA9 (TX) e PA10 (RX)
- No Arduino Uno: Pino 0 (RX) e 1 (TX)
A programação também é simples, basta usar o Serial.print () para escrever no RS-485 e o Serial.Read () para ler o RS-485 e os pinos DE e RE do RS-485 são BAIXOS para receber dados e ALTOS para gravar dados no barramento RS-485.
Componentes necessários
- STM32F103C8
- Arduino UNO
- Módulo conversor MAX485 TTL para RS485 - (2)
- Potenciômetro 10K
- Botão de pressão - 3
- LED - 3
- Resistores
- Tábua de pão
- Fios de conexão
Diagrama de circuito
Neste tutorial, STM32F103C8 é usado como Mestre com um módulo RS-485 e Arduino UNO é usado como Escravo com outro módulo RS-485.
Conexão do circuito entre RS-485 e STM32F103C8 (Mestre):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RÉ |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
UMA |
Para A do Slave RS-485 |
B |
Para B do Slave RS-485 |
STM32F103C8 com três botões:
Três botões de pressão com três resistências pull down de 10k são conectados aos pinos PA0, PA1, PA2 de STM32F103C8.
Conexão de circuito entre RS-485 e Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RÉ |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
UMA |
Para A do Mestre RS-485 |
B |
Para B do Mestre RS-485 |
Três LEDs são usados onde os ânodos dos LEDs com resistor de 330 ohms são conectados aos pinos 4, 7, 8 do Arduino UNO e os cátodos dos LEDs são conectados ao GND.
Programação STM32F103C8 e Arduino UNO para comunicação serial RS485
Arduino IDE é usado para desenvolvimento e programação de ambas as placas, isto é, STM32 e Arduino UNO. Mas certifique-se de ter selecionado a PORTA correspondente em Ferramentas-> Porta e Placa em Ferramentas-> Placa. Se você encontrar alguma dificuldade ou dúvida, consulte Programando seu STM32 no ARDUINO IDE. A programação para este tutorial consiste em duas seções, uma para STM32F103C8 (Master) e outra para Arduino UNO (Slave). Ambos os códigos serão explicados um a um a seguir.
STM32F103C8 como MestreNo lado Mestre, o status do botão de pressão é lido e, em seguida, gravado em série esses valores no barramento RS-485 através das portas seriais de hardware 1 (PA9, PA10) de STM32F103C8. Além disso, não há nenhuma biblioteca externa necessária no momento. O Arduino possui toda a biblioteca necessária para comunicação serial.
Comece a comunicação serial usando pinos seriais de hardware (PA9, PA10) na velocidade de 9600.
Serial1.begin (9600);
Leia o status do botão de pressão nos pinos PA0, PA1, PA2 de STM32F103C8 e armazene-os em uma variável button1val, button2val, button3val. O valor é ALTO se o botão for pressionado e BAIXO quando não for pressionado.
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
Antes de enviar os valores do botão para a porta serial, os pinos DE e RE do RS-485 devem ser ALTOS que estão conectados ao pino PA3 do STM32F103C8 (para tornar o pino PA3 ALTO):
digitalWrite (enablePin, HIGH);
Em seguida, para colocar esses valores na porta serial e enviar valores dependendo de qual botão for pressionado, use a instrução if else e envie o valor correspondente quando o botão for pressionado.
Se o primeiro botão for pressionado, a condição corresponde e o valor '1' é enviado para a porta serial onde o Arduino UNO está conectado.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
Da mesma forma, quando o botão 2 é pressionado, o valor 2 é enviado pela porta serial e quando o botão 3 é pressionado, o valor 3 é enviado pela porta serial.
senão if (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
E quando nenhum botão é pressionado, o valor 0 é enviado ao Arduino Uno.
senão { int num = 0; Serial1.println (num); }
Isso termina a programação para configurar STM32 como Mestre.
Arduino UNO como SlaveNo lado Slave o Arduino UNO recebe um valor inteiro que é enviado do Master STM32F103C8 que está disponível na porta serial do hardware do Arduino UNO (P0, 1) onde o módulo RS-485 está conectado.
Simplesmente leia o valor e armazene em uma variável. Dependendo do valor recebido, o LED correspondente é LIGADO ou DESLIGADO conectado ao Arduino GPIO.
Para receber os valores do Mestre basta deixar os pinos DE e RE do módulo RS-485 BAIXOS. Portanto, o pino 2 (enablePin) do Arduino UNO é BAIXO.
digitalWrite (enablePin, LOW);
Agora é só ler os dados inteiros disponíveis na Porta Serial e armazená-los em uma variável.
receber int = Serial.parseInt ();
Dependendo do valor, isto é, (0, 1, 2, 3) recebido, um dos três LEDs é LIGADO.
if (receber == 1) // Dependendo do valor recebido, o LED correspondente é LIGADO ou DESLIGADO { digitalWrite (ledpin1, HIGH); } else if (receive == 2) { digitalWrite (ledpin2, HIGH); } else if (receive == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Isso termina de programar e configurar o Arduino UNO como Slave. Além disso, isso finaliza as configurações completas para Arduino UNO e STM32. O vídeo de trabalho e todos os códigos estão anexados no final deste tutorial.
Testando a comunicação RS485 entre STM32F103C8 e Arduino UNO:
1. Quando o botão-1, que está conectado ao Master STM32, é pressionado, o LED 1 LIGA conectado ao Slave Arduino.
2. Quando o botão-2, que se conecta ao Master STM32, é pressionado, o LED 2 LIGA conectado ao Slave Arduino.
3. Da mesma forma, quando o botão 3 é pressionado, o LED 3 LIGA conectado ao Arduino Slave.
Isso conclui a comunicação serial RS485 entre STM32F103C8 e Arduino UNO. As placas Arduino UNO e STM32 são placas amplamente utilizadas para prototipagem rápida e fizemos muitos projetos úteis nessas placas. Se você tiver alguma dúvida ou tiver alguma sugestão para nós, escreva e comente abaixo.