PAF! – Processing Arduino Firmata

Dialogo

Costanza. È l’arcinemica di questo blog da più di un mesetto. Ciò che però non sono riuscito a mantenere qui, scrivendo, l’ho fatto in altri ambiti. Dopo la laurea, tra i vari corsi di fisica e non, ho portato avanti alcune idee/progetti che mi sono venuti in mente con Arduino. Tra questi, ve ne racconto uno.
Avendo a disposizione delle fotoresistenze ho voluto caratterizzarle andando a stimare la quantità di luce ricevuta dai sensori in funzione della distanza dalla sorgente luminosa. Naturalmente mi aspettavo un decremento di tale quantità all’aumentare della distanza per lo stesso motivo per cui la luce dei fari di un’automobile a dieci metri di distanza da essa, per esempio, è diversa da quella ricevuta a 50 metri.
Ho dunque preso il mio fedele Arduino Uno, ho montato il circuito, scritto il codice per acquisire tali valori e trasmetterli al pc e quindi ho usato Processing per la ricezione dei dati e una volta fatto partire lo sketch… mica funzionava! Come era possibile?
Da buon fisico quale sono – e testardo difronte ai problemi – ho cercato di capire meglio la questione. Curiosando in Rete ho scoperto un problema di cui non mi ero minimamente preoccupato finora – beata ingenuità! –ovvero ho trovato l’acqua calda: Arduino e Processing non dialogano alla stessa maniera. Esattamente come farebbero un abitante medio del Bangladesh e un francese, hanno difficoltà a capirsi: quando Arduino invia delle lettere, il problema non si presenta; ma appena si iniziano a spedire numeri sorgono i guai. Per fortuna c’è chi ha già posto un rimedio a tutto ciò creando il protocollo di dialogo Firmata. Come indica la descrizione, è una libreria che implementa il protocollo Firmata (occhio, non è lo stesso link di prima) per la comunicazione in casi come questo. Inutile dire che era esattamente ciò che cercavo. Ma come funziona operativamente?
Procediamo per punti:

  • Andate qui e scaricate la libreria per la vostra versione di Processing.
  • Estraete la cartella arduino dal file .zip e copiatela in sketchbook > libraries di Processing. Se non sapete dove sia la cartella sketchbook rintracciatela aprendo direttamente Processing e facendo clic su File > Preferences: vi indicherà la locazione della cartella. NB Se usate una distribuzione Linux dovete modificare il file Arduino.jar in arduino.jar (questo perché Linux è case sensitive. Il file comunque lo trovate semplicemente andando nel file appena estratto, percorso: arduino > library). Avete già finito.
  • Aprite l’IDE di Arduino, quindi lo sketch che volete caricare sulla board. Dovete importare la libreria per poterne sfruttare le funzionalità, quindi selezionate Sketch > Importa libreria > Firmata. In cima al codice vi comparirà una voce fatta così: 

    #include <Firmata.h>

    Bene, a questo punto bisogna anche dare i comandi giusti per inviare i dati. Supponendo che voi abbiate collegato dei sensori – come le fotoresistenze – ai pin analogici, uno sketch di base potrebbe essere questo:

    #include <Firmata.h>

    byte analogPin;void setup() {

    Serial.begin(57600); //impostazione velocità di collegamento con il pc (dovrà essere uguale a quella impostata in Processing)

    Firmata.begin(); //inizializziamo la libreria

    }

    void loop() {

    while(Firmata.available()) {

    Firmata.processInput();

    }

    for(analogPin = 0; analogPin < TOTAL_ANALOG_PINS; analogPin++) {

    Firmata.sendAnalog(analogPin, analogRead(analogPin));

    }
    }

  • Sistemata così la parte per Arduino, si può caricare il codice sulla board e chiudere l’IDE. Apriamo Processing e vediamo un altro sketch di base da cui poter partire:

    import processing.serial.*; //importazione della libreria per la comunicazione seriale

    import cc.arduino.*; //importazione della libreria specifica per Arduino

    Arduino arduino; //creazione di una variabile arduino

    void setup() {

    println(Arduino.list()); arduino = new Arduino(this, Arduino.list()[0], 57600); //seleziona la porta seriale corretta. Notate che la velocità di connessione deve essere la stessa di quella impostata sulla board.

    }

    void draw() {

    float ValSer0 = 0;

    ValSer0 = arduino.analogRead(0); //legge il valore numerico del pin analogico A0 (indicato nel codice con zero, tra parentesi) di Arduino proveniente dalla porta seriale selezionata. Un codice analogo si può usare per gli altri pin.

    println(ValSer0); //stampa il valore di A0 }

  • Fate partire lo sketch su Processing e vedete che succede.

Naturalmente il tutto è personalizzabile in base ai vostri particolari progetti. Io, per esempio, vi ho parlato della caratterizzazione delle fotoresistenze. Qui sotto c’è un video di prova:

Occhei, potrebbero essere solo delle palline che si muovono su uno schermo, ma almeno si muovono con cognizione di causa.
Questo è quanto. Buon divertimento a chiunque si cimenterà!

Ah, non c’entra niente con Arduino e protocolli vari, ma guardate un po’ qua che cosa può generare una serie incontrollata di problemi di dialogo! Io mi sono piegato dal ridere.

2 thoughts on “PAF! – Processing Arduino Firmata

E ora scrivi qualcosa tu!