Infrared Rays library
See http://developer.mbed.org/users/yasuyuki/notebook/IRmbed/
Revision 0:c74b212c3cbf, committed 2014-06-26
- Comitter:
- yasuyuki
- Date:
- Thu Jun 26 13:56:36 2014 +0000
- Child:
- 1:71ca050c4d05
- Commit message:
- first revision
Changed in this revision
| IR.cpp | Show annotated file Show diff for this revision Revisions of this file |
| IR.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IR.cpp Thu Jun 26 13:56:36 2014 +0000
@@ -0,0 +1,145 @@
+//**********************
+// IR.cpp for mbed
+//
+// IR ir(P0_12);
+//
+// (1)NEC format
+// IR carrier=38KHz
+// Time unit=0.56ms
+// logical 0 = on 1T + off 1T
+// logical 1 = on 1T + off 3T
+// reader=on 16T + off 8T
+// stop=on 1T + 8ms
+// frame=108ms
+//
+// (2)Standard IR format
+// IR carrier=33 - 40KHz
+// Time unit=0.35 - 0.50ms
+// logical 0 = on 1T + off 1T
+// logical 1 = on 1T + off 3T
+// reader=on 8T + off 4T
+// trailer=on 1T + 8ms
+//
+// (3)SONY format
+// IR carrier=40KHz
+// Time unit=0.6ms
+// logical 0 = off 1T + on 1T
+// logical 1 = off 1T + on 2T
+// reader=on 4T
+//
+// caution:
+// no detecting repeat code, return bits=0;
+//
+// (C)Copyright 2014 All rights reserved by Y.Onodera
+// http://einstlab.web.fc2.com
+//**********************
+
+#include "mbed.h"
+#include "IR.h"
+
+IR::IR (PinName irin) : _irin(irin){
+ init();
+}
+
+
+void IR::init()
+{
+ _irin.mode(PullUp);
+}
+
+unsigned char IR::CountHigh(){
+
+ unsigned char i=0;
+
+ while(_irin==1); // wait
+
+ while(_irin==0){
+ ++i;
+ wait_us(26);
+ wait_us(26);
+ if(i==0) return 0;
+ }
+ // NEC:i=19*8=152, i*2*26.5us=8056us
+ // STD:i=19*4=76, i*2*26.5us=4028us
+ // 1T:i=19*1=19
+
+ return i;
+
+}
+
+
+unsigned char IR::CountLow(){
+
+ unsigned char i=0;
+
+ while(_irin==0); // wait
+
+ while(_irin==1){
+ ++i;
+ wait_us(26);
+ if(i==0) return 0;
+ }
+ // NEC:i=19*8=152, i*26.5us=4028us
+ // STD:i=19*4=76, i*26.5us=2014us
+ // 1T:i=19*1=19
+ // 3T:i=19*3=57
+
+ return i;
+
+}
+
+
+void IR::GetIR2(){
+
+ unsigned char i,j;
+ unsigned char k;
+
+ bits=0;
+ for(j=0;j<16;j++){
+ for(i=0;i<8;i++){
+ k = CountHigh()*2;
+ if(mode==3){
+ buf[j]>>=1;
+ // Threschold = 35, 23 = 1T, 46 = 2T; for SONY
+ buf[j]+=((k>30) ? 0x80: 0);
+ ++bits;
+ }
+ k = CountLow();
+ if(k==0){
+ buf[j]>>=(8-i);
+ return;
+ }
+ if(mode!=3){
+ buf[j]>>=1;
+ // Threschold = 38, 19 = 1T, 57 = 3T; for NEC
+ // Threschold = 30, 15 = 1T, 45 = 3T; for STD
+ buf[j]+=((k>30) ? 0x80: 0);
+ ++bits;
+ }
+ }
+ }
+
+}
+
+
+void IR::GetIR(){
+
+ unsigned char i;
+
+ i = CountHigh(); // Start
+ mode=0;
+ if(40<i){
+ if(i<51){
+ mode=3; // SONY, 46
+ }else{
+ if(100<i){
+ mode=1; // NEC, 173
+ }else{
+ mode=2; // STD, 54-77
+ }
+ }
+ i = CountLow();
+ GetIR2();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IR.h Thu Jun 26 13:56:36 2014 +0000
@@ -0,0 +1,34 @@
+//**********************
+// IR.h for mbed
+//
+// (C)Copyright 2014 All rights reserved by Y.Onodera
+// http://einstlab.web.fc2.com
+//**********************
+
+#ifndef IR_H_
+#define IR_H_
+
+#include "mbed.h"
+
+class IR{
+public:
+ IR (PinName irin);
+ void init();
+
+ unsigned char CountHigh();
+ unsigned char CountLow();
+ void GetIR2();
+ void GetIR();
+
+ unsigned char buf[16]; // max 128bits
+ unsigned char mode; // 0:NEC, 1:STD
+ unsigned char bits;
+
+protected:
+
+ DigitalIn _irin;
+
+};
+
+
+#endif /* IR_H_ */