電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>如何使用GPIO引腳將按鈕連接到Raspberry Pi

如何使用GPIO引腳將按鈕連接到Raspberry Pi

2022-12-23 | zip | 0.39 MB | 次下載 | 免費(fèi)

資料介紹

描述

在這個(gè)項(xiàng)目中,我們將使用適用于 Raspberry Pi 2 套件組件的 Windows 10 IoT Core 的 Adafruit 入門包來創(chuàng)建一個(gè)項(xiàng)目,該項(xiàng)目使用 RGB 顏色傳感器來測量放置在傳感器上的對象的顏色。按鈕用于觸發(fā)傳感器。然后將顏色數(shù)據(jù)寫入調(diào)試控制臺(tái),并在揚(yáng)聲器或耳機(jī)上輸出檢測到的近似顏色。

在本課中,您將學(xué)習(xí)如何使用 GPIO 引腳將按鈕連接到 Raspberry Pi,如何通過 I2C 總線與傳感器通信以及如何將字符串轉(zhuǎn)換為音頻輸出。

硬件

根據(jù)下面“原理圖”部分中的 Fritzing 圖,將 Raspberry Pi2 連接到面包板和其他組件。

在本課中,您還需要一個(gè)揚(yáng)聲器或一副耳機(jī)。將它連接到 Pi 上的 AUX 插座。

軟件

您可以從https://github.com/ms-iot/adafruitsample下載代碼啟動(dòng)項(xiàng)目,我們將引導(dǎo)您完成添加與 Web 服務(wù)對話并在地圖上獲取您的 pin 所需的代碼。什么地圖?

打開“Lesson_205\StartSolution\Lesson_205.sln”并打開 MainPage.xaml.cs 文件。

我們已經(jīng)填寫了一些方法作為您在此解決方案中的起點(diǎn)。如果你想向前跳,你可以找到一個(gè)解決方案,所有代碼都已完成:“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 方法中添加代碼,它將:

  1. 為顏色傳感器創(chuàng)建一個(gè)新的 TCS34725 對象并初始化該對象。
  2. 為文本到語音操作創(chuàng)建一個(gè)新的語音合成器。
  3. 創(chuàng)建一個(gè)新的媒體元素來播放音頻并對其進(jìn)行初始化。
  4. 調(diào)用 InitializeGpio 函數(shù)。

如果您不想在地圖上添加圖釘,請刪除MakePinWebAPICall();??

protected override async void 
        {
             ;
            
            {
                
                colorSensor =   ;
                
                await colorSensor. ;

                
                合成器 =   ;

                 
                audio =   ;

                
                 ;
            }
            抓住(例外 e)
            {
                調(diào)試。 ;
            }
        }

InitializeGpio 函數(shù)應(yīng)執(zhí)行以下操作:

  1. 創(chuàng)建默認(rèn) GPIO 控制器并使用它打開所需的 GPIO 引腳。
  2. 去抖引腳。
  3. 將引腳模式設(shè)置為輸入。
  4. 為 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;
        }

每次按下按鈕時(shí)都會(huì)調(diào)用 buttonPin_ValueChanged 函數(shù)。該功能應(yīng)該:

  1. 檢查上升沿,即檢查按鈕是否被釋放。
  2. 如果為真,則獲取近似顏色值并調(diào)用 SpeakColor 函數(shù)。
 
         async void button  
        {
            
             (e.Edge  GpioPinEdge.RisingEdge)
            {
                
                中讀取近似顏色colorRead = await colorSensor.get  ;
                 
                await  ;
            }
        }

SpeakColor 函數(shù)應(yīng)該:

  1. 使用具有近似顏色的字符串創(chuàng)建 SpeechSynthesisStream。
  2. 使用調(diào)度程序,將媒體元素對象的源設(shè)置為 SpeechSynthesisStream 并播放它。
 
         async Task  
        {
             
            var stream = await synthesizer.  ;
            
            var ignored = Dispatcher.  =>
            {
                
                音頻。 ;
                
                音頻。 ;
            });
        }

?

TCS34725.cs?

打開 TCS34725.cs 文件。

首先,創(chuàng)建 2 個(gè)類來存儲(chǔ)從傳感器讀取的數(shù)據(jù)。

 
      
         UInt16 Red {  ; ;}
          UInt16 Green {; ;}
          UInt16 Blue {; ;}
          UInt16 Clear {; ;}
    }

    
      
          Red {  ; ;}
           Green {; ;}
           Blue {; ;}
    }

TCS34725 類的第一部分是列出 TCS34725 中不同寄存器的地址。這些值可以在?TCS34725 數(shù)據(jù)表中找到。I2C 和 GPIO 所需的變量在枚舉之后聲明。

已知顏色列表已提供給您。您可以根據(jù)Windows.UI.Colors中包含的顏色在此列表中添加或刪除顏色

添加一個(gè)結(jié)構(gòu)來存儲(chǔ)顏色的名稱和值對。

 
         已知顏色
        {
            顏色顏色值;
             顏色名稱;

             
            {
                顏色值 =;
                顏色名稱=名稱;
            }
        };

接下來是構(gòu)造函數(shù)。這里我們設(shè)置 GPIO 引腳來控制顏色傳感器上的 LED。我們正在使用 GPIO 12(引腳 32)。

在 Initialize 函數(shù)中,執(zhí)行以下操作:

  1. 使用 TCS34725 傳感器的設(shè)備地址實(shí)例化 I2C 連接設(shè)置。
  2. 將連接的 I2C 總線速度設(shè)置為快速模式。
  3. 使用 I2CBus 設(shè)備選擇器創(chuàng)建高級(jí)查詢語法字符串并使用該字符串創(chuàng)建集合。
  4. 使用 I2C 總線的設(shè)備 ID 和連接設(shè)置實(shí)例化 TCS34725 I2C 設(shè)備。
  5. 創(chuàng)建默認(rèn) GPIO 控制器并使用它打開所需的 GPIO 引腳。
  6. 設(shè)置引腳模式為輸出。
  7. 通過調(diào)用 initColorList 函數(shù)初始化顏色列表。
 
        public async Task 
        {
            調(diào)試。 ;

            
            {
                 
                I2cConnectionSettings settings =   ;
                
                
                settings.BusSpeed = I2cBusSpeed.FastMode;
                
                
                 aqs = I2cDevice.  ;
                
                
                
                DeviceInformationCollection dis = await DeviceInformation 的集合。 ;
                
                
                 
                colorSensor = await I2cDevice 實(shí)例化 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);
                    顏色列表。;
                }
            }
        }

代碼的下一部分已為您完成。?

  1. 為傳感器 LED 狀態(tài)創(chuàng)建一個(gè)枚舉,默認(rèn)情況下設(shè)置為開。
  2. 編寫了一個(gè)設(shè)置函數(shù)來設(shè)置 LED 的狀態(tài)。
  3. 使用數(shù)據(jù)表創(chuàng)建了兩個(gè)枚舉,以設(shè)置顏色傳感器可用的不同積分時(shí)間和增益配置的值。?
  4. 積分時(shí)間的默認(rèn)值設(shè)置為 700ms,增益設(shè)置為 0。這些值會(huì)影響顏色傳感器的分辨率和靈敏度。

接下來,將以下代碼行添加到 begin 函數(shù)中:

  1. 閱讀并驗(yàn)證傳感器簽名。
  2. 將 Init 變量設(shè)置為 true。
  3. 設(shè)置積分時(shí)間和增益。
  4. 啟用傳感器。
私人異步任務(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è)備 掉電模式,因此需要。 
            等待();
        }

接下來寫三個(gè)函數(shù)。一個(gè)用于設(shè)置積分時(shí)間,一個(gè)用于設(shè)置增益,一個(gè)用于啟用傳感器。在這些函數(shù)中的每一個(gè)中,不同的值被寫入傳感器以執(zhí)行給定的操作。這些值是使用數(shù)據(jù)表確定的。

為您編寫了類似的禁用功能。

 
           
        {
            (!初始化)開始();
            _tcs34725增益=增益;
             [] WriteBuffer =   [] { TCS34725_CONTROL | TCS34725_COMMAND_BIT,
                                              ()_tcs34725增益};
            colorSensor.Write(WriteBuffer);
        }

        
           
        {
            (!初始化)開始();
            _tcs34725IntegrationTime = 積分時(shí)間;
             [] 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)在編寫一個(gè)簡單的函數(shù)來組合 2 個(gè)字節(jié)以創(chuàng)建一個(gè) 16 位緩沖區(qū)。

 
        UInt16 ColorFromBuffer(byte[]  )
        {
            UInt16=  x00 

            =[  ] 
            <<= 
            |=[  ] 

             
        }

在 getRawData 函數(shù)中,執(zhí)行以下操作:

  1. 創(chuàng)建一個(gè)新的 ColorData 對象。
  2. 檢查I2C設(shè)備是否已經(jīng)初始化。
  3. 讀取清除數(shù)據(jù)。
  4. 重復(fù)相同的操作以讀取紅色、綠色和藍(lán)色數(shù)據(jù)。
  5. 將原始值寫入調(diào)試控制臺(tái)并返回 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ù)中:

  1. 創(chuàng)建一個(gè)新的 RgbData 對象。
  2. 使用前面的函數(shù)讀取原始數(shù)據(jù)。
  3. 使用以下方法計(jì)算 RGB 值:[原始顏色數(shù)據(jù)] * 255 / [原始清晰數(shù)據(jù)]
  4. 將 RGB 值寫入調(diào)試控制臺(tái)并返回 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ù)中添加以下代碼:

  1. 從上一個(gè)函數(shù)中讀取 RGB 顏色數(shù)據(jù)。
  2. 計(jì)算?我們列表中 RGB 數(shù)據(jù)和已知顏色之間?的歐氏距離。
  3. 返回距離最短的顏色作為最接近的顏色。
 
        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 的輸出窗口。接下來,揚(yáng)聲器/耳機(jī)會(huì)說出大概的顏色。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)