Go Down

Topic: Arduino USB-RS485 (Read 3750 times) previous topic - next topic

sciorty

Jan 23, 2013, 03:46 pm Last Edit: Jan 26, 2013, 04:48 pm by sciorty Reason: 1
Ho comprato un convertitore usb-rs485 ma all'interno pare non avere un driver.. inutile dire che la ricerca guidata di windows non abbia funzionato, ho provato a scaricare questo driver (l'ultimo) ma specificando nel percorso di ricerca driver la cartella scaricata non dava niente. Poi ho provato questo (il primo), mi estrae un eseguibile che non mi porta a niente..

Link, consigli? :(

Grazie in anticipo!

astrobeed

Scrivi al venditore e fatti dire dove prendere i driver.

sciorty

Risolto con questo (link diretto) http://www.adrive.com/public/hZBCZe/PL2303_Prolific_DriverInstaller_v1210.zip

sciorty

Ma una cosa:
uno schema per MAX485 ed arduino funzionante? Ho provato questo ma non riesco a caricare lo sketch.. ovviamente il pin TXarduino è collegato al 4 MAX485. A e B del convertitore USB sono collegati correttamente!

sciorty

Riprendo il post.

La porta seriale la riconosce, lo schema è sempre quello ed a quanto ho capito i pin 2 e 3 del MAX devono essere a LOW per ricevere e ad HIGH per inviare. Qui uno sketch di prova:
Code: [Select]


int val;

void setup(void) {
  Serial.begin(9600);
  pinMode(3,OUTPUT);     //pin 2 e 3 del MAX
  pinMode(13,OUTPUT);    //led
  digitalWrite(3,0);          //ricevo
}

void loop(void) {
  if(Serial.available()>0){
    digitalWrite(3,1);       //trasmetto
    Serial.println(val);
    digitalWrite(13,1);     //avviso con il led
    delay(500);
    digitalWrite(13,0);     
    digitalWrite(3,0);        //ricevo
    Serial.flush();
  }
 
}


Carico lo sketch normalmente, stacco il cavetto usb dell'arduino e apro il serial monitor sulla porta com del convertitore. Mando un carattere a muzzo e ricevo un carattere pure esso a muzzo ma il led 13 non si accende, segno che l'atmega non ha ricevuto.

Idem se cambio gli stati del pin per la ricezione o trasmissione..

sciorty

Sono riuscito a fare ricevere ed inviare, ma la codifica dei caratteri sembra una cosa impossibile..
Code: [Select]
void setup(void) {
  Serial.begin(9600);
  pinMode(3,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(3,0);
}

void loop(void) {
 
    if(Serial.available()>0){
      digitalWrite(3,1);
      Serial.println(Serial.read());
      digitalWrite(3,0);
      lamp();
      Serial.flush();
    }
 
 
}

void lamp(){digitalWrite(13,1);delay(1000);digitalWrite(13,0);}


Sulla COM del convertitore invio 'b', arduino legge "39"(lo vedo dal suo serial monitor) ma al convertitore torna indietro "2.."
Tutti i bit rate sono a 9600..
Una cosa stranissima è che se tolgo quel "lamp()", l'arduino riceve in continuazione una seria di 0. Ed è molto strano perchè mettendolo ricevo solo il carattere inviato e basta, nient'altro nè prima nè dopo

Lo so che sto rompendo le scatole ma proprio non capisco.. anche perchè l'ASCII di 'b' non è 39 ma bensì 98.

AIUTO  =(


leo72

Io da quello schema non ci capisco molto.
I pin 6 e 7 del 1° chip (MAX485 o 75176 che sia) vanno collegati in parallelo ai medesimi pin del 2° chip.
Inoltre i piedini 6 e 7 vanno collegati tra sé con una R da 100 ohm (una per ogni chip), messa il più vicino possibile al chip.

I pin VCC e GND li colleghi correttamente.
Poi i pin /RE e DE vanno collegati ad 1 unico pin dell'Arduino. Se quel pin lo metti LOW il chip riceve i dati, se lo metti HIGH il chip trasmette.
Il pin 1 va a RX dell'Arduino, il pin 4 va invece a TX.

sciorty

Lo schema è come quello, ho provato anche la resistenze ma non cambia niente. Ricevo, invio, ma non riesco a capire il criterio di codifica dei dati..
Magari è il convertitore cinese, dovrei provare a par comunicare due atmega con dei max

leo72


Lo schema è come quello, ho provato anche la resistenze ma non cambia niente. Ricevo, invio, ma non riesco a capire il criterio di codifica dei dati..

Non c'è codifica.
L'RS485 non è altro che un'estensione della seriale. Se spedisci il byte 1 ricevi il byte 1.
Devi ragionare come se l'RS485 nel mezzo non ci fosse, è un bus, cioè un vettore di dati, e basta.

Quote

Magari è il convertitore cinese, dovrei provare a par comunicare due atmega con dei max

Prova a scrivere un semplice sketch che spedisca al PC ad intervalli regolari dei caratteri, apri la comunicazione sul PC con un terminale configurato come 8N1, che è lo standard usato da Arduino per la seriale, e guarda un po' se arriva qualcosa.

sciorty

Appunto, anche io avevo intenzione di vederla come seriale ma dopo ho avuto questi problemi..
Oggi non posso ma domani ti scrivo con esattezza i problemi che riscontrerò nello sketch che mi hai proposto (anche se in parte ho scritto sopra)

nid69ita

39=00100111
98=01100010

se vuoi fare dei ragionamenti almeno devi convertirli in binario.
my name is IGOR, not AIGOR

sciorty


Prova a scrivere un semplice sketch che spedisca al PC ad intervalli regolari dei caratteri, apri la comunicazione sul PC con un terminale configurato come 8N1, che è lo standard usato da Arduino per la seriale, e guarda un po' se arriva qualcosa.


Ecco quello che esce fuori.. y= suppongo sia per lo '\n' che l'arduino invia con la println(), infatti con una semplice print('a') ricevo 0 e con una print('b') ricevo '

La resistenza è da 100R messa il più vicino possibile all'integrato e il doppino tra convertitore e max di soli 5-7 cm circa!
Inoltre leggevo che le resistenze di ingresso e di uscita devono essere uguali a quella del doppino nel caso in cui la durata del bit sia inferiore al tempo che impiega il segnale a percorrere l'intera lunghezza del canale. Cosa che ovviamente non succede nel mio caso..

BrainBooster

hai provato ad usare Serial.write al posto di Serial.print?

leo72

Sembra più che altro un problema di codifica dei caratteri.

astrobeed


Sembra più che altro un problema di codifica dei caratteri.


Per me è un problema di codepage del driver, ovvero c'è qualche impiccio di codifica/decodifica a livello pc che non ha nulla a che vedere con Arduino la RS485.

Go Up