Blind flap motion emulator using stepper motor. Different input methods are used including Light Dependent Resistors, Bluetooth, Voice command, Hand Gesture, and on-board switches. FRDM-K64F board is used to develop the system.

Revision:
0:b27dea26e7e6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu May 07 02:22:10 2020 +0000
@@ -0,0 +1,450 @@
+#include "mbed.h"
+#include "platform/mbed_thread.h"
+
+//Pin Declaration
+DigitalOut In1(D2); //Connection to In1 of L298N
+DigitalOut In2(D3); //Connection to In2 of L298N
+DigitalOut In3(D4); //Connection to In3 of L298N
+DigitalOut In4(D5); //Connection to In4 of L298N
+DigitalIn SW_Next_State(SW2); // Takes motor to next state, when SW2 is pushed.    PTC6 --> SW2
+DigitalIn SW_Prev_State(SW3); // Takes motor to previous state, when SW2 is pushed.    PTA4 --> SW3
+Serial BT(D1, D0); // Tx, Rx, Baudrate
+AnalogIn LDR1 (PTB2); //Conntection for LDR1 for hand motion reading -->A0
+AnalogIn LDR2 (PTB3); //Conntection for LDR2 for hand motion reading -->A1
+AnalogIn LDR3 (PTB10); // Connection for daylight LDR -->A2
+
+
+//Function Prototyping
+int motor_state_zero();    //Initializes the digital output for L298N input pins
+int motor_state_one();     //Sets L298N input pin configurations to state 1
+int motor_state_two();     //Sets L298N input pin configurations to state 2
+int motor_state_three();     //Sets L298N input pin configurations to state 3
+int motor_state_four();     //Sets L298N input pin configurations to state 4
+void RotateCW_1step();    //Rotates the stepper motor 1 step, clockwise
+void RotateCCW_1step();    //Rotates the stepper motor 1 step, counter-clockwise
+int Retrieve_BT_State(char);    //Gets the Bluetooth state in int data type
+void check_handGesture();    //Retrieve hand gesture
+void check_DayLight();    //Check daylight for automatic actuation
+
+//Global Variable Declaration & Initialization
+int motor_state=0;
+int Desired_Pos=0;
+int Current_Pos=1;
+float wait_delay=0.05;    //wait for 0.05 seconds
+char BT_state;
+char BT_state_current;
+char BT_AutoMode;
+char AutomaticMode;
+float ldr1_reading;
+float ldr2_reading;
+float ldr1_threshold=0.05;    //Threshold value of LDR1 in hand gesture module
+float ldr2_threshold=0.05;    //Threshold value of LDR2 in hand gesture module
+int LDR1_interrupted;
+int LDR2_interrupted;
+
+int main(){
+    // Initialise the digital output for L298N input pins
+    motor_state_zero();
+    BT.printf("Reading data stream...\n\r");
+    BT_state = 'z';
+    BT_state_current;
+    while (BT.readable()==0);
+
+    while(true){
+        while (BT.readable()) {
+            
+            BT_state_current = BT.putc(BT.getc());
+            printf("inside readable. BT_state_current = %c    BT_state = %c\r\n",BT_state_current,BT_state);
+            
+            if (BT_state_current != BT_state){
+                if((BT_state_current == 'x')||(BT_state_current == 'y')){
+                    if(BT_state_current == 'y'){
+                        AutomaticMode=1;
+                    }
+                }
+                else{
+                    printf("%c \r\n", BT_state_current);
+                    BT_state = BT_state_current;
+                    Desired_Pos = Retrieve_BT_State(BT_state);                 
+                }
+            }
+        }
+                        
+                        
+                        
+
+        if (Current_Pos != Desired_Pos){
+            
+            printf("---> Desired Position = %d\r\n", Desired_Pos);
+            printf("---> Current Position = %d\r\n", Current_Pos);
+            
+            while (Current_Pos > Desired_Pos){
+                RotateCCW_1step();    //Rotate CCW 1 step
+                Current_Pos -= 1;    //Decrement of Current_Pos by 1
+                printf("Current Position = %d\r\n", Current_Pos);
+            }
+            
+            while (Current_Pos < Desired_Pos){
+                RotateCW_1step();    //Rotate CW 1 step
+                Current_Pos += 1;    //Increment of Current_POS by 1
+                printf("Current Position = %d\r\n", Current_Pos);
+            }
+        }
+        
+        if ((SW_Next_State != 1) && (Desired_Pos<26)){
+            wait_ms(500);
+            if ((SW_Prev_State != 1) && (SW_Next_State != 1)){
+                printf("Initializing Current Position as Initial Position\r\n");
+                Current_Pos = 1;    //Increment of Current_POS by 1
+                Desired_Pos = 1;    //Increment of Current_POS by 1
+                BT_state_current = '1';
+                BT_state = '1';
+                wait_ms(500);
+            }
+            else{
+                RotateCW_1step();    //Use of on-board switch (SW2) to turn the stepper motor by one step, in the clockwise direction.
+                Current_Pos += 1;    //Increment of Current_POS by 1
+                Desired_Pos += 1;    //Increment of Current_POS by 1
+                printf("---> Desired Position = %d\r\n", Desired_Pos);
+                printf("---> Current Position = %d\r\n", Current_Pos);
+                wait(wait_delay);
+            }
+        }
+                
+        if ((SW_Prev_State != 1) && (Desired_Pos>1)){
+            wait_ms(500);
+            if ((SW_Prev_State != 1) && (SW_Next_State != 1)){
+                printf("Initializing Current Position as Initial Position\r\n");
+                Current_Pos = 1;    //Increment of Current_POS by 1
+                Desired_Pos = 1;    //Increment of Current_POS by 1
+                BT_state_current = '1';
+                BT_state = '1';
+                wait_ms(500);
+            }
+            else{
+                RotateCCW_1step();    //Use of on-board switch (SW3) to turn the stepper motor by one step, in the counterclockwise direction.
+                Current_Pos -= 1;    //Increment of Current_POS by 1
+                Desired_Pos -= 1;    //Increment of Current_POS by 1
+                printf("---> Desired Position = %d\r\n", Desired_Pos);
+                printf("---> Current Position = %d\r\n", Current_Pos);
+                wait(wait_delay);
+            }
+        }
+        
+        if ((SW_Prev_State != 1) && (SW_Next_State != 1)){
+                printf("Initializing Current Position as Initial Position\r\n");
+                Current_Pos = 1;    //Increment of Current_POS by 1
+                Desired_Pos = 1;    //Increment of Current_POS by 1
+                BT_state_current = '1';
+                BT_state = '1';
+                wait_ms(500);
+        }
+        
+        check_handGesture();
+
+        if (AutomaticMode==1){
+            printf("Automatic mode ON\r\n");
+            while(true){
+                while (BT.readable()){
+                    BT_AutoMode = BT.putc(BT.getc());
+                }
+                
+                check_DayLight();
+                
+                if(BT_AutoMode == 'x'){
+                    printf("Automatic mode OFF\r\n");
+                    AutomaticMode=0;
+                    BT_AutoMode='y';
+                    break;
+                }
+            }
+        }
+    }
+}
+
+
+//FUNCTION DEFINITION
+int motor_state_zero(){
+    In1=0;
+    In2=0;
+    In3=0;
+    In4=0;
+    motor_state=0;
+    //printf("motor_state = %d\r\n",motor_state);
+    return motor_state;
+}
+
+int motor_state_one(){
+    In1=1;
+    In2=0;
+    In3=0;
+    In4=0;
+    motor_state=1;
+    //printf("motor_state = %d\r\n",motor_state);
+    return motor_state;
+}
+
+int motor_state_two(){
+    In1=0;
+    In2=0;
+    In3=1;
+    In4=0;
+    motor_state=2;
+    //printf("motor_state = %d\r\n",motor_state);
+    return motor_state;
+}
+
+int motor_state_three(){
+    In1=0;
+    In2=1;
+    In3=0;
+    In4=0;
+    motor_state=3;
+    //printf("motor_state = %d\r\n",motor_state);
+    return motor_state;
+}
+
+int motor_state_four(){
+    In1=0;
+    In2=0;
+    In3=0;
+    In4=1;
+    motor_state=4;
+    //printf("motor_state = %d\r\n",motor_state);
+    return motor_state;
+}
+
+void RotateCW_1step(){
+    printf("Rotating Clockwise 1 step\r\n");
+    if (motor_state==0){
+        motor_state_one();
+        wait(wait_delay);
+    }
+    else if (motor_state==1){
+        motor_state_two();
+        wait(wait_delay);
+    }
+    else if (motor_state==2){
+        motor_state_three();
+        wait(wait_delay);
+    }
+    else if (motor_state==3){
+        motor_state_four();
+        wait(wait_delay);
+    }
+    else if (motor_state==4){
+        motor_state_one();
+        wait(wait_delay);
+    }
+}
+
+void RotateCCW_1step(){
+    printf("Rotating CounterClockwise 1 step\r\n");
+    if (motor_state==0){
+        motor_state_four();
+        wait(wait_delay);
+    }
+    else if (motor_state==1){
+        motor_state_four();
+        wait(wait_delay);
+    }
+    else if (motor_state==2){
+        motor_state_one();
+        wait(wait_delay);
+    }
+    else if (motor_state==3){
+        motor_state_two();
+        wait(wait_delay);
+    }
+    else if (motor_state==4){
+        motor_state_three();
+        wait(wait_delay);
+    }
+}
+
+int Retrieve_BT_State(char BT_state){
+            if (BT_state == '0'){
+                Desired_Pos = 0;
+            }
+            else if (BT_state == '1'){
+                Desired_Pos = 1;
+            }
+            else if (BT_state == '2'){
+                Desired_Pos = 2;
+            }
+            else if (BT_state == '3'){
+                Desired_Pos = 3;
+            }
+            else if (BT_state == '4'){
+                Desired_Pos = 4;
+            }
+            else if (BT_state == '5'){
+                Desired_Pos = 5;
+            }
+            else if (BT_state == '6'){
+                Desired_Pos = 6;
+            }
+            else if (BT_state == '7'){
+                Desired_Pos = 7;
+            }
+            else if (BT_state == '8'){
+                Desired_Pos = 8;
+            }
+            else if (BT_state == '9'){
+                Desired_Pos = 9;
+            }
+            else if (BT_state == 'a'){
+                Desired_Pos = 10;
+            }
+            else if (BT_state == 'b'){
+                Desired_Pos = 11;
+            }
+            else if (BT_state == 'c'){
+                Desired_Pos = 12;
+            }
+            else if (BT_state == 'd'){
+                Desired_Pos = 13;
+            }
+            else if (BT_state == 'e'){
+                Desired_Pos = 14;
+            } 
+            else if (BT_state == 'f'){
+                Desired_Pos = 15;
+            } 
+            else if (BT_state == 'g'){
+                Desired_Pos = 16;
+            } 
+            else if (BT_state == 'h'){
+                Desired_Pos = 17;
+            } 
+            else if (BT_state == 'i'){
+                Desired_Pos = 18;
+            } 
+            else if (BT_state == 'j'){
+                Desired_Pos = 19;
+            } 
+            else if (BT_state == 'k'){
+                Desired_Pos = 20;
+            } 
+            else if (BT_state == 'l'){
+                Desired_Pos = 21;
+            } 
+            else if (BT_state == 'm'){
+                Desired_Pos = 22;
+            } 
+            else if (BT_state == 'n'){
+                Desired_Pos = 23;
+            } 
+            else if (BT_state == 'o'){
+                Desired_Pos = 24;
+            } 
+            else if (BT_state == 'p'){
+                Desired_Pos = 25;
+            } 
+            else if (BT_state == 'q'){
+                Desired_Pos = 26;
+            } 
+            
+            return Desired_Pos;
+}
+
+void check_handGesture(){
+
+    int i,loop_time;
+
+    Timer loop;
+    ldr1_reading= LDR1;
+    ldr2_reading= LDR2;
+
+    if (ldr1_reading < ldr1_threshold){
+        if (Current_Pos<26){
+            if(ldr2_reading > ldr2_threshold){
+                for(i=0;i<50;i++){
+                    wait_ms(10);
+                    ldr2_reading= LDR2;
+                    //printf("LDR1 = %f    LDR2 = %f\n\r",ldr1_reading,ldr2_reading);
+                    if(ldr2_reading < ldr2_threshold){
+                        if (Current_Pos<13){
+                            Desired_Pos=13;
+                            BT_state='d';
+                        }
+                        else if(Current_Pos>=13){
+                            Desired_Pos=26;
+                            BT_state='q';
+                        }
+                        i=0;
+                        break;
+                    }
+                }
+            }
+        }
+        else{
+            printf("Motor in Position 26. No More Clockwise Rotation... \r\n");
+        }
+        wait_ms(500);
+    }
+
+    if (ldr2_reading < ldr2_threshold){
+        if (Current_Pos>1){
+            if(ldr1_reading > ldr1_threshold){
+                for(i=0;i<50;i++){
+                    wait_ms(10);
+                    ldr1_reading= LDR1;
+                    if(ldr1_reading < ldr1_threshold){
+                        if (Current_Pos>13){
+                            Desired_Pos=13;
+                            BT_state='d';
+                        }
+                        else if(Current_Pos<=13){
+                            Desired_Pos=1;
+                            BT_state='1';
+                        }
+                        i=0;
+                        break;
+                    }
+                }
+            }
+        }
+        else{
+            printf("Motor in Position 1. No More Counter-Clockwise Rotation... \r\n");
+        }
+        wait_ms(500);
+    }
+}
+
+void check_DayLight(){
+    static float LDR_daylightThreshold = 0.15;
+    static float LDR_daylightReading;
+    LDR_daylightReading = LDR3;
+
+    //printf("LDR_daylightReading = %f\r\n", LDR_daylightReading);
+    
+    if (LDR_daylightReading<LDR_daylightThreshold){ //it's night/dark
+        Desired_Pos=1; //close flap get state 1
+        BT_state='1';
+        
+    }
+    if (LDR_daylightReading>LDR_daylightThreshold){ //it's day
+        Desired_Pos=13; //open flaps get state 13
+        BT_state='d';
+    }
+    
+    if (Current_Pos != Desired_Pos){
+            
+            printf("---> Desired Position = %d\r\n", Desired_Pos);
+            printf("---> Current Position = %d\r\n", Current_Pos);
+            
+            while (Current_Pos > Desired_Pos){
+                RotateCCW_1step();    //Rotate CCW 1 step
+                Current_Pos -= 1;    //Decrement of Current_Pos by 1
+                printf("Current Position = %d\r\n", Current_Pos);
+            }
+            
+            while (Current_Pos < Desired_Pos){
+                RotateCW_1step();    //Rotate CW 1 step
+                Current_Pos += 1;    //Increment of Current_POS by 1
+                printf("Current Position = %d\r\n", Current_Pos);
+            }
+        }
+    
+}
\ No newline at end of file