L’accéléromètre (LSM6DSL) du BerryIMUv3 intègre une détection de double tapotement, ce qui facilite la détection de double tapotement sans avoir besoin de code sophistiqué.
Lorsque le LSM6DSL détecte un double tapotement, il peut déclencher une broche d’interruption sur le BerryIMUv3. Nous utiliserons un Raspberry Pi pour surveiller la broche d’interruption et allumer et éteindre une LED lorsqu’un double appui est détecté.
La reconnaissance d’événement Double-Tap a des registres spéciaux qui contrôlent la fonctionnalité de reconnaissance de tap, ce sont le seuil de tap et les fenêtres de temps de choc, de silence et de durée
Le Raspberry Pi configurera le BerryIMUv3 pour la reconnaissance par double appui. Il surveillera également les doubles pressions, qui seront utilisées pour allumer et éteindre une LED.
INT1 Sur le BerryIMUv3 s’élèvera lorsqu’un double tapotement est détecté.
GPIO18 (broche physique 12) sur le Raspberry Pi sera utilisé pour surveiller INT1 , en utilisant une interruption.
GPIO20 (broche physique 28) sera utilisée pour piloter la LED.
La résistance ci-dessous est de 330 Ohms
Voici les schémas de branchement
import signal from LSM6DSL import * import sys import RPi.GPIO as GPIO import smbus bus = smbus.SMBus(1) LED_ON = 0 #Used to track of the current state of the LED INTERRUPT_PIN = 12 #The interrupt pin which will be connected to the IMU LED_PIN = 38 #The pin which will be driving the LED #Used to clean up when Ctrl-c is pressed def signal_handler(sig, frame): GPIO.cleanup() sys.exit(0) #Used to write to the IMU def writeByte(device_address,register,value): bus.write_byte_data(device_address, register, value) def LEDnotification(channel): global LED_ON if LED_ON: GPIO.output(LED_PIN,0) LED_ON = 0 else: GPIO.output(LED_PIN,1) LED_ON = 1 writeByte(LSM6DSL_ADDRESS,LSM6DSL_CTRL1_XL,0b01100000) #ODR_XL = 416 Hz, FS_XL = +/- 2 g writeByte(LSM6DSL_ADDRESS,LSM6DSL_TAP_CFG,0b10001110) #Enable interrupts and tap detection on X, Y, Z-axis writeByte(LSM6DSL_ADDRESS,LSM6DSL_TAP_THS_6D,0b10001100) #Set tap threshold writeByte(LSM6DSL_ADDRESS,LSM6DSL_INT_DUR2,0b01111111) #Set Duration, Quiet and Shock time windows writeByte(LSM6DSL_ADDRESS,LSM6DSL_WAKE_UP_THS,0b10000000) #Double-tap enabled writeByte(LSM6DSL_ADDRESS,LSM6DSL_MD1_CFG,0b00001000) #Double-tap interrupt driven to INT1 pin GPIO.setmode(GPIO.BOARD) # Use physical pin numbering GPIO.setup(INTERRUPT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output(LED_PIN, 0) GPIO.add_event_detect(INTERRUPT_PIN, GPIO.RISING, callback=LEDnotification, bouncetime=300) while True: signal.signal(signal.SIGINT, signal_handler) signal.pause()
Nous couvrirons le code spécifique qui se rapporte à la reconnaissance par double appui.
Ligne 37 , LSM6DSL_TAP_CFG est utilisé pour activer la reconnaissance de prise sur les directions X, Y, Z. Il est également utilisé pour activer la fonction d’interruption pour la reconnaissance par double appui.
Ligne 38 , LSM6DSL_TAP_THS_6D est utilisé pour définir les seuils de prise. une valeur inférieure entraînera la détection de pressions plus douces.
Ligne 39 , LSM6DS_INT_DUR2 est utilisé pour définir la durée, la fenêtre de temps de silence et de choc. Une durée plus longue entraînera un temps plus long entre le 1er et le 2ème appui.
Ligne 40, LSM6DSL_WAKE_UP_THS. Réglez le bit le plus à gauche pour activer la reconnaissance par double appui.
Ligne 41, LSM6DSL_MD1_CFG est utilisé pour définir quelle broche d’interruption sur le BerryIMUv3 est utilisée. Dans ce cas, il est défini sur INT1.