在这个项目中,我们将在 Raspberry Pi 2 组件上使用适用于 Windows 10 IoT Core 的 Adafruit Starter Pack来制作说话光传感器。这将展示如何使用 MCP3008 模数转换器 (ADC) 芯片将 Pi2 连接到三个模拟组件。两个可变电阻器(电位器)和一个 CdS 光电管。
按照下面的 Fritzing 图将 Raspberry Pi2 连接到面包板和其他组件。
注意:设置电路时,请确保 MCP3008 芯片的方向正确。该芯片有一个半月形标记,一侧有一个点。其方向应如下图所示。
如果您有一对带 1/8" 插孔的耳机或一组带 1/8" 插孔的有源扬声器,您可以将它们连接到 Pi2 音频输出插孔以听到语音系统的提示。
您可以从https://github.com/ms-iot/adafruitsample下载代码启动项目 ,我们将引导您完成添加与 Web 服务对话并在地图上获取您的 pin 所需的代码。什么地图?
打开“Lesson_204\StartSolution\Lesson_204.sln ” 并打开 mainpage.xaml.cs 文件。
我们已经填写了一些方法作为您在此解决方案中的起点。如果你想跳到前面,你可以在以下位置找到所有代码已完成的解决方案:“Lesson_204\FullSolution\Lesson_204.sln”
在 MainPage 类的顶部添加以下行。
ReferenceVoltage = ; LowPotentiometerADCChannel = ; HighPotentiometerADCChannel = ; CDSADCChannel = ; JustRightLightString = ; LowLightString = ; HighLightString = ; eState { unknown, JustRight, TooBright, TooDark}; eState CurrentState = eState.unknown; MCP3008 mcp3008 = MCP3008(ReferenceVoltage); SpeechSynthesizer 合成器; 定时器定时器;
现在将这些行添加到 MainPage 构造函数以设置 Windows 语音合成器和 ADC 芯片。
// 创建一个的SpeechSynthesizer供以后使用。 合成器=语音合成器(); // 初始化ADC芯片以供使用 mcp3008.初始化();
现在将这些行添加到 OnNavigatedTo 方法。这将设置一个计时器回调,它将在不同的线程上每秒调用一次我们的代码。
如果您不想在地图上添加图钉,请删除MakePinWebAPICall();
override void OnNavigatedTo(NavigationEventArgs navArgs) { Debug.WriteLine( ); MakePinWebAPICall(); // 我们将每秒 timer = Timer(timerCallback, this, 0, 1000); }
现在我们调用了计时器回调,让我们填写它。
异步 timerCallback(对象状态) { 调试。 ( ); (mcp3008 == ) { 调试。 ( ); ; } eState newState = eState.JustRight; lowPotReadVal = mcp3008.ReadADC(LowPotentiometerADCChannel); highPotReadVal = mcp3008.ReadADC(HighPotentiometerADCChannel); cdsReadVal = mcp3008.ReadADC(CDSADCChannel); lowPotVoltage = mcp3008.ADCToVoltage(lowPotReadVal); highPotVoltage = mcp3008.ADCToVoltage(highPotReadVal); cdsVoltage = mcp3008.ADCToVoltage(cdsReadVal); 调试。 (String.Format( , lowPotReadVal, highPotReadVal, cdsReadVal)); 调试。 (String.Format( , lowPotVoltage, highPotVoltage, cdsVoltage)); (cdsVoltage < lowPotVoltage) { newState = eState.TooDark; } (cdsVoltage > highPotVoltage) { newState = eState.TooBright; } 等待 CheckForStateChange(newState); }
我们已经为您填写了大部分 CheckForStateChange 代码,但您想要添加对 TextToSpeech 帮助程序方法的调用。
等待;
现在是语音 API 的有趣部分,让它说话!修改 TextToSpeech 方法并添加这些行。
异步 { SpeechSynthesisStream 合成流; synthesisStream = 等待合成器。 ; media.AutoPlay = ; 媒体。 ; 媒体。 ; }
这是将包装 ADC 功能的类。
首先,我们将在构建新对象时存储参考电压值。
公共 { 调试。 ; 参考电压 = 参考电压; }
然后我们将填写 Initialize 方法以设置与 SPI 总线控制器的通信。
{ settings = SpiConnectionSettings(SPI_CHIP_SELECT_LINE); 设置下的额定速度。ClockFrequency = ; settings.Mode = SpiMode.Mode0; aqs = SpiDevice.GetDeviceSelector(); dis = DeviceInformation.FindAllAsync(aqs); mcp3008 = SpiDevice.FromIdAsync(dis[ ].Id, settings); (mcp3008 == ) { 调试.WriteLine( , dis[ ].Id); ; } } (例外 e) { Debug.WriteLine( + e.Message + + e.StackTrace); ; }
现在我们将填写 ReadADC 方法以实际从 MCP3008 芯片读取一个值。
ReadADC(byte whichChannel) { 字节命令 = whichChannel; 命令 |= MCP3008_SingleEnded; 命令 <<= ; byte[] commandBuf = new byte[] { , 命令, }; byte[] readBuf = new byte[] { , , }; mcp3008.TransferFullDuplex(commandBuf, readBuf); sample = readBuf[ ] + ((readBuf[ ] & ) << ); s2 = 样本 & ; 调试断言(示例== s2); 样品; }
最后添加一个辅助方法,用于将返回的 ADC 值(以单位为单位)转换为电压。
{
( )adc * ReferenceVoltage / ( )Max;
}
校准
运行代码并将面包板放在正常照明的区域。
查看输出窗口,了解 ADC 芯片从两个电位器和光电池读取的电压。
第一个数字是从低调整罐读取的值,第二个是高调整罐,第三个是当前在光电池上读取的值。
:: 值。_ _ , 。 , 。
转动低边界电位器,观察第一个数字的值变化。调整电位器直到电压略低于第三个数字的值(至少 0.2 伏)。
现在转动高边界锅,看第二个数字的值。您希望它比第三个数字的值高一点(同样至少 0.2 伏)。
现在已经配置了一个边界区域,其中的值“恰到好处”。
手术
以这种方式设置盆,如果你用手遮住光电管,输出应该说“我需要一盏灯”,如果你连接了可选的耳机/扬声器,你应该听到 Pi2 语音。
取下你的阴影会使它变成“啊,刚刚好”(和语音)。
将一盏灯照在传感器上会变成“我需要戴墨镜”(再次讲话)。
::timerCallback 值、、 。 , . , 。 ::TextToSpeech 啊,刚刚好 ::timerCallback 值、、 。 , . , 。 ::TextToSpeech 我需要一盏灯 ::timerCallback 值、、 。 , . , 。 ::TextToSpeech 我需要戴墨镜
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !