Arduino 101:简介+快速上手

Arduino 101是Intel和Arduino团队合作推出的Arduino型号。它具有Intel Curie核心,运行zephyr RTOS(一个微型的实时操作系统),是一款中高端的微控制器开发板。

相比Arduino UNO,Arduino 101的优点有:运算速度快、更大的存储空间、运动传感器、蓝牙4.0、硬件神经元网络、实时时钟、额外2MB Flash空间、I2S接口、更高速的ADC、中断引脚多达20个。

Arduino UNO Arduino 101
微控制器 ATmega328P Intel Curie
时钟频率 16MHz 32MHz
工作电压 5V 3.3V (5V兼容)
数字引脚个数 14 14
PWN引脚个数 6 4
模拟输入引脚个数 6 6
中断引脚个数 2 20
串口数量 1 2
Flash空间 32 kB 196 kB
SRAM空间 2 kB 24 kB

 

 

Arduino 101开发环境配置此处不讲,可访问Arduino中文社区获取信息。这里列出101一些独有特点的使用例程:

 

1、运动传感器

在串口打印加速度计读值,即101三个方向上的加速度值(单位m/s^2)

#include "CurieIMU.h"

void setup() {
  Serial.begin(9600); 
  CurieIMU.begin();
  CurieIMU.setAccelerometerRange(2);
}

void loop() {
  int ax, ay, az;
  CurieIMU.readAccelerometer(ax, ay, az);
  Serial.print((float)ax/16384);
  Serial.print("\t");
  Serial.print((float)ay/16384);
  Serial.print("\t");
  Serial.println((float)az/16384);
}

2、蓝牙

下载手机端的NRFmaster以后,连接Arduino101可以看到读值从0~255循环变化,每0.5秒变一次

#include "CurieBLE.h"

#define NO "19B10000-E8F2-537E-4F6C-D104768A1214"

BLEPeripheral blePeripheral;
BLEService Service(NO);
BLECharCharacteristic c(NO, BLERead | BLENotify);

void setup() {
  blePeripheral.setLocalName("Arduino 101");
  blePeripheral.addAttribute(Service);
  blePeripheral.addAttribute(c);
  blePeripheral.begin();
}

void loop() {
  static uint8_t i = 0;
  c.setValue(i++);
  delay(500);
}

3、实时时钟

在串口打印实时时钟时间。注意:101每次断电重启时,时钟都会恢复最初值

#include "CurieTime.h"

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print(hour());Serial.write(':');
  Serial.print(minute());Serial.write(':');
  Serial.print(second());Serial.print("   ");
  Serial.print(day());Serial.write('/');
  Serial.print(month());Serial.write('/');
  Serial.println(year());
  delay(1000);
}

4、板载Flash

板载Flash大小为2MB,有一个固定文件大小的文件系统,每个文件在建立时就确定大小,之后不能改动。以下是写入一个64B的文件的例程:

#include "SerialFlash.h"
#include "SPI.h"

#define File_SIZE 64

#define filename  "myfile.txt"

char contents[] = "Arduino 101 serial flash file system test";

// digital pin for flash chip CS pin
#define g_FlashChipSelect 21

void setup() {
  Serial.begin(9600);
  while(!Serial);
  
  if ( !SerialFlash.begin(g_FlashChipSelect) ){
    Serial.println("Unable to access SPI Flash chip");
  }

  SerialFlashFile file;

  if ( !SerialFlash.exists(filename)){
    if(! SerialFlash.create(filename, File_SIZE)){
      Serial.println("Not enough space to create file " filename);
      return;
    }
    Serial.println("Creating file " filename);
  }else{
    Serial.println("File " filename " already exists");
  }
  
  file = SerialFlash.open(filename);
  file.write(contents, sizeof(contents));
  Serial.println("Write Done");
}

void loop() {
  SerialFlashFile file = SerialFlash.open(filename);
  if(file){
    char buf[sizeof(contents)];
    Serial.println(filename ":");
    file.read(buf,sizeof(contents));
    Serial.println(buf);
  }else{
    Serial.println("File " filename " not exists");
  }
  delay(3000);
}

文件写入后,可以运行下面的程序,读出这个文件:

#include "SerialFlash.h"
#include "SPI.h"

#define filename  "myfile.txt"

#define g_FlashChipSelect 21

void setup() {
  Serial.begin(9600);
  if ( !SerialFlash.begin(g_FlashChipSelect) ){
    Serial.println("Unable to access SPI Flash chip");
  }
}

void loop(){
  SerialFlashFile file = SerialFlash.open(filename);
  if(file){
    char buf[64] = {0};
    Serial.println(filename ":");
    file.read(buf,64);
    Serial.println(buf);
  }else{
    Serial.println("File " filename " not exists");
  }
  delay(3000);
}

5、外部中断

101的所有IO引脚都可用于外部中断。本程序监听14~17号引脚是否发生下降沿中断,发生时打印中断引脚号。

void setup() {
  attachInterrupt(14,intf14,FALLING);
  attachInterrupt(15,intf15,FALLING);
  attachInterrupt(16,intf16,FALLING);
  attachInterrupt(17,intf17,FALLING);
  interrupts();
  Serial.begin(9600);
}

void intf14(){Serial.print("14 ");}
void intf15(){Serial.print("15 ");}
void intf16(){Serial.print("16 ");}
void intf17(){Serial.print("17 ");}

void loop() {}

6、定时器中断

本程序每1秒触发一次定时器中断,将13号引脚电平反转,板载LED灯出现闪烁效果。

#include "CurieTimerOne.h"

void timeInterrupt(){
  static uint8_t toggle = 0;
  digitalWrite(13, toggle);
  toggle = !toggle;
}

void setup() {
  pinMode(13, OUTPUT);
  CurieTimerOne.start(100000, &timeInterrupt);
}

void loop() {}