器材:
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