Comunicazione Arduino - LightBlue via BLE

Buongiorno a tutti,
Questo è il primo post che pubblico e, pertanto, spero di averlo fatto nel modo e nella sezione corretta. Mi scuso in anticipo se così non fosse.
Da qualche tempo sto riscontrando un problema nell'inviare i valori misurati dall'IMU della mia scheda (Nano 33 IOT) ad una applicazione (LIghtBlue).
Facendo andare il codice, sull'applicazione appare solo uno dei tre valori di interesse, nonostante tramite la funzione "IMUValues.writeValue(values[i])" io abbia passato un array contente tutti.
Nel caso fosse necessario, linkerò il codice da me scritto.
Grazie in anticipo a tutti coloro che se ne interesseranno

Buon pomeriggio e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farla al più presto. :wink:

Beh ... senza è difficile tirare ad indovinare ... :roll_eyes:

Il codice va messo nel post racchiuso nei tag CODE. In pratica, dopo esserti assicurato di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE), selezioni la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come tale. Grazie.

Guglielmo

#include "SensorFusion.h"
#include <ArduinoBLE.h>
#include <Arduino_LSM6DS3.h>
SF fusion;

BLEService IMUService("FFE0");
BLEFloatCharacteristic IMUValues("FFE1", BLERead | BLENotify);
float gx, gy, gz, ax, ay, az, mx, my, mz;
float pitch, roll, yaw;
float deltat;
double values[3] = {};
int previousMillis = 0;
int oldIMUvalue1, oldIMUvalue2, oldIMUvalue3 = 0;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  //while (!Serial) ; // wait for serial port to connect. Needed for native USB port only
  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
    while (1);
  }
  if (!BLE.begin()) {
    Serial.println("BLE failed to Initiate");
    while (1);
  }
  BLE.setLocalName("ArduinoIMU");
  BLE.setAdvertisedService(IMUService);
  IMUService.addCharacteristic(IMUValues);
  BLE.addService(IMUService);
  BLE.advertise();
  Serial.println("Bluetooth device active, waiting for connections...");
  //Serial.print("Accelerometer sample rate = ");
  //Serial.print(IMU.accelerationSampleRate());
  //Serial.println(" Hz");
  //Serial.println();
  //Serial.println("Acceleration in G's");
  //Serial.println("X\tY\tZ");
}

void loop() {
  BLEDevice central = BLE.central();
  if (central) {
    Serial.print("Connected to central: ");
    Serial.println(central.address());
    digitalWrite(LED_BUILTIN, HIGH);
    while (central.connected()) {
      long currentMillis = millis();
      if ( currentMillis - previousMillis >= 200 )
      {
        previousMillis = currentMillis;
        updateIMUValue();
      }
    }
  }
  digitalWrite(LED_BUILTIN, LOW);
  Serial.print( "Disconnected from central: " );
  Serial.println( central.address() );
}
void updateIMUValue() {
  if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable()) {
    IMU.readAcceleration(ax, ay, az);
    IMU.readGyroscope(gx, gy, gz);
    deltat = fusion.deltatUpdate();
    fusion.MahonyUpdate(gx * DEG_TO_RAD, gy * DEG_TO_RAD, gz * DEG_TO_RAD, ax, ay, az, deltat);
    pitch = fusion.getPitch();
    roll = fusion.getRoll();    //you could also use getRollRadians() ecc
    yaw = fusion.getYaw();
    //Serial.print(yaw);
    //Serial.print("/");
    //Serial.print(pitch);
    //Serial.print("/");
    //Serial.println(roll);
    double yaw_d = (double)yaw;
    double pitch_d = (double)pitch;
    double roll_d = (double)roll;
    Serial.print(yaw_d);
    Serial.print("/");
    Serial.print(pitch_d);
    Serial.print("/");
    Serial.println(roll_d);
    values[1] = yaw_d;
    values[2] = pitch_d;
    values[3] = roll_d;
    if ( yaw != oldIMUvalue1 && pitch != oldIMUvalue2 && roll != oldIMUvalue3) {
      for (int i = 0; i < 3; i++) {
        IMUValues.writeValue(values[i]);
        oldIMUvalue1 = yaw_d;
        oldIMUvalue2 = pitch_d;
        oldIMUvalue3 = roll_d;
      }
    }
  }
}

Ecco, questo è il mio codice. Qui sotto allego ciò che visualizzo una volta collegato LightBlue ad Arduino:

Il mio intento, invece, sarebbe quello di ricevere una cosa simile:

Grazie mille in anticipo a tutti coloro che si interesseranno!

Domanda forse stupida... Hai provato a convertire quei numeri binari per vedere a cosa corrispondono?

Cerco di risponderti spiegandoti quale dovrebbe essere il fine di questo progetto.
L'obbiettivo è quello di far compiere ad un oggetto creato su Unity, gli stessi movimenti che la scheda Arduino svolge nel mondo reale. Tutto questo, sfruttando il BLE della Nano 33.
Facendo partire il codice scritto su Unity, l'output che ricevo è il seguente:

Pertanto, ho pensato che, indipendentemente dal formato in cui io spedisco i dati, questi vengano letti correttamente. Tuttavia "Byte Length" restituisce 8, quando invece, essendo 3 i valori (yaw, pitch e roll), dovrebbe essere 12.
E' come se non ricevesse uno dei 3 ma, riguardando il codice Arduino, non capisco proprio dove sia l'intoppo.

Concordo che per il software dovrebbe essere indifferente il formato e contare solo il contenuto.
Però se convertendo quei valori trovi delle corrispondenze magari ti aiuta a capire cosa va storto.
Le mie sono solo ipotesi, visto che non ho mai usato nè il nano 33, nè il ble e nemmeno quella app...

Aspetta... L'indice degli array parte da 0 (come hai fatto giustamente nel for) e non da 1 (come hai fatto invece nell'assegnazione prima del for).

Innanzitutto, grazie mille. Essendo super incartato, qualsiasi ipotesi è sicuramente ben accetta. Proverò a cercare qualche corrispondenza tra la conversione dei valori e l'effettivo contenuto, mentre, per quanto riguarda l'indice degli array, hai ragionissima. Me ne sono accorto in un secondo momento, ero sicuro fosse quello l'errore ma niente da fare, è rimasto tutto invariato purtroppo.