IR control car "spinner" 赤外線コントロールラジコン"spinner"の本体&プロポ統合版プログラムです

Dependencies:   Motor Propo_RemotoIR mbed

Revision:
0:6825e25b7428
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spinner.cpp	Wed Oct 16 02:45:27 2013 +0000
@@ -0,0 +1,137 @@
+/* spinner base pcb
+ * <use ir propo>
+ *      LPC1114FN28 sony format propo
+ *
+ * <spinner circit>
+ * LPC1114FN28
+ *  dp28 : ir reciver
+ *  dp18,dp17,dp25: (pwm fwd rev) Right motor control
+ *  dp2,dp4,dp6:(pwm fwd rev) Left motor control
+ *
+ *  dp11,dp13,dp14,dp26 (LED1,2,3,4):lookup the ir recive condition
+
+*/
+
+#include "mbed.h"
+#include "Motor.h"
+
+#include "ReceiverIR.h"
+
+#define DBG
+//#define DBG2    // motor dousa kakunin
+
+#ifdef DBG
+Serial pc(dp16, dp15);    //tx,rx
+#endif // DBG
+
+//-----------------------
+// ir Library
+ReceiverIR ir_rx(dp28);
+RemoteIR::Format formatRx;
+uint8_t bufRx[10];    // nomal no is "2".
+int bitcountRx;
+
+DigitalOut led1(dp11);
+DigitalOut led2(dp13);
+DigitalOut led3(dp14);
+DigitalOut led4(dp26);
+
+
+//-----------------------
+// Motor Library
+Motor Right(dp18, dp17, dp25);   // pwm,fwd,rev
+Motor Left(dp2, dp4, dp6);      //  pwm,fwd,rev
+//-----------------------
+
+Timeout timeout;
+
+void isr_timeout(void)
+{
+    Right.speed(0);
+    Left.speed(0);
+
+    timeout.detach();
+    timeout.attach_us(&isr_timeout, 1000 * 1000);
+}
+
+void initialSpinner(void){
+
+    timeout.detach();
+    timeout.attach_us(&isr_timeout, 1000 * 1000);
+
+}
+
+void mainSpinner(void)
+{
+#ifdef DBG
+    pc.baud(9600);
+#endif // DBG
+
+        // IR data Monitor
+        led1 = 0;
+        led2 = 0;
+        led3 = 0;
+        led4 = 0;
+
+        switch(ir_rx.getState()) {
+            case ReceiverIR::Idle:
+                led1 = 1;
+                break;
+            case ReceiverIR::Receiving:
+                led2 = 1;
+                break;
+            case ReceiverIR::Received:
+                led3 = 1;
+                break;
+            default:
+                led4 = 1;
+                break;
+        }
+ 
+        if (ir_rx.getState() == ReceiverIR::Received) {
+            bitcountRx = ir_rx.getData(&formatRx, bufRx, sizeof(bufRx) * 8);
+
+            if((formatRx == RemoteIR::SONY) && (bitcountRx == 16)) {
+
+                timeout.detach();
+                timeout.attach_us(&isr_timeout, 1000 * 1000);
+
+                float xWork = (float)((int8_t)bufRx[0] / 8.0f);
+                float yWork = (float)((int8_t)bufRx[1] / 8.0f);
+                
+                // fukantai (-0.2 - 0.2)
+                if((-0.2 <= xWork) && (xWork <= 0.2)){xWork = 0;}
+                if((-0.2 <= yWork) && (yWork <= 0.2)){yWork = 0;}
+                
+                yWork = -yWork; // sousa wo hanten.
+
+                float r = yWork + (xWork / 2.0);
+                float l = yWork - (xWork / 2.0);
+
+                if(-1.0 > r) {
+                    r = -1.0;
+                }
+                if( 1.0 < r) {
+                    r =  1.0;
+                }
+                if(-1.0 > l) {
+                    l = -1.0;
+                }
+                if( 1.0 < l) {
+                    l =  1.0;
+                }
+
+
+#ifdef DBG
+                pc.printf("x = %02d y = %02d     |xWork = %1.1f yWork = %1.1f       |r = %1.1f l = %1.1f \r\n",(int8_t)bufRx[0],(int8_t)bufRx[1],xWork,yWork,r,l);
+#endif // DBG
+
+                Right.speed(r);
+                Left.speed(-l);
+
+  
+
+            }
+        }
+}
+