查看: 13959|回复: 7

[应用教程] Arduino/Genuino 101 入门教程二:获取加速度计和陀螺仪数据

[复制链接]
加速度计和陀螺仪是101一大特色,当然得玩玩啦,就是冲这个来的嘛。本来我还在纠结怎么获取传感器的数据?怎么对数据进行滤波?怎么对数据进行融合?但是,这些现在都变的简单了,有现成的库文件CurieIMU和MadgwickAHRS可以用来获取和处理传感器得到的数据。

【产品链接】:  Arduino 101

咳咳,玩起来:

1.下载程序:
在库文件中能找到六轴姿态传感器驱动库libraries\CurieIMU,里面有测试程序Accelerometer,这个程序一开始没有对数据进行校正,可以手动天加一下校正代码就好了,下面是添加好校正代码的程序:
  1. /*
  2.    Copyright (c) 2015 Intel Corporation.  All rights reserved.

  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Lesser General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2.1 of the License, or (at your option) any later version.

  7.    This library is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  10.    Lesser General Public License for more details.

  11.    You should have received a copy of the GNU Lesser General Public
  12.    License along with this library; if not, write to the Free Software
  13.    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

  14. */

  15. /*
  16.    This sketch example demonstrates how the BMI160 on the
  17.    Intel(R) Curie(TM) module can be used to read accelerometer data
  18. */
  19. #include <CurieIMU.h>
  20. int calibrateOffsets = 1; // int to determine whether calibration takes place or not

  21. void setup() {
  22.   Serial.begin(9600); // initialize Serial communication
  23.   while (!Serial);    // wait for the serial port to open

  24.   // initialize device
  25.   Serial.println("Initializing IMU device...");
  26.   CurieIMU.begin();

  27.   if (calibrateOffsets == 1) {
  28.     // use the code below to calibrate accel/gyro offset values
  29.     Serial.println("Internal sensor offsets BEFORE calibration...");
  30.     Serial.print(CurieIMU.getAccelerometerOffset(X_AXIS)); Serial.print("\t");
  31.     Serial.print(CurieIMU.getAccelerometerOffset(Y_AXIS)); Serial.print("\t");
  32.     Serial.print(CurieIMU.getAccelerometerOffset(Z_AXIS)); Serial.print("\t");
  33.     Serial.println("");

  34.     Serial.print("Starting Acceleration calibration...");
  35.     CurieIMU.autoCalibrateAccelerometerOffset(X_AXIS, 0);
  36.     CurieIMU.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
  37.     CurieIMU.autoCalibrateAccelerometerOffset(Z_AXIS, 1);
  38.     Serial.println(" Done");

  39.     Serial.println("Internal sensor offsets AFTER calibration...");
  40.     Serial.print(CurieIMU.getAccelerometerOffset(X_AXIS)); Serial.print("\t");
  41.     Serial.print(CurieIMU.getAccelerometerOffset(Y_AXIS)); Serial.print("\t");
  42.     Serial.print(CurieIMU.getAccelerometerOffset(Z_AXIS)); Serial.print("\t");
  43.     Serial.println("");
  44.   }
  45.   
  46.   // Set the accelerometer range to 2G
  47.   CurieIMU.setAccelerometerRange(2);
  48. }

  49. void loop() {
  50.   int axRaw, ayRaw, azRaw;         // raw accelerometer values
  51.   float ax, ay, az;

  52.   // read raw accelerometer measurements from device
  53.   CurieIMU.readAccelerometer(axRaw, ayRaw, azRaw);

  54.   // convert the raw accelerometer data to G's
  55.   ax = convertRawAcceleration(axRaw);
  56.   ay = convertRawAcceleration(ayRaw);
  57.   az = convertRawAcceleration(azRaw);

  58.   // display tab-separated accelerometer x/y/z values
  59.   Serial.print("a:\t");
  60.   Serial.print(ax);
  61.   Serial.print("\t");
  62.   Serial.print(ay);
  63.   Serial.print("\t");
  64.   Serial.print(az);
  65.   Serial.println();

  66.   // wait 5 seconds
  67.   delay(500);
  68. }

  69. float convertRawAcceleration(int aRaw) {
  70.   // since we are using 2G range
  71.   // -2g maps to a raw value of -32768
  72.   // +2g maps to a raw value of 32767
  73.   
  74.   float a = (aRaw * 2.0) / 32768.0;

  75.   return a;
  76. }
复制代码
串口读出来的数据,很准确,可以转动板子看看每个轴的数据变化:
1.jpg

2.读取陀螺仪的数据:下载程序,在库文件中能找到六轴姿态传感器驱动库libraries\CurieIMU,里面有测试程序Gyro,同样加几句代码事先校正一下数据,下面是添加好校正代码的程序:
  1. /*
  2.    Copyright (c) 2015 Intel Corporation.  All rights reserved.

  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Lesser General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2.1 of the License, or (at your option) any later version.

  7.    This library is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  10.    Lesser General Public License for more details.

  11.    You should have received a copy of the GNU Lesser General Public
  12.    License along with this library; if not, write to the Free Software
  13.    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

  14. */

  15. /*
  16.    This sketch example demonstrates how the BMI160 on the
  17.    Intel(R) Curie(TM) module can be used to read gyroscope data
  18. */

  19. #include "CurieIMU.h"

  20. void setup() {
  21.   Serial.begin(9600); // initialize Serial communication
  22.   while (!Serial);    // wait for the serial port to open

  23.   // initialize device
  24.   Serial.println("Initializing IMU device...");
  25.   CurieIMU.begin();

  26.   Serial.print("Starting Gyroscope calibration...");
  27.   CurieIMU.autoCalibrateGyroOffset();
  28.   Serial.println(" Done");

  29.   // Set the accelerometer range to 250 degrees/second
  30.   CurieIMU.setGyroRange(250);
  31. }

  32. void loop() {
  33.   int gxRaw, gyRaw, gzRaw;         // raw gyro values
  34.   float gx, gy, gz;

  35.   // read raw gyro measurements from device
  36.   CurieIMU.readGyro(gxRaw, gyRaw, gzRaw);

  37.   // convert the raw gyro data to degrees/second
  38.   gx = convertRawGyro(gxRaw);
  39.   gy = convertRawGyro(gyRaw);
  40.   gz = convertRawGyro(gzRaw);

  41.   // display tab-separated gyro x/y/z values
  42.   Serial.print("g:\t");
  43.   Serial.print(gx);
  44.   Serial.print("\t");
  45.   Serial.print(gy);
  46.   Serial.print("\t");
  47.   Serial.print(gz);
  48.   Serial.println();

  49.   // wait 5 seconds
  50.   delay(1000);
  51. }

  52. float convertRawGyro(int gRaw) {
  53.   // since we are using 250 degrees/seconds range
  54.   // -250 maps to a raw value of -32768
  55.   // +250 maps to a raw value of 32767
  56.   
  57.   float g = (gRaw * 250.0) / 32768.0;

  58.   return g;
  59. }
复制代码
串口数据输出,这里我让开发板绕X轴旋转得到的数据,考虑手动操作的误差,y轴和z轴基本保持不变,数据看起来不错哦:

2.jpg
拓展:
既然加速度计和陀螺仪的数据读出来了,那么是不是该用这个数据来干点什么,嘿嘿嘿,是不是可以干坏事了啊下个教程教你怎么干坏事,不要太激动哦
看累了没,开心一刻:
刚才和朋友聊天,其中有谈到你,知道吗?我和他们吵了起来,还差点动手打起来,因为他们有的说你像猴子,有的说你像猩猩,实在太过分了!根本没有把你当猪看!

Arduino/Genuino 101 入门教程】

  * DF创客社区版权所有,
欢迎转载
  转载请务必标注来源: DF创客社区+作者姓名+原文网址。



苦海  初级技匠

发表于 2016-3-20 10:16:45

INTEL的专用库是下完之后可以在example看到例程么,专用库是不是装了居里后自动就装了 ??
回复 支持 反对

使用道具 举报

Jason_G  高级技师
 楼主|

发表于 2016-3-20 11:07:19

苦海 发表于 2016-3-20 10:16
INTEL的专用库是下完之后可以在example看到例程么,专用库是不是装了居里后自动就装了 ?? ...

现在的Arduino IDE安装位置里面的libraries是没有Curie专用库的,即使装了居里也是没有的,需要下载后手动添加到里面,库文件的example里面有例程代码,直接用就能看到效果,偶尔需要稍微修改一下库文件。
回复 支持 反对

使用道具 举报

大连林海  初级技神

发表于 2016-3-20 11:07:57

这么速度吗
回复 支持 反对

使用道具 举报

Jason_G  高级技师
 楼主|

发表于 2016-3-20 11:23:44


昨晚把笔记整理了一下!
回复 支持 反对

使用道具 举报

iooops  版主

发表于 2016-3-20 21:26:43

根本就没有把你当猪看233333
回复 支持 反对

使用道具 举报

Jason_G  高级技师
 楼主|

发表于 2016-4-3 16:00:18

苦海 发表于 2016-3-20 10:16
INTEL的专用库是下完之后可以在example看到例程么,专用库是不是装了居里后自动就装了 ?? ...

当在开发板管理器中安装Arduino 101后,Intel的专用库就会自动装好。库文件参考路径:C:\Users\(用户名)\AppData\Local\Arduino15\packages\Intel\hardware\arc32\1.0.4\libraries
回复 支持 反对

使用道具 举报

gyy  学徒

发表于 2016-6-3 14:58:32

陀螺仪的z轴是哪个方向啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail