Stránka 1 z 2

Arduino Nano 33 BLE

Napsal: 06 lis 2021, 12:33
od monis2003
Zdravím,
potřebovala bych poradit. Mám Arduino nano 33 ble a potřebuji na dálku měřit zrychlení. Využívám spojení Bluetooth a mobilní aplikace nRF Connect.
Jenže
1) rozsah akcelerometru je v knihovně LSM9DS1 nastaven na 4g a nevím, jak a kde ho změnit na 16g.

2) Zjistila jsem, že deska se mi v aplikaci zobrazí jako připojená až když zapnu na PC sériový monitor. Já ale budu měřit na dálku, deska bude napájena z jiné baterie (piny VIN a GND) a nevím, jak zařídit, aby se deska dokázala připojit k telefonu bez pomoci PC.

Zde přikládám kód.
Děkuji za pomoc.

Kód: Vybrat vše

#include <Arduino_LSM9DS1.h>
#include <ArduinoBLE.h>

BLEService sensorService("16150f38-e7a9-4fe1-ae08-48464baf25b2");
BLEStringCharacteristic xSensorLevel ("ff99948c-18ff-4ed8-942e-512b9b24b6da", 
    BLERead | BLENotify,15);
BLEStringCharacteristic ySensorLevel ("8084aa6b-6cae-461f-9540-e1a5768de49d", 
    BLERead | BLENotify,15);
BLEStringCharacteristic zSensorLevel ("ab80cb77-fe74-40d8-9757-96f8a54c16d9", 
    BLERead | BLENotify,15);

float oldXLevel = 0;
float oldYLevel = 0;
float oldZLevel = 0;
long previousMillis = 0;

void setup() {
  IMU.begin();
  Serial.begin(115200); 
   
   
  while (!Serial);
  if (!IMU.begin()) {
  Serial.println("Failed to initialize IMU!");
  while (1);}
int setAccelFS(uint8_t = 8);
  pinMode(LED_BUILTIN, OUTPUT);

  if (!BLE.begin()){
    Serial.println("Starting BLE failed");
    while(1);}

   BLE.setLocalName("Akcelerometr");
   BLE.setAdvertisedService(sensorService);

     sensorService.addCharacteristic(xSensorLevel);
     sensorService.addCharacteristic(ySensorLevel);
     sensorService.addCharacteristic(zSensorLevel);
     BLE.addService(sensorService);

     xSensorLevel.writeValue(String(0));
     ySensorLevel.writeValue(String(0));
     zSensorLevel.writeValue(String(0));

     BLE.advertise();
     Serial.println("Bluetooth device active, waiting for connection...");
}

void loop() {

  BLEDevice central = BLE.central();
  if (central){
    Serial.print ("connected to central");
    Serial.println(central.address());
    digitalWrite(LED_BUILTIN, HIGH);

    while(central.connected()) {
      updateAccelerationLevel();
      delay(300);}

      digitalWrite(LED_BUILTIN, LOW);
      Serial.print("Disconnected from central: ");
      Serial.println(central.address());      
    }
  }




  void updateAccelerationLevel() {
    float x, y, z;

    if(IMU.accelerationAvailable ()) {
      IMU.readAcceleration(x, y, z);

      if (x != oldXLevel) {
        xSensorLevel.writeValue(String(x));
        oldXLevel = x;}

      if (x !=oldYLevel) {
        ySensorLevel.writeValue(String(y));
        oldYLevel = y;}

      if (z !=oldZLevel) {
        zSensorLevel.writeValue(String(z));
        oldZLevel = z;}


            Serial.print(x);
            Serial.print(y);
            Serial.println(z);
      }
      }

Re: Arduino Nano 33 BLE

Napsal: 06 lis 2021, 17:28
od peterple
Odpoveď na otázku č.1 neviem.
Odpoveď na otázku č.2
Táto doska má sériový kanál urobený predpokladám cez USB.

Kód: Vybrat vše

while (!Serial);
Takže to potom visí na tomto kóde.
Ale zrušiť len ten jeden riadok asi moc nepomôže. Tam treba kompletne prestať používať Serial v ostrej verzii.

Obyčajný Serial ktorí ide cez UART môže vysielať aj do prázdna. Napr ten test vracia vždy True
Stačí si len prečítať dokumentáciu.
https://www.arduino.cc/reference/en/lan ... /ifserial/

Re: Arduino Nano 33 BLE

Napsal: 06 lis 2021, 18:06
od monis2003
Děkuji, vyřešeno, už to funguje.

Zbývá tedy vyřešit otázku nastavení rozsahu na 16 g.

Re: Arduino Nano 33 BLE

Napsal: 06 lis 2021, 20:49
od AstroMiK
Je to absolutně bez záruky, ale když jsem kouknul do kódu knihovny a do katalogového listu, tak myslím, že by mělo stačit změnit obsah registru CTRL_REG6_XL z původního 0x70 na 0x68.

V příloze je výřez z kódu a z kat. listu.

knihovna.gif

kat_list.gif

Re: Arduino Nano 33 BLE

Napsal: 07 lis 2021, 08:08
od monis2003
Děkuji, jen prosím, jsem začátečník, jak se dostanu k tomu, abych to mohla v té knihovně přepsat?

Re: Arduino Nano 33 BLE

Napsal: 07 lis 2021, 11:32
od kiRRow
Arduino si knihovny ukládá do dokumentů/Arduino/Libraries popř do složky Libraries ve složce, kde je nainstalován.
Doporučuji tu knihovnu neupravovat v těchto složkách ( můžeš si rozhasit jinačí projetky ), ale zkopírovat si ji do složky s projektem a upravit ji až tam. Ve sketchi, pak budeš muset volání knihovny místo ostrých závorek napsat do uvozovek.

Kód: Vybrat vše

#include <ArduinoBLE.h> // tohle načítá z složek Libraries
#include "ArduinoBLE.h" // tohle načítá ze složky se sketchem

Re: Arduino Nano 33 BLE

Napsal: 07 lis 2021, 13:26
od peterple
Myslím si že netreba ani upravovať knižnicu.
stačí po zavolaní funkcie begin zmeniť obsah daného registra pomocou:

Kód: Vybrat vše

 IMU.writeRegister(LSM9DS1_ADDRESS, LSM9DS1_CTRL_REG6_XL, 0x68); // 119 Hz, 16g
Ten kód je preto open source aby si ho hľudia čítali a porozumeli mu.
A preto ho niektorí autori aj pekne komentujú.
https://github.com/arduino-libraries/Ar ... SM9DS1.cpp

Re: Arduino Nano 33 BLE

Napsal: 07 lis 2021, 15:19
od AstroMiK
V objektovém programování se trochu ztrácím, ale ta metoda 'writeRegister' je definovaná jako privátní.
Půjde použít i pro přímé volání?



Jinak jsem pro ten obvod našel ještě jinou knihovnu, která by měla umět nastavovat rozsah zrychlení uživatelsky pomocí:

Kód: Vybrat vše

// setAccelScale() -- Set the full-scale range of the accelerometer.
// This function can be called to set the scale of the accelerometer to
// 2, 4, 6, 8, or 16 g's.
// Input:
// 	- aScl = The desired accelerometer scale. Must be one of five possible
//		values from the accel_scale.
  void setAccelScale(uint8_t aScl);
(ten parametr 6g je tam asi omylem)

https://github.com/sparkfun/SparkFun_LS ... no_Library



Privátní definice metody v původní knihovně:
private.gif

Re: Arduino Nano 33 BLE

Napsal: 07 lis 2021, 15:40
od kiRRow
K privátní metodě může přistupovat pouze samotná instance třídy. Nelze ji volat odkudkoliv.

Re: Arduino Nano 33 BLE

Napsal: 07 lis 2021, 16:54
od monis2003
Děkuji moc za rady, ale asi něco stále dělám špatně.

Nejprve jsem zkusila za příkaz begin vložit to, co jste napsal vy peterple. to nefungovalo, napsalo to chybu.

Poté jsem zkusila váš postup kiRRow, zkopírovala jsem si celou knihovnu Arduino_LSM9DS1 a dostala se až k souboru .cpp, kde jsem změnila 0x70 na 0x68, jenže i přes to je stále nejvyšší naměřená hodnota 4G. Napadlo mě ještě, jestli nedělám chybu někde v tom přepisování. Soubor cpp mi jde otevřít totiž jen v poznámkovém bloku a to mi přijde trochu divné, že jsem to musela upravit tam.