lunedì 24 ottobre 2011

arduino e blueSMirf: connettere arduino via bluetooth


Nel post precedente ho introdotto il primo progetto di questo blog : un cercapersone bluetooth realizzato con arduino blueSMiRF e Ubuntu 10.4. In questo post vedremo come collegare Ubuntu 10.04 ad arduino via bluetooth. Nel prossimo come visualizzare la strinfìga su un display LCD.

Cominciamo, ma prima  è doveroso introdurre un paio di concetti.

Solitamente Aduino viene collegato al pc con un cavo usb con il quale si alimenta la scheda e si comunicano dati.
In realtà Arduino "parla" con il pc attraverso una porta seriale.
Nel caso di boarduino e di altri cloni miniaturizzati si ha la necessità di passare attraverso un adattatore usb2serial come questo al prezzo più che onesto di 10,00 EURO. 
Detto questo a volte risulta utile poter staccarsi dal pc e instaurare una comunicazione wireless.
E' questo il caso del progetto "un cerca persona bluetooth".
Ci sono alcune alternative come (Xbee, Wi-fi shield..) ma tra tutte il bluetooth mi è sembrata quella più economica visto che di fatto il computer con cui scrivo (come ormai quasi tutti i portatili) ha già in dotazione il bluetooth e che quindi i costi si riducono di circa la metà!
Non ho ancora esplorato soluzioni DIY tipo hack di chiavette Bluetooth perchè non ne ho sottomano neanche una da sacrificare per la scienza, motivo  per cui sono andato su robot-italy e ho comprato il modem bluetooth più economico che ho trovato. Rimanderò ad un secondo momento le sperimentazioni in modo da aver già fatto un po' di esperienza.
In effetti non tutti i passaggi sono stati proprio naturali per un novizio come me.

Premesso questo, si stappa una birra e si comincia.

PROBLEMA 1: Alimentare Boarduino con alimentazione esterna.
Il primo problema che si manifesta quando si stacca arduino dal pc è quello di capire come alimentare la scheda.
Non ho usato Arduino per questo progetto ma un suo clone: "Boarduino". Di norma non dovrebbe cambiare molto ma vi ho avvisati : )
In boarduino c'è un jumper che dice alla scheda dove prendere l'alimentazione, se da usb o da fonte esterna, bisogna mettere la selezione su ext
Ho usato una batteria da 9V per l'alimentazione collegando il polo positivo  al pin Vin e il negativo a GND .

PROBLEMA 2: Collegare il modulo BlueSMirf Silver all'arduino
Innanzitutto ho saldato degli stripes sulla scheda del modem bluetooth in modo da poterlo comodamente alloggiare sulla breadboard e in modo da poterlo, al limite, collegare ad un futuro circuito tramite adattatori femmina rendendolo in qualche modo riutilizzabile.
Il modem ha i seguenti pin:

- CTS-I
- VCC
- GND
- TX-0
- RX-I
- RTS-0

In alcuni blog dicono di collegare assieme i pin CTS-I e RTS-0. Se lo consigliano un motivo buono ci sarà, per la cronaca io non l'ho fatto e funziona lo stesso. Mi sono promesso di approfondire la questione i un prossimo futuro.

Vcc è la corente in ingresso che va collegata all'uscita a 5v dell'arduino.
GND va collegata a tutte le altre GND
TX-0 va collegata a RX dell'arduino
RX-I va collegata al TXdell'arduino

Dalla foto non si capisce un granchè ma di meglio non sono riuscito a fare : (


Fatto questo dovrebbe accendersi un led intermittente rosso sul BlueSMiRF. Vuol dire che la scheda è alimentata e (almeno si spera) funzionante.

PROBLEMONE 3: Connettere BlueSMiRF ad ubuntu 10.4
Ho avuto non poche difficoltà a fare il pairing di BlueSMiRF con ubuntu.

La via più semplice.
La via più semplice è forse è questa (inizialmente scartata perchè sconsigliata da un post sul sito di arduino per ubuntu 9.x ma funzionante in ubuntu 10.4):
- Scaricate dai repositori di ubuntu "blueman"
- Lanciatelo
- cliccate sul pulsante "cerca"
- dovrebbe comparire la scheda (Nel mio caso si chiama RN42-92F2)
- cliccate sul pulsantino con le chiavi
- si dovrebbe aprire un dialog in cui inserite la stringa "1234"
- se si connette cliccate con il tasto destro sopra il nome della scheda e scegliete dal menu contestuale SPP
- Se tutto va bene dovrebbe comparire un alert in cui dice che la connessione seriale è stata inizializzata e dovrebbe dirvi come si chiama.  Nella stragrande maggioranza dei casi è /dev/rfcomm0 . Si accende un led fisso verde e abbiamo quasi fatto.

Se siete dei maniaci della shell o per qualche motivo blueman vi tradisce (c'è chi dice si impossessi della vostra anima...) provate così:
- Aprite un terminale
- lanciate
hcitool scan
- dovrebe riportarvi una lista delle periferiche disponibili con relativo indirizzo
- aprite con un editor di teso (gedit, vi, pico, nano..) il seguente file  /etc/bluetooth/rfcomm.conf
es
sudo  nano /etc/bluetooth/rfcomm.conf
- decommentate un po' quello che trovate come esempio in modo che assomigli a qualcosa del genere
 -------------
rfcomm0 {
#       # Automatically bind the device at startup
        bind no;
#
#       # Bluetooth address of the device
        device [indirizzo che avete trovato prima]
#
#       # RFCOMM channel for the connection
        channel 1;
#
#       # Description of the connection
        comment "Arduino BT";
}
--------------------------
NB abbiate l'accortezza di modificare [indirizzo che avete trovato prima] con l'indirizzo che avete trovato prima.... senza le parentesi quadre ; )

- Salvate
- lanciate
sudo rfcomm connect rfcomm0


PROBLEMA 4: Scrivere e leggere dalla seriale.
In teoria adesso dovreste avere la connessione funzionante e dovreste essere in grado di scrivere e leggere sulla seriale.
Per testare che tutto funzioni scrivete uno schetch di test semplicissimo tipo :

void setup() {
  Serial.begin(115200);  //IMPORTANTISSIMO!!!!
  pinMode(13,OUTPUT);  
}

void loop() {
  if (Serial.available()>0)
  {
    char seriale=Serial.read();
    digitalWrite(13,HIGH);
    Serial.println(seriale);
    }
    else
    {
    digitalWrite(13,LOW);
   }   
  }
  
NB: Scollegate momentaneamente i cavi rx e tx dal bluetooth all'arduino e fate l'upload dello sketch con l'USB.
Poi scollegate il cavo usb.
In pratica Arduino sta in ascolto sulla seriale collegata via bluetooth. Se ci sono dati si accende il led integrato e li rimanda indietro sulla seriale "come gli arrivano" in modo che possiate leggerli.
Non sono riuscito ad usare il serial monitor dell'IDE con questa porta. Per cui ho optato per la old fashioned way...

quindi scrivete sul terminale un bel
sudo echo 'ciao' >/dev/rfcomm0
e subito dopo
cat /dev/rfcomm0
che se tutto va bene mi ritorna

c
i
a
o

con un bel blink del led integrato.

Mi raccomando assicuratevi che la boundrate sia a 115200. Ho provato per ore a capire come mai non mi tornassero i dati indietro e questo era il motivo.

Nei prossimi post faremo rispondere ad arduino con una stringa invece che singoli caratteri e poi coroneremo il tutto facendo visualizzare il messaggio su uno schermo lcd C216L01YBW00 o compatibili.










5 commenti:

  1. ottimo post!!!
    sl che a me una volta fatto il paring quando tento di fare echo sulla porta rfcomm0 o di aprirla con il terminale perla porta seriale mi dice permesso negato ho anche provato a fare chmod 666 su /dev/rfcomm0 ma niente qualche suggeriemento?

    RispondiElimina
  2. Ciao per aiutarti ho bisogno di un paio di informazioni:
    - se fai ls /dev/ esiste il file rfcomm0?
    - hai provato con sudo (se sei in debian o derivati) o con l'utente root?

    RispondiElimina
  3. Ciao, scusa sono un somaro. Mi spieghi cosa intendi per scrivere uno schetch? Faccio un file? Come lo nomino e dove lo metto? E come lo richiamo?
    Grazie

    RispondiElimina
  4. Ciao ,"sketch" è il termine con cui nelmondo Arduino si identificano i programmi che girano sul microcontrollore dell'Arduino.
    Quindi va caricato dentro l'Arduino previa compilazione.
    Per farlo il modo più semplice è utilizzare l'IDE di arduino che in un colpo solo compila ed esegue l'upload. Per come fare ti rimando dunque alla documentazione e agli howto del sito http://arduino.cc .
    Ciao

    RispondiElimina
  5. Ciao, ti ringrazio tantissimo!
    Ero bloccato da una vita sullo sketch, quello vecchio dava come stampa nel monitor seriale sempre e solo un'unica lettera.
    Con questo tuo post sono finalmente riuscito a far comunicare il mio tablet con l'Arduino, grazie mille!!!

    RispondiElimina