CurieNeurons 实例:颜色识别

器材:

GY-31 颜色传感器 * 1

DFROBOT AD Keyboard 五按钮模块 * 1

DFROBOT IO Expansion Shield IO 扩展板 * 1

Arduino101 * 1

接线方法:

首先将 GY-31 与 IO 扩展版连接:

S0 连接 D5       S1 连接 D6        S2 连接 D3           S3 连接 D4

OUT 连接 D2         VCC 连接 VCC      GND 连接 GND

再将按钮与 IO 拓展版连接:

OUT 连接 A0         VCC 连接 VCC      GND 连接 GND

最后将拓展版与 Arduino101 开发板相连,并将扩展版上的电压跳线改为 3.3V

接线示意图:

程序说明:

Arduino 程序一般由两个主要函数组成。一个是 setup 函数,这个函数中的代码只会在开发板启动时运行一次;第二个是 loop 函数,这个函数是在开发板运行了 setup 函数后执行的,里面的操作会不断循环执行。

在颜色学习的示例中,程序的主要流程如下:

Setup 函数部分:

设置串口:设置 Arduino101 开发板的串口通讯速率并开启;

设置传感器接口:设置颜色传感器的各个接口,其中 S0~S3 为 OUTPUT,OUT 为 INPUT。

设置传感器初始信号:设置颜色传感器的初始信号,其中 S0 设置为 HIGH,S1~S3 设置为 LOW。

设置中断处理:在本程序中,需要在 out 接口上绑定一个中断处理的函数,这和所使用的颜色传感器工作原理有关。绑定的中断处理函数为 count。

初始化神经网络:主要为清空神经网络传感器中之前可能存在的值。

代码如下:

void setup()

{

  Serial.begin(9600);

  while (!Serial);

  pinMode(s0, OUTPUT);

  pinMode(s1, OUTPUT);

  pinMode(s2, OUTPUT);

  pinMode(s3, OUTPUT);

  pinMode(out, INPUT);

  digitalWrite(s0, HIGH);

  digitalWrite(s1, LOW);

  digitalWrite(s2, LOW);

  digitalWrite(s3, LOW);

  attachInterrupt(out, count, CHANGE);

  hNN.Init();

  hNN.Forget(50);

}

Loop 函数部分:

设置 CurieTimerOne 中断处理:本程序中,需要特定时间执行一次 readCounter 函数,因此使用了 Arduino101 的时钟库 CurieTimerOne。ReadCounter 函数中主要功能是记录一段时间内传感器输出方波跳变的次数,以获取频率。这和颜色传感器的工作原理有关。

设置传感器白平衡参数:调用 SetWhiteBalance 函数即可。

读取按钮信息:由于按钮连接在开发板的 A0 口,使用 analogRead 函数读取数值,并用 get_key 函数分析哪个键被按下。

当检测到有按键被按下时,读取一次颜色数据,并分析按钮的类型。若白色按钮被按下,则将这个颜色输入到神经网络中进行识别;若为其他按钮,则使神经网络学习这组数据及对应的颜色。

代码如下:

void loop()

{

  CurieTimerOne.start(timerUsec, readCounter);

  SetWhiteBalance();

  while (1)

  {

    delay(100);

    adc_key_in = analogRead(0);

    key = get_key(adc_key_in);

    if (key != -1)

    {

      ReadAverageColor();

      patternGenerator();

      Serial.print(“R = “);

      Serial.print(pattern[0]);

      Serial.print(“, G = “);

      Serial.print(pattern[1]);

      Serial.print(“, B = “);

      Serial.println(pattern[2]);

      switch (key)

      {

      case 0:

        hNN.Learn(pattern, LEN, RED);

        Serial.println(“Learned an example of RED.\n”);

        delay(200);

        break;

      case 1:

        hNN.Learn(pattern, LEN, GREEN);

        Serial.println(“Learned an example of GREEN.\n”);

        delay(200);

        break;

      case 2:

        hNN.Learn(pattern, LEN, BLUE);

        Serial.println(“Learned an example of BLUE.\n”);

        delay(200);

        break;

      case 3:

        hNN.Learn(pattern, LEN, YELLOW);

        Serial.println(“Learned an example of YELLOW.\n”);

        delay(200);

        break;

      case 4:

        res = hNN.Classify(pattern, LEN, &dist, &cat, &nid);

        printClassifyResult();

        delay(200);

        break;

      }

    }

  }

}

注意:

按钮和颜色传感器的控制代码放在头文件 GY-31.h 中,具体使用原理可以查看相关模块的文档。使用按钮时,可以根据自己按钮模块的度数修改 get_key 函数中的参数。

CurieNeurons 神经网络接口函数介绍:

在本示例中,主要使用了两个 CurieNeurons 神经网络接口,一个是 Learn 函数,一个是 Classify 函数。这两个函数也是操作 CurieNeurons 神经网络最为重要的几个函数之一。

Learn 函数主要是向神经网络中输入一组数据,并附加这组数据的类别信息,神经网络会将这组数据记录下来,作为神经网络的神经元或用于调整已有的神经元。

Classify 函数主要是向神经元中输入一组数据,并读取神经网络返回的识别信息,包括这组数据的类别等等。

其他神经元接口函数请参考 NeuroMemAPI 1.2 文档。

使用方法:

将程序上传到 Arduino101 开发板后,选取一个白色平面,使颜色传感器采集白色数据,同时按下任意按钮,程序会自动调整颜色传感器的白平衡。

然后将颜色传感器对准不同颜色的平面,按下不同颜色的按钮即可进行学习。按下白色按钮即可进行识别。

源程序如下:/ckfinder/upload/20160809/files/%E9%A2%9C%E8%89%B2%E8%AF%86%E5%88%AB%E6%BA%90%E4%BB%A3%E7%A0%81.rar

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

发表评论

登录后才能评论
QR code