Infrared Rays library
See http://developer.mbed.org/users/yasuyuki/notebook/IRmbed/
IR.cpp@0:c74b212c3cbf, 2014-06-26 (annotated)
- 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?
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 | 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 | } |