Card-Activated Robot

General Description

The robot uses a card reader to grant access to the user. A user is granted access by scanning a Buzzcard with a valid GTID number. The user may then control the direction, speed, and duration in which the robot will move. A MPR121 Keypad is used to give input to the robot. A Text LCD is used to prompt for input and display feedback.

/media/uploads/luckybug38/img078.jpg

Problems Encountered/ Future Steps

Turning of the robot (turn left, turn right, turn around) varied depending on the status of the batteries. Other than that, no problem existed. For future work, the robot will be able to track back following the same path it took to come back to the original position. Remote control commands may be implemented.

Program

Import programCard_activated_robot

Sehoon Shon and Tanvir Iqbal's mbed mini project

Code

#include "mbed.h" 
#include "TextLCD.h"
#include <string.h>
#include "motordriver.h"
#include "mpr121.h"
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
DigitalIn a(p5);
DigitalIn b(p6);
DigitalIn c(p7);
DigitalIn d(p8);
 
InterruptIn interrupt(p11);
// Setup the i2c bus on pins 28 and 27
I2C i2c(p9, p10);
// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
 
//Motor
Motor left(p21, p22, p23, 1); // pwm, fwd, rev, has brake feature
Motor right(p26, p25, p24, 1);
 
//TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
TextLCD lcd(p15, p16, p17, p18, p19, p20);
Serial pc(USBTX, USBRX); // tx, rx 
Serial device(p13, p14);  // tx, rx 
 
//forward or in reverse mode
int forward;
 
//stores directions
int direction[10];
 
//stores speeds
float speed[10];
 
//stores durations
int duration[10];
 
//speed of the car
float car_speed;
 
//duration of the car
int car_duration;
 
//stores the command of the touchpad
int _command;
 
//check if there has been input to the touchpad
bool no_command;
 
//count variable for card reader
int count=0; 
 
//Number of total moves 
int num_moves;
 
//stores buzzcard information
char output[50];
 
//number of card swipes on the reader
int num_swipe=0;
int o_a, o_b;
//int count,ch, ignore_count;
int command[12];
int count_1=0; 
 
 
//password variables
int p_1, p_2,p_3,p_4;
 
//interrupt routine for touchpad
void fallInterrupt() {
    no_command = true;
    int s2=0;
    int key_code=0;
    int i=0;
    int value=mpr121.read(0x00);
    value +=mpr121.read(0x01)<<8;
    // LED demo mod by J. Hamblen
    //pc.printf("MPR value: %x \r\n", value);
    i=0;
    // puts key number out to LEDs for demo
    for (i=0; i<12; i++) {
        if (((value>>i)&0x01)==1) key_code=i+1;
        }
        
    s2 = key_code - 1;
    if(s2 > 0){
     
    _command=s2;
    no_command = false;
    led4=s2 & 0x01;
    led3=(s2>>1) & 0x01;
    led2=(s2>>2) & 0x01;
    led1=(s2>>3) & 0x01;
    }
     
    count_1++;
    //pc.printf("hello %f\n",s);
 
}
 
//function to turn left
void turnLeft(){
  lcd.cls();
  lcd.printf("Turning Left");
  left.speed(0);
  right.speed(0.4);
  wait(2);
  right.speed(0);
  wait(1);
}
  
//function to turn right
void turnRight(){
  lcd.cls();
  lcd.printf("Turning Right");
  left.speed(0.4);
  right.speed(0);
  wait(2);
  left.speed(0);
  wait(1);
}
 
//function to turn around
void turnAround(){
  lcd.cls();
  lcd.printf("Turning Around");
   
  left.speed(0.4);
  right.speed(0);
  wait(4);
  left.speed(0);
  wait(1);
}
 
 
//to move with input speed and duration of time
void go(float _speed, int _time){
    lcd.cls();
    lcd.printf("Speed %f Duration %d sec", _speed, _time);
    left.speed(_speed);
    right.speed(_speed);
    wait(_time);
    left.speed(0);
    right.speed(0);
    wait(1);
}
 
//starts the card reader and verifies the user
int cardReader(){
    num_swipe++;  
    int count=0;
    int ch=0;
    int ignore_count=0;
   // char output[50];
    while(1){
        if(device.readable()){
 
            ch=device.getc();
            if(ignore_count>5){
            output[count]=ch;
            count++;
            }
            ignore_count++;
            pc.putc(ch);
            }
            if (ignore_count>14){
                lcd.cls();
                 
                 if (strcmp(output,"902512409")==0){
                   lcd.printf("Confirmed\n");
                   lcd.printf("Welcome Sehoon\n");
                   for (int i=0; i<1000; i++){
                        if(device.readable())
                        device.getc();
                        }
                   return 1;               
                  }
                  else if (strcmp(output,"902536564")==0){
                   lcd.printf("Confirmed\n");
                   lcd.printf("Welcome Tanvir\n");
                   for (int i=0; i<1000; i++){
                        if(device.readable())
                        device.getc();
                        }
                   return 1;   
                   }       
                  else {
                       for (int i=0; i<100; i++){
                             if(device.readable())
                             ch=device.getc();
                             wait(.01);
                        }
                if (num_swipe==5){
                    lcd.printf("Too many tries\nEnter password");
                    
                    _command=0;
                    no_command=true;
                    while(1){
                    while(no_command){
                        wait(0.1);
                        }
                        p_1=_command;
                        _command=0;
                        no_command=true;
                        while(no_command){
                        wait(0.1);
                        }
                        p_2=_command;
                        _command=0;
                        no_command=true;
                        while(no_command){
                        wait(0.1);
                        }
                        p_3=_command;
                        _command=0;
                        no_command=true;
                        while(no_command){
                        wait(0.1);
                        }
                        p_4=_command;
                        _command=0;
                        no_command=true;
                         
                        if (p_1==1&&p_2==3&&p_3==5&&p_4==7)
                        {
                        lcd.cls();
                        lcd.printf("Correct!!!");
                        wait(2);
                        lcd.cls();
                        lcd.printf("Try swiping AGAIN!!");
                           break;
                           }
                           else{
                           lcd.cls();
                           lcd.printf("WRONG WRONG wROGNWRWEWERWER!@#!@");
                           wait(2);
                           lcd.cls();
                           } 
                            
                        }
                         
                         
                    }
                else
                lcd.printf("Try again\n");
                return 0;
                }
        }
    }    
     
}
 
//number of moves for the car
int number_of_moves(){
      //select duration
   //Selecting number of moves
   lcd.printf("Select Number of Moves");
   num_moves=100;
   _command=100;
   no_command = true;
   while(no_command){
    wait(0.1);
 
   }
 
   num_moves = _command;
 
     
  
    lcd.cls();
    lcd.printf("Number of Moves: %d", num_moves); 
    wait(2);
    return 0;
    }
     
int main() { 
 
    interrupt.fall(&fallInterrupt);   
  interrupt.mode(PullUp); 
  //Swiping buzz card 
   lcd.printf("Please Swipe your Buzzcard");
  while(!cardReader());
   wait(2);
   lcd.cls();
 
 
 
    number_of_moves();
   if (a||b||c||d){
        lcd.cls();
        lcd.printf("please turn off all switches");
        while(1){
            if (!(a||b||c||d))
            break;
        }
    }
  
    lcd.cls();
     
    
    for (int i=0; i<num_moves; i++){
     
    //select direction
   lcd.printf("Select Direction2=L 10=R 7=F 5=B");
   no_command = true;
   _command=0;
   while(_command!=2&&_command!=10&&_command!=7&&_command!=5){
    wait(0.1);
   }
        if(_command==2){
            direction[i]=1;
            lcd.cls();
            lcd.printf("Left");
   
            }
        else if (_command==10){
            direction[i]=2;
            lcd.cls();
            lcd.printf("Right");
 
             
            }
        else if (_command==7){
            direction[i]=3;
            lcd.cls();
            lcd.printf("Forward");
 
            }
        else if (_command==5){
            direction[i]=4;
            lcd.cls();
            lcd.printf("Reverse");
   
            }
             
        
    
   wait(2);
    lcd.cls();
     
     
    //select speed
   lcd.printf("Move Forward-1 or in Reverse-2");
   car_speed=0;
   _command=0;
   forward=0;;
   no_command = true;
   while(_command!=1&&_command!=2){
    wait(0.1);
   }
   if (_command==1){
        forward=1;
        lcd.cls();
        lcd.printf("Car moves forward");
        }
        else if (_command==2){
        forward=-1;
        lcd.cls();
        lcd.printf("Car moves in reverse");
        }
        wait(2);
        lcd.cls();
        _command=0;
   lcd.printf("Select Car Speed 1-10");
   while(_command!=1&&_command!=2&&_command!=3&&_command!=4&&_command!=5&&_command!=6&&_command!=7&&_command!=8&&_command!=9&&_command!=10){
        wait(0.1);
        }
        car_speed=forward*_command*0.1;
    
   speed[i]=car_speed;
   lcd.cls();
   lcd.printf("car speed: %d\n", _command);
   wait(2);
    
    lcd.cls();
     
     
     //select duration
  
   lcd.printf("Select Car duration 1-10 seconds");
   car_duration=0;
   _command=0;
   while(_command!=1&&_command!=2&&_command!=3&&_command!=4&&_command!=5&&_command!=6&&_command!=7&&_command!=8&&_command!=9&&_command!=10){
        wait(0.1);
        }
    car_duration=_command;
    duration[i]=car_duration;
    lcd.cls();
   lcd.printf("car duration: %d seconds\n", _command);
   wait(2);
    
 
  
    lcd.cls();
     
    }
     
    for (int i=10; i>0; i--){
        lcd.printf("Car will start in %d seconds",i);
        wait(1);
        lcd.cls();
    }
    lcd.printf("GO GO GO GO GO GO GO GO GO !!!");
    wait(1);
    for (int i=0; i<num_moves; i++){
  
       switch (direction[i]){
            case 1:
                turnLeft();
                break;
            case 2:
                turnRight();
                break;
            case 3:
                break;
            case 4:
                turnAround();
                break;
                }
      go(speed[i], duration[i]);
      }
      lcd.cls();
      lcd.printf("Finished");
}


Please log in to post comments.