极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13916|回复: 13

游戏摇杆+红外遥控电视

[复制链接]
发表于 2014-7-11 20:53:19 | 显示全部楼层 |阅读模式
本帖最后由 xzmoji 于 2014-7-12 09:28 编辑

一回到家,爸妈总问在大学学了什么东西,都不知道怎么回答。正巧家里的电视遥控器时好时坏,心血来潮,做个好玩的遥控器吧。

硬件:
   arduino mini pro
   摇杆模块  
   9V电池   
   电池扣
   红外发射管






使用需求
     声音+、声音—、频道+、频道—、切换喜欢的频道、关机


图就不画了,接线很简单 。
摇杆:  S-K -------2                           
          S-X ------A3   
          S-Y --------A4   
          VCC--------VCC
          GND-------GND

红外发射管    正极------3          话说用IRremote库一定要连PIN3      负极-----GND    网上有帖子说,要接个电阻限流,个人测试    不加电阻时,可以遥控的距离远一些,所以没加

  1. #include <IRremote.h>   

  2. //电视遥控器的编码
  3. #define NUM0 0x80BFE11E
  4. #define NUM1 0x80BF49B6
  5. #define NUM2 0x80BFC936
  6. #define NUM3 0x80BF33CC
  7. #define NUM4 0x80BF718E
  8. #define NUM5 0x80BFF10E
  9. #define NUM6 0x80BF13EC
  10. #define NUM7 0x80BF51AE
  11. #define NUM8 0x80BFD12E
  12. #define NUM9 0x80BF23DC
  13. #define BOX_POWER 0x80BF3BC4
  14. #define TV_POWER 0x04FBE01F
  15. #define VOICE_UP 0x80BFA15E
  16. #define VOICE_DOWN 0x80BF619E
  17. #define CHANNEL_UP 0x80BF53AC
  18. #define CHANNEL_DOWN 0x80BF4BB4
  19. #define KEY_OK 0x80BF738C

  20. //引脚说明
  21. #define PIN_X A3
  22. #define PIN_Y A4
  23. #define JOY_BUTTON 2  //我看到这模块有3个输出引脚的时候才知道原来摇杆可以按下去的。。。- -!


  24. #define AREF_MIDDLE 500 //摇杆X、Y轴静止时,模拟输出500,范围0-1023
  25. #define AREF_MAX 1023
  26. #define AREF_MIN 0
  27. #define OFFSET 20      //误差范围
  28. #define CHANNEL_AMOUNT 5  //喜欢的频道的个数


  29. int channelCount=0;    //用于循环切换频道计数
  30. char* favourateChannel[CHANNELAMOUNT]={"10","5","8","40","41"};//喜欢的频道
  31. IRsend irsend;   


  32. void setup()
  33. {
  34.   pinMode(JOY_BUTTON,INPUT);
  35.   Serial.begin(9600);
  36. }
  37. void loop(){

  38.   
  39.   //摇杆上揺
  40.   if(isUp()){
  41.     pressVoiceUp();//增加音量
  42.   }
  43.   //摇杆下揺
  44.   if(isDown()){
  45.     pressVoiceDown();//减小音量
  46.   }
  47.   //摇杆左揺
  48.   if(isLeft()){
  49.     pressChannelDown();//频道减
  50.   }
  51.   //摇杆右揺
  52.   if(isRight()){
  53.     pressChannelUp();//频道增
  54.   }
  55.   
  56.   //按下摇杆,按一下松开为切换喜欢的频道,长按关闭电视
  57.   if(isButton())
  58.   {
  59.       int i=0;
  60.       while(isButton()&&i<50)// 这里用i记录按住OK键的时间,一直按着直到循环结束的时间是500ms ,因为isButton()函数中有10ms的消抖,循环50次
  61.       {
  62.         i++;
  63.       }
  64.       if(i>=50)//按住超过500ms ,关电视电源
  65.       {
  66.           //close TV
  67.           pressTVPower();
  68.       }
  69.       else if(i<50)//按住小于500ms ,循环切换喜欢的频道
  70.       {
  71.         // change channel
  72.         pressChannelNum(favourateChannel[channelCount]);
  73.         
  74.         //循环计数
  75.         channelCount++;
  76.         if(channelCount==CHANNEL_AMOUNT){channelCount=0;}      
  77.       }  
  78.   }
  79.   
  80.   delay(150);//调节延时,避免漏按或者多按
  81. }

  82. //判断摇杆是否上揺
  83. int isUp(){
  84. int valueX = analogRead(PIN_X);
  85. int valueY= analogRead(PIN_Y);
  86. //误差在一个范围内,可认为是有效操作
  87. if(abs(valueY-AREF_MIN)<OFFSET){ Serial.println("Up");return 1;}
  88. else return 0;
  89. }

  90. //判断摇杆是否下揺
  91. int isDown()
  92. {
  93. int valueX = analogRead(PIN_X);
  94. int valueY= analogRead(PIN_Y);
  95. if(abs(valueY-AREF_MAX)<OFFSET){ Serial.println("Down");return 1;}
  96. else return 0;
  97. }

  98. //判断摇杆是否左揺
  99. int isLeft()
  100. {
  101. int valueX = analogRead(PIN_X);
  102. int valueY= analogRead(PIN_Y);
  103. if(abs(valueX-AREF_MIN)<OFFSET) { Serial.println("Left");return 1;}
  104. else return 0;
  105. }

  106. //判断摇杆是否右揺
  107. int isRight()
  108. {
  109. int valueX = analogRead(PIN_X);
  110. int valueY= analogRead(PIN_Y);
  111. if(abs(valueX-AREF_MAX)<OFFSET){ Serial.println("Right");return 1;}
  112. else return 0;

  113. }

  114. //判断摇杆是否被按下
  115. int isButton(){
  116.   if(digitalRead(JOY_BUTTON)==0){
  117.     delay(10);
  118.     if(digitalRead(JOY_BUTTON)==0){
  119.       return 1;
  120.     }
  121.   }
  122.   return 0;
  123. }

  124. void pressOK(){
  125.   irsend.sendNEC(KEY_OK, 32);
  126. }
  127. void pressVoiceUp(){
  128.   irsend.sendNEC(VOICE_UP, 32);
  129. }
  130. void pressVoiceDown(){
  131.   irsend.sendNEC(VOICE_DOWN, 32);
  132. }
  133. void pressChannelUp(){
  134.   irsend.sendNEC(CHANNEL_UP, 32);
  135. }
  136. void pressChannelDown(){
  137.   irsend.sendNEC(CHANNEL_DOWN, 32);
  138. }

  139. void pressTVPower(){
  140.   irsend.sendNEC(TV_POWER, 32);
  141. }
  142. void pressBoxPower(){
  143.   irsend.sendNEC(BOX_POWER, 32);
  144. }

  145. //发送每个频道的红外编码
  146. void pressChannelNum(char* channelNum){
  147.   int i=0;  
  148.   while(channelNum[i]!='\0'){
  149.     switch(channelNum[i]){
  150.     case '0':irsend.sendNEC(NUM0, 32);break;
  151.     case '1':irsend.sendNEC(NUM1, 32);break;
  152.     case '2':irsend.sendNEC(NUM2, 32);break;
  153.     case '3':irsend.sendNEC(NUM3, 32);break;
  154.     case '4':irsend.sendNEC(NUM4, 32);break;
  155.     case '5':irsend.sendNEC(NUM5, 32);break;
  156.     case '6':irsend.sendNEC(NUM6, 32);break;
  157.     case '7':irsend.sendNEC(NUM7, 32);break;
  158.     case '8':irsend.sendNEC(NUM8, 32);break;
  159.     case '9':irsend.sendNEC(NUM9, 32);break;
  160.     default:;
  161.     }
  162.     delay(100);//2个按键间的延时
  163.     i++;
  164.   }
  165.   pressOK();//确认
  166.   // press OK
  167. }
复制代码
      



先用Uno测试,等做好了马甲,再换小一点的mini

上个视频





悲剧的经验:遇到了问题,一定要首先检测硬件!!之前一直以为一体化红外管可以接收和发送,然后在代码上纠结了半天,逛过很多论坛看过很多帖子,最后在淘宝看到写着———红外一体化接收管......顿时就晕了。,之前误以为下面的那个也能发射,怎么试都不行,后来一用上面的红外发射管就成功了。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-7-12 00:16:19 | 显示全部楼层
好好玩的样子
回复 支持 反对

使用道具 举报

发表于 2014-7-12 07:34:35 | 显示全部楼层
最后一句话是什么意思?你刚开始选错元件了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-12 08:41:54 | 显示全部楼层
zoologist 发表于 2014-7-12 07:34
最后一句话是什么意思?你刚开始选错元件了?

是的最后的那张图片我看到一体化以为可以发射的,结果只是接收管而已
回复 支持 反对

使用道具 举报

发表于 2014-7-12 09:00:18 | 显示全部楼层
很好的红外实验,库里的红外编码和电视一致吧?好像编码有几种啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-12 09:14:15 | 显示全部楼层
太行摄狼 发表于 2014-7-12 09:00
很好的红外实验,库里的红外编码和电视一致吧?好像编码有几种啊

我的电视遥控正好是NEC类型的,如果是其他类型的编码,而你又不知道的话,就发送原始编码,我觉得大多数都是NEC的,建议先试最简单的例子,不行再发原始编码
回复 支持 反对

使用道具 举报

发表于 2014-7-12 09:15:27 | 显示全部楼层
xzmoji 发表于 2014-7-12 08:41
是的最后的那张图片我看到一体化以为可以发射的,结果只是接收管而已

哦  就是说 红外发射接收一体的,实际上应该是2个这个东西?
回复 支持 反对

使用道具 举报

发表于 2014-7-12 09:22:29 | 显示全部楼层
感谢了有时间试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-12 09:33:10 | 显示全部楼层
太行摄狼 发表于 2014-7-12 09:22
感谢了有时间试试

之前一直都是看别人的帖子,没有发过,第一次发,为开源做点贡献
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-12 09:33:25 | 显示全部楼层
tgyfish 发表于 2014-7-12 00:16
好好玩的样子

回复 支持 反对

使用道具 举报

发表于 2014-7-12 10:27:30 | 显示全部楼层
程序写的不错啊,俺软件不行,硬件还可以
回复 支持 反对

使用道具 举报

发表于 2014-7-12 11:48:10 | 显示全部楼层
你的父母是怎么评价的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-12 12:08:23 | 显示全部楼层
davidce 发表于 2014-7-12 11:48
你的父母是怎么评价的?

线太多,不方便按,所以我现在考虑做一个小盒子,把uno 换成Mini,像一个小型遥控器吧
回复 支持 反对

使用道具 举报

发表于 2014-7-12 22:22:13 | 显示全部楼层
xzmoji 发表于 2014-7-12 12:08
线太多,不方便按,所以我现在考虑做一个小盒子,把uno 换成Mini,像一个小型遥控器吧

你可以做个电路板~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 19:48 , Processed in 0.048953 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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