Non trovo il mio Errore di programmazione con RS485

Ciao a tutti,
sono a casa in convalescenza e mi stò dilettando a "giocare" con Arduino e l'aggiornamento della ferrovia in miniatura per me e i miei bambini...

Ho usato con entusiamo la comunicazione IC2 con 10 mt di cavo e 1 arduino uno, ma ora volevo fare qualcosa di più bello, realizzarendo un pannello di controllo con un Arduino uno e tutti led.... E dare i comandi tramire UNO + rs485 2 cavi e rs485 + MEGA.

Insomma ho cercato di riassumere, ma veniamo al dunque mi sono perso e linco il codice.
Sarei felice di smettere di fare Copia e incolla dai vari tutorial sul Web e in considerazione di questo se mi date per cortesia un libro di riferimento ne sarei felice.

il problema è questo che alla righa in cui devo comunicare dal Master "serialrs485.write(x)" mi genera un errore , mi dice il compilatore che: "serialrs485' was not declared in this scope".

La mia intenzione sarebbe, comunico X ( come costante ) e lo slave mi accendi il Led 1 , oppure comunico Y mi accendi il Led 2...

Sono riuscito a farlo anche con la comunicazione seriale grazie al Forum, ma per quanto riguarda
la libreria del RS 485 ci sono un sacco di tutorial ma incompleti...

P.S. La libreria ModBus485 è molto più chiara ma troppo complessa secondo me ed inutile per fare un giochino come il mio.

Grazie a chi ha voglia di darmi una mano.
Ciao da Marco da Torino e tra poco 45!

QUESTO VIDEO, e quelli successivi, mi sono stati molto utili per capire come usare la RS485 su Arduino. Magari lo conoscevi, magari no...

Grazie steve-cr,

ho studiato molti video dell'autore e sinceramente volevo acquistare anche il suo libro ma non ho capito se nei suoi capitoli viene spiegato bene la comunicazione seriale rs485 piuttosto che il complicato modbus...

Grazie Marco

Non so nulla di rs485, ma questo è un errore del c... Dice solo che cerchi di usare una variabile non dichiarata o comunque non "visibile" in quel punto dello sketch

Grazie fratt,

sono letteralmente impazzito a cercare di far funzionare lo sketch, ma anche dichiarando la variabile il problema lo dà sempre...
Ora ricompilerò tutto, magari come al solito è un segno che mi son perso... ( Sono pure dislessico). HAhahah!

Marco.

[code]
#include <SoftwareSerial.h>
//***************MASTER***************
SoftwareSerial rs485(12,13); // 12 "RD" pin della Ricezione e 13"DI" Tx
                             // modulo rs485 Max

const int LED_A1 = 1; //Led che si accendono sul master
const int LED_A2 = 2;
const int TXbuttonA1 = A0;
int buttonvalue =0; // Ho provato a mettere lo stato " = a 0 "
int z;
int t;

void setup() {

Serial.begin(9600); //seriale a monitor
rs485.begin(4800);

pinMode(11, OUTPUT);//anche se è un trasmettitore mette Uscita
digitalWrite(11,LOW);// LOW = ricezione dati e HIGH = trasmissione dati

pinMode(TXbuttonA1, INPUT);               
pinMode(LED_A1, OUTPUT); 
pinMode(LED_A2, OUTPUT); 

}

void loop() {
  
  buttonvalue = analogRead(TXbuttonA1);   //Stato del pulsante 
  if (buttonvalue == HIGH);
  {
  digitalWrite(11, HIGH); //accendi la trasmissione
  rs485.write(z);
  delay(50);
  digitalWrite(LED_A1, LOW);
  digitalWrite(LED_A2, HIGH);
  Serial.println("DEVIATOIO LED B1 ON");
}
else 
{
   buttonvalue = analogRead(TXbuttonA1);   //Stato del pulsante 
  (buttonvalue == LOW);
  
  digitalWrite(11, HIGH);// riga 9 
  rs485.write(t);
  delay(50);
  digitalWrite(LED_A1, HIGH);
  digitalWrite(LED_B1, LOW);
  Serial.println("DEVIATOIO LED A1 ON");
} 
}
[/code]

Questo è lo sketch che ho adattato a tanti esempi, sono riuscito a far muovere anche più servi dallo slave ma questo matrimonio con la RS485 "non sà da fare!" Mi sono perso in errori di punteggiatura... Ma anche correggendoli alla fine mi dice che se ricevo un errore inserendo "else"... Forse è meglio che ci dormo su.

P.S. Ho un Dubbione sulla trasmissione della int "z" e "t", non è che lo slave mi legge in ascii?

Grazie Marco

Non è la seriale che non va

Stai tentando di trasmettere caratteri ma senza chiuderli tra gli apostrofi

Il c li legge come nomi di variabili

Occhio che il primo if ha un problema, col ; a fine riga "chiudi" subito l'if e quindi entra sempre nel blocco istruzioni che segue.
E quindi non ha più senso l'else.
Poi nel secondo if manca l'if...

#include <SoftwareSerial.h>
//***************MASTER***************
SoftwareSerial rs485(12,13); // 12 "RD" pin della Ricezione e 13"DI" Tx
                             // modulo rs485 Max

const int LED_A1 = 3; //Led che si accendono sul master
const int LED_A2 = 2;
const int TXbuttonA1 = 4;
int buttonvalue =0; // Ho provato a mettere lo stato " = a 0 "
int z;
int t;

void setup() {

Serial.begin(9600); //seriale a monitor
rs485.begin(4800);

pinMode(11, OUTPUT);//anche se è un trasmettitore mette Uscita
digitalWrite(11,LOW);// LOW = ricezione dati e HIGH = trasmissione dati

pinMode(TXbuttonA1, INPUT);               
pinMode(LED_A1, OUTPUT); 
pinMode(LED_A2, OUTPUT); 

}

void loop() {
  
  buttonvalue = digitalRead(TXbuttonA1);   //Stato del pulsante 
  if (buttonvalue == HIGH)
  {
  digitalWrite(11, HIGH); //accendi la trasmissione
  rs485.write('z');
  delay(50);
  digitalWrite(LED_A1, LOW);
  digitalWrite(LED_A2, HIGH);
  Serial.println("DEVIATOIO LED B1 ON");
}
  if (buttonvalue == LOW){
 
{
   //buttonvalue = analogRead(TXbuttonA1);   //Stato del pulsante 
  //(buttonvalue == LOW);

  digitalWrite(11, HIGH);// riga 9 
  rs485.write('t');
  delay(50);
  digitalWrite(LED_A1, HIGH);
  digitalWrite(LED_A2, LOW);
  Serial.println("DEVIATOIO LED A1 ON");
} 
}}

/* ho avuto un pò di difficoltà perchè avevo anche un falso contatto con il pulsante che per ora lo collego sul pin digitale... Questo Sketch funziona o almeno sembra. Ora ho fatto solo la prima parte del lavoro, ora mi tocca lavorare e studiare allo slave.

Buona giornata Marco e grazie per le dritte!

  //**************SLAVE******************* 
  
  #include <SoftwareSerial.h>
  #include <Servo.h>
  SoftwareSerial rs485(12,13); // 12 "RD" pin della Ricezione e 13"DI" Tx
  
  const int LED_Ra1 = 3;
  const int LED_Ra2 = 2;
  int z;
  int t;
  Servo servo1;
  
  
  void setup() {
  Serial.begin(9600); //seriale a monitor
  rs485.begin(4800);
  pinMode(11, OUTPUT);//anche se è un trasmettitore mette Uscita
  digitalWrite(11,LOW); //LOW perchè deve ricevere
  pinMode(LED_Ra1, OUTPUT);
  pinMode(LED_Ra2, OUTPUT);
  servo1.attach(4); //pin servo 

  
  }    
  byte stato = LOW; // trasmette alla ricevente uno stato che sarò un singolo valore bite 
  
  void loop()
   { 
    if (rs485.available()) {  // significa processa i dati in arrivo!!!!
    byte z =rs485.read();
    if('z') {
    
    digitalWrite(LED_Ra1, HIGH); 
    digitalWrite(LED_Ra2, LOW);
    Serial.println("SEMAFORO LINEA A 1");
    servo1.write(0);
    delay(10);
   }}
   if (rs485.available()) {
   byte t =rs485.read(); 
   if('z') {
   
   digitalWrite(LED_Ra1, LOW);
   digitalWrite(LED_Ra2, HIGH);
   Serial.println("SEMAFORO LINEA A 2");
   servo1.write(45); //gradi angolo apertura
   delay(10);
   }}}
   
    

Buon giorno,
sono arrivato alla frutta, ho perso un sacco di tempo e sono arrivato fin quà ma mi sono perso con : "if" " else" e se non spazzo casa the Wife mi fà la pelle altro che giocare con ste cose che mettono disordine...

Se qualche anima pia mi dà un'imbocccata sempre che i due "accrocchi" non di RS485 trasmettano per bene i dati sennò lascio perdere gli RS485 e provo con qualcosa di meno adatto ma più consono alle mie conoscenze tecniche da "accrocchiatore"! :rofl:

Saluti Marco

Gli "accrocchi" RS-485 funzionano benissimo quindi se un po' di cose le hai capite perché buttare via tutto quello che hai imparato? I video di Aliverti spiegano tutto per filo e per segno: certo, bisogna sedersi davanti al monitor e non farsi disturbare. Io li ho guardati TUTTI, uno a uno. Però vedo che quasi tutti i problemi sono derivati da punteggiatura, parentesi, variabili... Troppe cose tutte insieme.
Datti tempo, fai con calma e vedrai che ne esci.

1 Like

Hai ragione steve-cr,
faccio un sacco di confusione e ho sempre gli appunti con il fantastico libro ARDUINo uno in mano...
Se riesco a far funzionare il tutto cercherò di postare tutti e due gli sketch, per chi è al mio livello penso sia molto utile... Ho letto dei blog con delle castronerie, dei copia incolla e mal tradotti...

Marco

L'errore più grossolano è nei 2 if z...
Tra le parentesi tonde di un if devi mettere una espressione che resrituisca un valore logico vero o falso. Tu hai messo un valore costante ('z').
Forse volevi fare qualcosa tipo

if (z == 'z')

Rieccomi,

è tutto il giorno che ci studio non ho ancora trovato una soluzione...
Non avevo mai usato Sketch che inviavano caratteri avevo sempre fatto cose molto semplici, ora mi ritrovo con l'esigenza di un Master che trasmette una lettera " z" allo Slave e mi accende un led e mi fà muovere un servocomando....

Per ora Il master (pare funzionare bene) e invece lo slave fà musica da diskoteca lampeggiando all'impazzata ci due led che dovrebbero essere un semaforo da treno! :rofl:

Se dopo cena ho ancora un pò di lucidità posto gli sketch che ho provato a fare con il mio "dialetto" perchè il "linguaggio dell'IDE" non l'ho ancora imparato bene.

Marco

Ciao io uso quelli di Gammon
http://www.gammon.com.au/forum/?id=11428
sono abbastanza semplici e potenti .
Cè anche la versione no block che utilizza un sistema di anticollisione dei dati

guarda, ti posso assicurare che quello che vuoi fare non è difficile

hai solo fatto un po' di confusione, tra tipi dato, strutture di programma, caratteri, variabili e altre fritture miste

domani, a mente fresca e riposata ti ci metti e vedrai che le cose poco a poco si chiariscono

non sei ne il primo ne l'ultimo che cerca di fare questo
uno di quelli che ho aiutato lo trovi qui:
https://forum.arduino.cc/t/pilotaggio-led-da-seriale/659164
siccome il programma linkato sostanzialmente va, ti potrei consigliare di leggertelo con calma e cercare di capire cosa fa ogni singola riga
vedrai che lentamente si apre tutto
casomai chiedi, ma ricorda che quello che impari e capisci di tuo rimane, quello che ti dicono "evapora"
quindi fai uno sforzo per arrivarci da solo, non è impossibile

ah, se non te lo ho già consigliato...
cerca:
Aiutateci ad aiutarvi
la pappa è fatta
aiutati che il ciel ti aiuta
e leggi bene il regolamento

e aggiungo:
come dice @steve-cr la parte RS485 va benissimo
il tuo problema è nella parte riconoscimento, sarebbe identico anche se avessi usato direttamente la seriale di arduino

perché hai scelto rs485?

Rieccomi,
in questi giorni di convalescenza volevo approfondire le mie conoscenze, ma credetemi scrivo tutto quello che faccio perchè ho la tendenza a invertire segni e numeri... E anche quando lavoro che un cliente mi chiede un codice colore lo scrivo sennò rischio in 5 min di scriverlo al contrario e non mi piace avere la pappa fatta...
Ho studiato a modo mio tutto quello che ha scritto il Sig. Alberti, Maffucci... Anche i consigli di Datman e altri quà del Forum. Finchè ho pensato di fare il comando per i trenini più carino, collegato con un cavo bello grosso di 5 mt circa... Quello che ho monato ora ho una serie di tasti e un arduino UNO che gestisce 4 servocomandi (deviatoi) e 8 Led ( semafori).

Dato che il giochino dei treni in famiglia pare piace, volevo fare un comando da tenere in mano con qualche luce che confermasse il tracciato dei treni e i deviatoi accesi... E da quanto avevo capito RS485 funzionava senza disturbi, poi ho detto con la comunicazione Ic2 ci sono riuscito...

Inomma, ho cercato di essere riassuntivo :sunglasses:

Marco

P.S. Ho cambiato il titolo che è meglio!
P.S.2 Vado a dormire che mi è venuta un'altra idea su come scrivere il codice :scream:

non capisco
che tu sia dislessico o meno poco importa
la dislessia è un disturbo dell'apprendimento, ed ha a che fare col centro del linguaggio, ne convengo
MA
qui non siamo ne a scuola, ne al lavoro
la "devi" rispettare certi standard e quindi la dislessia può essere un fattore penalizzante

QUI no
perchè stai seguendo un tuo hobby, ricercando un tuo piacere, si tratta di una scelta che non "deve" o "doveva" essere fatta, ma che "potevi" fare
e quindi si tratta di una scelta "consapevole"
e consapevole di essere dislessico e consapevole della difficoltà del lavoro che hai liberamente scelto non puoi invocare adesso tale attenuante

tradotto in italiano?

dislessico o no, rispondere alle domande puoi e potevi
ma non lo hai fatto
hai continuamente cambiato le regole del gioco e mischiato le carte, arrivando addirittura a cambiare il titolo della discussione
comunque tenendo in gioco la RS485 che ti abbiamo detto in abbondanza NON essere la causa del tuo problema
anzi, pensando all'ultimo di cambiarla con un'altro standard, ignorando quindi le nostre indicazioni che il tuo problema è nel programma, non nella comunicazione

La Seriale o la RS485 vanno bene entrambi.
La I2C invece non sopporta fili più lunghi di pochi centimetri quindi un "telecomando" con 5 metri di filo va benissimo con la RS485 oppure la Seriale.
E basta anche un NORMALISSIMO bifilare twisted, tipo telefonico, e non un "cavo bello grosso " (?!?!?!)
Come dice Standaroil, gli stessi problemi li avresti anche con la seriale o con altri metodi di trasmissione: prima metti a posto il programma in "locale" e poi andrai a vedere la trasmissione.
Comunque quel trenino ha l'aria di essere una figata: quando puoi fai delle foto.
Buon divertimento.