Arduino USB-RS485

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? :frowning:

Grazie in anticipo!

Scrivi al venditore e fatti dire dove prendere i driver.

Risolto con questo (link diretto) ADrive | Online Storage, Online Backup, Cloud Storage

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!

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:

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..

Sono riuscito a fare ricevere ed inviare, ma la codifica dei caratteri sembra una cosa impossibile..

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 =(

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.

Ff8Vo.png

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

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..

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.

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.

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)

39=00100111
98=01100010

se vuoi fare dei ragionamenti almeno devi convertirli in binario.

leo72:
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..

Immagine.bmp (1.76 MB)

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

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

leo72:
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.

astrobeed:

leo72:
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.

Sì, difatti.

@sciorty:
usando il terminale seriale dell'IDE, hai lo stesso problema? Usando un altro tipo di terminale hai lo stesso problema?

Possiamo appurare che il problema sia del convertitore, mettendo quel semplice sketch su uno standalone ricevo quello che mi aspetto.
EDIT:Vi dirò di più l'arduino riesce pure a leggermi direttamente i dati provenienti dall'uscita del max485 dello stand alone, senza un altro max a ricevere!

Come posso muovermi dunque? Perora posso andare avanti con altro nel mio progetto ma questa è la parte essenziale praticamente perchè mi serve una comunicazione di decine di metri..

Il driver è quello mandatomi dal produttore, che ho linkato nei primi post

sciorty:
Come posso muovermi dunque?

Questo è quello che succede quando acquisti le cineserie, paghi poco però valgono meno di quello che costano e ti fanno perdere un sacco di tempo con problemi assurdi.
Vuoi un convertitore USB->RS485 sicuro ed affidabile ? Benissimo allora usa un FTDI e un MAX485 oppure acquista un convertitore serio.

Tu usi quindi 2 di quei convertitori? Uno da Arduino e uno su PC?

Provandone uno solo su Arduino è okay? Ho capito bene il tuo ultimo post?
Ti chiedo allora, hai provato tutti e due i convertitori uno alla volta? Non potrebbe avere dei problemi solo uno dei due?

No, il convertitore è solo lato pc, serve per convertire il bus usb in uno di tipo rs485. I dati vengono quindi spediti ad un max485 che provvede a renderli leggibili alla seriale di arduino.

Comunque sicuramente non pretendevo il top della qualità acquistando quell'oggetto, ma sicuramente non mi aspettavo che non funzionasse! Se poi c'è da smanettarci è un altro conto..