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:
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 BMA400Konstruktor. 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
| Tip | Naziv | Opis |
|---|---|---|
I2C | i2c | Inicijalizirani objekt machine.I2C. Izborno samo na firmveru koji se prijavljuje kao esp32, esp8266 ili jedan stariji firmver Soldered pločice. |
int | address | I2C adresa. BMA400_I2C_ADDRESS_SDO_LOW (0x14, zadano) ili BMA400_I2C_ADDRESS_SDO_HIGH (0x15). |
status_string()returns strOpisuje 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 NoneZapisuje konfiguraciju generičkog prekida 1 senzora BMA400. Rezultat se sprema u sensor.status.
ReturnsNišta; provjerite sensor.status.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
dict | config | Ključ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 NonePostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
int | channel | BMA400_INT_CHANNEL_1 ili BMA400_INT_CHANNEL_2. |
int | 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. |
enable_interrupt(int_type, enable)returns NoneUključuje ili isključuje jedan uvjet prekida. Rezultat se sprema u sensor.status.
ReturnsNišta; provjerite sensor.status.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | int_type | Jedna od konstanti BMA400_*_INT_EN, ovdje BMA400_GEN1_INT_EN. |
bool | enable | True 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.