发 帖  
原厂入驻New
实战多通道高速精密测温仪的全系列设计教程,以实际项目为依托,提升工程师核心竞争力!→点击立即抢购←
[创意DIY] 基于安卓的视频遥控小车——安卓红外详解
2019-6-29 00:22:37  1645 安卓
分享
本帖最后由 鬼未景彡马奇士 于 2019-7-21 00:00 编辑

上一篇简单介绍了“基于安卓的视频遥控小车 ”,这次详细说说此设计的安卓端的红外遥控部分。
手机和小车之间的通信我用的不是蓝牙是红外遥控,虽然红外的遥控的控制距离只有10m左右,无法绕过障碍物进行遥控。但发射红外遥控信号的手机就架在小车上,可以将手机的红外发射器和红外接收器放在一块固定住。虽然并不是所有的安卓手机都有红外发射器,但都有3.5mm的耳机接口,红外信号的38kHz频率在音频范围内,可以用耳机接口外接的红外发光二极管发射红外遥控信号。如果使用蓝牙来完成对小车的控制,小车上需要配备蓝牙模块与手机进行配对通信。而且并不是所有的手机都支持蓝牙,早期的一些安卓智能手机就不支持蓝牙。而且蓝牙需要配对连接,红外遥控无需配对连接,省去等待时间。相比蓝牙模块,红外模块成本更低。所以采用红外遥控模式。
上边说的都是后话了,当初之所以用红外,是因为我一开始用的不是OPPO A51 ,用的是酷派8076D。那会儿A51还用着呢,这个酷派手机有WIFi但没有蓝牙,所以手机和单片机之间的通信就成了问题。
当时的小车还是这个样子
Cache_4e732302921cdbf8_1.png Cache_4e732302921cdbf8_2.jpg
我从网上搜了好多解决方案,智能手机是开发完成的产品,留出的接口不多,也只有USB口和耳机口:
一,用手机的USB口,但我发现酷派8076D不支持OTG,然后又从网上搜说是厂家只是删除了配置文件,我试了试,还是不行,它硬件上应该也没有升压电路(手机电池一般3.7V,USB是5V供电)。这部分参考【使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)http://blog.sina.com.cn/s/blog_8265bd790102vhpa.html】
二,用耳机口,这个网上也有例子【一文读懂Android/iOS手机如何通过音频接口与外设通信http://https//blog.csdn.net/HowieXue/article/details/79145048】,他这种方案是双工通信,但这个吧,涉及到信号处理,和数学打交道,鄙人数学渣渣。再者得买个这种外设,no money啊。然后我之前研究过遥控精灵(ZaZaRemote),不支持红外遥控的手机,在耳机孔插个红外发射头(smart zaza)就行了。这种方案是单工通信,小车配套上红外一体化接收头就可以遥控小车移动。不过不同手机的耳机口驱动力不一样,有的驱动不了红外发光二极管(压降1.4V左右),我的酷派就驱动不了,我直接把二极管接在手机喇叭上。
IMG20171211125641(1).jpg
最后,选择了音频口发射红外信号这种方案。其实造车之前,就开始在研究红外了,那会儿考四六级和期末英语考试都是用的红外耳机,就想着期末英语怎么作弊(^_−)☆,因为听力就是课本上的。教室有个红外发射器,后来查了些资料发现就是音频范围,把喇叭拆了接上红外发光二极管,就能用红外耳机听到声音。不过没用在作弊上,因为功率太小了(酷派手机喇叭改的),盖不过教室的。
音频转红外这块,我还没做好,我只是录了红外遥控信号的音频文件,然后播放。但我发现准确率大概只有八成,感觉这东西涉及到傅里叶变换,音频是正弦波,红外信号是方波,直接用音频驱动是有误差的吧,我也不是很懂,数学不好。网上我搜到这篇是【用安卓实现的安卓手把手教你学习并实现 安卓耳机口音频转红外发射https://blog.csdn.net/u013491946/article/details/78778689】,但我是用底层C语言实现的,用的C4droid写的在手机上运行,参考的这篇 【】OpenSL ES范例,无java代码,纯C    http://bbs.elecfans.com/jishu_162263_1_1.html
再后来,OPPO A51不用了,就把它用在小车上。OPPO A51支持红外遥控,所以不用那么麻烦。参考这篇【Android编程红外编程——红外码详析https://blog.csdn.net/sir_zeng/article/details/80591065】
单片机红外解码程序参考【Android遥控器开发https://blog.csdn.net/u010663063/article/details/48312579】,这个后边有单片机红外解码程序。
最后再放张动图
1562396036380.gif
1562247661208.gif

还可以参考以下链接
【手机当万能遥控器-自制“遥控精灵”外设http://forum.eepw.com.cn/thread/245699/1】



1
2019-6-29 00:22:37   评论 分享淘帖
2 个讨论
本帖最后由 鬼未景彡马奇士 于 2019-7-20 23:53 编辑

基于安卓的视频遥控小车实现人脸跟随看起来好像高大上,其实是用的安卓自带的人脸检测API(FaceDetector),将其和红外发射代码结合起来,实现了小车人脸跟随功能。


人脸检测的接口为FaceDetectionListener,
  1. private class MyFaceDetectionListener implements Camera.FaceDetectionListener {

  2.         @Override
  3.         public void onFaceDetection(Camera.Face[] faces, Camera camera) {
  4.             if (faces.length > 0){
  5.                 Log.d("FaceDetection", "face detected: "+ faces.length +
  6.                         " Face 1 Location X: " + faces[0].rect.centerX() +
  7.                         "Y: " + faces[0].rect.centerY() );
  8.             }
  9.         }
  10.     }
复制代码

通过Camera的setFaceDetedtionListener方法来接受底层检测到脸的回掉。
  1. mCamera.setFaceDetectionListener(new MyFaceDetectionListener());
复制代码

在摄像机开始预览了之后调用开始检测方法
  1. private void startFaceDetection(){
  2.         // Try starting Face Detection
  3.         Camera.Parameters params = mCamera.getParameters();

  4.         // start face detection only *after* preview has started
  5.         if (params.getMaxNumDetectedFaces() > 0){
  6.             // camera supports face detection, so can start it:
  7.             mCamera.startFaceDetection();
  8.         }
  9.     }
复制代码

以上为通用步骤,我对MyFaceDetectionListener进行了改造,将其和红外发射代码transmit()方法结合起来,代码如下
  1. private class MyFaceDetectionListener implements Camera.FaceDetectionListener{
  2.                           private int faceX=0;
  3.                     private int faceY=0;
  4.                     boolean fMoveFlag = false;//设置标志位,只执行一次,不连续发送
  5.                     boolean bMoveFlag = false;
  6.                     boolean lMoveFlag = false;
  7.                     boolean rMoveFlag = false;
  8.                     Camera.Parameters parameters;
  9.                     public MyFaceDetectionListener(Camera.Parameters parameters) {
  10.                                 this.parameters=parameters;
  11.                         }
  12.                 @Override
  13.                 public void onFaceDetection(Camera.Face[] faces, Camera camera) {
  14.                     if (faces.length > 0){
  15.                            
  16.                         Log.d("FaceDetection", "face detected: "+ faces.length +
  17.                                 " Face 1 Location X: " + faces[0].rect.centerX() +
  18.                                 "Y: " + faces[0].rect.centerY() );


  19.                         faceX=faces[0].rect.centerX();
  20.                         faceY=faces[0].rect.centerY();
  21.                                          if(faceY<-100&&!fMoveFlag){
  22.                                         
  23.                                                  mCIR.transmit(38000, pattern1);
  24.                                                 fMoveFlag=true;
  25.                                                 bMoveFlag=false;
  26.                                  }
  27.                                  if(faceY>100&&!bMoveFlag){
  28.                                         
  29.                                             mCIR.transmit(38000, pattern2);
  30.                                             bMoveFlag=true;
  31.                                             fMoveFlag=false;
  32.                                  }
  33.                                  if(faceX<-100&&!lMoveFlag){
  34.                                         
  35.                                             mCIR.transmit(38000, pattern3);
  36.                                             lMoveFlag=true;
  37.                                             rMoveFlag=false;
  38.                                  }
  39.                                  if(faceX>100&&!rMoveFlag){
  40.                                                                       
  41.                                                        
  42.                                             mCIR.transmit(38000, pattern4);
  43.                                             rMoveFlag=true;
  44.                                             lMoveFlag=false;
  45.                                  }
  46.                     }else{
  47.                            
  48.                     }
  49.                 }
  50.             }
复制代码

红外发射部分详见基于安卓的视频遥控小车——红外遥控部分
人脸追踪代码:http://www.pudn.com/Download/item/id/3913500.html

参考文献感谢以下文章的博主的分享
Android音视频-视频采集(Camera预览) - LymanYe的博客https://blog.csdn.net/Lyman_Ye/article/details/78788781
Android自带人脸识别https://blog.csdn.net/xingzhong128/article/details/79545026
Adnroid 使用安卓自带的人脸识别API - 风飞飘扬的专栏https://blog.csdn.net/qq_20082961/article/details/53193786
Screenshot_20190625_135022_com.csst.videotalk.jpg
哇,帖子里发链接显示不了,只能显示本站的链接
高级模式
您需要登录后才可以回帖 登录 | 注册

发表新帖
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表