xzmoji 发表于 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    网上有帖子说,要接个电阻限流,个人测试    不加电阻时,可以遥控的距离远一些,所以没加

#include <IRremote.h>   

//电视遥控器的编码
#define NUM0 0x80BFE11E
#define NUM1 0x80BF49B6
#define NUM2 0x80BFC936
#define NUM3 0x80BF33CC
#define NUM4 0x80BF718E
#define NUM5 0x80BFF10E
#define NUM6 0x80BF13EC
#define NUM7 0x80BF51AE
#define NUM8 0x80BFD12E
#define NUM9 0x80BF23DC
#define BOX_POWER 0x80BF3BC4
#define TV_POWER 0x04FBE01F
#define VOICE_UP 0x80BFA15E
#define VOICE_DOWN 0x80BF619E
#define CHANNEL_UP 0x80BF53AC
#define CHANNEL_DOWN 0x80BF4BB4
#define KEY_OK 0x80BF738C

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


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


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


void setup()
{
pinMode(JOY_BUTTON,INPUT);
Serial.begin(9600);
}
void loop(){


//摇杆上揺
if(isUp()){
    pressVoiceUp();//增加音量
}
//摇杆下揺
if(isDown()){
    pressVoiceDown();//减小音量
}
//摇杆左揺
if(isLeft()){
    pressChannelDown();//频道减
}
//摇杆右揺
if(isRight()){
    pressChannelUp();//频道增
}

//按下摇杆,按一下松开为切换喜欢的频道,长按关闭电视
if(isButton())
{
      int i=0;
      while(isButton()&&i<50)// 这里用i记录按住OK键的时间,一直按着直到循环结束的时间是500ms ,因为isButton()函数中有10ms的消抖,循环50次
      {
      i++;
      }
      if(i>=50)//按住超过500ms ,关电视电源
      {
          //close TV
          pressTVPower();
      }
      else if(i<50)//按住小于500ms ,循环切换喜欢的频道
      {
      // change channel
      pressChannelNum(favourateChannel);
      
      //循环计数
      channelCount++;
      if(channelCount==CHANNEL_AMOUNT){channelCount=0;}      
      }
}

delay(150);//调节延时,避免漏按或者多按
}

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

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

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

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

}

//判断摇杆是否被按下
int isButton(){
if(digitalRead(JOY_BUTTON)==0){
    delay(10);
    if(digitalRead(JOY_BUTTON)==0){
      return 1;
    }
}
return 0;
}

void pressOK(){
irsend.sendNEC(KEY_OK, 32);
}
void pressVoiceUp(){
irsend.sendNEC(VOICE_UP, 32);
}
void pressVoiceDown(){
irsend.sendNEC(VOICE_DOWN, 32);
}
void pressChannelUp(){
irsend.sendNEC(CHANNEL_UP, 32);
}
void pressChannelDown(){
irsend.sendNEC(CHANNEL_DOWN, 32);
}

void pressTVPower(){
irsend.sendNEC(TV_POWER, 32);
}
void pressBoxPower(){
irsend.sendNEC(BOX_POWER, 32);
}

//发送每个频道的红外编码
void pressChannelNum(char* channelNum){
int i=0;
while(channelNum!='\0'){
    switch(channelNum){
    case '0':irsend.sendNEC(NUM0, 32);break;
    case '1':irsend.sendNEC(NUM1, 32);break;
    case '2':irsend.sendNEC(NUM2, 32);break;
    case '3':irsend.sendNEC(NUM3, 32);break;
    case '4':irsend.sendNEC(NUM4, 32);break;
    case '5':irsend.sendNEC(NUM5, 32);break;
    case '6':irsend.sendNEC(NUM6, 32);break;
    case '7':irsend.sendNEC(NUM7, 32);break;
    case '8':irsend.sendNEC(NUM8, 32);break;
    case '9':irsend.sendNEC(NUM9, 32);break;
    default:;
    }
    delay(100);//2个按键间的延时
    i++;
}
pressOK();//确认
// press OK
}
      



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

上个视频

http://v.youku.com/v_show/id_XNzM5MTIxNDgw.html



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

tgyfish 发表于 2014-7-12 00:16:19

好好玩的样子

zoologist 发表于 2014-7-12 07:34:35

最后一句话是什么意思?你刚开始选错元件了?

xzmoji 发表于 2014-7-12 08:41:54

zoologist 发表于 2014-7-12 07:34 static/image/common/back.gif
最后一句话是什么意思?你刚开始选错元件了?

是的:L最后的那张图片我看到一体化以为可以发射的,结果只是接收管而已

太行摄狼 发表于 2014-7-12 09:00:18

很好的红外实验,库里的红外编码和电视一致吧?好像编码有几种啊

xzmoji 发表于 2014-7-12 09:14:15

太行摄狼 发表于 2014-7-12 09:00 static/image/common/back.gif
很好的红外实验,库里的红外编码和电视一致吧?好像编码有几种啊

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

zoologist 发表于 2014-7-12 09:15:27

xzmoji 发表于 2014-7-12 08:41 static/image/common/back.gif
是的最后的那张图片我看到一体化以为可以发射的,结果只是接收管而已

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

太行摄狼 发表于 2014-7-12 09:22:29

感谢了有时间试试

xzmoji 发表于 2014-7-12 09:33:10

太行摄狼 发表于 2014-7-12 09:22 static/image/common/back.gif
感谢了有时间试试

:handshake之前一直都是看别人的帖子,没有发过,第一次发,为开源做点贡献

xzmoji 发表于 2014-7-12 09:33:25

tgyfish 发表于 2014-7-12 00:16 static/image/common/back.gif
好好玩的样子

:handshake

太行摄狼 发表于 2014-7-12 10:27:30

程序写的不错啊,俺软件不行,硬件还可以

davidce 发表于 2014-7-12 11:48:10

你的父母是怎么评价的?

xzmoji 发表于 2014-7-12 12:08:23

davidce 发表于 2014-7-12 11:48 static/image/common/back.gif
你的父母是怎么评价的?

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

tgyfish 发表于 2014-7-12 22:22:13

xzmoji 发表于 2014-7-12 12:08 static/image/common/back.gif
线太多,不方便按,所以我现在考虑做一个小盒子,把uno 换成Mini,像一个小型遥控器吧

你可以做个电路板~
页: [1]
查看完整版本: 游戏摇杆+红外遥控电视