aiuto per lettura sensore seriale

ciao a tutti! avrei bisogno di un aiuto per la lettura di un sensore che comunica col pc attraverso una porta seriale rs232. solitamente lo collego ad un pc tramite un adattatore rs232-usb e leggo la stringa di dati che trasmette, attraverso l'hyper terminal, configurandolo 19200-n-8-1-none. adesso però vorrei leggere i dati con arduino... ho preparato un cavo seriale con i fili tagliati, quindi accessibili per collegamenti ad arduino. so che il sensore utilizza solo i pin 2-3-5 (rx-tx-gnd). mi dareste una dritta su cosa devo studiare per poter leggere i dati emessi dal sensore, con arduino? cercate di essere pazienti, le mie nozioni in questo campo sono molto scarse! ma el momento vorrei almeno capire se ho bisogno di una shield supplementare, oppure se basta collegare i fili che escono dal sensore ai pin rx-tx di arduino! grazie!

Arduino lavora a 5V, quel sensore ? Se lavora a 12V non va bene

La seriale di Arduino (quella sui pin 0 e 1) è una seriale TTL, tu hai una seriale RS232 e quindi incompatibile.

Devi prendere un adattatore seriale (uno di quelli basati sul MAX232) per adattare la logica ed i livelli di tensione del tuo apparato a quelli di Arduino.

Guglielmo

Grazie a tutti! Lo strumento lavora a 12v, lo alimento con una batteria esterna. Avreste un link in cui posso vedere l'adattatore di cui ho bisogno?

arduale: Avreste un link in cui posso vedere l'adattatore di cui ho bisogno?

QUESTO è un esempio, ma ne trovi un'infinità ;)

Guglielmo

grazie guglielmo! ho preso l'adattatore consigliato, ora devo provare a scrivere uno sketch per la lettura. volevo chiederti che strada devo percorrere, ovvero se tramite il collegamento a due pin digitali e l'utilizzo della libreria softwareserial, oppure tramite collegamento diretto ai pin 0 e 1 del mio arduino uno? considera che lo strumento, quando letto tramite hyperterminal di win, trasmette sempre in continuo, basta settarlo configurandolo 19200-n-8-1-none. grazie, ciao!

Se usi i pin 0 e 1 perdi l'uso della USB e quindi della possibilità di fare "debug" ... ... io consiglio sempre di usare la SoftwareSerial così da poter usare comunque la vera seriale per il debug e l'interfaccia con il Serial Monitor.

Naturalmente, se sei sicuro al 100% del codice e NON ti occorre la USB ... allora la vera seriale è da consigliare.

Guglielmo

credo di aver capito! allora provo cono la softwareserial e 2 pin digitali, usando il serial monitor per debug, poi se tutto funziona, passo ai pin 0 e 1. grazie ancora!

Mi raccomando, leggi il reference della SoftwareSerial per conoscere le limitazioni ed i pin utilizzabili in funzione del tipo di Arduino (Uno, Leonardo, Mega, ...).

Io consiglio sempre RX 10, TX 11 ;)

Guglielmo

ragazzi, non ne vengo fuori… hocollegato il sensore all’adattatore rs232-ttl, tramite un gender changer (adattatore e sensore hanno lo spinotto femmina, quindi mi serviva il gender changer, ma non credo che possa essere la causa del mancato funzionamento, poichè non dovrebbe fare “cose strane”…), ma quello che ricevo sul monitor seriale, sono solo una serie di ZERI…

il codice che uso è questo:

#include <SoftwareSerial.h>
#define RX 10
#define TX 11
SoftwareSerial sensor(RX, TX);

int incomingByte = 0;
uint8_t buffer[10];
uint8_t ind = 0;
String val = "";

void setup() {
  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);

  sensor.begin(19200);
  Serial.begin(9600);
//  delay(1000);
//  sensor.write("R\r");  // R: start continuous outputting
//  delay(1000);
}

void loop() {

  if (sensor.available())
  {
    incomingByte = sensor.read();
  }

  Serial.println(incomingByte);
  delay(500);
}

ho provato ad invertire RT e TX, ma senza risultato.

adattatore e sensore hanno lo spinotto femmina, quindi mi serviva il gender changer, ma non credo che possa essere la causa del mancato funzionamento,

E invece il problema è proprio quello, l'adattatore Maschio-Maschio che hai usato , adatta solo i connettori, non inverte i segnali Dato che probabilmente non hai dimestichezza con le saldature, prova ad usare dei spezzoni di cavo ( di diametro adatto, che entrino bene dentro ai connettori e che stiano fermi ) e fa' questo collegamento tra il connettore del sensore e della tua interfaccia RS232/TTL

Dimenticavo...

grazie per la dritta, brunello! in effetti con il collegamento come da te suggerito, qualcosa riesco a vedere. ora appaiono numeri apparentemente indecifrabili, almeno non sono quelli che mi aspetto. però variano a seconda che il sensore sia alimentato o no, quindi ne deduco che qualcosa esce! mi aspetterei una stringa di testo, ma evidentemente con il mio codice leggo solo i byte, giusto? dovrei in qualche modo "decifrarli".

In ogni caso anche lo sketch non ha molto senso... Meglio così:

void loop() {
  if (sensor.available()) {
    Serial.print(sensor.read());
  }
}

Questo sketch è "a senso unico" comunque, ti fa leggere quel che il sensore invia, ma tu a lui non puoi mandare niente. È questo che vuoi?

PS: Occhio comunque che la ricezione a 19200 bps tramite la SoftwareSerial non è detto che sia proprio a prova di bomba.

PS2: Consiglio di settare anche la Serial verso il PC a 19200, onde evitare di riempire il buffer.

Quasi sicuramente il tuo problema deriva da due cose, prima di tutto la delay(500) che non deve esserci, altrimenti ricevi solo un byte ogni 500 ms, inoltre la seriale verso il pc deve andare almeno a 19200 come quella del sensore, meglio se la mandi 115200.
Se la seriale verso il pc è più lenta di quella del sensore ti perdi i dati per strada, è come se riempi un secchio con un flusso di 6lt/s e lo svuoti con un flusso di 6 lt/s, dopo poco tempo metà del flusso in ingresso tracima fuori e va perso.
Quando rilevi un byte sulla seriale software lo invii direttamente verso il pc, all’interno della “if (sensor.available())”, tramite una serial.print (senza ln), poi una volta che hai verificato il corretto funzionamento dovrei accumulare i byte ricevuti un un array, e qui serve il protocollo di trasmissione del sensore, in modo poterli usare nel tuo programma.

SukkoPera: I PS2: Consiglio di settare anche la Serial verso il PC a 19200, onde evitare di riempire il buffer.

Abbiamo postato la stessa cosa in simultanea. :)

ok, grazie ancora. ci siamo quasi… almeno spero!
ho modificato il codice come da voi consigliato ed ora leggo una serie di numeri che si ripetono, quasi sempre uguali, con delle piccole variazioni.

#include <SoftwareSerial.h>
#define RX 10  // collegato a RX di rs232
#define TX 11  // collegato a TX di rs232
SoftwareSerial sensor(RX, TX);

int incomingByte = 0;
uint8_t buffer[10];
uint8_t ind = 0;
String val = "";

void setup() {
  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);

  sensor.begin(19200);
  Serial.begin(115200);
  delay(1000);
  sensor.write("R\r");  // R: start continuous outputting
  delay(1000);
}

void loop() {
  if (sensor.available()) {
    Serial.print(sensor.read());
  }
}

il sensore dovrebbe mandare fuori delle stringhe di testo, con un numero decimale (una cifra dopo la virgola), uno spazio e “ppm”, es:

345.2 ppm
350.4 ppm

almeno questo è quello che si vede con l’hyperterminal di winxp.

Togli quelle pinMode()!

SukkoPera: Togli quelle pinMode()!

fatto... ma non cambia niente!

anzi adesso mi sputa fuori un "247" all'inizio, poi niente più...

EDIT: ora, dopo qualch reset, esce la stringa:

324951495146521310324951495146521310

con freq 1 hz. esce quasi sempre uguale, cambia qualche cifra. potrebbe essere in qualche modo la stringa che cerco?

32 49 51 49 51 46 52 13 10 32 49 51 49 51 46 52 13 10

spazio 1313.4 (CR)(LF) spazio 1313.4 (CR)(LF)