SIK Experiment Guide for the Arduino 101/Genuino 101 Board (Spanish)
This Tutorial is Retired!
This tutorial covers concepts or technologies that are no longer current. It's still here for you to read and enjoy, but may not be as useful as our newest tutorials.
Experimento 19: Detección de pulsación
Introducción
Uno de los puntos fuertes de la placa 101 es que cuenta con tecnología muy avanzada para el reconocimiento de movimientos y gestos. Todo esto es posible a través de la unidad de medición de inercia (IMU) en la placa 101. La IMU mide los datos del acelerómetro (fuerza gravitatoria) y del giroscopio (rotación). Hemos estado probando el acelerómetro en el experimento 18. Vamos a profundizar un poco más y a aprovechar el módulo de Curie, que puede interpretar los datos para determinar si está dando un paso y contarlos, detectar si está pulsando la placa e incluso su orientación en el espacio.
Como ejemplo del uso de la combinación de la IMU y el módulo de Curie, crearemos un simple circuito RGB que parpadeará en verde dos veces si pulsa dos veces la parte superior de la placa 101 y parpadeará en rojo dos veces si pulsa dos veces la parte inferior de la placa 101.
Elementos necesarios
Necesitará los siguientes elementos:
- 1x placa de pruebas
- 1x placa Arduino 101 o Genuino 101
- 1x LED RGB de cátodo común
- 3x resistencia de 100 Ω
- 6x cables puente
¿No tiene el SIK?
Si está realizando este experimento y no dispone del SIK, le sugerimos que use estos elementos:
También necesitará una placa Arduino 101 O Genuino 101.
Lectura sugerida
Antes de continuar con este experimento, le recomendamos que se familiarice con los conceptos descritos en los siguientes tutoriales:
Presentación de la unidad de medición inercial
Una unidad de medición inercial (IMU) es una combinación de sensores que se utiliza para determinar la orientación de los sensores en el espacio tridimensional. La placa 101 utiliza un acelerómetro y un giroscopio para detectar la orientación física (para ello, mide la gravedad sobre el sensor) y un giroscopio para detectar el movimiento de rotación.
La placa 101 puede traducir los datos de la IMU en determinados gestos preprogramados como: dar un paso, pulsar una o dos veces la placa, o lanzar la placa. Este experimento se centrará en la detección de pulsaciones/dobles pulsaciones, pero le animamos a probar también el otro código de ejemplo que se encuentra en File > Examples > CurieIMU (Archivo > Ejemplos > IMU Curie).
Nota: La placa 101 tiene una IMU y se accede a través de la biblioteca de Arduino. Para usar la IMU no es necesario utilizar cables.
Conexión del hardware
¿Preparado para comenzar a conectar todo? Consulte el diagrama de cableado siguiente para ver cómo está conectado todo.
Componentes polarizados | Preste especial atención a las marcas de los componentes que indican cómo colocarlo en la placa de pruebas. Los componentes polarizados solo se pueden conectar a un circuito en una sola dirección. |
Diagrama de cableado del experimento
Abrir el boceto
Abra el software IDE de Arduino en su ordenador. La codificación en el lenguaje de Arduino controlará el circuito. Abra el código del circuito 19; para ello, acceda a "101 SIK Guide Code" (Guía de códigos de SIK 101) que ha descargado y guardado en la carpeta "Examples" (Ejemplos) anteriormente.
Para abrir el código vaya a: File > Examples > SIK Guide Code > Circuit_19 (Archivo > Ejemplos > Guía de códigos de SIK > Circuito_19)
También puede copiar y pegar el siguiente código en el IDE de Arduino. Cárguelo y observe lo que ocurre.
language:cpp
/*
SparkFun Inventor's Kit
Example sketch 19
TAP DETECTION
Use the 101 board's on-board IMU to detect a tap and double tap and react accordingly.
This sketch was written by SparkFun Electronics,
with lots of help from the Arduino community.
This code is completely free for any use.
Visit http://learn.sparkfun.com/products/2 for SIK information.
Visit http://www.arduino.cc to learn more about Arduino.
*/
#include "CurieIMU.h"
void setup()
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
// Initialise the IMU
CurieIMU.begin();
CurieIMU.attachInterrupt(eventCallback);
// Increase Accelerometer range to allow detection of stronger taps (< 4g)
CurieIMU.setAccelerometerRange(3);
// Reduce threshold to allow detection of weaker taps (>= 750mg)
CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)
// Set the time window for 2 taps as a double tap (<= 250 milliseconds)
CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);
// Enable Double-Tap detection
CurieIMU.interrupts(CURIE_IMU_DOUBLE_TAP);
}
void loop()
{
// nothing happens in the loop because all the action happens
// in the callback function.
}
static void eventCallback()
{
if (CurieIMU.getInterruptStatus(CURIE_IMU_DOUBLE_TAP)) {
if (CurieIMU.tapDetected(Z_AXIS, NEGATIVE))
{
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
}
else if (CurieIMU.tapDetected(Z_AXIS, POSITIVE))
{
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
}
else
{
digitalWrite(5, LOW);
digitalWrite(6, LOW);
}
}
}
Código a tener en cuenta
CurieIMU.begin();
Inicialice o comience a usar la IMU incorporada en la placa. Sin esto, la placa 101 no podría registrar datos de IMU.
CurieIMU.attachInterrupt(eventCallback);
Las interrupciones son eventos que interrumpen el bucle e indican a la placa 101 que haga algo inmediatamente. A continuación, la placa 101 sale del bucle, realiza lo indicado y vuelve al bucle. La interrupción especifica una función que se va a realizar cuando se activa la interrupción. En este caso: eventCallback
.
// Reduce threshold to allow detection of weaker taps (>= 750mg)
CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)
// Set the time window for 2 taps as a double tap (<= 250 milliseconds)
CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);
Para utilizar la IMU a fin de detectar una doble pulsación, se requiere una determinada configuración. Es necesario establecer un umbral de fuerza para una pulsación más dura y para una pulsación más suave. También es necesario especificar una duración para una pulsación doble para que el módulo Curie pueda saber cuál es la diferencia entre una sola pulsación y una pulsación doble.
CurieIMU.interrupts(CURIE_IMU_DOUBLE_TAP);
Por último, adjuntamos la interrupción al evento de pulsación doble. Por lo tanto, siempre que se realice una doble pulsación, la placa 101 ejecutará la función eventCallback.
Lo que debería ver
Una vez que el código se carga, el RGB se debe apagar. Sujete la placa y pulse dos veces la parte superior con el dedo con un ritmo y una sincronización que sean similares al doble clic con un ratón. El RGB debe parpadear en color verde dos veces y, a continuación, apagarse de nuevo. Si hace lo mismo con la parte inferior de la placa, parpadeará en color rojo.
Solución de problemas
La biblioteca no se compila
Vuelva a comprobar que dispone de una instrucción #include "CurieIMU.h"
. Si es el caso, asegúrese de que el nombre del archivo de encabezado está entre comillas y no entre comillas angulares.
No ocurre nada al pulsar dos veces
La placa 101 espera un rango de sincronización especificado para la doble pulsación. Intente acelerar las pulsaciones o ajuste la sincronización de la doble pulsación en el método CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);
.
Sigue sin funcionar
Puede ajustar la sensibilidad del acelerómetro. En el ejemplo se establece en 2 G o el doble de la cantidad de gravedad que solemos experimentar en la Tierra. Si lo disminuye, la sensibilidad aumentará.