在这个项目中,我们将使用适用于 Raspberry Pi 2 套件组件的 Windows 10 IoT Core 的 Adafruit 入门包来创建一个项目,该项目使用 RGB 颜色传感器来测量放置在传感器上的对象的颜色。按钮用于触发传感器。然后将颜色数据写入调试控制台,并在扬声器或耳机上输出检测到的近似颜色。
在本课中,您将学习如何使用 GPIO 引脚将按钮连接到 Raspberry Pi,如何通过 I2C 总线与传感器通信以及如何将字符串转换为音频输出。
根据下面“原理图”部分中的 Fritzing 图,将 Raspberry Pi2 连接到面包板和其他组件。
在本课中,您还需要一个扬声器或一副耳机。将它连接到 Pi 上的 AUX 插座。
您可以从https://github.com/ms-iot/adafruitsample下载代码启动项目,我们将引导您完成添加与 Web 服务对话并在地图上获取您的 pin 所需的代码。什么地图?
打开“Lesson_205\StartSolution\Lesson_205.sln”并打开 MainPage.xaml.cs 文件。
我们已经填写了一些方法作为您在此解决方案中的起点。如果你想向前跳,你可以找到一个解决方案,所有代码都已完成:“Lesson_205\FullSolution\Lesson_205.sln”
打开 MainPage.xaml.cs 文件。
在 MainPage 类的顶部添加以下行。这些是我们稍后将使用的类的引用。在这里,您还将指定将用于按钮的 GPIO 引脚。我们在此示例中使用了 GPIO 4(引脚 7)。
密封部分MainPage : Page
{
TCS34725 颜色传感器;
SpeechSynthesizer 合成器;
媒体元素音频;
GpioPin 按钮引脚;
gpioPin = ;
主页()
{
.InitializeComponent();
}
现在我们在 OnNavigatedTo 方法中添加代码,它将:
如果您不想在地图上添加图钉,请删除MakePinWebAPICall();
protected override async void { ; { colorSensor = ; await colorSensor. ; 合成器 = ; audio = ; ; } 抓住(例外 e) { 调试。 ; } }
InitializeGpio 函数应执行以下操作:
{
GpioController gpioController = GpioController.GetDefault();
buttonPin = gpioController.OpenPin(gpioPin);
buttonPin.DebounceTimeout = TimeSpan( );
buttonPin.SetDriveMode(GpioPinDriveMode.Input);
buttonPin.ValueChanged += buttonPin_ValueChanged;
}
每次按下按钮时都会调用 buttonPin_ValueChanged 函数。该功能应该:
async void button
{
(e.Edge GpioPinEdge.RisingEdge)
{
中读取近似颜色colorRead = await colorSensor.get ;
await ;
}
}
SpeakColor 函数应该:
async Task
{
var stream = await synthesizer. ;
var ignored = Dispatcher. =>
{
音频。 ;
音频。 ;
});
}
打开 TCS34725.cs 文件。
首先,创建 2 个类来存储从传感器读取的数据。
UInt16 Red { ; ;}
UInt16 Green {; ;}
UInt16 Blue {; ;}
UInt16 Clear {; ;}
}
Red { ; ;}
Green {; ;}
Blue {; ;}
}
TCS34725 类的第一部分是列出 TCS34725 中不同寄存器的地址。这些值可以在 TCS34725 数据表中找到。I2C 和 GPIO 所需的变量在枚举之后声明。
已知颜色列表已提供给您。您可以根据Windows.UI.Colors中包含的颜色在此列表中添加或删除颜色
添加一个结构来存储颜色的名称和值对。
已知颜色
{
颜色颜色值;
颜色名称;
{
颜色值 =;
颜色名称=名称;
}
};
接下来是构造函数。这里我们设置 GPIO 引脚来控制颜色传感器上的 LED。我们正在使用 GPIO 12(引脚 32)。
在 Initialize 函数中,执行以下操作:
public async Task
{
调试。 ;
{
I2cConnectionSettings settings = ;
settings.BusSpeed = I2cBusSpeed.FastMode;
aqs = I2cDevice. ;
DeviceInformationCollection dis = await DeviceInformation 的集合。 ;
colorSensor = await I2cDevice 实例化 TCS34725 I2C 设备。 ;
gpio = GpioController. ;
LedControlGPIOPin = gpio. ;
LedControlGPIOPin。 ;
init ;
}
抓住(例外 e)
{
调试。 ;
扔;
}
}
在 initColorList 函数中,读取 Windows.UI.Colors 库中的所有颜色并将已知颜色添加到列表中。
void init
{
colorList = List<已知颜色> ;
(PropertyInfo property typeof(Colors) )
{
(limitColorList.Contains )
{
KnownColor temp = property.GetValue , property.Name);
颜色列表。;
}
}
}
代码的下一部分已为您完成。
接下来,将以下代码行添加到 begin 函数中:
私人异步任务()
{
.WriteLine("TCS34725::开始");
byte[] WriteBuffer = byte[] { TCS34725_ID | TCS34725_COMMAND_BIT };
byte[] ReadBuffer = byte[] { };
// 设备签名
colorSensor.WriteRead(WriteBuffer, ReadBuffer);
.WriteLine("TCS34725 签名:" + ReadBuffer[ ].ToString());
(ReadBuffer[ ] != )
{
.WriteLine("TCS34725::Begin Signature Mismatch.");
;
}
//initalize 变量设置
Init = ;
//积分_
setIntegrationTime(_tcs34725IntegrationTime);
// 增益
设置增益(_tcs34725增益);
//注意: ,设备 掉电模式,因此需要。
等待();
}
接下来写三个函数。一个用于设置积分时间,一个用于设置增益,一个用于启用传感器。在这些函数中的每一个中,不同的值被写入传感器以执行给定的操作。这些值是使用数据表确定的。
为您编写了类似的禁用功能。
{
(!初始化)开始();
_tcs34725增益=增益;
[] WriteBuffer = [] { TCS34725_CONTROL | TCS34725_COMMAND_BIT,
()_tcs34725增益};
colorSensor.Write(WriteBuffer);
}
{
(!初始化)开始();
_tcs34725IntegrationTime = 积分时间;
[] WriteBuffer = [] { TCS34725_ATIME | TCS34725_COMMAND_BIT,
()_tcs34725IntegrationTime };
colorSensor.Write(WriteBuffer);
}
{
Debug.WriteLine( );
(!初始化)开始();
[] WriteBuffer = [] { , };
WriteBuffer[ ] = TCS34725_ENABLE | TCS34725_COMMAND_BIT;
WriteBuffer[ ] = TCS34725_ENABLE_PON 上发送电源;
colorSensor.Write(WriteBuffer);
Task.Delay( );
WriteBuffer[ ] = (TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
colorSensor.Write(WriteBuffer);
}
现在编写一个简单的函数来组合 2 个字节以创建一个 16 位缓冲区。
UInt16 ColorFromBuffer(byte[] )
{
UInt16= x00
=[ ]
<<=
|=[ ]
}
在 getRawData 函数中,执行以下操作:
{
ColorData colorData = ColorData();
(!Init) ;
[] WriteBuffer = [] { };
[] ReadBuffer = [] { , };
WriteBuffer[ ] = TCS34725_CDATAL | TCS34725_COMMAND_BIT;
colorSensor.WriteRead(WriteBuffer, ReadBuffer);
colorData.Clear = ColorFromBuffer(ReadBuffer);
WriteBuffer[ ] = TCS34725_RDATAL | TCS34725_COMMAND_BIT;
colorSensor.WriteRead(WriteBuffer, ReadBuffer);
colorData.Red = ColorFromBuffer(ReadBuffer);
WriteBuffer[ ] = TCS34725_GDATAL | TCS34725_COMMAND_BIT;
colorSensor.WriteRead(WriteBuffer, ReadBuffer);
colorData.Green = ColorFromBuffer(ReadBuffer);
WriteBuffer[ ] = TCS34725_BDATAL | TCS34725_COMMAND_BIT;
colorSensor.WriteRead(WriteBuffer, ReadBuffer);
colorData.Blue = ColorFromBuffer(ReadBuffer);
Debug.WriteLine( ,
colorData.Red, colorData.Green, colorData.Blue, colorData.Clear);
colorData;
}
在 getRgbData 函数中:
public Task ()
{
RgbData rgbData = RgbData();
ColorData colorData = ();
// ( )
{
rgbData.Red = (colorData.Red * / colorData.Clear);
rgbData.Blue = (colorData.Blue * / colorData.Clear);
rgbData.Green = (colorData.Green * / colorData.Clear);
}
Debug.WriteLine( , rgbData.Red, rgbData.Green, rgbData.Blue);
rgbData;
}
最后,在 getClosestColor 函数中添加以下代码:
public Task< > getClosestColor()
{
RgbData rgbData = getRgbData();
已知颜色 closestColor = colorList[ ];
minDiff = .MaxValue;
foreach(colorList
{
colorValue = color.colorValue;
diff = .Pow((colorValue.R - rgbData.Red), ) +
.Pow((colorValue.G - rgbData.Green), ) +
.Pow((colorValue.B - rgbData.Blue) , );
diff = ( ) .Sqrt(diff);
(差异 < 最小差异)
{
minDiff =差异;
closestColor =;
}
}
Debug.WriteLine( + closestColor.colorName +
+ closestColor.colorValue.ToString());
closestColor.colorName;
}
您的代码现在可以部署了!
将物体放在颜色传感器顶部并按下按钮。来自对象的 RGB 数据将被读取并写入 Visual Studio 的输出窗口。接下来,扬声器/耳机会说出大概的颜色。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !