资料介绍
描述
在这个项目中,我们将使用适用于 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.xaml.cs 文件。
在 MainPage 类的顶部添加以下行。这些是我们稍后将使用的类的引用。在这里,您还将指定将用于按钮的 GPIO 引脚。我们在此示例中使用了 GPIO 4(引脚 7)。
密封部分MainPage : Page { TCS34725 颜色传感器; SpeechSynthesizer 合成器; 媒体元素音频; GpioPin 按钮引脚; gpioPin = ; 主页() { .InitializeComponent(); }
现在我们在 OnNavigatedTo 方法中添加代码,它将:
- 为颜色传感器创建一个新的 TCS34725 对象并初始化该对象。
- 为文本到语音操作创建一个新的语音合成器。
- 创建一个新的媒体元素来播放音频并对其进行初始化。
- 调用 InitializeGpio 函数。
如果您不想在地图上添加图钉,请删除MakePinWebAPICall();
protected override async void { ; { colorSensor = ; await colorSensor. ; 合成器 = ; audio = ; ; } 抓住(例外 e) { 调试。 ; } }
InitializeGpio 函数应执行以下操作:
- 创建默认 GPIO 控制器并使用它打开所需的 GPIO 引脚。
- 去抖引脚。
- 将引脚模式设置为输入。
- 为 GPIO 引脚 ValueChanged 事件设置回调函数。
{
GpioController gpioController = GpioController.GetDefault();
buttonPin = gpioController.OpenPin(gpioPin);
buttonPin.DebounceTimeout = TimeSpan( );
buttonPin.SetDriveMode(GpioPinDriveMode.Input);
buttonPin.ValueChanged += buttonPin_ValueChanged;
}
每次按下按钮时都会调用 buttonPin_ValueChanged 函数。该功能应该:
- 检查上升沿,即检查按钮是否被释放。
- 如果为真,则获取近似颜色值并调用 SpeakColor 函数。
async void button { (e.Edge GpioPinEdge.RisingEdge) { 中读取近似颜色colorRead = await colorSensor.get ; await ; } }
SpeakColor 函数应该:
- 使用具有近似颜色的字符串创建 SpeechSynthesisStream。
- 使用调度程序,将媒体元素对象的源设置为 SpeechSynthesisStream 并播放它。
async Task { var stream = await synthesizer. ; var ignored = Dispatcher. => { 音频。 ; 音频。 ; }); }
TCS34725.cs
打开 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 函数中,执行以下操作:
- 使用 TCS34725 传感器的设备地址实例化 I2C 连接设置。
- 将连接的 I2C 总线速度设置为快速模式。
- 使用 I2CBus 设备选择器创建高级查询语法字符串并使用该字符串创建集合。
- 使用 I2C 总线的设备 ID 和连接设置实例化 TCS34725 I2C 设备。
- 创建默认 GPIO 控制器并使用它打开所需的 GPIO 引脚。
- 设置引脚模式为输出。
- 通过调用 initColorList 函数初始化颜色列表。
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); 颜色列表。; } } }
代码的下一部分已为您完成。
- 为传感器 LED 状态创建一个枚举,默认情况下设置为开。
- 编写了一个设置函数来设置 LED 的状态。
- 使用数据表创建了两个枚举,以设置颜色传感器可用的不同积分时间和增益配置的值。
- 积分时间的默认值设置为 700ms,增益设置为 0。这些值会影响颜色传感器的分辨率和灵敏度。
接下来,将以下代码行添加到 begin 函数中:
- 阅读并验证传感器签名。
- 将 Init 变量设置为 true。
- 设置积分时间和增益。
- 启用传感器。
私人异步任务() { .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 对象。
- 检查I2C设备是否已经初始化。
- 读取清除数据。
- 重复相同的操作以读取红色、绿色和蓝色数据。
- 将原始值写入调试控制台并返回 ColorData 对象。
{ 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 函数中:
- 创建一个新的 RgbData 对象。
- 使用前面的函数读取原始数据。
- 使用以下方法计算 RGB 值:[原始颜色数据] * 255 / [原始清晰数据]
- 将 RGB 值写入调试控制台并返回 RgbData 对象。
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 函数中添加以下代码:
- 从上一个函数中读取 RGB 颜色数据。
- 计算 我们列表中 RGB 数据和已知颜色之间 的欧氏距离。
- 返回距离最短的颜色作为最接近的颜色。
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 的输出窗口。接下来,扬声器/耳机会说出大概的颜色。
- 使用BerryLan快速无头WiFi连接到Raspberry Pi
- Windows IoT和Raspberry Pi:读取按钮
- 将nRF24L01+连接到Raspberry Pi
- 如何将16x2 LCD与Raspberry pi4连接
- 将Arduino和Raspberry Pi硬件设备与Minecraft游戏连接
- 基于诺基亚5110的Raspberry Pi帽子 0次下载
- 如何将RFID RC522与Raspberry Pi连接
- 通过Raspberry Pi的简单物联网按钮教程
- 用于40针Raspberry Pi型号的GPIO分线板
- Raspberry Pi GPIO帽开源分享
- 《爱上Raspberry Pi》中译版-电子书籍.pdf 0次下载
- 采用Raspberry Pi 3和扩展板对工业控制设计(附代码) 51次下载
- Instant Raspberry Pi Gaming 6次下载
- 如何配置 Raspberry Pi 3 和 BeagleBoards 的无线连接 5次下载
- raspberry_pi各版本差别 0次下载
- 5分钟内将Raspberry Pi Pico变成简单的示波器+波形发生器 2317次阅读
- 基于Raspberry Pi 5的蜂窝物联网项目 1312次阅读
- T507开发板如何将占用引脚配置为普通GPIO 845次阅读
- 使用Raspberry Pi Pico W和MicroPython开发物联网应用 2180次阅读
- 如何通过Raspberry Pi设置CE电流监视器 2342次阅读
- 基于树莓派产品 Raspberry Pi微控制器板的优缺点 2984次阅读
- 如何将Raspberry Pi相机用作Bash脚本的一部分? 1913次阅读
- 基于Raspberry Pi Pico开发先进的家庭自动化系统 3003次阅读
- 基于在Raspberry Pi Zero W的基础上实现设计微型机器人 2251次阅读
- 微雪电子ZeroW| Raspberry Pi ZeroW主板简介 2618次阅读
- 微雪电子Raspberry Pi 3 Model主板简介 3141次阅读
- 利用Raspberry Pi构建存储和虚拟化时间序列数据 952次阅读
- 一文了解Raspberry Pi 4各项性能跑分 3w次阅读
- PiTalk 套件将Raspberry Pi当作智能手机或是行动物联网装置 6830次阅读
- 视觉享受!用Raspberry Pi实现圣诞树灯光秀 8344次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论