Arduino Uno e Comunicazione tramite protocollo rs232

Ciao a tutti, premetto di essere completamente nuovo al mondo di Arduino. Premetto di non essere né un esperto di elettronica e nemmeno di informatica, perciò vi chiedo di portare un po' di pazienza, sopratutto se vi pongo una domanda che ritenete banale (spero che non sia già stata trattata in precedenza, e, nel caso, mi scuso in anticipo.)

Ho a disposizione una scheda Arduino Uno e convertitore USB/rs232 che dall'usb del computer diventa una porta rs232 a pin, collegabile ad esempio in una breadboard. La mia necessità è questa, e credo che sia anche piuttosto semplice. Vorrei programmare Arduino Uno per poter riconoscere e ricevere dei caratteri ASCII in uscita dalla porta seriale, e, a seconda del carattere ricevuto, alzare un livello logico in uscita su un piedino. Insomma, credo che sia alla base della programmazione dei microcontrollori. Vi chiederei se cortesemente potreste indicarmi se esiste uno sketch per Arduino Uno che mi possa servire d'esempio su come programmare Arduino per riconoscere dei caratteri ASCII col protocollo rs232 (ovvero dovrei impostare il baudrate, la lunghezza dei bit, lo start bit, lo stop bit, ecc.. ecc..) Se ci fosse qualcosa di già pronto potrebbe essere un ottimo punto di partenza per me che sono piuttosto novello della materia!

Ho trovato tutorial che mi obbliga ad usare un traslatore di livello (un MAX232 se non sbaglio), ma non riesco a capirne il motivo. La porta rs232 ha un output di 5V che dovrebbe essere una tensione supportata da Arduino Uno. Se ci fosse la possibilità vorrei evitare di usare dei traslatori di livello.

Mi scuso se ho scritto delle cavolate e confido nella vostra pazienza nel voler aiutare un novellino!

Ciao a tutti!.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

  1. non capisco perché non colleghi l’ Arduino alla USB.
  2. i livelli logici della RS 232 possono essere: HIGH: da -3V a -25V; LOW da +3V a +25V. Normalmente si usa +/-12 o +/-9V
    Cioa Uwe

Come ti ha detto Uwe, stai sbagliando ... ... la vera porta RS232 ha prima di tutto i segnali che vanno sopra e SOTTO lo zero e che possono essere anche superiori ai 12V ed inoltre la sua logica è invertita rispetto alla TTL.

Quoto Wikipedia :

Il protocollo specifica una massima tensione di circuito aperto di 25 V, mentre i livelli di tensione che si possono usare per i segnali sono ±5 V, ±10 V, ±12 V e ±15 V. Per incrementare l'immunità ai disturbi elettrici l'interfaccia elettrica ha una soglia di commutazione di ±3 V, cioè per passare da uno stato ad un altro non è sufficiente arrivare allo zero, ma dovrà essere superata la soglia dei 3 V di segno opposto.

... ovvero, sulla RS232 avrai un segnale che somiglierà a :

Il MAX232 serve sia per adattare tale segnale ai valori TTL che accetta in ingresso Arduino, sia per invertirne la logica dato che, come detto, una seriale TTL ha i valori di 0 e 1 invertiti rispetto alla RS232:

Per esempi di programma, basta che nell'IDE vai su "Files -> Examples -> Communications" e trovi vari esempi che usano la seriale :)

Guglielmo

Grazie mille a tutti! Non appena scritte queste righe non mancherò di fare le mie presentazioni nel link che mi avete mandato.

1) non capisco perché non colleghi l' Arduino alla USB.

Purtroppo non posso farlo. Nel progetto al quale mi hanno in qualche modo costretto è previsto che i dati vengano immessi tramite protocollo rs232 da un computer tramite un covertitore USB/Seriale (UM232R per essere più precisi) Mandando dei caratteri a questo controller ho notato che i livelli logici sono +5V e 0V, quindi sarebbero compatibili con gli input di arduino. Lo startbit si ottiene abbassando il +5 costante. Con dei valori di tensione compatibili con Arduino Uno non è proprio possibile fare a meno di invertire la logica con un MAX232?

Arduino dovrebbe fare una cosa semplicissima, dovrebbe riconoscere un carattere in ingresso e dare una tensione alta in uscita in un unico pin. A questo punto non mi interesserebbe nemmeno di invertire la logica rs232 (o magari potrebbe esserci il modo di invertire la logica direttamente dallo sketch), l'unico problema ce l'avrei sullo startbit che probabilmente Arduino non riuscirebbe a riconoscerlo. Sbaglio qualcosa nel ragionamento? Se proprio non ci fosse modo mi vedrò costretto ad acquistare un MAX232, ma se fosse possibile vorrei evitarlo. Scusate l'insistenza! Grazie mille ancora!

Sono fuori ufficio ... leggi QUI ;)

Guglielmo

tantissima, tantissima, tantissima stima per te!
Grazie!

ozzy84:
tantissima, tantissima, tantissima stima per te!
Grazie!

Figurati :smiley: … a quest’ora immagino tu abbia già trovato tutte le informazioni sulla SoftwareSerial … comunque … i dettagli sulla libreria li trovi QUI

Guglielmo

Si, si. avevo trovato i dettagli ma grazie comunque per la disponibilità!!

Alcune indicazioni (... visto anche il messaggio che mi hai mandato ;)) :

  1. il terzo parametro nascosto lo usi quando crei l'istanza della SoftwareSerial ...
SoftwareSerial mySerial (10, 11, true);
  1. ricorda che se dal PC trasmetti un carattere ... molto probabilmente questo viene trasmesso come un carattere secondo la codifica ASCII quindi ... 0 = 0x30, 1 = 0x31, 2 = 0x32, ... 9 = 0x39 e come tale lo ricevi ;)

Guglielmo

Allora,
continuo questo post con un esempio che spero possa esservi di aiuto.
Non manco però di cominciare con i ringraziamenti per la vostra disponibilità.

Alla fine sono riuscito a configurare Arduino Uno per poter riconoscere un carattere ASCII immesso da una porta seriale esterna.
Il codice è questo, è una sciocchezza ma sembra funzionare a dovere:

#include <SoftwareSerial.h>
SoftwareSerial PortaSeriale(7, 8); //RX - TX
char let;
 
 
void setup()  {
//definisco il pin7(RX) come ingresso
pinMode(7, INPUT);
//definisco il pin8(TX) come uscita
pinMode(8, OUTPUT);
//setto  il baudrate
PortaSeriale.begin(9600);

pinMode(4, OUTPUT);
 
}
 
void loop() {

//leggo dalla seriale(pin)
EchoChar = PortaSeriale.read();

if (letr == '1')
        
            {
            digitalWrite(4, HIGH); 
            
            }
         
      if (let == '2')
          {
          digitalWrite(4, LOW); 
          }
delay(100);
 
        }

Per ora fa tutto ciò che deve fare, ovvero se Arduino legge un carattere 1 da seriale esterna alza il livello del pin4, se legge un carattere 2 abbassa il pin 4.

Non ho dovuto usare l’inversione di logica, forse questo rimane ancora un dubbio ma per il mio livello di conoscenze attuale posso ritenermi più che soddisfatto.

Un sentito ringraziamento a tutti!

Saluti

Stefano