Estou fazendo um armário inteligente utilizando Node-RED para elaborar o programa e um arduino mega mestre para controlar outros arduinos como escravos que serão responsáveis por abrir as gavetas, além dos relés e solenoides envolvidos no projeto.
Quando estava usando apenas um arduino como protótipo o projeto funcionava certinho, agora que estou acrescentando mais arduino e a comunicação RS485 estou com problemas para funcionar, e nunca fiz nada com esse tipo de comunicação antes.
Troquei o nó no Node-RED responsável por enviar o comando de qual gaveta abrir de um nó Arduino Out para Serial Out, alterei a function que antecede o nó e os códigos dos arduinos, pesquisei como deveria fazer a ligação dos MAX485 e repliquei igualmente. Fiz algum testes com multímetro e tudo parece normal, mas quando tento enviar o comando de abrir a gaveta nada acontece, alguém poderia me ajudar? Aceito novas abordagens também!
Abaixo os códigos dos arduinos, function e as ligações dos equipamento:
Código Arduino Mestre:
"#include <SimpleModbusMaster.h>
#define MAX485_CONTROL 2
#define NUM_ESCRAVOS 8
Packet packets[NUM_ESCRAVOS];
unsigned int modbus_array[NUM_ESCRAVOS];
void preTransmission() {
digitalWrite(MAX485_CONTROL, HIGH);
}
void postTransmission() {
digitalWrite(MAX485_CONTROL, LOW);
}
void setup() {
Serial.begin(9600);
pinMode(MAX485_CONTROL, OUTPUT);
digitalWrite(MAX485_CONTROL, LOW);
// Configuração do ModbusMaster
modbus_configure(&Serial, 9600, SERIAL_8N1, 1000, 200, 3, MAX485_CONTROL, packets, NUM_ESCRAVOS, modbus_array);
}
void loop() {
modbus_update();
if (Serial.available()) {
String comando = Serial.readStringUntil('\n');
if (comando.startsWith("ABRIR:") || comando.startsWith("FECHAR:")) {
int ID_Arduino = comando.substring(6, 7).toInt();
int Pino_Gaveta = comando.substring(8).toInt();
if (comando.startsWith("FECHAR:")) {
Pino_Gaveta = -Pino_Gaveta;
}
if (ID_Arduino >= 1 && ID_Arduino <= NUM_ESCRAVOS) {
modbus_array[ID_Arduino] = Pino_Gaveta;
}
}
}
}"
Código Arduinos Escravos:
"#include <SimpleModbusSlave.h>
#define MAX485_CONTROL 2
unsigned int holdingRegs[2];
void setup() {
Serial.begin(9600);
pinMode(MAX485_CONTROL, OUTPUT);
digitalWrite(MAX485_CONTROL, LOW);
for (int i = 2; i <= 41; i++) {
pinMode(i, OUTPUT);
}
modbus_configure(&Serial, 9600, SERIAL_8N1, 1, 2, 0, holdingRegs);
}
void loop() {
modbus_update(); // Processa mensagens Modbus
int comando = holdingRegs[1];
if (comando >= 2 && comando <= 41) {
digitalWrite(comando, HIGH);
}
else if (comando <= -2 && comando >= -41) {
digitalWrite(-comando, LOW);
}
holdingRegs[1] = 0;
}"
Function antes do nó Serial Out:
"var gavetas = {
“B01.C31”: { ID_Arduino: 1, Pino_Gaveta: 5 }, //(Sim as gavetas são essas stings e não são enumeradas
// Depois vou acrescentar as gavetas
};
var codigoGaveta = global.get(‘gaveta’);
var acao = “ABRIR”;
if (gavetas[codigoGaveta]) {
var ID_Arduino = gavetas[codigoGaveta].ID_Arduino;
var Pino_Gaveta = gavetas[codigoGaveta].Pino_Gaveta;
var comando = acao + ":" + ID_Arduino + "," + Pino_Gaveta + "\n";
msg.payload = comando;
return msg;
} else {
node.warn(“Código da gaveta não encontrado!”);
return null;
}"
Configuração Serial Out:
Ligações: