×

如何使用GPIO引脚将按钮连接到Raspberry Pi

消耗积分:0 | 格式:zip | 大小:0.39 MB | 2022-12-23

李骏鹏

分享资料个

描述

在这个项目中,我们将使用适用于 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 方法中添加代码,它将:

  1. 为颜色传感器创建一个新的 TCS34725 对象并初始化该对象。
  2. 为文本到语音操作创建一个新的语音合成器。
  3. 创建一个新的媒体元素来播放音频并对其进行初始化。
  4. 调用 InitializeGpio 函数。

如果您不想在地图上添加图钉,请删除MakePinWebAPICall();  

protected override async void 
        {
             ;
            
            {
                
                colorSensor =   ;
                
                await colorSensor. 
                合成器 =   ;

                 
                audio =   ;

                
                 ;
            }
            抓住(例外 e)
            {
                调试。 ;
            }
        }

InitializeGpio 函数应执行以下操作:

  1. 创建默认 GPIO 控制器并使用它打开所需的 GPIO 引脚。
  2. 去抖引脚。
  3. 将引脚模式设置为输入。
  4. 为 GPIO 引脚 ValueChanged 事件设置回调函数。
 
          
         {
             
            GpioController gpioController = GpioController.GetDefault();
            
            buttonPin = gpioController.OpenPin(gpioPin);
            
            buttonPin.DebounceTimeout =  TimeSpan(  );
            
            buttonPin.SetDriveMode(GpioPinDriveMode.Input);
            
            buttonPin.ValueChanged += buttonPin_ValueChanged;
        }

每次按下按钮时都会调用 buttonPin_ValueChanged 函数。该功能应该:

  1. 检查上升沿,即检查按钮是否被释放。
  2. 如果为真,则获取近似颜色值并调用 SpeakColor 函数。
 
         async void button  
        {
            
             (e.Edge  GpioPinEdge.RisingEdge)
            {
                
                中读取近似颜色colorRead = await colorSensor.get  ;
                 
                await  ;
            }
        }

SpeakColor 函数应该:

  1. 使用具有近似颜色的字符串创建 SpeechSynthesisStream。
  2. 使用调度程序,将媒体元素对象的源设置为 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 函数中,执行以下操作:

  1. 使用 TCS34725 传感器的设备地址实例化 I2C 连接设置。
  2. 将连接的 I2C 总线速度设置为快速模式。
  3. 使用 I2CBus 设备选择器创建高级查询语法字符串并使用该字符串创建集合。
  4. 使用 I2C 总线的设备 ID 和连接设置实例化 TCS34725 I2C 设备。
  5. 创建默认 GPIO 控制器并使用它打开所需的 GPIO 引脚。
  6. 设置引脚模式为输出。
  7. 通过调用 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);
                    颜色列表。;
                }
            }
        }

代码的下一部分已为您完成。 

  1. 为传感器 LED 状态创建一个枚举,默认情况下设置为开。
  2. 编写了一个设置函数来设置 LED 的状态。
  3. 使用数据表创建了两个枚举,以设置颜色传感器可用的不同积分时间和增益配置的值。 
  4. 积分时间的默认值设置为 700ms,增益设置为 0。这些值会影响颜色传感器的分辨率和灵敏度。

接下来,将以下代码行添加到 begin 函数中:

  1. 阅读并验证传感器签名。
  2. 将 Init 变量设置为 true。
  3. 设置积分时间和增益。
  4. 启用传感器。
私人异步任务()
        {
            .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 函数中,执行以下操作:

  1. 创建一个新的 ColorData 对象。
  2. 检查I2C设备是否已经初始化。
  3. 读取清除数据。
  4. 重复相同的操作以读取红色、绿色和蓝色数据。
  5. 将原始值写入调试控制台并返回 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 函数中:

  1. 创建一个新的 RgbData 对象。
  2. 使用前面的函数读取原始数据。
  3. 使用以下方法计算 RGB 值:[原始颜色数据] * 255 / [原始清晰数据]
  4. 将 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 函数中添加以下代码:

  1. 从上一个函数中读取 RGB 颜色数据。
  2. 计算 我们列表中 RGB 数据和已知颜色之间 的欧氏距离。
  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;
        }

您的代码现在可以部署了!

 

试试看!

将物体放在颜色传感器顶部并按下按钮。来自对象的 RGB 数据将被读取并写入 Visual Studio 的输出窗口。接下来,扬声器/耳机会说出大概的颜色。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !