右側のほうのセンサLPC1114FN28

Dependencies:   IRM2121 Ping interruptin_mod mbed

右側(仮)のセンサデータ処理等を行うプログラム

まだまだ改良の余地ありり.

Revision:
0:182437c14483
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Dec 06 07:42:33 2014 +0000
@@ -0,0 +1,141 @@
+/*
+メインと通信するLPC1114のプログラム()
+
+現在は両方がmainと通信します.
+
+
+*/
+
+#include "mbed.h"
+
+#define SYSAHBCLKDIV_Val      0x00000001        // Reset: 0x001
+#define CLOCK_SETUP           1                  // デフォルト=1
+#define SYSPLLCTRL_Val        0x00000023        // デフォルト=23 Reset: 0x000
+#define SYSPLLCLKSEL_Val      0x00000001        // デフォルト=0  Reset: 0x000
+#define MAINCLKSEL_Val        0x00000003        // デフォルト=3  Reset: 0x000
+
+#include "IRM2121.h"
+#include "Ping.h"
+
+#define PING_COUNT 5 //5回に1回にPing処理
+#define LINE_LINE 0.45 //すごく雑 
+
+IRM2121 Ir[6] = {dp17,dp18,dp24,dp25,dp26,dp28};
+Ping Ping1(dp1,dp2);
+Ping Ping2(dp4,dp6); 
+AnalogIn Line[4] ={dp9,dp10,dp11,dp13};
+DigitalOut Led(LED1);
+
+I2CSlave Mbed(dp5,dp27);//sda,scl
+Serial pc(USBTX,USBRX);
+
+
+uint8_t IrMovig_ave(uint8_t num, int data){
+    static unsigned int sum[6];
+    static unsigned temp[6][5];
+    
+    sum[num] -= temp[num][4]; 
+    sum[num] += data;
+    
+    temp[num][4] = temp[num][3];
+    temp[num][3] = temp[num][2];
+    temp[num][2] = temp[num][1];
+    temp[num][1] = temp[num][0];
+    temp[num][0] = data;
+    
+    return  sum[data]/5;   
+}
+
+
+
+void ResetSet(uint8_t *PingCk){
+
+    Led = 1;//周回の初め    
+    PingCk ++;
+
+}
+
+
+
+int main() {
+    
+    //default Mbed.frequency();
+    Mbed.address(0x0A);
+    /*Data*/
+    uint8_t IrMemory[6] = {0};//IRのデータ保管
+    uint8_t PingMemory[2] = {0};
+    unsigned int LineMemory[4] = {0};
+    
+    /*Flag*/
+    uint8_t LineFlag;//配置 - - - - Line[3] Line[2] Line[1] Line[0]
+    
+    /*Count*/
+    uint8_t PingCk = 0;
+    
+    /* I2Cdata*/
+    char SendData[9]={0};
+
+    while(1) {
+        
+        ResetSet(&PingCk);
+        Ir[0].Set();
+        Ir[1].Set();
+        Ir[2].Set();
+        Ir[3].Set();
+        Ir[4].Set();
+        Ir[5].Set();
+        
+        wait_ms(30);//wait値は最適値を探す必要がある.
+        
+        IrMemory[0] = IrMovig_ave(0,Ir[0].Read());
+        IrMemory[1] = IrMovig_ave(1,Ir[1].Read());
+        IrMemory[2] = IrMovig_ave(2,Ir[2].Read());
+        IrMemory[3] = IrMovig_ave(3,Ir[3].Read());
+        IrMemory[4] = IrMovig_ave(4,Ir[4].Read());
+        IrMemory[5] = IrMovig_ave(5,Ir[5].Read());
+        
+        /*大きい二つだけでいい気がする.*/
+        if(PingCk >= PING_COUNT){
+            Ping1.Send();
+            Ping2.Send();    
+            wait_ms(30);
+            PingMemory[0] = Ping1.Read_cm();
+            PingMemory[1] = Ping2.Read_cm();
+            PingCk = 0;
+        }
+        
+        LineMemory[0] = Line[0];
+        LineMemory[1] = Line[1];
+        LineMemory[2] = Line[2];
+        LineMemory[3] = Line[3];
+        
+        LineFlag = ((int)(LineMemory[3]+LINE_LINE))*8 +
+                   ((int)(LineMemory[2]+LINE_LINE))*4 +
+                   ((int)(LineMemory[1]+LINE_LINE))*2 +
+                   ((int)(LineMemory[0]+LINE_LINE))*1;
+           
+        SendData[0] = (char)IrMemory[0];
+        SendData[1] = (char)IrMemory[1];
+        SendData[2] = (char)IrMemory[2];
+        SendData[3] = (char)IrMemory[3];
+        SendData[4] = (char)IrMemory[4];
+        SendData[5] = (char)IrMemory[5];
+        SendData[6] = (char)PingMemory[0];
+        SendData[7] = (char)PingMemory[1];
+        SendData[8] = (char)LineFlag;
+        
+        switch(Mbed.receive()){    
+            case I2CSlave::ReadAddressed:
+                 Mbed.write(SendData, 9); // Includes null char
+                 break;
+             case I2CSlave::WriteGeneral:
+                 break;
+             case I2CSlave::WriteAddressed:
+                 break;
+        
+        }
+    
+        Led = 0;
+    
+    }
+}