Archivi tag: serial

Arduino – Concatenare la stampa di stringhe e variabili

In un recente post ho approfondito l’uso di Serial.write() e Serial.print(), proseguo riprendendo gli appunti che di volta in volta aggiungo a quanto sviluppato durante i corsi. Come sapete per inviare sulla seriale un testo molto lungo è necessario scrivere molte linee di codice, una sequenza di Serial.print() che hanno come argomento il testo che si vuole visualizzare, questo un esempio:

Serial.print("Nel mezzo ");
Serial.print("del cammin ");
Serial.print("di nostra vita ");
Serial.print("mi ritrovai ");
Serial.print("per una selva oscura ");
Serial.print("ché la diritta via ");
Serial.print("era smarrita. ");

Tutte queste righe potrebbero essere scritte in una forma più compatta, accodando tutte le Serial.print() :

Serial.print("Nel mezzo ");Serial.print("del cammin ");
Serial.print("di nostra vita ");Serial.print("mi ritrovai ");
Serial.print("per una selva oscura ");
Serial.print("ché la diritta via ");Serial.print("era smarrita. ");

Sarebbe interessante poter avere la possibilità di concatenare il testo da stampare così come è possibile fare con altri linguaggi di programmazione: Java / VB / C # / C ++, ecc…

Questa funzionalità è stata implementata qualche tempo fa da Mikal Hart che ha realizzato la libreria Streaming (file zip). I vantaggi di utilizzo risiedono nella compattezza del codice prodotto e nella velocità di scrittura.

Con l’uso della libreria Streaming il codice precedente che stampa una serie di stringhe utilizzando la Serial.print(), diventa:

Serial << "Nel mezzo " << "del cammin " << "di nostra vita " << "mi ritrovai " << "per una selva oscura " << "ché la diritta via " << "era smarrita."<< endl;

Nel caso si volesse suddividere l’invio sulla seriale su più linee::

Serial << "Nel mezzo " << "del cammin " << "di nostra vita " << endl;
Serial << "mi ritrovai " << "per una selva oscura " << endl;
Serial << "ché la diritta via " << "era smarrita. " << endl;

Prendendo spunto dall’esempio che trovate nella libreria:

#include <Streaming.h>

void setup()
{
  Serial.begin(9600);
  int lettera = 'M';
  int mese = 7, giorno = 6, anno = 1967;
  
  Serial << "Questo è un esempio dell'uso della libreria Streaming," << endl;
  Serial << "che ti permette di stampare variabili" << endl;
  Serial << "senza dover digitare ad ogni riga" << endl;
  Serial << "Serial.print().  Esempio: " << endl;
  
  Serial << "M è " << lettera << "." << endl;
  Serial << "La mia data di nascita è " << giorno << "-" << mese << "-" << anno << "." << endl;
  
  Serial << "Puoi anche usare i modificatori, per esempio:" << endl;
  Serial << _BYTE(lettera) << " e " << _HEX(lettera) << " in esadecimale. " << endl;
}

void loop()
{}

Realizzimo uno sketch che conta il numero di pressioni del pulsante e visualizziamo sulla Serial Monitor una stringa che ne da indicazione, il circuito è costituito da:

  • Arduino UNO R3
  • Resitore da 1KOhm
  • 1 pulsante

Lo sketch di esempio è il seguente:

#include <Streaming.h>

#define PULSANTE 11 // pin di input a cui è collegato il pulsante

// Variabili
int ContatorePulsantePremuto = 1; // conta il numero di volte che il pulsante è premuto buttonPushCounter 
int StatoPulsante = 0;            // stato corrente del pulsante
int StatoPulsantePrecedente = 0;  // stato precedente del pulsante

void setup() {
  pinMode(PULSANTE, INPUT); // imposta il pin digitale come output
  Serial.begin(9600);       // inizzializza la seriale a a 9600 bps
}

void loop() {
  StatoPulsante = digitalRead(PULSANTE);
  // legge il valore dell'input e lo conserva

  if (StatoPulsante != StatoPulsantePrecedente) {   // compara lo stato del pulsante attuale con il precedente
    if (StatoPulsante == HIGH) {                    // se lo stato è cambiato incrementa il contatore
      // se lo stato corrente è alto, il pulsante è passato da off a on
      
      // Stampa sulla seriale il numero di pressioni del pulsante
        Serial << "Il pulsante è stato premuto " << ContatorePulsantePremuto << " volte" << endl;
      
      ContatorePulsantePremuto++;
    }
  }

  // salva lo stato corrente nella variabile che indica lo stato precedente per il loop successivo 
  StatoPulsantePrecedente = StatoPulsante;
}

Ad ogni pressione del pulsante sulla seriale compariranno le stringhe:

Esercizio

L’invio dello dello stream del testo può avvenire non solo sulla seriale ma anche su qualsiasi classe derivata da Print, ad esempio su display.

Sapreste ottenere la stessa cosa con un display a 16 colonne e 2 righe?

Suggerimento:

lcd << "Il pulsante è stato premuto " << contatore << " volte" << endl;

Buon Coding a tutti 🙂

Appunti di programmazione su Arduino: comunicazione seriale

Serial.begin(rate)
Apre la porta seriale ed imposta la velocità di trasmissione (baud rate) seriale per trasmettere i dati. La velocità di trasmissione tipica per la comunicazione del computer è di 9600 bps (bps: baud rate per secondo)

Nota: attensione a non confondere la sigla bps con bit al secondo, nel nostro caso parliamo di boud, cioè simboli e ad ogni simbolo possono corrispondere più bit.

void setup()
{
   serial.begin(9600); // apre la porta seriale ed imposta
                       // la velocità di trasmissione a
                       // 9600 bps
}

Nota: quando si usa la comunicazione seriale, i pin digitali 0 (RX) e 1 (TX) non possono essere utilizzati contemporaneamente.

Serial.println(data)
Stampa i dati sulla porta seriale (invia i dati alla seriale e li visualizza) seguito da un ritorno a capo automatico ed un avanzamento linea.
Questo comando ha la stessa struttura della Serial.print() ma è più semplice da usare per la lettura sul serial monitor.

Serial.println(analogValue); // invia il valore di
                             // analogValue

Nota: Per ulteriori informazioni sui possibili utilizzi della Serial.println() e della Serial.print() fare riferimento al manuale on-line su Arduino.cc.

L’esempio che segue legge un valore dal pin analogico 0 ed invia i dati ogni secondo al computer:

void setup()
{
   Serial.begin(9600); // imposta la comunicazione seriale
                       // a 9600 pbs
}
void loop()
{
   Serial.println(analogRead(0)); // invia il valore analogico
   delay(1000);                   // fa una pausa di 1 secondo
}

Per le lezioni precedenti consultare la sezione Appunti di programmazione che trovate nella pagina Arduino di questo sito.

Installare l’IDE Arduino 1.0.1 su Ubuntu 12.04

Con l’avvio dell’anno scolastico ripartono i corsi di Alternanza Scuola Lavoro su Arduino per gli allievi di 4′ della sezione elettronica.
Quest’anno ho deciso di far utilizzare ai miei studenti l’ultima versione di Arduino la 1.01. La programmazione avverrà su PC con sistema operativo Ubuntu su cui ho da poco effettuato l’aggiornamento alla versione 12.04.

Problema: al primo avvio dell’IDE ho notato che non era possibile in alcun modo selezionare la porta seriale.

Come risolvere l’inconveniente?

On-line si trovano alcune soluzioni ma non risolvono completamente il mio problema.

In passato avevo superato il problema per Ubuntu 11.10, questi i tre post di riferimento:

Ma con Arduino 1.0.1 ed Ubuntu 12.04 bisogna agire in maniera un po’ diversa. Per rendere più chiaro il tutorial ripeterò alcune delle operazioni già eseguite nei post sopra citati.

Questo l’indice di esecuzione per la risoluzione del bug:

  1. installare Java
  2. installare la libreria AVR C
  3. scaricate Arduino 1.0.1
  4. riattivare la porta seriale (ttyACM0)

E’ presente inoltre un’ulteriore problema: l’avvio dell’IDE risulta molto rallentato. Mostrerò come velocizzare l’apertura del programma.

Continua a leggere