Rootming 发表于 2013-4-6 09:30:35

利用Arduino上的atmega8u2制作红外遥控版PPT控制器

演示:
         http://www.tudou.com/v/ddbAphZMp7w/&rpid=113202837&resourceId=113202837_04_05_99/v.swf

原理:
          通过USBASP给Arduino板载的usb转串口芯片刷入新的固件,使其连接电脑时能被识别为键盘。PPT程序打开时,F5键为从头开始放映,方向键右为下一张,方向键左上一张,ESC键为退出放映。目前实现了这么四个键,还可以扩展,源码简单,其余靠各位想象吧。

所需物品:
            1.USBASP
            2.带atmega8u2的Arduino开发板(如果是atmega16u2,应该需要更换固件,但我这里没有实验的条件)
            3.杜邦线
            4.打印机线
            5.红外线一体接收头
            6.红外遥控器

制作:
          1.根据源代码注释,连接好线路
          2.编译后面提供的代码,并写入atmega2560
          3.,断开Arduino与电脑连接,将USBASP与atmega8u2的ISP接口相连,然后连接电脑,使用avr_fighter上写入Arduino-keyboard-0.3-mega2560.hex这个程序,这里芯片选的是atmega8,烧写前最好备份原固件,不过Arduino官网也提供下载
          4.将Arduino重新与电脑连接,此时电脑会识别到一个USB键盘并进行驱动安装,安装完驱动,打开Power Point程序即可以控制

图片说明:
连接图:
            

关于USBASP与ISP:
            

烧写界面:
            

源代码:
#include <IRremote.h>

#define RECV_PIN 2
#define CODE_PLAY 0xFFC23D
#define CODE_NEXT 0xFF02FD
#define CODE_PREV 0xFF22DD
#define CODE_EXIT 0xFF906F
#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)
#define MOD_ALT_LEFT      (1<<2)
#define MOD_GUI_LEFT      (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT   (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)
#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
#define KEY_F       9
#define KEY_G       10
#define KEY_H       11
#define KEY_I       12
#define KEY_J       13
#define KEY_K       14
#define KEY_L       15
#define KEY_M       16
#define KEY_N       17
#define KEY_O       18
#define KEY_P       19
#define KEY_Q       20
#define KEY_R       21
#define KEY_S       22
#define KEY_T       23
#define KEY_U       24
#define KEY_V       25
#define KEY_W       26
#define KEY_X       27
#define KEY_Y       28
#define KEY_Z       29
#define KEY_1       30
#define KEY_2       31
#define KEY_3       32
#define KEY_4       33
#define KEY_5       34
#define KEY_6       35
#define KEY_7       36
#define KEY_8       37
#define KEY_9       38
#define KEY_0       39
#define KEY_ENTER   40
#define KEY_ESCAPE41
#define KEY_BACKSPACE42
#define KEY_TAB   43
#define KEY_SPACE   44
#define KEY_MINUS   45
#define KEY_EQUALS46
#define KEY_LBRACKET 47
#define KEY_RBRACKET 48
#define KEY_BACKSLASH 49
#define KEY_NONUS_NUMBER 50
#define KEY_SEMICOLON 51
#define KEY_QUOTE   52
#define KEY_TILDE   53
#define KEY_COMMA   54
#define KEY_PERIOD55
#define KEY_SLASH   56
#define KEY_CAPSLOCK 57
#define KEY_F1      58
#define KEY_F2      59
#define KEY_F3      60
#define KEY_F4      61
#define KEY_F5      62
#define KEY_F6      63
#define KEY_F7      64
#define KEY_F8      65
#define KEY_F9      66
#define KEY_F10   67
#define KEY_F11   68
#define KEY_F12   69
#define KEY_PRNTSCRN    70
#define KEY_SCROLLLOCK71
#define KEY_PAUSE       72
#define KEY_INSERT      73
#define KEY_HOME      74
#define KEY_PAGEUP      75
#define KEY_DELETE      76
#define KEY_END         77
#define KEY_PAGEDOWN    78
#define KEY_RIGHT_ARROW 79
#define KEY_LEFT_ARROW80
#define KEY_DOWN_ARROW81
#define KEY_UP_ARROW    82
#define KEY_NUM_LOCK    83
#define KEY_NUM_DIV   84
#define KEY_NUM_MUL   85
#define KEY_NUM_SUB   86
#define KEY_NUM_ADD   87
#define KEY_NUM_ENTER   88
#define KEY_NUM_1       89
#define KEY_NUM_2       90
#define KEY_NUM_3       91
#define KEY_NUM_4       92
#define KEY_NUM_5       93
#define KEY_NUM_6       94
#define KEY_NUM_7       95
#define KEY_NUM_8       96
#define KEY_NUM_9       97
#define KEY_NUM_0       98
#define KEY_NUM_DOT   99
#define KEY_ARROW_LEFT 0x50

IRrecv irrecv(RECV_PIN);
decode_results results;
uint8_t buf = { 0 };

void releaseKey()
{
buf = 0;
buf = 0;
Serial.write(buf, 8); // Release key
}

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); //初始化红外遥控
//pinMode(13,1);
}

void loop() {
                if (irrecv.decode(&results)) {
                        if(results.value == CODE_PLAY){
                                   //Serial.println("You Press Play button");
                      buf = KEY_F5;
                      Serial.write(buf, 8);
                      releaseKey();
                        }
                        else if(results.value == CODE_NEXT) {
                                    //Serial.println("You Press Next button");
                      buf = KEY_RIGHT_ARROW;
                      Serial.write(buf, 8);
                      releaseKey();
                        }
                        else if(results.value == CODE_PREV){
                                //Serial.println("You Press Prcv button");
                      buf = KEY_LEFT_ARROW;
                      Serial.write(buf, 8);
                      releaseKey();
                        }
                        else if(results.value == CODE_EXIT){
                                //Serial.println("You Press Exit button");
                      buf = KEY_ESCAPE;
                      Serial.write(buf, 8);
                      releaseKey();
                        }
                        /*
                        else {
                                Serial.println("You Press Unknown button!");
                        }
                        */
                            irrecv.resume(); // 接收下一个值
                    }
}














发表于 2013-4-6 09:47:39

转播微博http://app.qlogo.cn/mbloghead/792461ab49809187ae3e

数字 发表于 2013-4-7 13:08:30

呵呵,东西做的不错,就是感觉用了牛刀!

竹空闻樱 发表于 2013-4-19 17:56:49

好帖子,顶!

GW.wangshuo 发表于 2014-11-29 13:37:40

楼主,有原来的固件吗。。按照你的做法实现了。现在想要还原,找不到固件了。。:'(:'(。。

Rootming 发表于 2015-1-19 17:17:02

GW.wangshuo 发表于 2014-11-29 13:37 static/image/common/back.gif
楼主,有原来的固件吗。。按照你的做法实现了。现在想要还原,找不到固件了。。。。

arduino官网有哦

sunrobot 发表于 2016-1-20 09:00:58

@Rooting大哥,固件怎么制作呢?
页: [1]
查看完整版本: 利用Arduino上的atmega8u2制作红外遥控版PPT控制器