在这个项目中,我们将使用适用于 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条评论
快来发表一下你的评论吧 !