rs485 con sn75176 tra due arduini.

Mi sento scemo, eppure non riesco a far andare la comunicazione tra due arduini usando due SN75176. BP per la precisione..
Per favore, ditemi quale evidente particolare non riesco a vedere!

Allora, trattasi di un Duemilanove e un clone Mega1280 (precisamente quello di DFRobot.com)
il 2009 trasmette,
2009 - SN75176
pin1 -> pin4 (Driver in)
+5Vdc -> pin8
+5Vdc -> pin3 (Driver Enable, when HIGH)
GND -> pin5

Mega - SN75176
pin19 (serial1-RX) -> pin1 (Receiver out)
+5Vdc -> pin8
GND -> pin5
GND -> pin2 (Receiver Enable, when LOW)

poi i segnali A e B degli SN75176 connessi tra loro (A con A e B con B)

nessun segnale.. ho provato sia con delle resistenze da 470 ohm tra A e B su ogni SN75, sia senza resistenze.
sul trasmettitore c'è questo:

int LED_PIN = 13;
int i;
boolean b;

void setup() {
  Serial.begin(9600);

  i = 0;
  b = 0;
  pinMode(LED_PIN, OUTPUT);

  Serial.println("Init() complete");
}

void loop() {
  i ++;

  Serial.println(i);

  b = !b;
  digitalWrite(LED_PIN, b);

  delay(1000);
}

mentre sul ricevente questo:

int LED_PIN = 13;
int i;
boolean b;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);

  i = 0;
  b = 0;
  pinMode(LED_PIN, OUTPUT);

  Serial.println("Init() complete");
}

void loop() {
  if (Serial1.available()) {
    i = Serial1.read();
    Serial.println(i);
    digitalWrite(LED_PIN, b);
    b = !b;
  }
}

entrambi sono collegati via USB al PC, ma ho anche provato a scollegare il trasmittente alimentandolo con un trasformatore.

non leggo dati, niente.
ho provato anche a stampare Serial.read senza provare "available", ma mi da sempre -1.

Vi viene in mente qualcosa?

Forse ho trovato il perchè (anche se non mi è chiaro).
qui: http://www.gammon.com.au/forum/?id=11428 nello schema le resistenze stanno tra A e +5Vdc e tra B e GND. Così arriva il segnale.

ora provo col protocollo.
Cmq, sul playground tutto ciò che si trova su questi chip riguarda il DMX, ma non c'è niente riguardo la comunicazione tra arduini.

Ciao, Davide.

un esempio:
http://gdallaire.net/blog/?tag=rs485

Grazie!
D.

Edit:
Sto provando, ma purtroppo non ho capito come si richiama la funzione di Rx.

se la chiamo così ho errore: (too few arguments to function)

Serial.println(rs485RxMsg());

Sai spiegarmi come devo scriverla?

Devi collegare 2 R da circa 100/120 ohm fra i 2 cavi A e B, vicino ai terminali dei 2 chip.
Poi collega RE e DE ad un unico pin di Arduino così che con 1 filo puoi comandare i 2 stati: quando dai HIGH, abiliti in trasmissione e viceversa.
Fatto questo, basta collegare RX/TX dell'Arduino rispettivamente ai pin R/D.

Ciao

la funzione rs485RxMsg(char *msg, byte msgLen) non restituisce una stringa (per cui puoi stamparla direttamente con Println) ma ti "riempie" un array con quello che ricevi... mi rendo conto che è qualcosa che può sembrare contorto ma è sicuramente di stampo C puro, dove non avevi "cose" belle come gli oggetti String :wink:

Devi quindi fare così:

#define BUFFER_LENGTH 30
char buffer[BUFFER_LENGTH];
...
rs485RxMsg(buffer, BUFFER_LENGTH);
Serial.write(buffer, BUFFER_LENGTH);

leo72:
Devi collegare 2 R da circa 100/120 ohm fra i 2 cavi A e B, vicino ai terminali dei 2 chip.
Poi collega RE e DE ad un unico pin di Arduino così che con 1 filo puoi comandare i 2 stati: quando dai HIGH, abiliti in trasmissione e viceversa.
Fatto questo, basta collegare RX/TX dell'Arduino rispettivamente ai pin R/D.

i valori di resistenze più vicini che avevo erano 47 e 470. provato con entrambi i valori, col collegamento che suggerisci tu e non andava.
in compenso va con il collegamento che ho scritto su nell'altro post. (magari riproverò prendendo le resistenze giuste, o sommando quelle che ho..)
grazie cmq.

Davide.

Io ho fatto dialogare 2 Attiny85 tramite 2 75176 e non ho incontrato difficoltà seguendo lo schema che ti ho riportato.

lucadentella:
Ciao

la funzione rs485RxMsg(char *msg, byte msgLen) non restituisce una stringa (per cui puoi stamparla direttamente con Println) ma ti "riempie" un array con quello che ricevi... mi rendo conto che è qualcosa che può sembrare contorto ma è sicuramente di stampo C puro, dove non avevi "cose" belle come gli oggetti String :wink:

Devi quindi fare così:

#define BUFFER_LENGTH 30
char buffer[BUFFER_LENGTH];
...
rs485RxMsg(buffer, BUFFER_LENGTH);
Serial.write(buffer, BUFFER_LENGTH);

Grazie, è proprio la spiegazione che mi serviva.
proverò in questi giorni..

leo72:
Io ho fatto dialogare 2 Attiny85 tramite 2 75176 e non ho incontrato difficoltà seguendo lo schema che ti ho riportato.

ok, grazie Leo. allora probabilmente sono le resistenze, anche se mi fa strano pensare che così poca differenza cambi qualcosa.
ciao, Davide.