1. A breve aggiorneremo la piattaforma di Reboot per risolvere alcuni problemi con i plug-in, quindi chiediamo ancora un po' di pazienza, Lo staff di Reboot

Comunicazione Seriale

Discussione in 'Corso di Arduino' iniziata da RyujiAndy, 3 Feb 2015.

By RyujiAndy on 3 Feb 2015 alle 22:38
  1. RyujiAndy

    RyujiAndy Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿ Staff

    Iscritto:
    15 Dic 2014
    Messaggi:
    558
    Like ricevuti:
    390
    [​IMG]
    Un aspetto importante della scheda Arduino è la possibilità di interagire con un PC tramite porta USB.
    In realtà la comunicazione avviene tramite una porta seriale UART o USART, grazie ad un pin digitale RX (D0 su Arduino Uno) e TX (D1). Quando si abilita la comunicazione seriale questi 2 pin non possono essere utilizzati per altre funzioni.
    I PC moderni non dispongono della porta seriale quindi, per praticità, a partire dalla versione Diecimila è stato integrato nella board Arduino un chip per la conversione del segnale.

    Esistono diverse board Arduino, ed ognuno di queste ha numero di porte e caratteristiche differenti riguardo l'utilizzo dei pin. A seguire riporto solo alcuni modelli:
    • Arduino UNO: Una porta seriale sui pin digitali D0 (RX) e D1 (TX).
    • Arduino Mega: Tre porte seriali, Serial1 sui pin digitali D19 (RX) e D18 (TX), Serial2 sui pin digitali D17 (RX) e D16 (TX) e Serial3 sui pin digitali D15 (RX) e D14 (TX).
    • Arduino DUE: Tre porte seriali da 3.3v, Serial1 sui pin digitali D19 (RX) e D18 (TX), Serial2 sui pin digitali D17 (RX) e D16 (TX) e Serial3 sui pin digitali D15 (RX) e D14 (TX), il processore SAM3X ha una porta USB nativa 'SerialUSB '.
    • Arduino Leonardo: Una porta Serial1 sui pin digitali Do (RX) e D1 (TX),la Serial è un USB CDC cioé una porta nativa che viene utilizzata per la comunicazione con hardware esterno come tastiere o memoria di massa. Altra caratteristica di questa versione (e di Arduino DUE) è la possibilità di interfacciarsi direttamente via USB ad un altro dispositivo, in quanto tra il controller e l'host non c'è alcun convertitore seriale. Ad esempio, Leonardo può simulare il comportamento di un mouse o una tastiera USB ed inviare dati ad un PC.
    Passiamo ora alla pratica:
    Eccovi un programmino di esempio per capire meglio come Arduino è in grado di inviare dati al pc:
    Codice:
    void setup () {
       Serial.begin(9600);
       Serial.print("Hello");
       Serial.print(" ");
       Serial.println("Reboot.ms");
       Serial.end();
    }
    
    void loop () {
       ;
    }
    Una volta Copilato e caricato il programma su arduino tramite l'apposito tasto [​IMG] , dobbiamo aprire il terminale Seriale cliccando sul tasto [​IMG] . Si aprirà una finestra contenente la scritta "Hello Reboot.ms".
    C'è da notare che ogni qualvolta si apre il terminale di comunicazione seriale Arduino si resetta automaticamente, quindi se apriamo e chiudiamo la finestra questo riavvierà Arduino ogni volta, facendo partire il programma dall'inizio.
    Analizzando il programma si nota subito che ci sono 2 funzioni principali: la prima è "void setup" che viene letta subito dopo il bootloader Arduino e che viene utilizzata per inizializzare l'hardware che andiamo ad utilizzare. La seconda è la funzione "void loop", ovvero un ciclo infinito dove si scrive il programma vero e proprio che utilizzeremo negli esperimenti.
    In questo caso ho scritto le istruzioni di stampa nella funzione "void setup" per il semplice motivo che altrimenti la scritta sarebbe stata ripetuta all'infinito. A noi, per il momento, interessa che venga stampata a schermo solo una volta.
    • Il comando "Serial.begin" inizializza la comunicazione seriale tra Arduino e PC, ed il numero che va tra parentesi sta ad indicare la velocità di comunicazione. Questa assume i seguenti valori: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, o 115200.
    • Come abbiamo aperto la porta per la comunicazione, possiamo anche chiuderla con il comando "Serial.end". Questo comunque comporta il dover reinizializzare la comunicazione se si intende utilizzarla ancora.
    • Per stampare a video abbiamo a disposizione due comandi: "Serial.print" e "Serial.println". La differenza essenziale è che il primo stampa il contenuto tra parentesi senza andare accapo.
      Il comando "Serial.print" è in grado di stampare vari formati;
      "Serial.print(72, BIN);" stamperà a video "1001000" cioè il valore binario di "72" .
      "Serial.print(72, DEC);" stamperà a video "72" cioè il decimale.
      "Serial.print(72, OCT);" stamperà a video "110" cioè l'ottale.
      "Serial.print(72, HEX);" stamperà a video "48" cioè l'esadecimale.
      Il comando non è in grado di fare solo conversioni tra diversi sistemi numerici, ma ad esempio possiamo decidere quante cifre dopo il punto vanno stampate:
      "Serial.print(72.19489390, 2);" stamperà a video "72.19".
      "Serial.print(72.19489390, 1);" stamperà a video "72.2", questo perchè arrotonderà per eccesso.
      Per stampare delle stringhe è necessario racchiuderle tra virgolette come nel programma di esempio.
    Arduino comunque è anche in grado di leggere dati che gli vengono inviati, questo grazie al comando "Serial.read", ma conviene sempre prima controllare se c'è un flusso di dati, altrimenti rischiamo di avere una serie di valori errati, infatti il comando assume il valore del byte trasmesso o se questo è assente allora l'errore "-1", quindi conviene prima eseguire il comando "Serial.available" per essere sicuri di leggere una sequenza valida di byte e conoscere la quantita di essa, perchè il comando ne restituisce il numero.
    Codice:
    void setup() {
       Serial.begin(9600);
    }
    
    void loop() {
       Serial.print(Serial.read(), DEC);
       Serial.print(" ");
    }
    In questo esempio non ho inserito intenzionalmente il controllo del flusso di dati per vedere come si comporta il comando di lettura, infatti avremo una cascata di "-1" o il codice ascii del carattere inviato tramite il terminale seriale.

    Ho anche evitato di usare variabili, cicli o controlli perchè intendo trattarli in seguito, ma ritengo molto importante capire come Arduino possa inviare e ricevere dati, questo per il semplice fatto che si può usare il comando seriale come invio di informazioni al PC su punti ben precisi di un programma e visto che nella programmazione si incappa spesso in bug di programmazione, ci aiuta per capire in che punto stiamo sbagliando del nostro esperimento. C'è comunque da sottolineare che non deve essere usato esclusivamente per questo: esistono moduli, infatti, che utilizzano questo metodo di comunicazione per eseguire comandi, per esempio quelli dotati di display.
    Voglio precisare che questo argomento verrà ripreso più dettagliatamente, questo perchè al momento non abbiamo ancora spiegato concetti essenziali per usare appieno le potenzialità dei comandi che sono a nostra disposizione.
     
    #1
    Ultima modifica: 4 Feb 2015
    A federico, andre9699, llo0773 e 4 altri utenti piace questo elemento.
Tags: this article has not been tagged

Commenti

Discussione in 'Corso di Arduino' iniziata da RyujiAndy, 3 Feb 2015.

    1. Edu79
      Edu79 Livello 1
      Leggendo la prima lezione di arduino volevo chiederti se questo corso, come quello sull' elettronica, è indirizzato anche a chi come me non sa nulla di programmazione. Leggendo questa lezione sembra proprio di si :smile:, ma correggimi se sbaglio. Grazie e buona Pasqua a tutti!
    2. RyujiAndy Staff
      RyujiAndy OP Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿
      Sì questa volta le lezioni saranno per tutti e saranno collegate con quelle di elettronica di standardbus
      A fenomeno96 piace questo elemento.
    3. Jordan
      Jordan Livello 2
      Sera, è solo questo il corso?
    4. RyujiAndy Staff
      RyujiAndy OP Staff ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿
      Veramente no spero che seguiranno altre, tempo permettendo
      A Swear e Zeus piace questo messaggio.

Condividi questa Pagina