树莓派实验报告.docx
《树莓派实验报告.docx》由会员分享,可在线阅读,更多相关《树莓派实验报告.docx(8页珍藏版)》请在冰豆网上搜索。
树莓派实验报告
成绩:
教师:
课程名称:
嵌入式Windows程序开发
实验名称:
实验12-PIR传感器和语音识别实验
专业班级:
姓名:
学号:
实验日期:
一、实验目的:
(1)熟悉人体红外传感器、语音识别和文本转语音(TTS)。
(2)掌握在Windows10IoTCore中使用GPIO读取人体红外传感器输出的方法。
(3)掌握在Windows10IoTCore中使用SpeechRecognition和SpeechSynthesis进行语音识别和语音合成的方法。
二、实验内容:
(1)将人体红外传感器PIR、LED灯分别连接到树莓派的GPIO5和GPIO6,运行程序12-1后,先点击初始化PIR按钮,若附近有人活动时,即程序检测到上升沿,指示的LED灯亮;没有人活动时,即程序检测到下降沿,LED灯熄灭,与应用程序界面上的状态同步。
如下图所示。
在实验12-1的基础上,使用树莓派、人体红外传感器PIR、LED灯、电阻、面包板和跳线,实现SecurityCamera。
即检测到附近有人活动时,程序自动拍照,存储到本地。
(2)使用树莓派(IoTCore系统烧写版本为14986)、USB声卡、耳机、麦克风、LED灯、电阻、面包板和跳线,实现本地的语音合成和语音识别,从而达到控制LED灯的目的。
程序12-2给出了语音控制一个LED的场景,即使用语音turnonbedroomled或者turnoffbedroomled来控制GPIO5引脚连接的LED灯。
同时,可以在VisualStudio的Output窗口看到语音识别的实时结果。
如下图所示。
用户可以在应用程序界面输入文字,点击按钮,可以让系统读出该内容,如下图所示。
请在此基础上,添加LED灯,修改语音定义文件和程序,从而达到控制两个不同的LED的功能。
三、实验结果(注意:
所有截图需要加注自己的姓名+学号水印):
1.利用Fritzing软件画出硬件连接图,给出实验内容1对应的所有关键代码,给出测试结果和说明,附调试截图。
硬件连接图:
硬件连接图如左图所示,将led连接在GPIO5上,将pri的数据输出接口接在GPIO18上
关键代码:
privatevoidPinPIR_ValueChanged(GpioPinsender,GpioPinValueChangedEventArgse)
{
//togglethestateoftheLEDeverytimethebuttonispressed
if(e.Edge==GpioPinEdge.RisingEdge)
{
ledPin.Write(GpioPinValue.Low);
}
if(e.Edge==GpioPinEdge.FallingEdge)
{
ledPin.Write(GpioPinValue.High);
}
vartask=Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>{
if(e.Edge==GpioPinEdge.FallingEdge)
{
ledEllipse.Fill=grayBrush;
GpioStatus.Text="PIRFallingEdge";
}
if(e.Edge==GpioPinEdge.RisingEdge)
{
ledEllipse.Fill=redBrush;
GpioStatus.Text="PIRRisingEdge";
takePhoto_Click(takePhoto,newRateChangedRoutedEventArgs());
}
});
}
如上面的代码所示在原来的代码段中调用takePhoto_Click(takePhoto,newRateChangedRoutedEventArgs());函数,在主页面的圆点控制的代码中添加调用拍照功能的代码。
当人体红外传感器检测到时输出高电平,GPIO口接受到后检测到上升沿便会进行拍照并且点亮led
实验结果:
实验结果如图所示,当红外设备检测到有人时就会进行拍照,并且将照片进行保存,于此同时,照片展示框下的指示点便会由灰色变为红色以指示检测到红外信息,同时连接在树莓派GPIO上的led小灯点亮。
没有检测到红外信息时,便不会拍照。
也不会执行任何操作。
2.利用Fritzing软件画出硬件连接图,给出实验内容2对应的所有关键代码,给出测试结果和说明,附调试截图。
硬件连接图:
如右图所示,在此次的试验中需要用到两个GPIO引脚,分别为GPOI6和GPIO12。
关键代码:
privateasyncvoidLightControl(stringcommand,stringtarget)
{
if(target=="Bedroom")
{
//===========================
if(command=="ON")
{
if(BedRoomLED_GpioPin!
=null)
{
awaitCoreApplicationCoreDispatcherPriority.Normal,()=>
{
bedRoomTimer.Start();
}
);
}
}
elseif(command=="OFF")
{
awaitCoreApplicationCoreDispatcherPriority.Normal,()=>
{
bedRoomTimer.Stop();
if(BedRoomLED_GpioPinValue==GpioPinValue.Low)
{
BedRoomLED_GpioPinValue=GpioPinValue.High;
BedRoomLED_GpioPin.Write(BedRoomLED_GpioPinValue);
//LED.Fill=redBrush;
}
}
);
}
//===========================
}
elseif(target=="kitchen")
{
//===========================
if(command=="ON")
{
if(kITCHENLED_GpioPin!
=null)
{
awaitCoreApplicationCoreDispatcherPriority.Normal,()=>
{
kITCHENTimer.Start();
}
);
}
}
elseif(command=="OFF")
{
awaitCoreApplicationCoreDispatcherPriority.Normal,()=>
{
kITCHENTimer.Stop();
if(kITCHENLED_GpioPinValue==GpioPinValue.Low)
{
kITCHENLED_GpioPinValue=GpioPinValue.High;
kITCHENLED_GpioPin.Write(kITCHENLED_GpioPinValue);
//LED.Fill=redBrush;
}
}
);
}
//===========================
}
SaySomthing($"{target}light",command);
}
privatevoidInitBedRoomGPIO()
{
vargpio=GpioController.GetDefault();
//ShowanerrorifthereisnoGPIOcontroller
if(gpio==null)
{
BedRoomLED_GpioPin=null;
//GpioStatus.Text="ThereisnoGPIOcontrolleronthisdevice.";
return;
}
BedRoomLED_GpioPin=gpio.OpenPin(BedRoomLED_PINNumber);
BedRoomLED_GpioPinValue=GpioPinValue.High;
BedRoomLED_GpioPin.Write(BedRoomLED_GpioPinValue);
BedRoomLED_GpioPin.SetDriveMode(GpioPinDriveMode.Output);
//GpioStatus.Text="GPIOpininitializedcorrectly.";
}
privatevoidInitKITCHENGPIO()
{
vargpio=GpioController.GetDefault();
//ShowanerrorifthereisnoGPIOcontroller
if(gpio==null)
{
kITCHENLED_GpioPin=null;
//GpioStatus.Text="ThereisnoGPIOcontrolleronthisdevice.";
return;
}
实验结果:
当语音输入“hijack”时便会启动程序,程序会返回“hijackwhatcanIdoforyou”。
然后便可以进行命令输入。
当语音输入“turnonthe…”便可以进行用语音输入控制小灯的亮灭。
实验结果如左图所示,当声音输入开灯的命令之后便会将灯打开途中两个灯分别代表卧室和厨房的灯,从中可以看出实验成功将两个地方的灯分别点亮。
四、实验总结(请列出实验过程中遇到的问题和解决方法):
由于此次的实验比较简单基本上没有遇到什么很难的问题,主要出现的问题还是之前出现过的那些,由于takephoto_Click为前台的事件,因此需要将该调用放入UI更改程序中否则无法成功。