Mobile controlled Robot with Arduino
In this tutorial we will look at making a mobile controlled robot with Explore Robo platform and we will be using arduino software to program the board.
Working
Whenever we make a call, and press keys, dtmf tones are generated and transmitted. The tones can be easily decoded using a IC like MT8870. This enables a lot of possibilities for wireless control over mobile and telephone. We will use it to control the Explore Robo with DTMF.
Code
/* Demonstrates reading DTMF keys from chip like MT8870 and driving motors with the help of L293d bridge; making a Mobile controlled Robot. Tones are read from the DTMF decoder and keys 2, 8, 4, 6 are used to move the robot FORWARD, BACKWARD, LEFT and RIGHT. The DTMF interrupt (INT1) is used to read a new key. Check the below link for connections and other details http://exploreembedded.com/wiki/index.php?title=Explore_Robo */ int MotorLeft[2] = {A0,A1};//Motor Pins int MotorRight[2] = {A2,A3};//Motor Pins int Mobile[5]={4,5,6,7};// DTMF mobile tones volatile int NewTone_Flag = 0; int volatile NewTone = 0; void setup() { MotorInit(); MobileInit(); attachInterrupt(1, CheckTone, FALLING); //Serial.begin(9600); //Serial.println("Mobile controlled Robo"); } void loop() { if(NewTone_Flag == 1) { NewTone = ReadTone(); NewTone_Flag = 0; } switch(NewTone) { case 2: Robot_Forward();break; case 8: Robot_Backward(); break; //Notice that in order to use the delay() we need to disable the interuptts. case 4: noInterrupts(); Robot_Left();delay(1000); Robot_Stop(); NewTone = 0; interrupts(); break; case 6: noInterrupts(); Robot_Right();delay(1000); Robot_Stop(); NewTone=0; interrupts(); break; case 5: Robot_Stop();break; default:Robot_Stop(); } } void CheckTone() { NewTone_Flag = 1; } int ReadTone() { int MobileTone=0,i; for(i=0;i<4;i++) MobileTone|= digitalRead(Mobile[i])<<i; //MobileTone = (digitalRead(Mobile[3])*8)+ (digitalRead(Mobile[2])*4)+(digitalRead(Mobile[1])*2)+(digitalRead(Mobile[0])*1); //Serial.print(MobileTone); return MobileTone; } void MobileInit() { int i; for(i=0 ; i<5; i++) { pinMode(Mobile[i],INPUT); } //first pin will be used as interrupt, hence direction set not required. } //Initialize the motor void MotorInit() { int i; for(i=0 ; i<2; i++) { pinMode(MotorLeft[i],OUTPUT); pinMode(MotorRight[i],OUTPUT); } } //Robot Driving Functions void Robot_Forward() { digitalWrite(MotorLeft[0],0); digitalWrite(MotorLeft[1],1); digitalWrite(MotorRight[0],1); digitalWrite(MotorRight[1],0); } void Robot_Backward() { digitalWrite(MotorLeft[0],1); digitalWrite(MotorLeft[1],0); digitalWrite(MotorRight[0],0); digitalWrite(MotorRight[1],1); } void Robot_Left() { digitalWrite(MotorLeft[0],1); digitalWrite(MotorLeft[1],0); digitalWrite(MotorRight[0],1); digitalWrite(MotorRight[1],0); } void Robot_Right() { digitalWrite(MotorLeft[0],0); digitalWrite(MotorLeft[1],1); digitalWrite(MotorRight[0],0); digitalWrite(MotorRight[1],1); } void Robot_Stop() { digitalWrite(MotorLeft[0],0); digitalWrite(MotorLeft[1],0); digitalWrite(MotorRight[0],0); digitalWrite(MotorRight[1],0); }