Tempo permettendo ho potuto continuare lo sviluppo della comunicazione rs485 tra arduino.
Sto riscontrando alcuni problemi.
Il Master "ARDUINO MEGA 2560" collegato sulla Seriale 1 hardware al chip adm485 RX1-19 TX1-18 e pinControl-9, il master invia alcuni valori agli slave che controllano i dati ricevuti e se corretti inviano altri dati al master che verifica questi dati e se corretti, per il momento, attiva un led posto sul pin 12.
Gli slave "ARDUINO UNO SMD" collegati sulla Seriale hardware al chip adm485 RX-0 TX-1 e pinControl-4.
Il problema è che vedo gli slave che ricevono e inviano i dati, ma il master non sempre riceve e quindi non sempre attiva il led
CODICE MASTER
#if ARDUINO >= 100
#include <Arduino.h>
#include <SoftwareSerial.h>
//SoftwareSerial cameraconnection = SoftwareSerial(8, 9);
SoftwareSerial rs485(10, 11); // receive & transmit pins
#else
#include <WConstants.h>
#include <NewSoftSerial.h>
//NewSoftSerial cameraconnection = NewSoftSerial(8, 9);
NewSoftSerial rs485(10, 11); // receive pin & transmit pins
#endif
int pinCONTROL = 9;
int pinMLED = 13;
int pinLED = 12;
int myaddress = 0;
int slave = 1;
char msg1[] = {'2', '1', '3', '9'};
char msg2[] = {'2', '2', '3', '9'};
char msg3[] = {'2', '3', '3', '9'};
char msg4[] = {'2', '4', '3', '9'};
char msg5[] = {'2', '5', '3', '9'};
char msg6[] = {'2', '6', '3', '9'};
char msg7[] = {'2', '7', '3', '9'};
char msg8[] = {'2', '8', '3', '9'};
byte byte_receive;
char data[4];
byte state=0;
byte INDEX=0;
byte pronto=0;
unsigned long previousMillis = 0; // last time update
long interval = 10000; // interval at which to blink (milliseconds)
void setup() {
pinMode(pinLED, OUTPUT);
pinMode(pinMLED, OUTPUT);
pinMode(pinCONTROL, OUTPUT);
digitalWrite(pinCONTROL, LOW);
Serial.begin(9600);
Serial1.begin(9600);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
slave = 1;
for (slave = 1; slave <= 8; slave++)
{
interroga_slave(slave, INDEX);
}
if (slave > 8)
slave = 1;
}
}
void interroga_slave(int num_slave, int INDEX)
{
digitalWrite(pinMLED, LOW);
digitalWrite(pinLED, LOW);
digitalWrite(pinCONTROL, HIGH);
delay(250); // Still some more waiting
if ( num_slave == 1 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg1[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 2 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg2[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 3 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg3[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 4 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg4[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 5 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg5[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 6 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg6[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 7 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg7[i]);
}
digitalWrite(pinMLED, LOW);
}
if ( num_slave == 8 ) {
digitalWrite(pinMLED, HIGH);
for (int i = 0; i<=4; i++) {
Serial1.print(msg8[i]);
}
digitalWrite(pinMLED, LOW);
}
Serial1.flush();
digitalWrite(pinCONTROL, LOW);
Serial1.end();
delay(10);
Serial1.begin(9600);
delay(100);
if ( Serial1.available() ) {
// Serial.println("A");
for (int INDEX=0; INDEX<4; INDEX++) {
data[INDEX] = Serial1.read();
}
Serial.print(data[0]);
Serial.print(data[1]);
Serial.print(data[2]);
Serial.println(data[3]);
if (data[1] == '1') {
digitalWrite(pinMLED, HIGH);
delay(200);
}
if (data[2] == '2') {
digitalWrite(pinLED, HIGH);
delay(200);
}
}
}
CODICE SLAVE
#if ARDUINO >= 100
#include <Arduino.h>
//#include <SoftwareSerial.h>
//SoftwareSerial cameraconnection = SoftwareSerial(8, 9);
//SoftwareSerial rs485(2, 3); // receive & transmit pins
#else
#include <WConstants.h>
//#include <NewSoftSerial.h>
//NewSoftSerial cameraconnection = NewSoftSerial(8, 9);
//NewSoftSerial rs485(2, 3); // receive pin & transmit pins
#endif
#define pinCONTROL 4
#define pinMLED 13
#define pinLED 12
#define myaddress 1
char msg[] = {'2', '1', '2', '8'};
byte byte_receive[4];
char data[4];
byte state=0;
byte INDEX=0;
byte pronto=0;
void setup() {
pinMode(pinLED,OUTPUT);
pinMode(pinMLED,OUTPUT);
pinMode(pinCONTROL,OUTPUT);
digitalWrite(pinCONTROL,LOW);
Serial.begin(9600);
//rs485.begin(9600);
}
void loop()
{
delay(100);
digitalWrite(pinMLED,LOW);
digitalWrite(pinLED,LOW);
digitalWrite(pinCONTROL,LOW);
delay(150);
if (Serial.available()) {
for (int INDEX=0; INDEX<4; INDEX++) {
data[INDEX] = Serial.read();
}
}
//Serial.println(data);
if (data[0] == '2') //Se il primo dato ricevuto è 2 allora siamo sicuri che il master ci sta interrogando e abilitiamo l'invio
pronto=1;
if (pronto == 1 && data[1] == '1') {
digitalWrite(pinCONTROL,HIGH);
digitalWrite(pinMLED,HIGH);
delay(250);
for (int i = 0; i<=4; i++) {
Serial.print(msg[i]);
}
while (!(UCSR0A & (1 << TXC0))); // Wait for the transmission to complete
digitalWrite(pinCONTROL,LOW);
if (data[1] == 1) {
digitalWrite(pinMLED,HIGH);
delay(200);
}
if (data[2] == 3) {
digitalWrite(pinLED,HIGH);
delay(200);
}
pronto = 0;
data[0] = 0;
data[1] = 0;
data[2] = 0;
data[3] = 0;
}
}
byte hex2num(byte x){
byte result;
if (x>=48 && x<=57){
result=x-48;
}else if (x>=65 && x<=70){
switch(x){
case 65:
result=10;
break;
case 66:
result=11;
break;
case 67:
result=12;
break;
case 68:
result=13;
break;
case 69:
result=14;
break;
case 70:
result=15;
break;
}
}
return result;
}