資料介紹
描述
在這個項目中,我們將使用適用于 Raspberry Pi 2 套件組件的 Windows 10 IoT Core 的 Adafruit 入門包來創(chuàng)建一個項目,該項目使用 RGB 顏色傳感器來測量放置在傳感器上的對象的顏色。按鈕用于觸發(fā)傳感器。然后將顏色數據寫入調試控制臺,并在揚聲器或耳機上輸出檢測到的近似顏色。
在本課中,您將學習如何使用 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(); }
現(xiàn)在我們在 OnNavigatedTo 方法中添加代碼,它將:
- 為顏色傳感器創(chuàng)建一個新的 TCS34725 對象并初始化該對象。
- 為文本到語音操作創(chuàng)建一個新的語音合成器。
- 創(chuàng)建一個新的媒體元素來播放音頻并對其進行初始化。
- 調用 InitializeGpio 函數。
如果您不想在地圖上添加圖釘,請刪除MakePinWebAPICall();
??
protected override async void { ; { colorSensor = ; await colorSensor. ; 合成器 = ; audio = ; ; } 抓?。ɡ?e) { 調試。 ; } }
InitializeGpio 函數應執(zhí)行以下操作:
- 創(chuàng)建默認 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 函數應該:
- 使用具有近似顏色的字符串創(chuàng)建 SpeechSynthesisStream。
- 使用調度程序,將媒體元素對象的源設置為 SpeechSynthesisStream 并播放它。
async Task { var stream = await synthesizer. ; var ignored = Dispatcher. => { 音頻。 ; 音頻。 ; }); }
?
TCS34725.cs?
打開 TCS34725.cs 文件。
首先,創(chuàng)建 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 函數中,執(zhí)行以下操作:
- 使用 TCS34725 傳感器的設備地址實例化 I2C 連接設置。
- 將連接的 I2C 總線速度設置為快速模式。
- 使用 I2CBus 設備選擇器創(chuàng)建高級查詢語法字符串并使用該字符串創(chuàng)建集合。
- 使用 I2C 總線的設備 ID 和連接設置實例化 TCS34725 I2C 設備。
- 創(chuàng)建默認 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 狀態(tài)創(chuàng)建一個枚舉,默認情況下設置為開。
- 編寫了一個設置函數來設置 LED 的狀態(tài)。
- 使用數據表創(chuàng)建了兩個枚舉,以設置顏色傳感器可用的不同積分時間和增益配置的值。?
- 積分時間的默認值設置為 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增益); //注意: ,設備 掉電模式,因此需要。 等待(); }
接下來寫三個函數。一個用于設置積分時間,一個用于設置增益,一個用于啟用傳感器。在這些函數中的每一個中,不同的值被寫入傳感器以執(zhí)行給定的操作。這些值是使用數據表確定的。
為您編寫了類似的禁用功能。
{ (!初始化)開始(); _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)在編寫一個簡單的函數來組合 2 個字節(jié)以創(chuàng)建一個 16 位緩沖區(qū)。
UInt16 ColorFromBuffer(byte[] ) { UInt16= x00 =[ ] <<= |=[ ] }
在 getRawData 函數中,執(zhí)行以下操作:
- 創(chuàng)建一個新的 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 函數中:
- 創(chuàng)建一個新的 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; }
您的代碼現(xiàn)在可以部署了!
?
試試看!
將物體放在顏色傳感器頂部并按下按鈕。來自對象的 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的簡單物聯(lián)網按鈕教程
- 用于40針Raspberry Pi型號的GPIO分線板
- Raspberry Pi GPIO帽開源分享
- 可視頻直播的Raspberry Pi網絡控制機器人 14次下載
- 《愛上Raspberry Pi》中譯版-電子書籍.pdf 0次下載
- 采用Raspberry Pi 3和擴展板對工業(yè)控制設計(附代碼) 51次下載
- 如何配置 Raspberry Pi 3 和 BeagleBoards 的無線連接 5次下載
- raspberry_pi各版本差別 0次下載
- 5分鐘內將Raspberry Pi Pico變成簡單的示波器+波形發(fā)生器 1522次閱讀
- 基于Raspberry Pi 5的蜂窩物聯(lián)網項目 1027次閱讀
- T507開發(fā)板如何將占用引腳配置為普通GPIO 479次閱讀
- 使用Raspberry Pi Pico W和MicroPython開發(fā)物聯(lián)網應用 1673次閱讀
- 如何通過Raspberry Pi設置CE電流監(jiān)視器 2120次閱讀
- 基于樹莓派產品 Raspberry Pi微控制器板的優(yōu)缺點 2710次閱讀
- 如何將Raspberry Pi相機用作Bash腳本的一部分? 1806次閱讀
- 基于Raspberry Pi Pico開發(fā)先進的家庭自動化系統(tǒng) 2849次閱讀
- 基于在Raspberry Pi Zero W的基礎上實現(xiàn)設計微型機器人 2106次閱讀
- 微雪電子ZeroW| Raspberry Pi ZeroW主板簡介 2429次閱讀
- 微雪電子Raspberry Pi 3 Model主板簡介 2873次閱讀
- 利用Raspberry Pi構建存儲和虛擬化時間序列數據 884次閱讀
- 一文了解Raspberry Pi 4各項性能跑分 2.9w次閱讀
- PiTalk 套件將Raspberry Pi當作智能手機或是行動物聯(lián)網裝置 6686次閱讀
- 視覺享受!用Raspberry Pi實現(xiàn)圣誕樹燈光秀 8127次閱讀
下載排行
本周
- 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開發(fā)指南
- 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次下載 | 免費
評論
查看更多