Infrared Rays library

Dependents:   mbed_IR

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

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?

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 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