demo

Dependencies:   mbed

Revision:
0:b0c572636fc2
Child:
1:552a34826f55
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Aug 15 04:22:20 2016 +0000
@@ -0,0 +1,401 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mbed.h"
+//#include "ble/BLE.h"
+//#include "ble/services/iBeacon.h"
+//#include "ble/services/UARTService.h"
+
+DigitalOut  led1(LED1, 1);
+DigitalOut  DIR_L(p25);
+DigitalOut  PWM_L(p23);
+DigitalOut  DIR_R(p28);
+DigitalOut  PWM_R(p24);
+
+//// Sensor
+#define NOISE 5
+//#define DEBUG
+
+#ifdef DEBUG
+Serial      pc(p10, p11);
+#endif
+Ticker      ticker;
+AnalogIn    analog_ir(p1);
+DigitalIn   SEN_UP_R(p2);
+DigitalIn   SEN_UP_L(p3);
+DigitalIn   SEN_DOWN(p4);
+DigitalIn   SEN_IR(p6);
+
+#define ON      0
+#define OFF     1
+#define VREF    3300.0  //mV
+
+//// Motor
+#define STOP    0
+#define UP      1
+#define DOWN    2
+#define LEFT    3
+#define RIGHT   4
+uint8_t     g_time_pwm = 0,     g_pwm_left = 0,     g_pwm_right = 0;
+uint16_t    g_time_led = 0;
+uint8_t     g_sts_car = STOP;
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+ * @param    dir: UP or DOWN; speed: 0-100.
+ * @return   none.
+ */
+void motor_left(uint8_t dir, uint8_t speed)
+{
+    DIR_R = dir;
+    g_pwm_left = speed;
+}
+//////////////////////////////////////////////////
+/*
+ * @param    dir: UP or DOWN; speed: 0-100.
+ * @return   none.
+ */
+void motor_right(uint8_t dir, uint8_t speed)
+{
+    DIR_R = dir;
+    g_pwm_right = speed;
+}
+//////////////////////////////////////////////////
+/*
+ * @param    speed: 0-100.
+ * @return   none.
+ */
+void rotator_left(uint8_t speed)
+{
+    DIR_L = 0;
+    g_pwm_left = speed;
+    DIR_R = 1;
+    g_pwm_right = speed;
+    g_sts_car = LEFT;
+}
+//////////////////////////////////////////////////
+/*
+ * @param    speed: 0-100.
+ * @return   none.
+ */
+void rotator_right(uint8_t speed)
+{
+    DIR_L = 1;
+    g_pwm_left = speed;
+    DIR_R = 0;
+    g_pwm_right = speed;
+    g_sts_car = RIGHT;
+}
+//////////////////////////////////////////////////
+/*
+ * @param    speed_left, speed_right: 0-100.
+ * @return   none.
+ */
+void move_up(uint8_t speed_left, uint8_t speed_right)
+{
+    DIR_L = 0;
+    g_pwm_left = speed_left;
+    DIR_R = 0;
+    g_pwm_right = speed_right;
+    g_sts_car = UP;
+}
+
+void move_around(uint8_t speed_left, uint8_t speed_right)
+{
+    DIR_L = 0;
+    g_pwm_left = speed_left;
+    DIR_R = 0;
+    g_pwm_right = speed_right;
+    g_sts_car = UP;
+}
+
+//////////////////////////////////////////////////
+/*
+ * @param    speed_left, speed_right: 0-100.
+ * @return   none.
+ */
+void move_down(uint8_t speed_left, uint8_t speed_right)
+{
+    DIR_L = 1;
+    g_pwm_left = speed_left;
+    DIR_R = 1;
+    g_pwm_right = speed_right;
+    g_sts_car = DOWN;
+}
+
+void move_left_down (uint8_t speed_left, uint8_t speed_right)
+{
+    DIR_L = 1;
+    g_pwm_left = speed_left;
+    DIR_R = 0;
+    g_pwm_right = speed_right;
+    g_sts_car = DOWN;
+}
+
+void move_right_down (uint8_t speed_left, uint8_t speed_right)
+{
+    DIR_L = 0;
+    g_pwm_left = speed_left;
+    DIR_R = 1;
+    g_pwm_right = speed_right;
+    g_sts_car = DOWN;
+}
+
+//////////////////////////////////////////////////
+//////////////////////////////////////////////////
+/*
+ * @param    none.
+ * @return   Distance (cm), 1-80 cm.
+ */
+uint16_t sensor_ir(void)
+{
+    uint16_t    adc;
+    uint16_t    cm;
+    uint16_t    sensor = 0, i;
+    
+    for(i=0; i<NOISE; i++) {
+        adc = analog_ir.read_u16();
+        adc = 750-adc;
+        if      (adc > 60000) cm = 1;
+        else if (adc > 600) cm = 0;
+        else if (adc > 550) cm = adc/8;
+        else if (adc > 500) cm = adc/10;
+        else if (adc > 450) cm = adc/12;
+        else if (adc > 400) cm = adc/14;
+        else if (adc > 350) cm = adc/16;
+        else if (adc > 300) cm = adc/18;
+        else if (adc > 200) cm = adc/16;
+        else if (adc > 200) cm = adc/14;
+        else if (adc > 150) cm = adc/12;
+        else if (adc > 100) cm = adc/10;
+        else if (adc >  60) cm = adc/9;
+        else if (adc >  30) cm = adc/8;
+        else if (adc >   0) cm = adc/7;
+        
+        wait(0.001);
+        sensor = sensor + cm;
+        if(cm == 0) break;
+        cm = sensor/NOISE;
+    }
+    
+#ifdef DEBUG
+    pc.printf("\r\n %d adc, %d cm", adc, cm);
+#endif
+    return cm;
+}
+
+//////////////////////////////////////////////////
+/*
+ * @param    none.
+ * @return   ON or OFF.
+ */
+uint8_t sensor_ir2(void)
+{
+    uint16_t i, sensor = 0;
+    
+    for(i=0; i<NOISE; i++) {
+        wait(0.001);
+        sensor = sensor + SEN_IR;
+    }
+    if(sensor > NOISE/2)   return OFF;
+    else                   return ON;
+}
+
+//////////////////////////////////////////////////
+/*
+ * @param    none.
+ * @return   ON or OFF.
+ */
+uint8_t sensor_up_left(void)
+{
+    uint16_t i, sensor = 0;
+    
+    for(i=0; i<NOISE; i++) {
+        wait(0.001);
+        sensor = sensor + SEN_UP_L;
+    }
+    if(sensor > NOISE/2)   return OFF;
+    else                   return ON;
+}
+//////////////////////////////////////////////////
+/*
+ * @param    none.
+ * @return   ON or OFF.
+ */
+uint8_t sensor_up_right(void)
+{
+    uint16_t i, sensor = 0;
+    
+    for(i=0; i<NOISE; i++) {
+        wait(0.001);
+        sensor = sensor + SEN_UP_R;
+    }
+    if(sensor > NOISE/2)   return OFF;
+    else                   return ON;
+}
+//////////////////////////////////////////////////
+/*
+ * @param    none.
+ * @return   ON or OFF.
+ */
+uint8_t sensor_down(void)
+{
+    uint16_t i, sensor = 0;
+    
+    for(i=0; i<NOISE; i++) {
+        wait(0.001);
+        sensor = sensor + SEN_DOWN;
+    }
+    if(sensor > NOISE/2)   return OFF;
+    else                   return ON;
+}
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+void periodicCallback(void)
+{
+    if(g_time_pwm < g_pwm_left)    PWM_L = 1; else PWM_L = 0;
+    if(g_time_pwm < g_pwm_right)   PWM_R = 1; else PWM_R = 0;
+    g_time_pwm++; if(g_time_pwm >= 100) {g_time_pwm = 0;}
+    
+    g_time_led++; if(g_time_led >= 1000) {g_time_led = 0; led1 = !led1;}   //DIR_L = !DIR_L; DIR_R = !DIR_R;
+    
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool randomBool() {
+    return rand() % 2 == 1;
+}
+
+int main(void)
+{
+    wait(0.1);
+    //Init Hardware
+    SEN_UP_L.mode(PullUp);
+    SEN_UP_R.mode(PullUp);
+    SEN_DOWN.mode(PullUp);
+    SEN_IR.mode(PullUp);
+    led1 = 1; DIR_L = 0; DIR_R = 0; PWM_L = 0;  PWM_R = 0;
+    //Init interupt Timer
+    ticker.attach(periodicCallback, 0.00015);
+    wait(0.5);
+    uint8_t start = 1;
+    while (true) {
+        uint8_t sen_in = sensor_ir();
+        //if ( (sen_in > 0) && (sen_in < 30) )
+//        {
+//            move_up(100, 100);
+//            while( (sensor_up_left() == ON) && (sensor_up_right() == ON) );
+//            move_down(50, 50);
+//            wait(1);
+//            if ((sensor_up_left() == OFF) && (sensor_up_right() == OFF))
+//            {
+//                move_down(30, 30);
+//                while ((sensor_up_left() == ON) && (sensor_up_right() == ON));
+//                // move_up(50, 50);
+//            }
+//            if ((sensor_up_left() == OFF) && (sensor_down() == OFF))
+//            {
+//                move_left_down(100,100);
+//                while( (sensor_up_left() == ON) && (sensor_down() == ON) );
+//                // move_up(50, 50);
+//            }
+//            if ((sensor_up_right() == OFF) && (sensor_down() == OFF))
+//            {
+//                move_right_down(100,100);
+//                while( (sensor_up_right() == ON) && (sensor_down() == ON));
+//                // move_up(50, 50);
+//            }
+//            if (sensor_up_left() == OFF)
+//            {
+//                move_down(100,30);
+//                while( sensor_up_left() == ON);
+//            }
+//            if (sensor_up_right() == OFF)
+//            {
+//                move_down(30,100);
+//                while( sensor_up_right() == ON);
+//            }
+//            if (sensor_down() == OFF)
+//            {
+//                move_up(100,100);
+//                while( sensor_down() == ON);
+//            }
+//        }
+//        else
+//        {
+//            if (start == 1)
+//            {
+//                start = 0;
+//                move_up(100,65);
+//            }
+//            else
+//            {
+//                rotator_right(20);
+//            }
+//            
+//            while ((sensor_up_left() == OFF) && (sensor_up_right() == OFF))
+//            {
+//                if (randomBool() == 1)
+//                {
+//                    move_up(70,0);
+//                }
+//                else
+//                {
+//                    move_up(0,70);
+//                }
+//                while ((sensor_up_left() == ON) && (sensor_up_right() == ON)) ;
+//                // move_up(50, 50);
+//            }
+//            while ((sensor_up_left() == OFF) && (sensor_down() == OFF))
+//            {
+//                move_right_down(100,100);
+//                while( (sensor_up_left() == ON) && (sensor_down() == ON) );
+//                // move_up(50, 50);
+//            }
+//            while ((sensor_up_right() == OFF) && (sensor_down() == OFF))
+//            {
+//                move_right_down(100,100);
+//                while( (sensor_up_right() == ON) && (sensor_down() == ON));
+//                // move_up(50, 50);
+//            }
+//            while (sensor_up_left() == OFF)
+//            {
+//                move_down(100,30);
+//                while( sensor_up_left() == ON);
+//            }
+//            while (sensor_up_right() == OFF)
+//            {
+//                move_down(30,100);
+//                while( sensor_up_right() == ON);
+//            }
+//            while (sensor_down() == OFF)
+//            {
+//                move_up(100,100);
+//                while( sensor_down() == ON);
+//            }     
+//        }
+        move_up(100, 100);
+        wait(5);
+    }
+}