Difference between revisions of "Mobile controlled Robot with Arduino"
(Created page with "{{Popup|type=l|text= 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 boa...") |
|||
Line 4: | Line 4: | ||
=Working= | =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. | 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= | ||
+ | <syntaxhighlight> | ||
+ | /* | ||
+ | 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); | ||
+ | } | ||
+ | |||
+ | <\syntaxhighlight> |
Revision as of 11:03, 19 October 2014
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);
- }
- <\syntaxhighlight>