Infrared Rays library
See http://developer.mbed.org/users/yasuyuki/notebook/IRmbed/
IR.cpp@1:71ca050c4d05, 2015-09-25 (annotated)
- Committer:
- yasuyuki
- Date:
- Fri Sep 25 17:11:16 2015 +0000
- Revision:
- 1:71ca050c4d05
- Parent:
- 0:c74b212c3cbf
revision 1
;
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:71ca050c4d05 | 12 | // stop=on 1T |
yasuyuki | 0:c74b212c3cbf | 13 | // frame=108ms |
yasuyuki | 0:c74b212c3cbf | 14 | // |
yasuyuki | 1:71ca050c4d05 | 15 | // (2)AEHA 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 | 1:71ca050c4d05 | 29 | // frame=45ms |
yasuyuki | 0:c74b212c3cbf | 30 | // |
yasuyuki | 0:c74b212c3cbf | 31 | // caution: |
yasuyuki | 0:c74b212c3cbf | 32 | // no detecting repeat code, return bits=0; |
yasuyuki | 0:c74b212c3cbf | 33 | // |
yasuyuki | 1:71ca050c4d05 | 34 | // (C)Copyright 2014-2015 All rights reserved by Y.Onodera |
yasuyuki | 0:c74b212c3cbf | 35 | // http://einstlab.web.fc2.com |
yasuyuki | 0:c74b212c3cbf | 36 | //********************** |
yasuyuki | 0:c74b212c3cbf | 37 | |
yasuyuki | 0:c74b212c3cbf | 38 | #include "mbed.h" |
yasuyuki | 0:c74b212c3cbf | 39 | #include "IR.h" |
yasuyuki | 0:c74b212c3cbf | 40 | |
yasuyuki | 1:71ca050c4d05 | 41 | IR::IR (PinName irin, PinName irout) : _irin(irin),_irout(irout){ |
yasuyuki | 0:c74b212c3cbf | 42 | init(); |
yasuyuki | 0:c74b212c3cbf | 43 | } |
yasuyuki | 0:c74b212c3cbf | 44 | |
yasuyuki | 0:c74b212c3cbf | 45 | |
yasuyuki | 0:c74b212c3cbf | 46 | void IR::init() |
yasuyuki | 0:c74b212c3cbf | 47 | { |
yasuyuki | 0:c74b212c3cbf | 48 | _irin.mode(PullUp); |
yasuyuki | 1:71ca050c4d05 | 49 | _irout=0; |
yasuyuki | 0:c74b212c3cbf | 50 | } |
yasuyuki | 0:c74b212c3cbf | 51 | |
yasuyuki | 1:71ca050c4d05 | 52 | unsigned char IR::countHigh(){ |
yasuyuki | 0:c74b212c3cbf | 53 | |
yasuyuki | 0:c74b212c3cbf | 54 | unsigned char i=0; |
yasuyuki | 0:c74b212c3cbf | 55 | |
yasuyuki | 0:c74b212c3cbf | 56 | while(_irin==1); // wait |
yasuyuki | 0:c74b212c3cbf | 57 | |
yasuyuki | 0:c74b212c3cbf | 58 | while(_irin==0){ |
yasuyuki | 0:c74b212c3cbf | 59 | ++i; |
yasuyuki | 0:c74b212c3cbf | 60 | wait_us(26); |
yasuyuki | 0:c74b212c3cbf | 61 | wait_us(26); |
yasuyuki | 1:71ca050c4d05 | 62 | if(i==0) return 0; // timeout |
yasuyuki | 0:c74b212c3cbf | 63 | } |
yasuyuki | 0:c74b212c3cbf | 64 | // NEC:i=19*8=152, i*2*26.5us=8056us |
yasuyuki | 1:71ca050c4d05 | 65 | // AEHA:i=19*4=76, i*2*26.5us=4028us |
yasuyuki | 0:c74b212c3cbf | 66 | // 1T:i=19*1=19 |
yasuyuki | 0:c74b212c3cbf | 67 | |
yasuyuki | 0:c74b212c3cbf | 68 | return i; |
yasuyuki | 0:c74b212c3cbf | 69 | |
yasuyuki | 0:c74b212c3cbf | 70 | } |
yasuyuki | 0:c74b212c3cbf | 71 | |
yasuyuki | 0:c74b212c3cbf | 72 | |
yasuyuki | 1:71ca050c4d05 | 73 | unsigned char IR::countLow(){ |
yasuyuki | 0:c74b212c3cbf | 74 | |
yasuyuki | 0:c74b212c3cbf | 75 | unsigned char i=0; |
yasuyuki | 0:c74b212c3cbf | 76 | |
yasuyuki | 0:c74b212c3cbf | 77 | while(_irin==0); // wait |
yasuyuki | 0:c74b212c3cbf | 78 | |
yasuyuki | 0:c74b212c3cbf | 79 | while(_irin==1){ |
yasuyuki | 0:c74b212c3cbf | 80 | ++i; |
yasuyuki | 0:c74b212c3cbf | 81 | wait_us(26); |
yasuyuki | 1:71ca050c4d05 | 82 | if(i==0) return 0; // timeout |
yasuyuki | 0:c74b212c3cbf | 83 | } |
yasuyuki | 0:c74b212c3cbf | 84 | // NEC:i=19*8=152, i*26.5us=4028us |
yasuyuki | 1:71ca050c4d05 | 85 | // AEHA:i=19*4=76, i*26.5us=2014us |
yasuyuki | 0:c74b212c3cbf | 86 | // 1T:i=19*1=19 |
yasuyuki | 0:c74b212c3cbf | 87 | // 3T:i=19*3=57 |
yasuyuki | 0:c74b212c3cbf | 88 | |
yasuyuki | 0:c74b212c3cbf | 89 | return i; |
yasuyuki | 0:c74b212c3cbf | 90 | |
yasuyuki | 0:c74b212c3cbf | 91 | } |
yasuyuki | 0:c74b212c3cbf | 92 | |
yasuyuki | 0:c74b212c3cbf | 93 | |
yasuyuki | 1:71ca050c4d05 | 94 | void IR::getIR2(){ |
yasuyuki | 0:c74b212c3cbf | 95 | |
yasuyuki | 1:71ca050c4d05 | 96 | unsigned char i; |
yasuyuki | 1:71ca050c4d05 | 97 | unsigned short j; // capable 32768 bits = 4096 bytes |
yasuyuki | 0:c74b212c3cbf | 98 | unsigned char k; |
yasuyuki | 0:c74b212c3cbf | 99 | |
yasuyuki | 0:c74b212c3cbf | 100 | bits=0; |
yasuyuki | 1:71ca050c4d05 | 101 | for(j=0;j<IR_LIMITS;j++){ // buffer bytes LIMITS |
yasuyuki | 1:71ca050c4d05 | 102 | for(i=0;i<8;i++){ // 8 bits |
yasuyuki | 1:71ca050c4d05 | 103 | k = countHigh()*2; |
yasuyuki | 0:c74b212c3cbf | 104 | if(mode==3){ |
yasuyuki | 0:c74b212c3cbf | 105 | buf[j]>>=1; |
yasuyuki | 0:c74b212c3cbf | 106 | // Threschold = 35, 23 = 1T, 46 = 2T; for SONY |
yasuyuki | 0:c74b212c3cbf | 107 | buf[j]+=((k>30) ? 0x80: 0); |
yasuyuki | 0:c74b212c3cbf | 108 | ++bits; |
yasuyuki | 0:c74b212c3cbf | 109 | } |
yasuyuki | 1:71ca050c4d05 | 110 | k = countLow(); |
yasuyuki | 0:c74b212c3cbf | 111 | if(k==0){ |
yasuyuki | 0:c74b212c3cbf | 112 | buf[j]>>=(8-i); |
yasuyuki | 0:c74b212c3cbf | 113 | return; |
yasuyuki | 0:c74b212c3cbf | 114 | } |
yasuyuki | 0:c74b212c3cbf | 115 | if(mode!=3){ |
yasuyuki | 0:c74b212c3cbf | 116 | buf[j]>>=1; |
yasuyuki | 0:c74b212c3cbf | 117 | // Threschold = 38, 19 = 1T, 57 = 3T; for NEC |
yasuyuki | 1:71ca050c4d05 | 118 | // Threschold = 30, 15 = 1T, 45 = 3T; for AEHA |
yasuyuki | 0:c74b212c3cbf | 119 | buf[j]+=((k>30) ? 0x80: 0); |
yasuyuki | 0:c74b212c3cbf | 120 | ++bits; |
yasuyuki | 0:c74b212c3cbf | 121 | } |
yasuyuki | 0:c74b212c3cbf | 122 | } |
yasuyuki | 0:c74b212c3cbf | 123 | } |
yasuyuki | 0:c74b212c3cbf | 124 | |
yasuyuki | 0:c74b212c3cbf | 125 | } |
yasuyuki | 0:c74b212c3cbf | 126 | |
yasuyuki | 0:c74b212c3cbf | 127 | |
yasuyuki | 1:71ca050c4d05 | 128 | void IR::getIR(){ |
yasuyuki | 0:c74b212c3cbf | 129 | |
yasuyuki | 0:c74b212c3cbf | 130 | unsigned char i; |
yasuyuki | 0:c74b212c3cbf | 131 | |
yasuyuki | 1:71ca050c4d05 | 132 | i = countHigh(); // Start |
yasuyuki | 0:c74b212c3cbf | 133 | mode=0; |
yasuyuki | 0:c74b212c3cbf | 134 | if(40<i){ |
yasuyuki | 0:c74b212c3cbf | 135 | if(i<51){ |
yasuyuki | 0:c74b212c3cbf | 136 | mode=3; // SONY, 46 |
yasuyuki | 0:c74b212c3cbf | 137 | }else{ |
yasuyuki | 0:c74b212c3cbf | 138 | if(100<i){ |
yasuyuki | 0:c74b212c3cbf | 139 | mode=1; // NEC, 173 |
yasuyuki | 0:c74b212c3cbf | 140 | }else{ |
yasuyuki | 1:71ca050c4d05 | 141 | mode=2; // AEHA, 54-77 |
yasuyuki | 0:c74b212c3cbf | 142 | } |
yasuyuki | 0:c74b212c3cbf | 143 | } |
yasuyuki | 1:71ca050c4d05 | 144 | i = countLow(); |
yasuyuki | 1:71ca050c4d05 | 145 | getIR2(); |
yasuyuki | 0:c74b212c3cbf | 146 | } |
yasuyuki | 0:c74b212c3cbf | 147 | |
yasuyuki | 0:c74b212c3cbf | 148 | } |
yasuyuki | 1:71ca050c4d05 | 149 | |
yasuyuki | 1:71ca050c4d05 | 150 | |
yasuyuki | 1:71ca050c4d05 | 151 | // out ON with 38KHz |
yasuyuki | 1:71ca050c4d05 | 152 | void IR::outON(char n, char t) |
yasuyuki | 1:71ca050c4d05 | 153 | { |
yasuyuki | 1:71ca050c4d05 | 154 | |
yasuyuki | 1:71ca050c4d05 | 155 | unsigned char i,j; |
yasuyuki | 1:71ca050c4d05 | 156 | |
yasuyuki | 1:71ca050c4d05 | 157 | for(j=0;j<t;j++){ |
yasuyuki | 1:71ca050c4d05 | 158 | for(i=0;i<n;i++){ |
yasuyuki | 1:71ca050c4d05 | 159 | // 38KHz, 1/3duty |
yasuyuki | 1:71ca050c4d05 | 160 | _irout=1; // LED ON=8.6ms |
yasuyuki | 1:71ca050c4d05 | 161 | wait_us(6); |
yasuyuki | 1:71ca050c4d05 | 162 | _irout=0; // LED OFF=17.4ms |
yasuyuki | 1:71ca050c4d05 | 163 | wait_us(15); |
yasuyuki | 1:71ca050c4d05 | 164 | } |
yasuyuki | 1:71ca050c4d05 | 165 | } |
yasuyuki | 1:71ca050c4d05 | 166 | |
yasuyuki | 1:71ca050c4d05 | 167 | } |
yasuyuki | 1:71ca050c4d05 | 168 | |
yasuyuki | 1:71ca050c4d05 | 169 | // out OFF without 38KHz |
yasuyuki | 1:71ca050c4d05 | 170 | void IR::outOFF(char n, char t) |
yasuyuki | 1:71ca050c4d05 | 171 | { |
yasuyuki | 1:71ca050c4d05 | 172 | |
yasuyuki | 1:71ca050c4d05 | 173 | unsigned char i,j; |
yasuyuki | 1:71ca050c4d05 | 174 | |
yasuyuki | 1:71ca050c4d05 | 175 | for(j=0;j<t;j++){ |
yasuyuki | 1:71ca050c4d05 | 176 | for(i=0;i<n;i++){ |
yasuyuki | 1:71ca050c4d05 | 177 | // 38KHz, 1/3duty |
yasuyuki | 1:71ca050c4d05 | 178 | _irout=0; // LED OFF |
yasuyuki | 1:71ca050c4d05 | 179 | wait_us(6); |
yasuyuki | 1:71ca050c4d05 | 180 | _irout=0; // LED OFF |
yasuyuki | 1:71ca050c4d05 | 181 | wait_us(15); |
yasuyuki | 1:71ca050c4d05 | 182 | } |
yasuyuki | 1:71ca050c4d05 | 183 | } |
yasuyuki | 1:71ca050c4d05 | 184 | |
yasuyuki | 1:71ca050c4d05 | 185 | } |
yasuyuki | 1:71ca050c4d05 | 186 | |
yasuyuki | 1:71ca050c4d05 | 187 | |
yasuyuki | 1:71ca050c4d05 | 188 | void IR::setIR() |
yasuyuki | 1:71ca050c4d05 | 189 | { |
yasuyuki | 1:71ca050c4d05 | 190 | |
yasuyuki | 1:71ca050c4d05 | 191 | unsigned char j,t; |
yasuyuki | 1:71ca050c4d05 | 192 | unsigned short i,n; |
yasuyuki | 1:71ca050c4d05 | 193 | |
yasuyuki | 1:71ca050c4d05 | 194 | if(bits==0)return; // no data |
yasuyuki | 1:71ca050c4d05 | 195 | |
yasuyuki | 1:71ca050c4d05 | 196 | // reader |
yasuyuki | 1:71ca050c4d05 | 197 | switch(mode){ |
yasuyuki | 1:71ca050c4d05 | 198 | case 1: |
yasuyuki | 1:71ca050c4d05 | 199 | if(bits!=32)return; |
yasuyuki | 1:71ca050c4d05 | 200 | outON(NEC,16); // ON(16T) |
yasuyuki | 1:71ca050c4d05 | 201 | outOFF(NEC,8); // OFF(8T) |
yasuyuki | 1:71ca050c4d05 | 202 | t=16+8; |
yasuyuki | 1:71ca050c4d05 | 203 | break; |
yasuyuki | 1:71ca050c4d05 | 204 | case 2: |
yasuyuki | 1:71ca050c4d05 | 205 | if(bits>IR_LIMITS*8)return; |
yasuyuki | 1:71ca050c4d05 | 206 | outON(AEHA,8); // ON(8T) |
yasuyuki | 1:71ca050c4d05 | 207 | outOFF(AEHA,4); // OFF(4T) |
yasuyuki | 1:71ca050c4d05 | 208 | t=8+4; |
yasuyuki | 1:71ca050c4d05 | 209 | break; |
yasuyuki | 1:71ca050c4d05 | 210 | case 3: |
yasuyuki | 1:71ca050c4d05 | 211 | if(!(bits==12 || bits==15 || bits==20))return; |
yasuyuki | 1:71ca050c4d05 | 212 | outON(SONY,4); // ON(4T) |
yasuyuki | 1:71ca050c4d05 | 213 | t=4; |
yasuyuki | 1:71ca050c4d05 | 214 | break; |
yasuyuki | 1:71ca050c4d05 | 215 | } |
yasuyuki | 1:71ca050c4d05 | 216 | |
yasuyuki | 1:71ca050c4d05 | 217 | // data |
yasuyuki | 1:71ca050c4d05 | 218 | switch(mode){ |
yasuyuki | 1:71ca050c4d05 | 219 | case 1: |
yasuyuki | 1:71ca050c4d05 | 220 | for(i=0;i<4;i++){ |
yasuyuki | 1:71ca050c4d05 | 221 | for(j=0;j<8;j++){ |
yasuyuki | 1:71ca050c4d05 | 222 | if(buf[i] & (0x1<<j)){ |
yasuyuki | 1:71ca050c4d05 | 223 | outON(NEC,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 224 | outOFF(NEC,3); // OFF(3T) |
yasuyuki | 1:71ca050c4d05 | 225 | t+=4; |
yasuyuki | 1:71ca050c4d05 | 226 | }else{ |
yasuyuki | 1:71ca050c4d05 | 227 | outON(NEC,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 228 | outOFF(NEC,1); // OFF(1T) |
yasuyuki | 1:71ca050c4d05 | 229 | t+=2; |
yasuyuki | 1:71ca050c4d05 | 230 | } |
yasuyuki | 1:71ca050c4d05 | 231 | } |
yasuyuki | 1:71ca050c4d05 | 232 | } |
yasuyuki | 1:71ca050c4d05 | 233 | break; |
yasuyuki | 1:71ca050c4d05 | 234 | case 2: |
yasuyuki | 1:71ca050c4d05 | 235 | i=0; |
yasuyuki | 1:71ca050c4d05 | 236 | n=0; |
yasuyuki | 1:71ca050c4d05 | 237 | do{ |
yasuyuki | 1:71ca050c4d05 | 238 | for(j=0;j<8;j++){ |
yasuyuki | 1:71ca050c4d05 | 239 | if(buf[i] & (0x1<<j)){ |
yasuyuki | 1:71ca050c4d05 | 240 | outON(AEHA,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 241 | outOFF(AEHA,3); // OFF(3T) |
yasuyuki | 1:71ca050c4d05 | 242 | t+=4; |
yasuyuki | 1:71ca050c4d05 | 243 | }else{ |
yasuyuki | 1:71ca050c4d05 | 244 | outON(AEHA,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 245 | outOFF(AEHA,1); // OFF(1T) |
yasuyuki | 1:71ca050c4d05 | 246 | t+=2; |
yasuyuki | 1:71ca050c4d05 | 247 | } |
yasuyuki | 1:71ca050c4d05 | 248 | if(++n == bits)break; |
yasuyuki | 1:71ca050c4d05 | 249 | } |
yasuyuki | 1:71ca050c4d05 | 250 | ++i; |
yasuyuki | 1:71ca050c4d05 | 251 | }while(n < bits && i<IR_LIMITS); |
yasuyuki | 1:71ca050c4d05 | 252 | break; |
yasuyuki | 1:71ca050c4d05 | 253 | case 3: |
yasuyuki | 1:71ca050c4d05 | 254 | i=0; |
yasuyuki | 1:71ca050c4d05 | 255 | n=0; |
yasuyuki | 1:71ca050c4d05 | 256 | do{ |
yasuyuki | 1:71ca050c4d05 | 257 | for(j=0;j<8;j++){ |
yasuyuki | 1:71ca050c4d05 | 258 | if(buf[i] & (0x1<<j)){ |
yasuyuki | 1:71ca050c4d05 | 259 | outOFF(SONY,1); // OFF(1T) |
yasuyuki | 1:71ca050c4d05 | 260 | outON(SONY,2); // ON(2T) |
yasuyuki | 1:71ca050c4d05 | 261 | t+=3; |
yasuyuki | 1:71ca050c4d05 | 262 | }else{ |
yasuyuki | 1:71ca050c4d05 | 263 | outOFF(SONY,1); // OFF(1T) |
yasuyuki | 1:71ca050c4d05 | 264 | outON(SONY,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 265 | t+=2; |
yasuyuki | 1:71ca050c4d05 | 266 | } |
yasuyuki | 1:71ca050c4d05 | 267 | if(++n == bits)break; |
yasuyuki | 1:71ca050c4d05 | 268 | } |
yasuyuki | 1:71ca050c4d05 | 269 | ++i; |
yasuyuki | 1:71ca050c4d05 | 270 | }while(n < bits && i<IR_LIMITS); |
yasuyuki | 1:71ca050c4d05 | 271 | break; |
yasuyuki | 1:71ca050c4d05 | 272 | } |
yasuyuki | 1:71ca050c4d05 | 273 | |
yasuyuki | 1:71ca050c4d05 | 274 | // stop |
yasuyuki | 1:71ca050c4d05 | 275 | switch(mode){ |
yasuyuki | 1:71ca050c4d05 | 276 | case 1: |
yasuyuki | 1:71ca050c4d05 | 277 | t=192-t; |
yasuyuki | 1:71ca050c4d05 | 278 | outON(NEC,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 279 | outOFF(NEC,t); // frame=108ms=192T |
yasuyuki | 1:71ca050c4d05 | 280 | break; |
yasuyuki | 1:71ca050c4d05 | 281 | case 2: |
yasuyuki | 1:71ca050c4d05 | 282 | outON(AEHA,1); // ON(1T) |
yasuyuki | 1:71ca050c4d05 | 283 | outOFF(AEHA,16); // 8ms=16T |
yasuyuki | 1:71ca050c4d05 | 284 | break; |
yasuyuki | 1:71ca050c4d05 | 285 | case 3: |
yasuyuki | 1:71ca050c4d05 | 286 | t=75-t; |
yasuyuki | 1:71ca050c4d05 | 287 | outOFF(SONY,t); // frame=45ms=75T |
yasuyuki | 1:71ca050c4d05 | 288 | break; |
yasuyuki | 1:71ca050c4d05 | 289 | } |
yasuyuki | 1:71ca050c4d05 | 290 | |
yasuyuki | 1:71ca050c4d05 | 291 | } |
yasuyuki | 1:71ca050c4d05 | 292 | |
yasuyuki | 1:71ca050c4d05 | 293 |