Arduino - Modbus
Neste tutorial, vamos aprender:
- O que é Modbus?
- Por que precisamos do Modbus?
- Quais são as alternativas ao Modbus?
- Como o Modbus funciona
- Modbus RTU/ASCII e Modbus TCP
- Como usar a biblioteca Modbus do Arduino
O que é Modbus?
Modbus é um protocolo usado na comunicação entre dispositivo e dispositivo, entre dispositivo e software/aplicativo, e entre dispositivos e IHM (HMI). Ele é muito usado na área industrial para controlar/monitorar dispositivos.
Em palavras simples, Modbus é uma linguagem que um dispositivo usa para se comunicar com outros dispositivos, software/aplicativos e dispositivos IHM.
Este tutorial é sobre Arduino, então o Arduino representa o dispositivo. Usando o Modbus, podemos fazer:
- Dois Arduinos conversarem entre si para controlar/monitorar as saídas/entradas
- O Arduino conversar com um software no PC ou um aplicativo no smartphone
- O Arduino conversar com um dispositivo IHM
Por exemplo, o Arduino #1 com 4 interruptores controla o Arduino #2 com 4 lâmpadas a uma longa distância.
Por que precisamos do Modbus?
Para responder a essas perguntas, vamos considerar um caso: um interruptor conectado ao Arduino #1 controla um LED conectado ao Arduino #2 a uma longa distância.

A alternativa mais simples ao Modbus é definirmos nós mesmos um protocolo simples:
- Arduino #1:
- Quando o interruptor é colocado em ON, o Arduino #1 envia um byte (comando) com valor 1 para o Arduino #2.
- Quando o interruptor é colocado em OFF, o Arduino #1 envia um byte (comando) com valor 0 para o Arduino #2.
- Arduino #2:
- Se o byte recebido for 1, liga o LED
- Se o byte recebido for 0, desliga o LED
- O Arduino #1 quiser saber se o comando foi executado com sucesso pelo Arduino #2
- O Arduino #1 quiser verificar o estado do LED no Arduino #2
- O Arduino #1 com vários interruptores quiser controlar vários LEDs no Arduino #2
- O Arduino #1 quiser usar um interruptor para controlar um LED no Arduino #2 e o Arduino #2 também quiser usar um interruptor para controlar um LED no Arduino #1
- E outros casos de uso.
- NÃO precisamos definir os comandos, o Modbus já os definiu para todos os casos. Só precisamos implementá-lo.
- O nosso dispositivo pode funcionar com outros dispositivos/softwares que suportam Modbus SEM precisar trabalhar junto com o criador do dispositivo/software.
O protocolo acima foi definido por nós mesmos, não é um protocolo padrão. Precisamos definir mais coisas se:
Não é fácil definir todos os comandos por conta própria. O problema fica mais complicado quando misturamos os requisitos acima. E também não podemos garantir que fique livre de erros
Outro problema aparece quando definimos o protocolo por conta própria. Se quisermos que o nosso Arduino funcione com outro Arduino que usa um protocolo definido por outra pessoa, isso é impossível, a menos que trabalhemos juntos e compartilhemos o protocolo criado.
Esses são os motivos pelos quais precisamos do protocolo Modbus. Se usarmos o protocolo Modbus:
Se usarmos o protocolo Modbus no Arduino, podemos usar muitos softwares/aplicativos gratuitos para controlar/monitorar o nosso Arduino.
Quando usar e NÃO usar o Modbus
O protocolo Modbus não é fácil para iniciantes entenderem e implementarem, mesmo com a biblioteca Modbus disponível. Por isso, não tem problema usar um protocolo simples definido por você, como descrito acima, se:
- O sistema for simples, como alguns interruptores no Arduino #1 controlando alguns LEDs no Arduino #2
- O Arduino NÃO precisar funcionar com outros dispositivos/softwares de outros criadores
Devemos usar o Modbus quando:
- O sistema for complicado
- O sistema exigir alta confiabilidade
- O Arduino precisar funcionar com outros dispositivos/softwares de outros criadores
※ Nota:
Existem alguns outros protocolos padrão e não padrão que são alternativas ao Modbus. Eles estão fora do escopo deste tutorial.
Como o protocolo Modbus funciona
Como descrito anteriormente, um Arduino pode se comunicar com software/aplicativo, dispositivo IHM ou outro Arduino via protocolo Modbus. Este tutorial usa a comunicação entre dois Arduinos como exemplo de comunicação Modbus. Os outros casos são iguais.
Conceitos
Existem alguns conceitos no Modbus:
- Master e Slave
- Requisição e Resposta
- Function Code (FC) e Endereço
O protocolo Modbus funciona no modelo Master-Slave. Entre dois Arduinos, um PRECISA funcionar como Master e o outro funciona como Slave.
O Master envia uma requisição e o Slave envia uma resposta.

Uma requisição enviada pelo Master basicamente contém as seguintes informações:
- Function Code (FC): 1 byte, é o comando, que diz ao Slave o que fazer. Por exemplo, ler o estado de um pino de entrada digital, de um pino de saída digital ou de um pino de entrada analógica, ou controlar um pino de saída digital.
- Endereço: 2 bytes, é usado para identificar o pino. Cada pino de entrada digital, pino de saída digital e pino de entrada analógica recebe um endereço.
- Dados (por exemplo, valor de controle)
Ao receber uma requisição, o Slave executa a ação correspondente e envia de volta uma resposta, que contém o resultado da ação ou a informação que o Master solicitou.
Function Code
O Function Code foi definido pelo padrão Modbus. Existem muitos Function Codes. Vamos ver alguns Function Codes básicos abaixo:
- FC 01 (Read Coils): é um comando usado para ler o estado de um ou vários pinos de saída digital
- FC 05 (Write Single Coil): é um comando usado para controlar (escrever) o estado de um ou vários pinos de saída digital
- FC 02 (Read Discrete Inputs): é um comando usado para ler o estado de um ou vários pinos de entrada digital
"FC 01" significa que o valor do Function Code é 0x01.
Existem mais Function Codes. Para não sobrecarregar os iniciantes, este tutorial apresenta apenas alguns Function Codes essenciais.
Ao usar a biblioteca Modbus do Arduino, você precisa:
- Decidir qual Function Code usar
- Dar endereços para cada pino do Arduino (apenas os pinos que você usa)
As instruções detalhadas de uso da biblioteca Modbus serão apresentadas no próximo tutorial. Curta a nossa página no Facebook para receber a notificação do novo tutorial.
O Arduino Master pode ler o estado do seu pino de entrada digital e depois controlar o estado da saída digital do Arduino Slave, e vice-versa
Por exemplo:
- O Arduino Master está ligado ao LED #M e ao SWITCH #M
- O Arduino Slave está ligado ao LED #S e ao SWITCH #S
- Vamos fazer o SWITCH #M controlar o LED #S, e o SWITCH #S controlar o LED #M

Solução:
- O Master lê o estado do SWITCH #M → envia uma requisição ao Slave para controlar o LED #S de acordo com o estado do SWITCH #M → o Slave controla o LED #S e envia a resposta
- O Master envia uma requisição ao Slave para ler o estado do SWITCH #S → o Slave responde com o estado do SWITCH #S → o Master controla o LED #M de acordo com o estado do SWITCH #S
※ Nota:
- Acima, usamos os termos "pino de entrada digital" e "pino de saída digital" para facilitar para os iniciantes. Na verdade, "pino de entrada digital" representa qualquer estado de dispositivo que é somente leitura, e "pino de saída digital" representa qualquer estado de dispositivo que é de leitura/escrita
- O Modbus pode suportar vários Masters e vários Slaves
- O Modbus pode ser usado não apenas para entrada/saída digital, mas também para entrada/saída analógica
Modbus RTU/ASCII e Modbus TCP
Existem três tipos populares de Modbus: Modbus RTU, Modbus ASCII e Modbus TCP. O princípio de funcionamento é o mesmo para todos os tipos de Modbus, como descrito acima. Cada tipo de Modbus foi projetado para se adaptar ao ambiente de rede: Serial ou TCP.
- Diagrama do sistema

- Pilha de protocolos

Diferenças entre Modbus RTU/ASCII e Modbus TCP
| Modbus RTU/ASCII | Modbus TCP |
|---|---|
| Via serial (RS-232/RS-422/RS-485) | Via TCP |
| Suporta uma única transação(*) | Suporta várias transações() |
- (*): O Modbus RTU/ASCII suporta apenas uma única transação. Isso significa que, quando um Master envia uma requisição Modbus, ele PRECISA esperar por uma resposta Modbus ou pelo tempo limite (timeout) antes de enviar outra requisição.
- (): O Modbus TCP suporta várias transações. Isso significa que, quando um Master envia uma requisição Modbus, ele NÃO precisa esperar por uma resposta Modbus. Ele pode enviar várias requisições continuamente. Para identificar a resposta correspondente a uma requisição, o Modbus TCP tem um campo adicional, chamado "Transaction ID". A requisição e a resposta correspondente têm o mesmo Transaction ID.
Como usar a biblioteca Modbus do Arduino
Graças à biblioteca Modbus, usar o Modbus com o Arduino fica mais simples.
Vamos fazer um tutorial sobre como usar a biblioteca Modbus. Curta a nossa página no Facebook para receber a notificação do novo tutorial.