Visualizzazione post con etichetta Bluetooth 4.0 (BLE). Mostra tutti i post
Visualizzazione post con etichetta Bluetooth 4.0 (BLE). Mostra tutti i post

domenica 23 marzo 2014

Trasmissione dati di sensori via Bluetooth 4.0 - parte 3 : ricezione dati su iPhone

Per la ricezione dei dati ho utilizzato una app gratuita chiamata BLE Utility.
L'applicazione effettua una scansione del dispositivi BLE raggiungibili, permettendo di mostrare il dettaglio dei servizi implementati e relativi dati trasmessi.




Il valore ricevuto è in formato ascii (2055 nella screenshot) e ha una risoluzione a 12bit implementata tramite una tecnica di oversampling sulla porta A0 di Arduino (10bit nativi).

Per una implementazione custom, sono disponibili sul sito redBear una library dedicata.








Trasmissione dati di sensori via Bluetooth 4.0 - parte 2 : il codice

Per leggere e trasmettere i dati letti sulla porta A0 sono sufficienti davvero poche righe di codice.

La scrittura dei dati via BLE è fatta in modo seriale, semplificando tutte le operazioni di lettura e scrittura.


Per migliorare la trasmissione dei dati  il codice implementa:
- una lettura in oversampling, per migliorare la precisione della porta A0 da 10 a 12 bit 
- un "trigger" sul dato letto, per trasmettere effettivamente il valore letto solo quando questo differisce dal precedente.
Il valore letto viene inviato via BLE in formato stringa, seguito da un "line feed" (0x0A).


#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega328P__) 
  AltSoftSerial BLEMini; 
#else
  #define BLEMini Serial1
#endif

void setup()
{
    BLEMini.begin(57600);
    Serial.begin(57600);
}

int value=0;
int previousValue=0;
bool first=HIGH;
String valueStr="";

void loop()

{
   readValue(2); //0=(10 bit),1 (11 bit),2 (12 bit)
   valueStr=String(value);
   if (value!=previousValue || first==HIGH)
   {
     for (int i = 0; i < valueStr.length(); i++)
     {
         BLEMini.write(valueStr[i]);
     }
     BLEMini.write(0x0A);
     Serial.println(value);
   }
   previousValue=value;
   first=LOW;
   delay(10);
}

void readValue(int incr)  //0=(10 bit),1 (11 bit),2 (12 bit)
{
      value=0;
      for (k=0; k<oversampling; k++)
      {
        t0=micros();
        value = analogRead(A0)+value ;
        delayMicroseconds(30);
      }
      value= int(value/pow(2,4- incr)) ;
}

Nel prossimo post: come leggere su iPhone i dati trasmessi

Trasmissione dati di sensori via Bluetooth 4.0 - parte 1: il progetto

Si è imposto ormai da parecchio tempo il protocollo Bluetooth 4.0 (BLE: Bluetooth Low Energy), che non è la semplice evoluzione degli standard precedenti, ma rappresenta un nuovo sistema per far comunicare apparecchiature hardware con un consumo estremamente ridotto.
Questo apre scenari davvero interessanti, si pensi ad esempio all'uso dei Beacon per le applicazioni di micro-location e notifica a dispositivi smartphone, con l'impiego di Beacon la cui batteria dura mesi.

Anche i dispositivi iOS recenti (iPhone dal 4S in poi) dispongono di questo tecnologia, che può essere utilizzata con molta facilità.

Il progettino qui descritto è finalizzato all'acquisizione di un segnale da un sensore (nel mio caso un potenziometro) e la trasmissione in tempo reale del dato via Bluetooth, nel mio caso una app per iPhone.

RedBearLab ha a catalogo una piccola shield dal costo ridotto che copre perfettamente tutte le esigenze di trasmissione/ricezione dati BLE con Arduino.
Il prodotto si chiama BLE mini e è costituito da una piccola scheda che all'occorrenza può essere alimentata tramite una batteria tampone che ne garantisce il funzionamento per parecchie settimane.