CNK Arduino 教程(四)

读写运动数据

材料准备

实物图如下:

硬件连接

1.硬件连线:将扩展板插入到 Genuino 上,然后将 MicroSD Module V1.0 模块插入到扩展板上,如下图所示,将 MicroSD 卡插到 MicroSD Module 上,然后将 Genuino 和电脑用 usb 数据线相连。

实物连接图如下:

注意,经过我们检测,电源和下载线供电端的方向是加速度 ax 的方向,在一个平面内与之垂直的是 ay 方向,与控制板平面垂直的是 az 方向,如下图所标。经过我们多次测试,采集数据的时候要尽量保持动作的一致性和重复性,而且在做完完整的动作之后,让设备静止一秒左右,方便后续标记以及处理数据。

 

软件准备

系统推荐:Windows 7 以上  / Mac OS 10.7 Lion 或更新的版本
开发环境推荐:Arduino IDE 1.6.12 以上
开发版支持库推荐:Intel Curie Boards by Intel  1.0.7 以上
开发库需求:SD 库(这个库为 Arduino IDE 自带,如果你没找到它,可在下方下载。)
SD.zip
( SD.zip 库下载完成后,在 Arduino IDE 菜单栏中的 “ 项目 -> 加载库 -> 添加一个 .ZIP 库… ” 中选择下载的 “ SD.zip ” 文件即可自动完成库文件的加载。在 macOS 下载后可能会自动解压成文件夹,我们可以在 “ 添加一个 .ZIP 库… ” 的选择窗口中直接选择库文件夹即可。 )

示例代码

写 sd 卡代码示例如下:


#include “SPI.h”
#include “SD.h”
#include “CurieIMU.h” 

#define SAMPLING_INTERVAL 10//ms

 

File myFile;

 

float ax, ay, az;

 

uint64_t timer;

 

void setup() {

 

 timer = 0;

 

 Serial.begin(9600);

 

 CurieIMU.begin();

 

 CurieIMU.autoCalibrateXAccelOffset(0);

 

 CurieIMU.autoCalibrateYAccelOffset(0);

 

 CurieIMU.autoCalibrateZAccelOffset(1);

 

 CurieIMU.setAccelOffsetEnabled(true);

 

 CurieIMU.setAccelerometerRange(4);

 

 if(!SD.begin(4)) {

     Serial.println(“initialization failed!”);

     return;

  }

}

void loop() {

 

   timer =millis();  

   CurieIMU.readAccelerometerScaled(ax, ay, az);

   myFile =SD.open(“data.csv”, FILE_WRITE);

   if(myFile)

   {

       myFile.print(ax);

       myFile.print(“,”);

       myFile.print(ay);

       myFile.print(“,”);

       myFile.print(az);

       myFile.print(“\n”);

    }

   myFile.close();   

   while((millis() – timer) < SAMPLING_INTERVAL);

}


代码分析

===============
if(!SD.begin(4)) {
===============

如果从 CS 口与 SD 卡通信,4 表示 CS 接线的 pin 口

===================================
myFile =SD.open(“data.csv”, FILE_WRITE);
===================================

以写权限打开 data.csv,如果不存在此文件的话,新建一个 data.csv 文件。

==============
myFile.print(ax);
==============

向文件中写入 X 轴的数值。

============
myFile.close();   
============

关闭文件。

=================================
CurieIMU.autoCalibrateXAccelOffset(0);
CurieIMU.autoCalibrateYAccelOffset(0);
CurieIMU.autoCalibrateZAccelOffset(1);
CurieIMU.setAccelOffsetEnabled(true);
=================================

初始化加速度传感器。

===============================
CurieIMU.setAccelerometerRange(4);
===============================

设置加速度器输出的值得范围为-4g~4g。

 

效果测试

烧写完程序以后,我们就可以重复做一组动作,大约可以做 20 次左右,断电,
取出 MicroSD 卡,通过 sd 卡适配器插入电脑上,双击打开里面的 data.csv 文件。

如下图:

现在我们看到的就是里面的 3 轴的加速度的数据了。

注意事项

如果接插杜邦线不牢固的话,会接触不良影响采集到的数据。
读写 MicroSD 卡数据

安装完 SD.zip 的开发库以后,会自带一文件读写的例子,在文件-> 示例->SD->ReadWrite。


#include “SPI.h”
#include “SD.h”
 

File myFile;

 

void setup() {

  // Open serial communications and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

 

  Serial.print(“Initializing SD card…”);

 

  if (!SD.begin(4)) {

    Serial.println(“initialization failed!”);

    return;

  }

  Serial.println(“initialization done.”);

 

  // open the file. note that only one file can be open at a time,

  // so you have to close this one before opening another.

  myFile = SD.open(“test.txt”, FILE_WRITE);

 

  // if the file opened okay, write to it:

  if (myFile) {

    Serial.print(“Writing to test.txt…”);

    myFile.println(“testing 1, 2, 3.”);

    // close the file:

    myFile.close();

    Serial.println(“done.”);

  } else {

    // if the file didn’t open, print an error:

    Serial.println(“error opening test.txt”);

  }

 

  // re-open the file for reading:

  myFile = SD.open(“test.txt”);

  if (myFile) {

    Serial.println(“test.txt:”);

 

    // read from the file until there’s nothing else in it:

    while (myFile.available()) {

      Serial.write(myFile.read());

    }

    // close the file:

    myFile.close();

  } else {

    // if the file didn’t open, print an error:

    Serial.println(“error opening test.txt”);

  }

}

 

void loop() {

  // nothing happens after setup

}


代码分析

=======================
while (myFile.available()) {
      Serial.write(myFile.read());
    }

=======================

判断要读写的文件是不是可用的,如果是可用的话,通过串口打印文件的内容。

============
myFile.close();
============

关闭文件流。

发布者:Cara,转载请注明出处:http://www.makercollider.com/curie/1170

发表评论

登录后才能评论
QR code