資料介紹
描述
在這個項目中,我們將使用適用于 Raspberry Pi 2 套件組件的 Windows 10 IoT Core 的 Adafruit 入門包來創(chuàng)建一個項目,該項目使用 RGB 顏色傳感器來測量放置在傳感器上的對象的顏色。按鈕用于觸發(fā)傳感器。然后將顏色數(shù)據(jù)寫入調(diào)試控制臺,并在揚聲器或耳機上輸出檢測到的近似顏色。
在本課中,您將學(xué)習(xí)如何使用 GPIO 引腳將按鈕連接到 Raspberry Pi,如何通過 I2C 總線與傳感器通信以及如何將字符串轉(zhuǎn)換為音頻輸出。
硬件
根據(jù)下面“原理圖”部分中的 Fritzing 圖,將 Raspberry Pi2 連接到面包板和其他組件。
在本課中,您還需要一個揚聲器或一副耳機。將它連接到 Pi 上的 AUX 插座。
軟件
您可以從https://github.com/ms-iot/adafruitsample下載代碼啟動項目,我們將引導(dǎo)您完成添加與 Web 服務(wù)對話并在地圖上獲取您的 pin 所需的代碼。什么地圖?
打開“Lesson_205\StartSolution\Lesson_205.sln”并打開 MainPage.xaml.cs 文件。
我們已經(jīng)填寫了一些方法作為您在此解決方案中的起點。如果你想向前跳,你可以找到一個解決方案,所有代碼都已完成:“Lesson_205\FullSolution\Lesson_205.sln”
?
MainPage.xaml.cs
打開 MainPage.xaml.cs 文件。
在 MainPage 類的頂部添加以下行。這些是我們稍后將使用的類的引用。在這里,您還將指定將用于按鈕的 GPIO 引腳。我們在此示例中使用了 GPIO 4(引腳 7)。
密封部分MainPage : Page { TCS34725 顏色傳感器; SpeechSynthesizer 合成器; 媒體元素音頻; GpioPin 按鈕引腳; gpioPin = ; 主頁() { .InitializeComponent(); }
現(xiàn)在我們在 OnNavigatedTo 方法中添加代碼,它將:
- 為顏色傳感器創(chuàng)建一個新的 TCS34725 對象并初始化該對象。
- 為文本到語音操作創(chuàng)建一個新的語音合成器。
- 創(chuàng)建一個新的媒體元素來播放音頻并對其進行初始化。
- 調(diào)用 InitializeGpio 函數(shù)。
如果您不想在地圖上添加圖釘,請刪除MakePinWebAPICall();
??
protected override async void { ; { colorSensor = ; await colorSensor. ; 合成器 = ; audio = ; ; } 抓?。ɡ?e) { 調(diào)試。 ; } }
InitializeGpio 函數(shù)應(yīng)執(zhí)行以下操作:
- 創(chuàng)建默認 GPIO 控制器并使用它打開所需的 GPIO 引腳。
- 去抖引腳。
- 將引腳模式設(shè)置為輸入。
- 為 GPIO 引腳 ValueChanged 事件設(shè)置回調(diào)函數(shù)。
{
GpioController gpioController = GpioController.GetDefault();
buttonPin = gpioController.OpenPin(gpioPin);
buttonPin.DebounceTimeout = TimeSpan( );
buttonPin.SetDriveMode(GpioPinDriveMode.Input);
buttonPin.ValueChanged += buttonPin_ValueChanged;
}
每次按下按鈕時都會調(diào)用 buttonPin_ValueChanged 函數(shù)。該功能應(yīng)該:
- 檢查上升沿,即檢查按鈕是否被釋放。
- 如果為真,則獲取近似顏色值并調(diào)用 SpeakColor 函數(shù)。
async void button { (e.Edge GpioPinEdge.RisingEdge) { 中讀取近似顏色colorRead = await colorSensor.get ; await ; } }
SpeakColor 函數(shù)應(yīng)該:
- 使用具有近似顏色的字符串創(chuàng)建 SpeechSynthesisStream。
- 使用調(diào)度程序,將媒體元素對象的源設(shè)置為 SpeechSynthesisStream 并播放它。
async Task { var stream = await synthesizer. ; var ignored = Dispatcher. => { 音頻。 ; 音頻。 ; }); }
?
TCS34725.cs?
打開 TCS34725.cs 文件。
首先,創(chuàng)建 2 個類來存儲從傳感器讀取的數(shù)據(jù)。
UInt16 Red { ; ;} UInt16 Green {; ;} UInt16 Blue {; ;} UInt16 Clear {; ;} } Red { ; ;} Green {; ;} Blue {; ;} }
TCS34725 類的第一部分是列出 TCS34725 中不同寄存器的地址。這些值可以在?TCS34725 數(shù)據(jù)表中找到。I2C 和 GPIO 所需的變量在枚舉之后聲明。
已知顏色列表已提供給您。您可以根據(jù)Windows.UI.Colors中包含的顏色在此列表中添加或刪除顏色
添加一個結(jié)構(gòu)來存儲顏色的名稱和值對。
已知顏色
{
顏色顏色值;
顏色名稱;
{
顏色值 =;
顏色名稱=名稱;
}
};
接下來是構(gòu)造函數(shù)。這里我們設(shè)置 GPIO 引腳來控制顏色傳感器上的 LED。我們正在使用 GPIO 12(引腳 32)。
在 Initialize 函數(shù)中,執(zhí)行以下操作:
- 使用 TCS34725 傳感器的設(shè)備地址實例化 I2C 連接設(shè)置。
- 將連接的 I2C 總線速度設(shè)置為快速模式。
- 使用 I2CBus 設(shè)備選擇器創(chuàng)建高級查詢語法字符串并使用該字符串創(chuàng)建集合。
- 使用 I2C 總線的設(shè)備 ID 和連接設(shè)置實例化 TCS34725 I2C 設(shè)備。
- 創(chuàng)建默認 GPIO 控制器并使用它打開所需的 GPIO 引腳。
- 設(shè)置引腳模式為輸出。
- 通過調(diào)用 initColorList 函數(shù)初始化顏色列表。
public async Task { 調(diào)試。 ; { I2cConnectionSettings settings = ; settings.BusSpeed = I2cBusSpeed.FastMode; aqs = I2cDevice. ; DeviceInformationCollection dis = await DeviceInformation 的集合。 ; colorSensor = await I2cDevice 實例化 TCS34725 I2C 設(shè)備。 ; gpio = GpioController. ; LedControlGPIOPin = gpio. ; LedControlGPIOPin。 ; init ; } 抓?。ɡ?e) { 調(diào)試。 ; 扔; } }
在 initColorList 函數(shù)中,讀取 Windows.UI.Colors 庫中的所有顏色并將已知顏色添加到列表中。
void init { colorList = List<已知顏色> ; (PropertyInfo property typeof(Colors) ) { (limitColorList.Contains ) { KnownColor temp = property.GetValue , property.Name); 顏色列表。; } } }
代碼的下一部分已為您完成。?
- 為傳感器 LED 狀態(tài)創(chuàng)建一個枚舉,默認情況下設(shè)置為開。
- 編寫了一個設(shè)置函數(shù)來設(shè)置 LED 的狀態(tài)。
- 使用數(shù)據(jù)表創(chuàng)建了兩個枚舉,以設(shè)置顏色傳感器可用的不同積分時間和增益配置的值。?
- 積分時間的默認值設(shè)置為 700ms,增益設(shè)置為 0。這些值會影響顏色傳感器的分辨率和靈敏度。
接下來,將以下代碼行添加到 begin 函數(shù)中:
- 閱讀并驗證傳感器簽名。
- 將 Init 變量設(shè)置為 true。
- 設(shè)置積分時間和增益。
- 啟用傳感器。
私人異步任務(wù)() { .WriteLine("TCS34725::開始"); byte[] WriteBuffer = byte[] { TCS34725_ID | TCS34725_COMMAND_BIT }; byte[] ReadBuffer = byte[] { }; // 設(shè)備簽名 colorSensor.WriteRead(WriteBuffer, ReadBuffer); .WriteLine("TCS34725 簽名:" + ReadBuffer[ ].ToString()); (ReadBuffer[ ] != ) { .WriteLine("TCS34725::Begin Signature Mismatch."); ; } //initalize 變量設(shè)置 Init = ; //積分_ setIntegrationTime(_tcs34725IntegrationTime); // 增益 設(shè)置增益(_tcs34725增益); //注意: ,設(shè)備 掉電模式,因此需要。 等待(); }
接下來寫三個函數(shù)。一個用于設(shè)置積分時間,一個用于設(shè)置增益,一個用于啟用傳感器。在這些函數(shù)中的每一個中,不同的值被寫入傳感器以執(zhí)行給定的操作。這些值是使用數(shù)據(jù)表確定的。
為您編寫了類似的禁用功能。
{ (!初始化)開始(); _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 上發(fā)送電源; colorSensor.Write(WriteBuffer); Task.Delay( ); WriteBuffer[ ] = (TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN); colorSensor.Write(WriteBuffer); }
現(xiàn)在編寫一個簡單的函數(shù)來組合 2 個字節(jié)以創(chuàng)建一個 16 位緩沖區(qū)。
UInt16 ColorFromBuffer(byte[] ) { UInt16= x00 =[ ] <<= |=[ ] }
在 getRawData 函數(shù)中,執(zhí)行以下操作:
- 創(chuàng)建一個新的 ColorData 對象。
- 檢查I2C設(shè)備是否已經(jīng)初始化。
- 讀取清除數(shù)據(jù)。
- 重復(fù)相同的操作以讀取紅色、綠色和藍色數(shù)據(jù)。
- 將原始值寫入調(diào)試控制臺并返回 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 函數(shù)中:
- 創(chuàng)建一個新的 RgbData 對象。
- 使用前面的函數(shù)讀取原始數(shù)據(jù)。
- 使用以下方法計算 RGB 值:[原始顏色數(shù)據(jù)] * 255 / [原始清晰數(shù)據(jù)]
- 將 RGB 值寫入調(diào)試控制臺并返回 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 函數(shù)中添加以下代碼:
- 從上一個函數(shù)中讀取 RGB 顏色數(shù)據(jù)。
- 計算?我們列表中 RGB 數(shù)據(jù)和已知顏色之間?的歐氏距離。
- 返回距離最短的顏色作為最接近的顏色。
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; }
您的代碼現(xiàn)在可以部署了!
?
試試看!
將物體放在顏色傳感器頂部并按下按鈕。來自對象的 RGB 數(shù)據(jù)將被讀取并寫入 Visual Studio 的輸出窗口。接下來,揚聲器/耳機會說出大概的顏色。
- 使用BerryLan快速無頭WiFi連接到Raspberry Pi
- Windows IoT和Raspberry Pi:讀取按鈕
- 將nRF24L01+連接到Raspberry Pi
- 如何將16x2 LCD與Raspberry pi4連接
- 將Arduino和Raspberry Pi硬件設(shè)備與Minecraft游戲連接
- 基于諾基亞5110的Raspberry Pi帽子 0次下載
- 如何將RFID RC522與Raspberry Pi連接
- 通過Raspberry Pi的簡單物聯(lián)網(wǎng)按鈕教程
- 用于40針Raspberry Pi型號的GPIO分線板
- Raspberry Pi GPIO帽開源分享
- 《愛上Raspberry Pi》中譯版-電子書籍.pdf 0次下載
- 采用Raspberry Pi 3和擴展板對工業(yè)控制設(shè)計(附代碼) 51次下載
- Instant Raspberry Pi Gaming 6次下載
- 如何配置 Raspberry Pi 3 和 BeagleBoards 的無線連接 5次下載
- raspberry_pi各版本差別 0次下載
- 5分鐘內(nèi)將Raspberry Pi Pico變成簡單的示波器+波形發(fā)生器 2317次閱讀
- 基于Raspberry Pi 5的蜂窩物聯(lián)網(wǎng)項目 1312次閱讀
- T507開發(fā)板如何將占用引腳配置為普通GPIO 845次閱讀
- 使用Raspberry Pi Pico W和MicroPython開發(fā)物聯(lián)網(wǎng)應(yīng)用 2180次閱讀
- 如何通過Raspberry Pi設(shè)置CE電流監(jiān)視器 2342次閱讀
- 基于樹莓派產(chǎn)品 Raspberry Pi微控制器板的優(yōu)缺點 2984次閱讀
- 如何將Raspberry Pi相機用作Bash腳本的一部分? 1913次閱讀
- 基于Raspberry Pi Pico開發(fā)先進的家庭自動化系統(tǒng) 3003次閱讀
- 基于在Raspberry Pi Zero W的基礎(chǔ)上實現(xiàn)設(shè)計微型機器人 2251次閱讀
- 微雪電子ZeroW| Raspberry Pi ZeroW主板簡介 2618次閱讀
- 微雪電子Raspberry Pi 3 Model主板簡介 3141次閱讀
- 利用Raspberry Pi構(gòu)建存儲和虛擬化時間序列數(shù)據(jù) 952次閱讀
- 一文了解Raspberry Pi 4各項性能跑分 3w次閱讀
- PiTalk 套件將Raspberry Pi當(dāng)作智能手機或是行動物聯(lián)網(wǎng)裝置 6830次閱讀
- 視覺享受!用Raspberry Pi實現(xiàn)圣誕樹燈光秀 8344次閱讀
下載排行
本周
- 1DD3118電路圖紙資料
- 0.08 MB | 1次下載 | 免費
- 2AD庫封裝庫安裝教程
- 0.49 MB | 1次下載 | 免費
- 3PC6206 300mA低功耗低壓差線性穩(wěn)壓器中文資料
- 1.12 MB | 1次下載 | 免費
- 4網(wǎng)絡(luò)安全從業(yè)者入門指南
- 2.91 MB | 1次下載 | 免費
- 5DS-CS3A P00-CN-V3
- 618.05 KB | 1次下載 | 免費
- 6海川SM5701規(guī)格書
- 1.48 MB | 次下載 | 免費
- 7H20PR5電磁爐IGBT功率管規(guī)格書
- 1.68 MB | 次下載 | 1 積分
- 8IP防護等級說明
- 0.08 MB | 次下載 | 免費
本月
- 1貼片三極管上的印字與真實名稱的對照表詳細說明
- 0.50 MB | 103次下載 | 1 積分
- 2涂鴉各WiFi模塊原理圖加PCB封裝
- 11.75 MB | 89次下載 | 1 積分
- 3錦銳科技CA51F2 SDK開發(fā)包
- 24.06 MB | 43次下載 | 1 積分
- 4錦銳CA51F005 SDK開發(fā)包
- 19.47 MB | 19次下載 | 1 積分
- 5PCB的EMC設(shè)計指南
- 2.47 MB | 16次下載 | 1 積分
- 6HC05藍牙原理圖加PCB
- 15.76 MB | 13次下載 | 1 積分
- 7802.11_Wireless_Networks
- 4.17 MB | 12次下載 | 免費
- 8蘋果iphone 11電路原理圖
- 4.98 MB | 6次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191390次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183342次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81588次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論