Peripheral BLE su Finder Opta

Imparare ad utilizzare Finder Opta come Peripheral BLE, creando una Characteristic che permetta ad un Central di cambiare lo stato dei LED del dispositivo.

Guide and Tutorial |

Panoramica

In questo tutorial, mostreremo come configurare Finder Opta per far si che
agisca da Peripheral BLE, a cui un Central si possa connetterre per pilotare i
LED del dispositivo. In particolare, andremo a configurare un Service contente
una Characteristic in lettura e scrittura, da cui un Central possa scrivere o
leggere dei valori esadecimali corrispondenti a diversi stati dei LED.

Obiettivi

  • Imparare a creare un Service ed una Characteristic BLE su Finder Opta.
  • Imparare a leggere i dati scritti dai Central nelle Characteristic di Finder
    Opta.

Requisiti hardware e software

Requisiti hardware

  • PLC Finder Opta (x1).
  • Cavo USB-C® (x1).

Requisiti Software

Finder Opta e il BLE

Grazie alla libreria ArduinoBLE, Finder Opta può comportarsi come Peripheral
BLE e configurare Service con una o più Characteristic in modalità lettura e/o
scrittura. Sempre sfruttando questa libreria, il Finder Opta potrà fare
advertising e attendere la connessione di un Central con cui scambiare comandi.

Istruzioni

Configurazione dell’Arduino IDE

Per seguire questo tutorial, sarà necessaria l’ultima versione dell’Arduino
IDE
. Se è la prima volta che configuri il
Finder Opta, dai un’occhiata al tutorial Getting Started with
Opta
.

Assicurati di installare l’ultima versione delle librerie
ArduinoBLE
poiché verrà utilizzata per la comunicazione BLE con il Central.

Per ulteriori dettagli su come installare manualmente le librerie, consulta
questo
articolo
.

Panoramica del codice

Lo scopo del seguente esempio è configurare Finder Opta come Peripheral BLE,
andando poi ad esporre una Characteristic in lettura e scrittura dentro cui un
Central possa scrivere per accendere o spegnere i LED del Finder Opta. In
particolare, configureremo un Service con una Characteristic ed avvieremo
l’advertising, attendendo scritture del Central contenenti comandi esadecimali
che pilotino i LED.

Setup dello sketch

Nella parte iniziale dello sketch dichiaramo il Service e la Characteristic BLE
con i relativi UUID. Inoltre, la Characteristic sarà configurata in modalità
read/write:

BLEService ledService("b4bf4c90-a3eb-413f-9698-cfaaa9a428cc");
BLEByteCharacteristic ledCharacteristic("b4bf4c91-a3eb-413f-9698-cfaaa9a428cc", BLERead | BLEWrite);

Nella funzione di setup() andremo a configurare il nome del device usato
durante l’advertising, ed in seguito ad abbinare Service e Characteristic,
settandone anche il valore iniziale; al termine di queste operazioni avvieremo
l’advertising. Il codice della funzione è mostrato di seguito:

void setup()
{
    Serial.begin(9600);

    // Init the BLE service.
    if (BLE.begin() == 0)
    {
        while (1)
        {
        }
    }

    // Set local name and service UUID.
    BLE.setLocalName("Finder Opta");
    BLE.setAdvertisedService(ledService);

    // Add service and characeristic.
    ledService.addCharacteristic(ledCharacteristic);
    BLE.addService(ledService);

    // Set initial value.
    ledCharacteristic.writeValue(0x00);

    // Start advertising.
    BLE.advertise();
}

Loop principale

La funzione loop() di questo sketch rimane in ascolto in attesa di
connessioni da parte di Central, fino a quando non se ne connette uno: in caso
di connessione il Finder Opta controllerà se la ledCharacteristic sia stata
scritta o meno, ed in caso affermativo leggerà il valore per pilotare i LED dal
numero 0 al numero 3. Il condice del loop principale è riportato di seguito:

void loop()
{
    // Check if any central is available.
    BLEDevice central = BLE.central();
    if (central)
    {
        Serial.println("Central connected.");
        while (central.connected())
        {
            // If central wrote to characeristic.
            if (ledCharacteristic.written())
            {
                uint8_t state = ledCharacteristic.value();
                digitalWrite(LED_D0, state & 0x01);
                digitalWrite(LED_D1, (state & 0x02) >> 1);
                digitalWrite(LED_D2, (state & 0x04) >> 2);
                digitalWrite(LED_D3, (state & 0x08) >> 3);
            }
        }
        Serial.println("Central disconnected.");
    }
}

Si noti che lo stato del LED n-esimo dipenderà dal valore del bit n-esimo nel
comando scritto dal Central all’interno della ledCharacteristic: se il bit
n vale 1 il LED n verrà acceso, se il bit n vale 0 il LED n verrà
spento. Nei commenti del codice è disponibile una tabella contenente la
mappatura tra codice esadecimale del comando e comportamento dei LED.

Esempio di interazione

Una volta compilato e caricato lo sketch sul Finder Opta, è possibile
utilizzare l’app nRF
Connect

per connettersi alla Peripheral BLE e scrivere un comando nella Characteristic.
Al termine della scansione il Finder Opta comparirà tra i dispositivi
disponibili:

Screenshot di nRF Connect

Procediamo connettendoci e vedremo apparire un Service e una Characteristic con
gli UUID assegnati dallo sketch:

Screenshot di nRF Connect

A questo punto clicchiamo sull’icona con freccia che punta verso l’alto per
effetuare una scrittura. Gli screenshot seguenti mostrano ad esempio come
accendere il LED 0 e il LED 3:

Screenshot di nRF Connect
Screenshot di nRF Connect

Infine questo ultimo screenshot mostra come accendere tutti i LED del Finder
Opta con un singolo comando:

Screenshot di nRF Connect

Conclusioni

Questo tutorial mostra come configurare Finder Opta da Peripheral BLE, per
esporre una Characteristic in cui un Central possa scrivere un comando
esadecimale per pilotare lo stato dei LED del dispositivo.