Tecnicamente's Weblog

Just another WordPress.com weblog

Archivi Mensili: aprile 2012

Arduino, MAX232 e comunicazione seriale – Parte 2

Nel post precedente abbiamo visto il circuito che occorre realizzare per creare l’interfaccia hardware che permetta ad Arduino di avere una comunicazione seriale secondo il protocollo RS232.

La prima cosa da fare è includere la libreria nel nostro programma, indicare i PIN che vogliamo usare come RX ( comunicazione TTL in ingresso) e TX (comunicazione TTL in uscita).

#include <SoftwareSerial.h>
#define RX 6
#define TX 7
SoftwareSerial mySerial(RX, TX);

Con l’istruzione SoftwareSerial si definisce una interfaccia seriale dal nome mySerial indicando i PIN adibiti a RX ed a TX.

Nel caso si voglia usare anche il secondo canale di trasmissione disponibile nel MAX232 su può definire una seconda interfaccia usando un altro nome ed altri PIN:

SoftwareSerial secondSerial(3,4)

Abbiamo definito i PIN che trasmettono i dati, ma non abbiamo ancora definito di che tipo sono i dati da trasmettere, per tale motivo occorre dichiarare le variabili tx ed rx, che sono rispettivamente l’informazione spedita da Arduino e l’informazione ricevuto.

Tali variabili sono definite come byte, tale tipo memorizza 8 bit, permettendo di avere dei valori da 0 a 255.

byte tx = 0;    // variabile per contenere il carattere inviato
byte rx = 0;    // variabile per contenere il carattere ricevuto

Giunti a questo punto abbiamo definito sia l’interfaccia hardware che software di comunicazione, mancano ancora ancora settaggi fondamentali per la connessione come ad esempio la velocità di trasmissione dei dati.

Per eseguire dei test e dei debug uso due connessioni seriali, una dal PC ad Arduino ed una seconda da Arduino al PC (mySerial).

void setup()
    {
    Serial.begin(19200); // imposto la UART per lavorare a 19200
    pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
    Serial.flush(); // svuoto il buffer di ricezione seriale

        mySerial.begin(19200);
        mySerial.flush();
        Serial.println("Avvio della comunicazione");
    }

Riorganizzando quanto detto in un unico programma abbiamo quanto segue:

/*

*/

#include <SoftwareSerial.h>
#define RX 6
#define TX 7
SoftwareSerial mySerial(RX, TX);

#define led 13  // led connesso al pin n°13

byte tx = 0;
byte rx = 0;    // variabile per contenere il carattere ricevuto

void setup()
    {
    Serial.begin(19200); // imposto la UART per lavorare a 19200
    pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
    Serial.flush(); // svuoto il buffer di ricezione seriale

        mySerial.begin(19200);
        mySerial.flush();
        Serial.println("Avvio della comunicazione");
    }

void loop()
    {
        int flag=0;

    while (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
        {
        tx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
        mySerial.write(tx);
        Serial.print("Arduino TX ->  ");
        Serial.write(tx);
        Serial.println();

        flag = 1; // per scrivere il carattere "CR" su mySerial
        }

        if (flag == 1){
                    mySerial.println();
                    flag = 0;
                }

                if (digitalRead(RX)== 1)
                {
                    Serial.println("-------");
                }
                else
                {
                  Serial.print("RX <- ");
                  Serial.println(RX);
                }

        while (mySerial.available()>0)
                {
                  rx = mySerial.read();
                  Serial.write(rx);
                  flag = 1;
                }
                if (flag == 1){
                    Serial.println();
                    flag = 0;
                }
delay(1000);
}

Nel prossimo post vedremo come fare il debug e se finalemnte il cellulare risponde ai comandi

Arduino, Max232 e comunicazione seriale – Parte 1

Dopo vari test e semplici esercizi di studio con Arduino è giunto il momento di mettere in piedi un progetto ambizioso, permettere ad Arduino di comunicare con un cellulare o un modulo GSM, in modo da inviare informazioni e ricevere comandi tramite SMS.

Ma i grandi progetti cominciano con piccoli passi, e nel mio caso il primo passo da fare e permettere la comunicazione tra Arduino e un telefono cellulare, usando i classici comandi “AT“.

Se come me state pensando di usare il PIN 0 ed il PIN 1 per collegare Arduino al cellulare, vi annuncio di lasciar perdere, lo sbaglio è già stato fatto da me.

I PIN in questione sono già utilizzati dalla comunicazione seriale che instauriamo con Arduino quando lo colleghiamo al PC tramite cavo USB.

Occorre quindi far ricorso ad altre risorse, in particolare possiamo usare due uscite digitali tra quelle disponibili (nel mio caso PIN 6 e PIN 7), e far ricorso alle librerie: “SoftwareSerial.h” che sono comprese nell’ambiente di sviluppo.

Le librerie SoftwareSerial ci permetterano di impostare i precedenti PIN 6 e 7 come i PIN adeguati ad una comunicazione tramite TTL.
In tal modo potremo usare tutti i comandi classici della comunicazione seriale di Arduino su questi due nuovi PIN.
La condizione da rispettare è che la forma “Serial.xxxxx()” diventi una forma del tipo “mySerial.xxxxx()“, per tutta la documentazione del caso vi invito alla lettura del link: http://arduino.cc/en/Reference/SoftwareSerial.

Oltre alla libreria software ci occorre un famosissimo integrato, il MAX232!
Il Maxim MAX232 permette di convertire i segnali TTL provelienti dai PIN 6 e 7 nei segnali previsti dalla comunicazione RS232, per tutte le informazioni del caso cliccate qui.

Come potete vedere nel sito ufficiale della Maxim, lo schema del MAX232 è:

L’integrato permettere di realizzare due comunicazioni seriali secondo l’RS232 semplicemente usando altri due PIN di Arduino, ma per il mio scopo va bene utilizzare solo un canale di trasmissione per tale motivo nello schema successivo trovate collegati solo i PIN 11 e 12 (T1in e R1out) ad Arduino.

La porta seriale del cellulare sarà invece collegata ai PIN 13 e14 (R1in e T1out):

Dallo schema del MAX232 si vede benissimo che esso esegue un inversione del segnale di ingresso, i segnali TTL inviati da Arduino.

I segnali TTL inviati da Arduino posso assumere i valori:

  • 0V per esprimere lo “0” logico;
  • +5V per esprimere l’ “1” logico.

Tali livelli logici sono inviati al MAX232 che li inverte dando in uscita:

TTL RS-232
livello logico “0”/ 0V +10 V

Lo Standard RS232 prevede un valore da +6V a -15V

livello logico “1” / +5V -10 V

Lo Standard RS232 prevede un valore da -6V a -15V

Quindi se avete qualche dubbio sul corretto funzionamento dell’integrato basta collegare il PIN T1in di ingresso a +5V ed in uscita al T1out dovete leggere un valore da -6V a -15V.

Ripetendo il test mettendo a massa il PIN T1in il valore in uscita al T1out deve essere compreso tra +6V e +15V.

Il collegamento tra Arduino, il MAX232 ed il connettore DB9 dove collegare il cellulare è stato fatto rispettando lo schema ed i commenti che trovate qui.

Nel mio caso ho:
Vcc = 5 volt, prelevati dall’opportuno PIN di Arduino, verificate che il vostro max232 richieda 5 Volt e non di più.
RX = PIN 6
TX = PIN 7
GND = PIN GND di Arduino
Per il condensatore sul PIN 16 del max232 ho usato un condensatore da 100uF, causa non disponibilità del 10uF, e tutto funziona benissimo.

Bene con SoftwareSerial.h, il maxim max232, ed una manciata di condensatori abbiamo creato l’interfaccia che ci serve per la comunicazione, ma la via è ancora lunga ed il debug anche, quindi nella seconda parte metteremo mano ad un po’ di codice e a qualche altro accessorio che potrebbe servire.

Il circuito realizzato, scusate la qualità, è quindi il seguente: