在这个项目中,我们将在 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条评论
快来发表一下你的评论吧 !