2017 Luglio, 17 Lunedì 16:36


Nel corso del 2017 lo Student Branch IEEE dell'Università di Brescia ha deciso di aiutare i ricercatori dell'ateneo (gruppo ES3) nel testare un loro progetto: ci siamo quindi concentrati sull'utilizzo del framework SAndroidE, che permettere di gestire device diversi tramite Android, sfruttando la connessione Bluetooth.

Referente Progetto: Stefano Prandini

Il mio gruppo, formato da Landi Federico, Mentasti Giulia (e io, Prandini Stefano) ha deciso di testare il funzionamento del framework tramite la rilevazione della variazione di parametri di un circuito.
Per fare ciò ci siamo basati sulla guida fornita dallo stesso gruppo ES3, reperibile al seguente link sul sito di SAndroidE.

Il nostro lavoro si è diviso in due sottoprogetti: la realizzazione di un circuito e la programmazione di un'app Android, per visualizzare sullo smartphone i dati rilevati.

Realizzazione del circuito

Abbiamo deciso di costruire il circuito attorno ad un RedBear BLE Nano, una scheda elettronica dotata di microcontrollore con Bluetooth Low Energy integrato.
Dato che il nostro obiettivo era di rilevare parametri circuitali variabili abbiamo deciso di utilizzare una resistenza variabile (aka Trimmer), in modo da poterne modificare il valore durante l'esecuzione dell'applicazione e riscontrare immediatamente il funzionamento del framework.
Appoggiandoci ad una breadBoard abbiamo collegato il Trimmer al SoC tramite i pin di I/O e il SoC stesso al supporto USB per l'alimentazione tramite i pin di VIN/VDD e GRD.
Il risultato è stato un circuito come quello nell'immagine:


Reso il RedBear in grado di leggere i parametri circuitali ed inviarli tramite Bluetooth non ci è restato che scrivere un'applicazione per poterli ricevere e leggere con uno smartphone.

Scrittura app

Per la creazione dell'applicazione abbiamo utilizzato Android Studio, IDE rilasciato da Google stessa per lo sviluppo di app per la piattaforma Android.
L'intero progetto è reperibile su GitHub al link: https://github.com/STB1019/SAndroidE/tree/master/Project%20SFG
Dopo aver importato la libreria SAndroidE.aar (come spiegato nella guida del link ad inizio articolo) ci siamo concentrati sulla scrittura del codice che ci avrebbe permesso di ricevere le informazioni necessarie dal BLE Nano (via Bluetooth) e di visualizzarle sullo schermo dello smartphone.
Il codice risultante della MainActivity è il seguente:

package it.unibs.ste.smafgsandroide;

import android.os.Bundle;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
import it.unibs.sandroide.lib.BLEContext;
import it.unibs.sandroide.lib.activities.SandroideBaseActivity;
import it.unibs.sandroide.lib.item.generalIO.BLEGeneralIO;
import it.unibs.sandroide.lib.item.generalIO.BLEGeneralIOEvent;
import it.unibs.sandroide.lib.item.generalIO.BLEOnGeneralIOEventListener;

public class MainActivity extends SandroideBaseActivity {

    protected static final String TAG = "MainActivity";

    TextView tvTrimmer;
    TextView tvStatus;

    BLEGeneralIO nanoTrimmer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BLEContext.initBLE(this);

        tvTrimmer =(TextView) findViewById(R.id.tvAnalogValue);
        nanoTrimmer = (BLEGeneralIO) BLEContext.findViewById("nanoSMAFG_rbs_general_io_5");

        if (nanoTrimmer!=null) {
            nanoTrimmer.setOnGeneralIOEventListener(new BLEOnGeneralIOEventListener() {
                @Override
                public void onBoardInitEnded() {
                    nanoTrimmer.setStatus(BLEGeneralIO.GENERAL_IO_AI);
                }

                @Override
                public void onAnalogValueChanged(BLEGeneralIOEvent bleGeneralIOEvent)
                {
                    Log.d(TAG, "analog value changing: " + bleGeneralIOEvent.values[1]);
                    final float val = bleGeneralIOEvent.values[1];
                    final float misurationValue = Math.round(val * 200) / (float) 100;
                    runOnUiThread(new Runnable() {
                                      @Override
                                      public void run() {
                                          tvTrimmer.setText("Valore: " + misurationValue);
                                      }
                                  }
                    );
                    ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar);
                    bar.setProgress((int)(Math.round(val * 100) / (float) 100));
                    bar.setScaleY(3f);

                    tvStatus = (TextView) findViewById(R.id.status);
                }

                @Override
                public void onDigitalInputValueChanged(BLEGeneralIOEvent bleGeneralIOEvent) {
                }

                @Override
                public void onDigitalOutputValueChanged(BLEGeneralIOEvent bleGeneralIOEvent) {
                }

                @Override
                public void onServoValueChanged(BLEGeneralIOEvent bleGeneralIOEvent) {
                }

                @Override
                public void onPWMValueChanged(BLEGeneralIOEvent bleGeneralIOEvent) {
                }

                @Override
                public void onGeneralIOStatusChanged(BLEGeneralIOEvent bleGeneralIOEvent) {
                }

                @Override
                public void onSetGeneralIOParameter(BLEGeneralIOEvent bleGeneralIOEvent) {
                }
            });
        }
    }
}

Una volta creato l'oggetto nanoTrimmer ed associato al pin 5 (pin del BLE Nano al quale avevamo collegato il trimmer) tramite il metodo findViewById, abbiamo usato il metodo onAnalogValueChanged per stampare il valore del trimmer in una TextView ogni volta che questo cambiasse. Abbiamo aggiunto anche una ProgressBar per visualizzare graficamente il valore rilevato.
La realizzazione grafica della nostra applicazione è stata la seguente:

Concluso con successo il nostro progetto abbiamo realizzato quanto sia semplice tramite SAndroidE leggere ed inviare dati da un dispositivo ad un altro tramite bluetooth, dato che una volta importate le librerie nel progetto i metodi da utilizzare risultano essere gli stessi per qualsiasi dispositivo: oltre ad essere facile da implementare risulta dunque anche estremamente versatile. Questo non può che essere un punto di forza, che ha spinto noi studenti a credere (e sperare) che in un futuro questo firmware possa essere molto più conosciuto ed utilizzato, in modo da semplificare notevolmente le comunicazioni wireless.