Nano 33 BLE Senseをデータ入力に使う<BLE>⑩9軸慣性センサ<BLEセントラル>

 9軸慣性センサ LSM9DS1のBLEペリフェラルを受けるために、BLEのセントラルをmatlabで記述します。

準備

 LSM9DS1が接続するBLEペリフェラルは、前回と同じaddress(88A2EDC9F60C)を使って接続に行きます。

clear
scan = blelist("Timeout", 30)
Nano33BLE_address="88A2EDC9F60C"; % scanで見つかったアドレスを代入
b = ble(Nano33BLE_address);

プログラム

 前回、3種類のペリフェラルのスケッチを作りました。

  • 9軸のデータをそれぞれ実数で送る(UUIDは9個)
  • 9軸のうち二つを組み合わせて文字列で送る(UUIDは5個)
  • 9軸のデータのaccelerationのxyz、gyroscopeのxyz、magneticFieldのxyzを組み合わせて文字列で送る(UUIDは3個)

 最初は、実数でデータが送られてきます。hex2numS()ファンクションで、IEEE754のフォーマットで送られてくるデータを実数に戻します。


clear
scan = blelist("Timeout", 20);
Nano33BLE_address="88A2EDC9F60C";  % scanで見つかったアドレスを代入
b = ble(Nano33BLE_address);

% LSM9DS1

ServiceUUID    = "F000AC00-0451-4000-B000-000000000000";
LSM9DS1_AccelerationX_Characteristic_UUID  =  "F000AC01-0451-4000-B000-000000000000";
LSM9DS1_AccelerationY_Characteristic_UUID  =  "F000AC02-0451-4000-B000-000000000000";
LSM9DS1_AccelerationZ_Characteristic_UUID  =  "F000AC03-0451-4000-B000-000000000000";
LSM9DS1_GyroscopeX_Characteristic_UUID     =  "F000AC04-0451-4000-B000-000000000000";
LSM9DS1_GyroscopeY_Characteristic_UUID     =  "F000AC05-0451-4000-B000-000000000000";
LSM9DS1_GyroscopeZ_Characteristic_UUID     =  "F000AC06-0451-4000-B000-000000000000";
LSM9DS1_MagneticFieldX_Characteristic_UUID =  "F000AC07-0451-4000-B000-000000000000";
LSM9DS1_MagneticFieldY_Characteristic_UUID =  "F000AC08-0451-4000-B000-000000000000";
LSM9DS1_MagneticFieldZ_Characteristic_UUID =  "F000AC09-0451-4000-B000-000000000000";

g11 = characteristic(b, ServiceUUID, LSM9DS1_AccelerationX_Characteristic_UUID); % 配列
subscribe(g11);  % Notify
g12 = characteristic(b, ServiceUUID, LSM9DS1_AccelerationY_Characteristic_UUID);
subscribe(g12);
g13 = characteristic(b, ServiceUUID, LSM9DS1_AccelerationZ_Characteristic_UUID);
subscribe(g13);
g14 = characteristic(b, ServiceUUID, LSM9DS1_GyroscopeX_Characteristic_UUID);
subscribe(g14);
g15 = characteristic(b, ServiceUUID, LSM9DS1_GyroscopeY_Characteristic_UUID);
subscribe(g15);
g16 = characteristic(b, ServiceUUID, LSM9DS1_GyroscopeZ_Characteristic_UUID);
subscribe(g16);
g17 = characteristic(b, ServiceUUID, LSM9DS1_MagneticFieldX_Characteristic_UUID);
subscribe(g17);
g18 = characteristic(b, ServiceUUID, LSM9DS1_MagneticFieldY_Characteristic_UUID);
subscribe(g18);
g19 = characteristic(b, ServiceUUID, LSM9DS1_MagneticFieldZ_Characteristic_UUID);
subscribe(g19);

%pause(30);

for i=1:5
    accelerationX = hex2numS(flip(read(g11))); % little endian->big endian
    accelerationY = hex2numS(flip(read(g12)));
    accelerationZ = hex2numS(flip(read(g13)));
    fprintf('\n Acceleration(Hz) is %.2f %.2f %.2f ', accelerationX,accelerationY,accelerationZ);
    pause(10);
    gyroscopeX = hex2numS(flip(read(g14))); % little endian->big endian
    gyroscopeY = hex2numS(flip(read(g15)));
    gyroscopeZ = hex2numS(flip(read(g16)));
    fprintf('\n Gyroscope(Hz) is %.2f %.2f %.2f ', gyroscopeX,gyroscopeY,gyroscopeZ);
    pause(10);
    magneticFieldX = hex2numS(flip(read(g17))); % little endian->big endian
    magneticFieldY = hex2numS(flip(read(g18)));
    magneticFieldZ = hex2numS(flip(read(g19)));
    fprintf('\n Magnetic Field(uT) is %.2f %.2f %.2f ', magneticFieldX,magneticFieldY,magneticFieldZ);
    disp("-");
    pause(10)
end

unsubscribe(g11);
unsubscribe(g12);
unsubscribe(g13);
unsubscribe(g14);
unsubscribe(g15);
unsubscribe(g16);
unsubscribe(g17);
unsubscribe(g18);
unsubscribe(g19);
clear b


function  shortF = hex2numS(decimal4)  % IEE754の単精度浮動小数点数の形式:binary32
    dataBig = strcat(num2str(dec2bin( decimal4(1),8)),num2str(dec2bin( decimal4(2),8)) ...
                  ,num2str(dec2bin( decimal4(3),8)),num2str(dec2bin( decimal4(1),8)));
    sign = (-1)^str2num(dataBig(1));        % 符号
    exponentBit = dataBig(2:1:9);
    fractionBit = ("1" + dataBig(10:1:end));
    fraction = bin2dec(fractionBit)/(2^23) ;          % 仮数
    exponent = 2 ^ (bin2dec(exponentBit) -127) ;      % 指数

    shortF = sign * fraction * exponent;
end

 実行結果です。いろいろと時間調整をしてみましたが、2個目のデータの途中でエラーが出ます。

UUIDは3個の文字列で送ってくる

 三つ目のスケッチを動かして、カンマで区切った値を分離します。


clear
scan = blelist("Timeout", 20);
Nano33BLE_address="88A2EDC9F60C";  % scanで見つかったアドレスを代入
b = ble(Nano33BLE_address);

% LSM9DS1

ServiceUUID    = "F000AE00-0451-4000-B000-000000000000";
LSM9DS1_Acceleration_Characteristic_UUID  =  "F000AE01-0451-4000-B000-000000000000";
LSM9DS1_Gyroscope_Characteristic_UUID  =  "F000AE02-0451-4000-B000-000000000000";
LSM9DS1_MagneticField_Characteristic_UUID  =  "F000AE03-0451-4000-B000-000000000000";


g11 = characteristic(b, ServiceUUID, LSM9DS1_Acceleration_Characteristic_UUID); % 配列
subscribe(g11);  % Notify
g12 = characteristic(b, ServiceUUID, LSM9DS1_Gyroscope_Characteristic_UUID);
subscribe(g12);
g13 = characteristic(b, ServiceUUID, LSM9DS1_MagneticField_Characteristic_UUID);
subscribe(g13);

for i=1:10
    AccelerationXYZ = char(read(g11));
    data = split(AccelerationXYZ, ",");
    accelerationX = data{1,:};
    accelerationY = data{2,:};
    accelerationZ = data{3,:};
    fprintf('\n Acceleration(Hz) is %s %s %s ', accelerationX,accelerationY,accelerationZ);

    gyroscopeXYZ = char(read(g12));
    data = split(gyroscopeXYZ, ",");
    gyroscopeX = data{1,:};
    gyroscopeY = data{2,:};
    gyroscopeZ = data{3,:};
    fprintf('\n Gyroscope(Hz) is %s %s %s ', gyroscopeX,gyroscopeY,gyroscopeZ);

    magneticFieldXYZ = char(read(g13));
    data = split(magneticFieldXYZ, ",");
    magneticFieldX = data{1,:};
    magneticFieldY = data{2,:};
    magneticFieldZ = data{3,:};
    fprintf('\n Magnetic Field(uT) is %s %s %s ', magneticFieldX,magneticFieldY,magneticFieldZ);
    disp("-");
    pause(2)
end

unsubscribe(g11);
unsubscribe(g12);
unsubscribe(g13);
clear b


function  shortF = hex2numS(decimal4)  % IEE754の単精度浮動小数点数の形式:binary32
    dataBig = strcat(num2str(dec2bin( decimal4(1),8)),num2str(dec2bin( decimal4(2),8)) ...
                  ,num2str(dec2bin( decimal4(3),8)),num2str(dec2bin( decimal4(1),8)));
    sign = (-1)^str2num(dataBig(1));        % 符号
    exponentBit = dataBig(2:1:9);
    fractionBit = ("1" + dataBig(10:1:end));
    fraction = bin2dec(fractionBit)/(2^23) ;          % 仮数
    exponent = 2 ^ (bin2dec(exponentBit) -127) ;      % 指数

    shortF = sign * fraction * exponent;
end

 実行結果です。10回連続してデータを受け取っていますが、問題は生じませんでした。

前へ

Nano 33 BLE Senseをデータ入力に使う<BLE>⑨9軸慣性センサ<BLEペリフェラル>

次へ

Nano 33 BLE Senseをデータ入力に使う<BLE>⑪外部I2C温度センサTMP107<BLEペリフェラル>