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.

Pages
Contributors: D___Run___
Favorited Favorite 0

Experimento 18: Leer el acelerómetro integrado

Introducción

En el experimento 13 ha probado diferentes entradas para controlar la velocidad y la dirección de un motor. En este experimento hará algo similar, pero utilizará el acelerómetro integrado en la placa Arduino 101 como entrada.

El acelerómetro mide las fuerzas gravitatorias que se aplican al sensor en diferentes direcciones. Puede extrapolar mucha información de los datos del acelerómetro si se está moviendo. Pero también es útil para saber qué lado está inclinado cuando está parado. La gravedad de la Tierra es una fuerza omnipresente que se puede medir con el acelerómetro. La usaremos de esta manera para determinar la orientación de la placa Arduino 101 y a partir de ahí podrá hacer que el motor se mueva hacia delante, atrás o que esté parado. ¡Empecemos!

Elementos necesarios

Necesitará los siguientes elementos:

  • 1 placa de pruebas
  • 1 placa Arduino 101 o Genuino 101
  • 1 controlador del motor SparkFun
  • 1 motor reductor 42:1 para aficionados
  • 13 cables puente

¿No tiene el SIK?

Si está realizando este experimento y no dispone del SIK, le sugerimos que use estos elementos:

Breadboard - Self-Adhesive (White)

Breadboard - Self-Adhesive (White)

PRT-12002
$5.50
48
Jumper Wires - Connected 6" (M/M, 20 pack)

Jumper Wires - Connected 6" (M/M, 20 pack)

PRT-12795
$2.10
2
Hobby Gearmotor - 140 RPM (Pair)

Hobby Gearmotor - 140 RPM (Pair)

ROB-13302
$5.50
6

SparkFun Motor Driver - Dual TB6612FNG (1A)

ROB-09457
18 Retired

También necesitará una placa Arduino 101 O Genuino 101.

Arduino 101

DEV-13787
9 Retired

Genuino 101

DEV-13984
Retired

Lectura sugerida

Antes de continuar con este experimento, le recomendamos que se familiarice con los conceptos en los siguientes tutoriales:

Presentación del acelerómetro.

Los acelerómetros son dispositivos que miden la aceleración, es decir, es la tasa de variación de la velocidad de un objeto. Se mide en metros por segundo al cuadrado (m/s2) o en fuerzas G (G). Una sola fuerza G aquí en el planeta Tierra es equivalente a 9,8 m/s2, pero esto varía ligeramente con la altitud (y será un valor diferente en diferentes planetas debido a las variaciones en la fuerza de gravedad). Los acelerómetros son útiles para detectar vibraciones en sistemas o para aplicaciones de orientación.

Conexión del hardware

¿Está preparado para comenzar a conectar todo? Consulte el diagrama de cableado siguiente para ver cómo está conectado todo.

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

texto alternativo

¿Tiene dificultades para ver el circuito? Haga clic en el diagrama de cableado para verlo más de cerca.

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 18; 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 > 101 SIK Guide Code > Circuit_18 (Archivo > Ejemplos > Guía de códigos de SIK 101 > Circuito_18)

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 18

Controlling a Motor Using an Accelerometer

  Use the on-board accelerometer of the 101 board as an input to control
  a motor based on its orientation in space. If you tilt the 101 to the left,
  the motor spins in one direction; tilted to the right, it spins the opposite direction; and if it
  is flat, the motor stops.

This sketch was written by SparkFun Electronics, and based on the Orientation example
in the CurieIMU Library Examples
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"

const int DIR_A = 4;
const int DIR_B = 5;
const int PWM = 6;

// previous orientation (for comparison). Start at (-1) to start with

void setup()
{
 //set motor control pins to OUTPUT
pinMode(DIR_A, OUTPUT);
pinMode(DIR_B, OUTPUT);
pinMode(PWM, OUTPUT);

 // Start the acceleromter
 CurieIMU.begin();

// Set the accelerometer range to 2G
CurieIMU.setAccelerometerRange(2);
}

void loop()
{
 // read accelerometer:
 int x = CurieIMU.readAccelerometer(X_AXIS);
 int y = CurieIMU.readAccelerometer(Y_AXIS);
 int z = CurieIMU.readAccelerometer(Z_AXIS);

 // calculate the absolute values, to determine the largest
 int absX = abs(x);
 int absY = abs(y);
 int absZ = abs(z);

if ( (absZ > absX) && (absZ > absY))
{
 // base orientation on Z
 if (z > 0)
 {
  brake();
 }
}

 //else if Y is greater than X and Z its on edge
 else if ( (absY > absX) && (absY > absZ))
 {
  // if Y is positive orientation (digital pins up)and is set to 1
  if (y > 0)
  {
    forward();
  }
  //the Y is in the negative orientation (analog pins up) and is set to 2
  else
  {
    reverse();
  }
}
}
//custom function for driving the motor forward
void forward()
{
  digitalWrite(DIR_A, HIGH);
  digitalWrite(DIR_B, LOW);
  digitalWrite(PWM, HIGH);
}

//custom function for driving the motor in reverse
void reverse()
{
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, HIGH);
  digitalWrite(PWM, HIGH);
}

//custom function for braking the motor
void brake()
{
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  digitalWrite(PWM, LOW);
}

Código a tener en cuenta

#include "CurieIMU.h"

El puerto serie de Arduino se puede utilizar tanto para recibir como para enviar datos. Ya que pueden recibirse datos en cualquier momento, la placa Arduino 101 guarda o almacena en el búfer los datos que entran en el puerto hasta que esté listo para utilizarlos. El comando Serial.available() devuelve el número de caracteres que el puerto ha recibido, pero que no se han usado en el boceto todavía. Cero significa que no se han recibido datos.

int x = CurieIMU.readAccelerometer(X_AXIS);

Leemos el valor del acelerómetro transfiriendo la constante de X_AXIS al método readAccelerometer de IMU Curie. Esto devolverá la lectura en tiempo real del sensor. Para leer otro eje puede transferir las constantes de X_AXIS, Y_AXIS y Z_AXIS.

int absX = abs(x);

En este experimento no estamos necesariamente interesados en los valores positivos o negativos. Solo queremos saber cuáles son los más altos para poder tomar una decisión a partir de ahí. Hemos usado la función abs() que obtiene el valor absoluto de un número (básicamente elimina el signo (-)). Lo almacenamos en una variable local denominada absX, de modo que si alguna vez queremos acceder al valor x sin procesar, podamos hacerlo.

language:cpp
//if Z axis is greater than X and Y its facing upright
if ( (absZ > absX) && (absZ > absY))
{
 // base orientation on Z
 if (z > 0)
 {
  brake();
 }
}

 //else if Y is greater than X and Z its on edge
 else if ( (absY > absX) && (absY > absZ))
 {
  // if Y is positive orientation (digital pins up)and is set to 1
  if (y > 0)
  {
    forward();
  }
  //the Y is in the negative orientation (analog pins up) and is set to 2
  else
  {
    reverse();
  }
}

Una vez que tenemos las lecturas del acelerómetro en valor absoluto, podemos compararlas utilizando una instrucción if(). En este ejemplo solo queremos comparar los valores que están relacionados con la inclinación de la placa hacia la izquierda y la derecha, pero aun así necesitamos los tres ejes para averiguarlo. Por ejemplo, si Y es superior a X, el eje Y está orientado hacia abajo (apuntado en la dirección de la gravedad). A continuación, podemos hacer una comparación final para ver si es superior a 0 a fin de garantizar que está en sentido positivo. Hemos establecido la dirección del motor en función de esas comparaciones.

Lo que debería ver

Una vez que el código se carga en la placa 101, sostenga la placa 101 e inclínela hacia la izquierda (pines de entrada analógica hacia abajo). El motor debería empezar a moverse en una dirección. Ahora inclínela hacia la dirección contraria (pines GPIO digitales hacia abajo); el motor debería moverse en dirección contraria. Cuando pone la placa en horizontal, el motor debe pararse. Si no es así, consulte la sección Solución de problemas a continuación.

texto alternativo

Solución de problemas

El motor no gira

Asegúrese de que el cableado del controlador del motor es correcto. Son muchos cables.

Todavía sigue sin funcionar

Vuelva a comprobar que el código se ha cargado en la placa 101. A veces lleva tiempo cargarlo a la placa 101, así que tenga paciencia.

Sigue sin funcionar

A veces la placa Arduino se desconecta del ordenador. Intente desenchufarla y volver a enchufarla en el puerto USB.