smadonnamenti con la seriale

ciao a tutti questo è il mio primo post sul forum.
Sto iniziando un progetto nel quale mi devo interfacciare via seriale ad un altro componente, ma ho già dei problemi solo con l'invio dei comandi...

ho scritto il seguente codice:

int incomingByte = 0;      // for incoming serial data
int ledPin =  13; 
byte select[] = {0x02,0x00,0x04,0x04,0x00,0x00,0x02};

void setup() {
  Serial.begin(9600);      // opens serial port, sets data rate to 9600 bps
  pinMode(ledPin, OUTPUT);
}

void loop() {

  Serial.write(select,7);
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    digitalWrite(ledPin, HIGH);
  }
  delay(500);
  digitalWrite(ledPin, LOW);
  delay(500);
  
}

che dovrebbe mandare un select e accendermi un led se ricevo una risposta.

Non vedendo la comunicazione funzionare mi sono messo a guardare nel serial monitor cosa mandavo.. e non è quello che mi aspetto!
il mio messaggio inizia con 0x02 cioè un STX, invece nel serial monitor vedo tutt'altro (credo fosse un 0xBF), non riesco a capirne la ragione.

Volevo capire se crea conflitto avere il cavo usb collegato e avere le uscite tx e rx collegate ad un'altra seriale.

Infine non capisco come mai mi trasmette sulla seriale solo con il cavo usb collegato e non quando alimento con la batteria, è perché al serial.begin non sente nessuna periferica collegata alla seriale?

grazie.

ciao lollotek
Suppongo che hai un Arduino 2009.
Il problema é che hai attacato 2 cose sulla seriale (TX e RX); quei 2 pin vengono usati anche dal interfaccia USB-RS232 presente sulla scheda.
Il codice funziona, anche se non ho capito cosa vuoi spedire col comando Serial.write(select,7);
Vedo che a ogni loop aspetti 1 secondo; l' hai voluto cosí?
Usa la libreria http://arduino.cc/en/Reference/SoftwareSerial per collegare il Tuo "altro componente".
L' ultima domanda non so rispondere.
Ciao Uwe

Si, l'attesa di un secondo l'ho messa volutamente per non mitragriare troppo velocemente sulla seriale e riuscire a vedere il led di "debug".

nella parte:

byte select[] = {0x02,0x00,0x04,0x04,0x00,0x00,0x02};
Serial.write(select,7);

Voglio inviare la serie di byte, non è corretto?
Ho visto ora la libreria seriale, proverò con quella.

grazie mille.

Ciao lollotek
Quel code dovrebbe essere giusto.
mi ripeto:
Il problema é che hai attacato 2 cose sulla seriale (TX e RX); quei 2 pin vengono usati anche dal interfaccia USB-RS232 presente sulla scheda.
Usa la libreria http://arduino.cc/en/Reference/SoftwareSerial per collegare il Tuo "altro componente".
Ciao Uwe

ok, grazie mille, stasera ci provo...

altro componente

è così terribile quello che ho detto? comunque è un modulo rfid mifare, come potrei definirlo?

ciao lollotek
Non é terribile , ti ho solo citato e per questo messo fra virgolette. :wink: :smiley:
Ciao e buona fortuna.
Ciao Uwe

Ok sto usando la libreria e funziona, però in uscita non ti trovo quello che mi aspetto..
io faccio :

  mySerial.print(2,BYTE);
  mySerial.print(0,BYTE);
  mySerial.print(4,BYTE);
  mySerial.print(4,BYTE);
  mySerial.print(0,BYTE);
  mySerial.print(0,BYTE);
  mySerial.print(2,BYTE);

Aspettandomi in uscita per esempio come primo carattere un STX, cioè il secondo carattere della tabella ascii.
invece leggendo il canale mi ritrovo in Hex i seguenti caratteri:

BF
F7
F7
FF
FF
FB
00
00

sbaglio qualcosa?
io sono in ascolto con le seguenti impostaizoni:
Baud rate: 9600
Parity: none
bit per data: 8
Stop bit: 1

che sono le stesse usate dal modulo rfid con il quale devo andare a comunicare..

ciao lollotek

La funzione mySerial.print(2,BYTE); da dove la prendi? l' hai definta tu o fa parte di una libreria? Non so dirti niente se non so cosa fa la funzione.
ciao Uwe

purtroppo non ho il codice a portata di mano altrimenti te lo posto tutto..
comunque myserial è derivato dalla SoftwareSerial.
sono partito dall'esempio della sotware serial, ed ho visto che si utilizza il metodo print per inviare i dati.
Io dovrei riuscire a mandare il secondo carattere della tabella ascii che sarebbe un STX, fatto questo penso che poi di conseguenza riuscirei a fare tutto il resto..

allora stando a quanto dice qui

con questo comando

Serial.print(byte(78)) gives "N" (whose ASCII value is 78)

oppure

Serial.print(78, BYTE) gives "N"

io mando il carattere numero "78"

che è il metodo che appunto ho usato come indicato di sopra..

anche qui indica lo stesso genere di problema.

è possibile che basglio qualcosa a livello hardware? io mi sono collegato con l'rx di una seriale aggiuntiva al pin che uso come tx con la software serial, e le cose non mi quadrano, potrebbe esserci per qualche strano motivo un disallineamento dei bit?

questa sera faccio altre prove e posto il codice completo.

#include <SoftwareSerial.h>

#define rxPin 4
#define txPin 5

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup() {

  pinMode(rxPin, INPUT);    // imposto rx in entrata
  pinMode(txPin, OUTPUT); // imposto tx in uscita
  
  mySerial.begin(9600);     // apro la software serial
  
}

void loop() { 
  mySerial.print(byte(2)); // dovrei ritrovarmi STX 
  delay(2000);
}

questo è il codice, e mettendomi in ascolto mi spara fuori il carattere "?" cioè 0x3F, anziché 0x02.

qualcuno sa darmi qualche spiegazione?

[edit]..inizia a venirmi il dubbio che sia la mia porta da usb a seriale che uso per controllare l'uscita che funzioni male..[/edit]

ciao lollotek
Alcune domande cretine.
L' ordine dei Bit é giusto?
Il baudrate sono uguali?
Tu hai collegato la seriale del PC con i piedini 4 e 5 del Arduino? direttamente o hai messo qualche elettronica in mezzo?
Ciao Uwe

si si, i baudrate è uguale, ripeto, io sono in scolto con le seguenti impostazioni:
Baud rate: 9600
Parity: none
bit per data: 8
Stop bit: 1

dal piedino 5 faccio partire un filo che va a toccare l'rx del cavo usb-seriale al qule però ho messo un mini attacco incrociato in modo da avere la parte "femmina" dove mettere il mio filo.

ho provato anche ad attaccare il cavo usb seriale ad un'altra porta usb, ed ad usare la libreria NewSoftwareSerial, ma i risultati sono comunque identici.

tu per ordine dei bit che intendi? mandandogli solo un carattere mi aspetto di leggere solo quello.
mi pare di aver provato di tutto, per questo mi viene da accusare il cavo usb-seriale.
ah, poi la massa è quella del pc, perchè comunque l'arduino è alimentato dal suo cavo usb.
Devo forse fare qualche altra impostazione di pinMode o impostare come alta o bassa l'uscita?

Ciao lollotek
Le uscite RX-Tx delArduino non hanno i livelli di tensione conforme alla RS232.
Il arduino ha i livelli HIGH: 5V e LOW: 0V mentre la RS232 i livelli sono definiti HIGH +3V a +25V e LOW -3 a -25V
Ti serve un adattatore tipo MAX232. o equivalente che Ti produce dai 5V +/- 8V.
Non so che adattatore USB-RS232 usi. Se usi uno da PC hai questo problema; Potresti usare per un telefonino; alcuin modelli hanno dalla parte telefonino il livelli logici adatti (non so dirti quale adattatore per quale modello di telefonino va bene.

L'ordine dei bit é se viene mandato prima quello la cifra piú bassa (1) o prima quella piú alta (128).

Ciao Uwe

ah caspita, mi tocca farmi il circuitino quindi?
però mi sorge spontaneo un dubbio.. ma allora quelli che usano il Parallax (lettore rdif 125Khz) dovrebbero anche loro fare questa modifica? non mi pare di averlo mai visto.. collegano in reader e basta.

Anche nel mio caso vedere la comunicazione sulla seriale del pc sarebbe un "extra" l'importante è comunicare con il mio modulo rfid, che però usando anch'esso un'alimentazione da 5v credo che anche lui viaggi sugli stessi livelli di tensione dell'arduino per la comunicazione 232..

Ciao lollotek
Manda mi il modello o il sito del Tuo RFID. con i dati alla mano so dirti qualcosa di piú concreto.
Ciao Uwe

questo è il data sheet..
data sheet
mi sembra perfetto da adattare come shield..

ciao lollotek

se ho capito bene ci sono 5 versioni:
FRW-TTL-MS-5 TTL interface. Polling-selecting mode.
FRW-TTL-MH-5 TTL interface. Spontaneous mode.
FRW-232-MS-5 RS232 interface. Polling-selecting mode.
FRW-232-MH-5 RS232 interface. Spontaneous mode.
FRW-485-MS-12 RS485 interface. Polling-selecting mode. 125 device address.

Col comando REPLY#V : VERSION puoi sapere che vesione hai.

Se hai TTL puoi collegarlo direttamente col arduino
con RS232 Ti serve un adattatore tipo MAX232
con RS485 TI serve una adattatore per RS485

Dovresti vederlo anche stampato sulla scheda o sulla fattura.

Ciao Uwe

ah già scusa non ho spicificato, so già che il mio modello è:
FRW-232-MS-5 RS232 interface. Polling-selecting mode.
però non capisco, se è alimento a 5 volt come mai dovrebbe aver bisogno di un max 232 ? non dovrebbero comunicare entrambi con valori di low e high sdi 0 e 5 ?
ciao e grazie.

ciao lollotek

So che mi ripeto: I livelli logici definiti nel RS232 sono high: da +3V fino a +25V e low da -3 a -25V. È cosí. Se non é cosí non é una RS232, ma qualcos'altro.
Guardati come esempio questo datasheet: Mixed-signal and digital signal processing ICs | Analog Devices
Nello schema quasi in fondo alla pagina vedi lo schema di principio:
ci sono 4 condensatori C1 fino a C4. Con C1 viene raddoppiato la tensione di alimentazione da 5 V a 10 V e caricato il condenatore C3.
Il condensatore C2 serve per fare dei +10V i -10V e viene caricato il C4. Cosí abbiamo i +10 e -10V e percui siamo dentro nella specifica. I 4 Driver servono per cambiare livello di tensione da 5 e 0V a +/-10 per la trasmissione e segnali di flusso dati e di trasformare i +/- 12V che entrano ricezione e controllo di flusso ai 5 e 0V.
Forse dovresti leggerti per essere informati dello standard RS232 perché nonostante sia un interfaccia standardizzato si puó usarla in tanti modi diversi che non sono tra di loro compatibili.
EIA RS-232 - Wikipedia

Ciao Uwe