Infrared Rays library

Dependents:   mbed_IR

See http://developer.mbed.org/users/yasuyuki/notebook/IRmbed/

Committer:
yasuyuki
Date:
Thu Jun 26 13:56:36 2014 +0000
Revision:
0:c74b212c3cbf
Child:
1:71ca050c4d05
first revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yasuyuki 0:c74b212c3cbf 1 //**********************
yasuyuki 0:c74b212c3cbf 2 // IR.cpp for mbed
yasuyuki 0:c74b212c3cbf 3 //
yasuyuki 0:c74b212c3cbf 4 // IR ir(P0_12);
yasuyuki 0:c74b212c3cbf 5 //
yasuyuki 0:c74b212c3cbf 6 // (1)NEC format
yasuyuki 0:c74b212c3cbf 7 // IR carrier=38KHz
yasuyuki 0:c74b212c3cbf 8 // Time unit=0.56ms
yasuyuki 0:c74b212c3cbf 9 // logical 0 = on 1T + off 1T
yasuyuki 0:c74b212c3cbf 10 // logical 1 = on 1T + off 3T
yasuyuki 0:c74b212c3cbf 11 // reader=on 16T + off 8T
yasuyuki 0:c74b212c3cbf 12 // stop=on 1T + 8ms
yasuyuki 0:c74b212c3cbf 13 // frame=108ms
yasuyuki 0:c74b212c3cbf 14 //
yasuyuki 0:c74b212c3cbf 15 // (2)Standard IR format
yasuyuki 0:c74b212c3cbf 16 // IR carrier=33 - 40KHz
yasuyuki 0:c74b212c3cbf 17 // Time unit=0.35 - 0.50ms
yasuyuki 0:c74b212c3cbf 18 // logical 0 = on 1T + off 1T
yasuyuki 0:c74b212c3cbf 19 // logical 1 = on 1T + off 3T
yasuyuki 0:c74b212c3cbf 20 // reader=on 8T + off 4T
yasuyuki 0:c74b212c3cbf 21 // trailer=on 1T + 8ms
yasuyuki 0:c74b212c3cbf 22 //
yasuyuki 0:c74b212c3cbf 23 // (3)SONY format
yasuyuki 0:c74b212c3cbf 24 // IR carrier=40KHz
yasuyuki 0:c74b212c3cbf 25 // Time unit=0.6ms
yasuyuki 0:c74b212c3cbf 26 // logical 0 = off 1T + on 1T
yasuyuki 0:c74b212c3cbf 27 // logical 1 = off 1T + on 2T
yasuyuki 0:c74b212c3cbf 28 // reader=on 4T
yasuyuki 0:c74b212c3cbf 29 //
yasuyuki 0:c74b212c3cbf 30 // caution:
yasuyuki 0:c74b212c3cbf 31 // no detecting repeat code, return bits=0;
yasuyuki 0:c74b212c3cbf 32 //
yasuyuki 0:c74b212c3cbf 33 // (C)Copyright 2014 All rights reserved by Y.Onodera
yasuyuki 0:c74b212c3cbf 34 // http://einstlab.web.fc2.com
yasuyuki 0:c74b212c3cbf 35 //**********************
yasuyuki 0:c74b212c3cbf 36
yasuyuki 0:c74b212c3cbf 37 #include "mbed.h"
yasuyuki 0:c74b212c3cbf 38 #include "IR.h"
yasuyuki 0:c74b212c3cbf 39
yasuyuki 0:c74b212c3cbf 40 IR::IR (PinName irin) : _irin(irin){
yasuyuki 0:c74b212c3cbf 41 init();
yasuyuki 0:c74b212c3cbf 42 }
yasuyuki 0:c74b212c3cbf 43
yasuyuki 0:c74b212c3cbf 44
yasuyuki 0:c74b212c3cbf 45 void IR::init()
yasuyuki 0:c74b212c3cbf 46 {
yasuyuki 0:c74b212c3cbf 47 _irin.mode(PullUp);
yasuyuki 0:c74b212c3cbf 48 }
yasuyuki 0:c74b212c3cbf 49
yasuyuki 0:c74b212c3cbf 50 unsigned char IR::CountHigh(){
yasuyuki 0:c74b212c3cbf 51
yasuyuki 0:c74b212c3cbf 52 unsigned char i=0;
yasuyuki 0:c74b212c3cbf 53
yasuyuki 0:c74b212c3cbf 54 while(_irin==1); // wait
yasuyuki 0:c74b212c3cbf 55
yasuyuki 0:c74b212c3cbf 56 while(_irin==0){
yasuyuki 0:c74b212c3cbf 57 ++i;
yasuyuki 0:c74b212c3cbf 58 wait_us(26);
yasuyuki 0:c74b212c3cbf 59 wait_us(26);
yasuyuki 0:c74b212c3cbf 60 if(i==0) return 0;
yasuyuki 0:c74b212c3cbf 61 }
yasuyuki 0:c74b212c3cbf 62 // NEC:i=19*8=152, i*2*26.5us=8056us
yasuyuki 0:c74b212c3cbf 63 // STD:i=19*4=76, i*2*26.5us=4028us
yasuyuki 0:c74b212c3cbf 64 // 1T:i=19*1=19
yasuyuki 0:c74b212c3cbf 65
yasuyuki 0:c74b212c3cbf 66 return i;
yasuyuki 0:c74b212c3cbf 67
yasuyuki 0:c74b212c3cbf 68 }
yasuyuki 0:c74b212c3cbf 69
yasuyuki 0:c74b212c3cbf 70
yasuyuki 0:c74b212c3cbf 71 unsigned char IR::CountLow(){
yasuyuki 0:c74b212c3cbf 72
yasuyuki 0:c74b212c3cbf 73 unsigned char i=0;
yasuyuki 0:c74b212c3cbf 74
yasuyuki 0:c74b212c3cbf 75 while(_irin==0); // wait
yasuyuki 0:c74b212c3cbf 76
yasuyuki 0:c74b212c3cbf 77 while(_irin==1){
yasuyuki 0:c74b212c3cbf 78 ++i;
yasuyuki 0:c74b212c3cbf 79 wait_us(26);
yasuyuki 0:c74b212c3cbf 80 if(i==0) return 0;
yasuyuki 0:c74b212c3cbf 81 }
yasuyuki 0:c74b212c3cbf 82 // NEC:i=19*8=152, i*26.5us=4028us
yasuyuki 0:c74b212c3cbf 83 // STD:i=19*4=76, i*26.5us=2014us
yasuyuki 0:c74b212c3cbf 84 // 1T:i=19*1=19
yasuyuki 0:c74b212c3cbf 85 // 3T:i=19*3=57
yasuyuki 0:c74b212c3cbf 86
yasuyuki 0:c74b212c3cbf 87 return i;
yasuyuki 0:c74b212c3cbf 88
yasuyuki 0:c74b212c3cbf 89 }
yasuyuki 0:c74b212c3cbf 90
yasuyuki 0:c74b212c3cbf 91
yasuyuki 0:c74b212c3cbf 92 void IR::GetIR2(){
yasuyuki 0:c74b212c3cbf 93
yasuyuki 0:c74b212c3cbf 94 unsigned char i,j;
yasuyuki 0:c74b212c3cbf 95 unsigned char k;
yasuyuki 0:c74b212c3cbf 96
yasuyuki 0:c74b212c3cbf 97 bits=0;
yasuyuki 0:c74b212c3cbf 98 for(j=0;j<16;j++){
yasuyuki 0:c74b212c3cbf 99 for(i=0;i<8;i++){
yasuyuki 0:c74b212c3cbf 100 k = CountHigh()*2;
yasuyuki 0:c74b212c3cbf 101 if(mode==3){
yasuyuki 0:c74b212c3cbf 102 buf[j]>>=1;
yasuyuki 0:c74b212c3cbf 103 // Threschold = 35, 23 = 1T, 46 = 2T; for SONY
yasuyuki 0:c74b212c3cbf 104 buf[j]+=((k>30) ? 0x80: 0);
yasuyuki 0:c74b212c3cbf 105 ++bits;
yasuyuki 0:c74b212c3cbf 106 }
yasuyuki 0:c74b212c3cbf 107 k = CountLow();
yasuyuki 0:c74b212c3cbf 108 if(k==0){
yasuyuki 0:c74b212c3cbf 109 buf[j]>>=(8-i);
yasuyuki 0:c74b212c3cbf 110 return;
yasuyuki 0:c74b212c3cbf 111 }
yasuyuki 0:c74b212c3cbf 112 if(mode!=3){
yasuyuki 0:c74b212c3cbf 113 buf[j]>>=1;
yasuyuki 0:c74b212c3cbf 114 // Threschold = 38, 19 = 1T, 57 = 3T; for NEC
yasuyuki 0:c74b212c3cbf 115 // Threschold = 30, 15 = 1T, 45 = 3T; for STD
yasuyuki 0:c74b212c3cbf 116 buf[j]+=((k>30) ? 0x80: 0);
yasuyuki 0:c74b212c3cbf 117 ++bits;
yasuyuki 0:c74b212c3cbf 118 }
yasuyuki 0:c74b212c3cbf 119 }
yasuyuki 0:c74b212c3cbf 120 }
yasuyuki 0:c74b212c3cbf 121
yasuyuki 0:c74b212c3cbf 122 }
yasuyuki 0:c74b212c3cbf 123
yasuyuki 0:c74b212c3cbf 124
yasuyuki 0:c74b212c3cbf 125 void IR::GetIR(){
yasuyuki 0:c74b212c3cbf 126
yasuyuki 0:c74b212c3cbf 127 unsigned char i;
yasuyuki 0:c74b212c3cbf 128
yasuyuki 0:c74b212c3cbf 129 i = CountHigh(); // Start
yasuyuki 0:c74b212c3cbf 130 mode=0;
yasuyuki 0:c74b212c3cbf 131 if(40<i){
yasuyuki 0:c74b212c3cbf 132 if(i<51){
yasuyuki 0:c74b212c3cbf 133 mode=3; // SONY, 46
yasuyuki 0:c74b212c3cbf 134 }else{
yasuyuki 0:c74b212c3cbf 135 if(100<i){
yasuyuki 0:c74b212c3cbf 136 mode=1; // NEC, 173
yasuyuki 0:c74b212c3cbf 137 }else{
yasuyuki 0:c74b212c3cbf 138 mode=2; // STD, 54-77
yasuyuki 0:c74b212c3cbf 139 }
yasuyuki 0:c74b212c3cbf 140 }
yasuyuki 0:c74b212c3cbf 141 i = CountLow();
yasuyuki 0:c74b212c3cbf 142 GetIR2();
yasuyuki 0:c74b212c3cbf 143 }
yasuyuki 0:c74b212c3cbf 144
yasuyuki 0:c74b212c3cbf 145 }