Skip to main content

Detekcija pokreta

Što prikazuje ovaj primjer​

BMA400 samostalno nadzire pokret. Generički prekid 1 čipa uspoređuje akceleraciju s referentnom vrijednošću i postavlja INT1 kada se bilo koja os pomakne više od praga. Vaša pločica samo reagira na prekid.

Osim I2C spoja (u primjeru GPIO 9 za SCL i GPIO 8 za SDA), spojite INT1 pin pločice na GPIO 5 ili promijenite INT1_PIN na pin koji koristite.

Kod primjera​

# FILE: bma400-motionDetection.py
# AUTHOR: Soldered Electronics
# BRIEF: Uses the BMA400's generic interrupt feature to detect motion via a
# hardware interrupt pin
# WORKS WITH: BMA400 Accelerometer breakout: www.solde.red/333419
# LAST UPDATED: 2026-09-17

from machine import I2C, Pin
from bma400 import (
BMA400,
BMA400_OK,
BMA400_AXIS_XYZ_EN,
BMA400_DATA_SRC_ACCEL_FILT_2,
BMA400_ACTIVITY_INT,
BMA400_ANY_AXES_INT,
BMA400_UPDATE_EVERY_TIME,
BMA400_HYST_96_MG,
BMA400_INT_CHANNEL_1,
BMA400_INT_PUSH_PULL_ACTIVE_1,
BMA400_GEN1_INT_EN,
BMA400_ASSERTED_GEN1_INT,
)

# Hardware setup: connect the breakout board's INT1 pin to INT1_PIN below
INT1_PIN = 5

mems_event = False


def int1_callback(pin):
global mems_event
mems_event = True


# Change these to match how your board wires I2C
i2c = I2C(0, scl=Pin(9), sda=Pin(8))
sensor = BMA400(i2c)

if sensor.status != BMA400_OK:
raise Exception("Failed to initialize BMA400: " + sensor.status_string())

# Configure the generic interrupt feature. It triggers an interrupt when the
# measured acceleration exceeds a reference acceleration
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,
"int_thres_ref_y": 0,
"int_thres_ref_z": 512, # 1g at 4g range
"int_chan": BMA400_INT_CHANNEL_1, # Route interrupt to INT1 pin
}
sensor.set_generic1_interrupt(config)

# Configure INT1 pin to push/pull mode, active high
sensor.set_interrupt_pin_mode(BMA400_INT_CHANNEL_1, BMA400_INT_PUSH_PULL_ACTIVE_1)

# Enable the generic 1 interrupt condition
sensor.enable_interrupt(BMA400_GEN1_INT_EN, True)

int1 = Pin(INT1_PIN, Pin.IN)
int1.irq(trigger=Pin.IRQ_RISING, handler=int1_callback)

print("Waiting for motion...")

while True:
if mems_event:
mems_event = False
status = sensor.get_interrupt_status()
if status is not None and (status & BMA400_ASSERTED_GEN1_INT):
print("Motion detected!")

🔗Otvorite cijeli primjer

bma400-motionDetection.py u commitu 484a5be

→

Ovaj primjer koristi i machine.I2C (MicroPython referenca) te machine.Pin s metodom irq() (MicroPython referenca), koji dolaze s MicroPython firmverom i nisu dio modula bma400.

Očekivani rezultat:

ShellMicroPython
Waiting for motion...
Motion detected!

Waiting for motion... pojavljuje se nakon što je prekid postavljen. Motion detected! pojavljuje se svaki put kada BMA400 signalizira pokret na INT1.

Korištene funkcije​

BMA400(i2c=None, address=BMA400_I2C_ADDRESS_SDO_LOW)returns BMA400

Konstruktor. Izvodi softverski reset senzora, provjerava ID čipa (0x90) i postavlja ga u normalni način rada. Baca iznimku kada senzor ne odgovara ili odgovara neki drugi čip.

ReturnsObjekt senzora.

Parametri

TipNazivOpis
I2Ci2cInicijalizirani objekt machine.I2C. Izborno samo na firmveru koji se prijavljuje kao esp32, esp8266 ili jedan stariji firmver Soldered pločice.
intaddressI2C adresa. BMA400_I2C_ADDRESS_SDO_LOW (0x14, zadano) ili BMA400_I2C_ADDRESS_SDO_HIGH (0x15).
status_string()returns str

Opisuje trenutni kod sensor.status, na primjer Communication failure ili Sensor not found.

ReturnsOpis ili prazan niz kada je status BMA400_OK.

set_generic1_interrupt(config)returns None

Zapisuje konfiguraciju generičkog prekida 1 senzora BMA400. Rezultat se sprema u sensor.status.

ReturnsNišta; provjerite sensor.status.

Parametri

TipNazivOpis
dictconfigKljučevi 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 i int_chan.
set_interrupt_pin_mode(channel, mode)returns None

Postavlja pin prekida kao push-pull ili open drain, aktivan u visokom ili niskom stanju. Rezultat se sprema u sensor.status.

ReturnsNišta; provjerite sensor.status.

Parametri

TipNazivOpis
intchannelBMA400_INT_CHANNEL_1 ili BMA400_INT_CHANNEL_2.
intmodeBMA400_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.
enable_interrupt(int_type, enable)returns None

Uključuje ili isključuje jedan uvjet prekida. Rezultat se sprema u sensor.status.

ReturnsNišta; provjerite sensor.status.

Parametri

TipNazivOpis
intint_typeJedna od konstanti BMA400_*_INT_EN, ovdje BMA400_GEN1_INT_EN.
boolenableTrue za uključivanje, False za isključivanje.
get_interrupt_status()returns int or None

Čita koji su uvjeti prekida aktivni. Rezultat provjerite pomoću zastavica poput BMA400_ASSERTED_GEN1_INT.

ReturnsBitmaska zastavica BMA400_ASSERTED_* ili None u slučaju pogreške sabirnice.

Sastavljanje cjeline​

Kada su gen_int_thres i gen_int_dur oba postavljeni na 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 postavljen na BMA400_UPDATE_EVERY_TIME omogućuje čipu da samostalno ažurira referencu, a referenca Z od 512 iznosi 1 g u rasponu od ±4 g. INT1 je push-pull, aktivan u visokom stanju, pa se prekid na pinu okida na Pin.IRQ_RISING.

Povratni poziv samo postavlja mems_event. Glavna petlja zatim preko I2C-a čita status i ispisuje Motion detected! kada je postavljena zastavica generičkog prekida 1.