program_BlockPIL //{Ping,Ir,Lines} Sensor

Dependencies:   mbed HMC6352

Files at this revision

API Documentation at this revision

Comitter:
ryuna
Date:
Sat Feb 22 07:05:09 2014 +0000
Child:
1:3ecb80796a7f
Commit message:
Program_program_BlockPIL

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Feb 22 07:05:09 2014 +0000
@@ -0,0 +1,177 @@
+#include "mbed.h"
+/*PING DEFINE */
+#define ERROR_PING 0xFFF
+#define ALL_PING 4
+/*IR DEFINE*/
+#define BREAKPT_IR 833
+#define ERROR_IR 0xFFF
+#define ALL_IR 10
+//#define OVERLINE_IR 46
+/*LINE DEFINE*/
+#define JUDGEVOL_LINE 0.8
+#define ALL_LINE 4
+//OTHERS
+#define ALL_KIND 3 //kind of sensors
+#define MAX_NUM 10 //sensors most number
+/*
+Ping , IrSensor , LineSensor
+*/
+
+//LINE sensor is float value 
+Serial pc(USBTX,USBRX);
+Timer time_ping;
+Timer time_ir; 
+
+PinName num_ping[ALL_PING] = {p5,p6,p7,p8};
+PinName num_ir[ALL_IR] = {p21,p22,p23,p24,p25,p26,p27,p28,p29,p30};
+PinName num_line[ALL_LINE] = {p17,p18,p19,p20};
+
+enum sensors{Ping,Ir,Line};
+volatile unsigned int value_ping[ALL_PING] = {0};
+volatile unsigned int value_ir[ALL_IR] = {0};
+volatile float value_line[ALL_LINE] = {0};
+DigitalOut myled(LED1);
+
+unsigned int moving_ave(enum sensors kind,int num, unsigned int data){
+    static unsigned int sum[ALL_KIND][MAX_NUM] = {0};
+    static unsigned int temp[ALL_KIND][MAX_NUM][10] = {0};
+    //static unsigned int ave[MAX_NUM] = {0};
+    sum[kind][num] -= temp[kind][num][9];
+    sum[kind][num] += data;
+    temp[kind][num][9] = temp[kind][num][8];
+    temp[kind][num][8] = temp[kind][num][7];
+    temp[kind][num][7] = temp[kind][num][6];
+    temp[kind][num][6] = temp[kind][num][5];
+    temp[kind][num][5] = temp[kind][num][4];
+    temp[kind][num][4] = temp[kind][num][3];
+    temp[kind][num][3] = temp[kind][num][2];
+    temp[kind][num][2] = temp[kind][num][1];
+    temp[kind][num][1] = temp[kind][num][0];
+    temp[kind][num][0] = data;
+    //ave[kind][num] = sum[kind][num]/100;
+    
+    switch (kind) {
+        case Ping: 
+            value_ping[num] = sum[kind][num]/10;
+            break;
+        case Ir:
+            value_ir[num] = sum[kind][num]/100;
+            break;
+        case Line:
+            value_line[num] = sum[kind][num]/10000.0;
+            break;
+        default :
+            break;
+    }
+
+    return sum[kind][num];//return no config sum
+       
+}
+unsigned int ping_function (int num){
+    DigitalInOut sensor_ping(num_ping[num]);
+    unsigned int memory = 0;//return value
+    time_ping.reset();
+    /*make a pulse */
+    sensor_ping.output();
+    sensor_ping = 1;
+    wait_us(5);
+    sensor_ping = 0;
+    sensor_ping.input();
+    /*finish,and start timer*/
+    time_ping.start();
+    while(!sensor_ping){
+        if(time_ping.read_ms() > 1){
+            time_ping.stop();
+            return ERROR_PING;
+        }
+    }
+    time_ping.reset();
+    while(sensor_ping){
+        if(time_ping.read_ms() >18.5){
+            time_ping.stop();
+            return ERROR_PING;
+        }
+    }
+    memory = time_ping.read_us();
+    time_ping.stop();
+    
+    return memory;
+}
+unsigned int ir_function (int num){
+    DigitalIn sensor_ir(num_ir[num]);
+    int flag = 0;
+    unsigned int memory = 0;
+    unsigned int temp = 0;   
+    flag = 1;
+    time_ir.start();
+    if((sensor_ir)){
+        while((sensor_ir)){
+            if(time_ir.read_us() >= BREAKPT_IR){
+                flag = 0;
+                break;
+            }
+        }
+    }
+    time_ir.stop();
+    time_ir.reset();
+    if(flag){
+        time_ir.start();
+        while(!sensor_ir){//!
+            if(time_ir.read_us() >= BREAKPT_IR){
+                break;
+            }
+        }
+        memory = time_ir.read_us();
+        while(1){
+            if(!sensor_ir){
+                temp = (time_ir.read_us() - memory);
+                time_ir.stop();
+                time_ir.reset();
+                wait(0.01);
+                return temp;
+            }
+        }
+    }else{//not found
+    }
+    time_ir.stop();
+    time_ir.reset();
+    return ERROR_IR;
+}
+int line_function(int num){
+    float memory = 0;
+    AnalogIn sensor_line(num_line[num]);
+    memory = sensor_line;
+    return (int)(memory*1000);
+
+}
+int main() {
+    //enum sensors kinds;
+    int num[ALL_KIND] = {0};
+    unsigned int value1[ALL_PING] = {0};
+    unsigned int value2[ALL_IR] = {0};
+    float value3[ALL_LINE] = {0};
+    while(1) {
+        //value1[num[Ping]] = moving_ave(Ping,num[Ping],ping_function(num[Ping]))/10;
+        value2[num[Ir]]   = moving_ave(Ir,num[Ir],ir_function(num[Ir]))/100;
+        //value3[num[Line]]= moving_ave(Line,num[Line],line_function(num[Line]))/10000.0;
+        //pc.printf("value1[%d]=%d ",num[Ping], value1[num[Ping]]);
+        pc.printf("value2[%d]=%d ",num[Ir], value2[num[Ir]]);
+        //pc.printf("value3[%d]=%lf ",num[Line], value3[num[Line]]);
+        num[Ping]++;
+        num[Ir]++;
+        num[Line]++;        
+        if(num[Ping]>= ALL_PING){
+            num[Ping] = 0; 
+            //putchar('\n');
+        }
+        if(num[Ir]>= ALL_IR){
+            num[Ir] = 0;
+            putchar('\n');
+        }
+        if(num[Line]>= ALL_LINE){
+            num[Line] = 0;
+            //putchar('\n');
+        }
+        
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Feb 22 07:05:09 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file