Detekcija pokreta
Što ovaj primjer prikazuje
BMA400 samostalno prati kretanje. Generički prekid 1 na čipu uspoređuje akceleraciju s referentnom vrijednošću i postavlja INT1 kada se bilo koja os pomakne više od praga. Vaš kontroler samo reagira na prekid.
Osim preko Qwiic konektora ili I2C pinova na headeru, povežite pin INT1 pločice s digitalnim pinom 2 na kontroleru ili u skici promijenite interruptPin na pin koji koristite. Pin mora podržavati prekide.
Primjer koda
/**
**************************************************
*
* @file motionDetection.ino
*
* @brief Example showing how to use the BMA400's generic interrupt
* feature to detect motion via a hardware interrupt pin
*
* @link solde.red/333419 : Soldered BMA400 Accelerometer breakout
*
* @authors SparkFun Electronics, modified by Soldered Electronics
***************************************************/
#include <BMA400-SOLDERED.h>
// Create an instance of the BMA400 sensor
Soldered_BMA400 accelerometer;
// Pin connected to the sensor's INT1 pin, change to match your wiring
int interruptPin = 2;
// Flag to know when an interrupt occurs
volatile bool interruptOccurred = false;
void bma400InterruptHandler()
{
interruptOccurred = true;
}
void setup()
{
// Initialize serial for output
Serial.begin(115200);
Serial.println("BMA400 Example - Motion Detection");
// Initialize I2C bus
Wire.begin();
// Check if sensor is connected and initialize it.
// Address is optional, defaults to 0x14
while (accelerometer.begin() != BMA400_OK)
{
Serial.println("Error: BMA400 not connected, check wiring and I2C address!");
delay(1000);
}
Serial.println("BMA400 connected!");
// Configure the generic interrupt feature. It triggers an interrupt
// when the measured acceleration exceeds a reference acceleration
bma400_gen_int_conf config = {
.gen_int_thres = 5, // 8mg resolution (e.g. 5 = 40mg)
.gen_int_dur = 5, // 10ms resolution (e.g. 5 = 50ms)
.axes_sel = BMA400_AXIS_XYZ_EN, // Evaluate all axes for interrupts
.data_src = BMA400_DATA_SRC_ACCEL_FILT_2, // Datasheet recommends filter 2 (100Hz)
.criterion_sel = BMA400_ACTIVITY_INT, // Trigger when active
.evaluate_axes = BMA400_ANY_AXES_INT, // Trigger if any axis exceeds threshold
.ref_update = BMA400_UPDATE_EVERY_TIME, // Automatically update reference values
.hysteresis = BMA400_HYST_96_MG, // Hysteresis for noise rejection
.int_thres_ref_x = 0, // Raw 12-bit reference value
.int_thres_ref_y = 0, // Raw 12-bit reference value
.int_thres_ref_z = 512, // Raw 12-bit reference value (1g at 4g range)
.int_chan = BMA400_INT_CHANNEL_1 // Route interrupt to INT1 pin
};
accelerometer.setGeneric1Interrupt(&config);
// Configure INT1 pin to push/pull mode, active high
accelerometer.setInterruptPinMode(BMA400_INT_CHANNEL_1, BMA400_INT_PUSH_PULL_ACTIVE_1);
// Enable the generic 1 interrupt condition
accelerometer.enableInterrupt(BMA400_GEN1_INT_EN, true);
// Attach the interrupt handler to the microcontroller pin wired to INT1
attachInterrupt(digitalPinToInterrupt(interruptPin), bma400InterruptHandler, RISING);
}
void loop()
{
if (interruptOccurred)
{
interruptOccurred = false;
// Check which interrupt condition triggered
uint16_t interruptStatus = 0;
accelerometer.getInterruptStatus(&interruptStatus);
if (interruptStatus & BMA400_ASSERTED_GEN1_INT)
{
Serial.println("Motion detected!");
}
}
}
Ovaj primjer koristi i attachInterrupt() i digitalPinToInterrupt()
(Arduino referenca),
koji dolaze s Arduino jezgrom i nisu dio biblioteke Soldered BMA400
Accelerometer.
Očekivani rezultat:
BMA400 Example - Motion Detection
BMA400 connected!
Motion detected!
Prva dva retka pojavljuju se pri pokretanju. Motion detected! pojavljuje se svaki put
kada BMA400 signalizira pokret na INT1.
Korištene funkcije
Soldered_BMA400()returns noneKonstruktor. Stvara objekt senzora; ne komunicira sa senzorom dok ne pozovete begin().
ReturnsKonstruktor; nema povratne vrijednosti.
int8_t begin(uint8_t address = BMA400_I2C_ADDRESS_DEFAULT, TwoWire &wirePort = Wire)returns int8_tPokreće senzor preko I2C-a: softverski resetira BMA400, provjerava ID čipa i postavlja ga u normalan način rada.
ReturnsBMA400_OK (0) u slučaju uspjeha, inače negativan kôd pogreške. Adresa različita od 0x14 ili 0x15 vraća BMA400_E_INVALID_CONFIG.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | address | I2C adresa. BMA400_I2C_ADDRESS_DEFAULT (0x14, zadano) ili BMA400_I2C_ADDRESS_SECONDARY (0x15). |
TwoWire & | wirePort | I2C sabirnica koja se koristi. Zadano je Wire. |
int8_t setGeneric1Interrupt(bma400_gen_int_conf* config)returns int8_tZapisuje konfiguraciju generičkog prekida 1 na BMA400: prag, trajanje, osi, izvor podataka, kriterij okidanja, ažuriranje reference, histerezu, referentne vrijednosti i pin prekida na koji je usmjeren.
Returns0 u slučaju uspjeha, negativna vrijednost u slučaju neuspjeha.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
bma400_gen_int_conf* | config | Pokazivač na konfiguraciju. Primjer popunjava gen_int_thres (koraci od 8 mg), gen_int_dur (koraci od 10 ms), axes_sel, data_src, criterion_sel, evaluate_axes, ref_update, hysteresis, int_thres_ref_x, int_thres_ref_y, int_thres_ref_z (sirove 12-bitne vrijednosti) i int_chan. |
int8_t setInterruptPinMode(bma400_int_chan channel, uint8_t mode)returns int8_tPostavlja pin prekida kao push-pull ili open drain, aktivno visok ili aktivno nizak.
Returns0 u slučaju uspjeha, negativna vrijednost u slučaju neuspjeha.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
bma400_int_chan | channel | Pin koji se konfigurira, na primjer BMA400_INT_CHANNEL_1 za INT1. |
uint8_t | mode | BMA400_INT_PUSH_PULL_ACTIVE_0, BMA400_INT_PUSH_PULL_ACTIVE_1 (zadano), BMA400_INT_OPEN_DRIVE_ACTIVE_0 ili BMA400_INT_OPEN_DRIVE_ACTIVE_1. |
int8_t enableInterrupt(bma400_int_type intType, bool enable)returns int8_tUključuje ili isključuje jedan uvjet prekida.
Returns0 u slučaju uspjeha, negativna vrijednost u slučaju neuspjeha.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
bma400_int_type | intType | Uvjet, na primjer BMA400_GEN1_INT_EN za generički prekid 1. |
bool | enable | true za uključivanje, false za isključivanje. |
int8_t getInterruptStatus(uint16_t* status)returns int8_tČita koji su uvjeti prekida aktivni. Rezultat provjerite u odnosu na zastavice kao što je BMA400_ASSERTED_GEN1_INT.
Returns0 u slučaju uspjeha, negativna vrijednost u slučaju neuspjeha.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
uint16_t* | status | Prima zastavice stanja, kombinaciju vrijednosti BMA400_ASSERTED_*. |
Sve zajedno
S gen_int_thres = 5 i gen_int_dur = 5 prekid se aktivira kada se os
pomakne više od 40 mg od svoje reference u trajanju od 50 ms, prema
komentarima u primjeru. ref_update = BMA400_UPDATE_EVERY_TIME omogućuje čipu da samostalno ažurira
referencu, a Z referenca od 512 iznosi 1 g u rasponu od ±4 g.
INT1 je postavljen na push-pull, aktivno visoko, pa skica svoj rukovatelj postavlja
na RISING brid.
Rukovatelj samo postavlja volatile zastavicu. loop() zatim poziva
getInterruptStatus() preko I2C-a i ispisuje Motion detected! kada je postavljena zastavica
generičkog prekida 1.