Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Motor SRF05 ID12RFID Servo
Revision 0:8c8c9055046b, committed 2011-04-28
- Comitter:
- warpedkevin
- Date:
- Thu Apr 28 10:02:39 2011 +0000
- Commit message:
- Dissertation work.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ID12RFID.lib Thu Apr 28 10:02:39 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/ID12RFID/#f04afa911cf5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Motor.lib Thu Apr 28 10:02:39 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/Motor/#f265e441bcd9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SRF05.lib Thu Apr 28 10:02:39 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/SRF05/#e758665e072c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Servo.lib Thu Apr 28 10:02:39 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/Servo/#36b69a7ced07
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Apr 28 10:02:39 2011 +0000
@@ -0,0 +1,196 @@
+/************************************************************************************
+DERBOT CONTROLLED BY MBED - Kevin Catheines - 100081329
+Program to sweep a block of area, and look for an ID tag. Obstacle detection enabled.
+Last updated - 28/04/11
+************************************************************************************/
+//*************
+//LIBRARY LIST:
+//*************
+#include "mbed.h"
+#include "SRF05.h"
+#include "Motor.h"
+#include "Servo.h"
+#include "ID12RFID.h"
+//**********************************
+//DECLARING FUNCTIONS AND VARIABLES:
+//**********************************
+//LED's
+DigitalOut Led1 = (LED1);
+DigitalOut Led2 = (LED2);
+DigitalOut Led3 = (LED3);
+DigitalOut Led4 = (LED4);
+//Opto Sensors
+InterruptIn LeftOpto(p6);
+InterruptIn RightOpto(p5);
+//Motors (PWM stream, fwd, rev)
+Motor LeftMotor(p22, p19, p19);
+Motor RightMotor(p21, p20, p20);
+//Servo
+Servo MyServo(p23);
+//Ultrasound (Trigger, echo)
+SRF05 Srf(p25, p24);
+//ID-20 RFID Tag
+ID12RFID Rfid(p14);
+//Variables
+int Counter;
+float MyServoPWM = 0.2;
+float GlobalMotor = -0.225;
+//float GlobalSpeed = -0.15; //Global for Shaft Encoding; 0 = stationary, 1 = fully rev, -1 = fully fwd: removed do to hardware failure
+//**********
+//FUNCTIONS:
+//**********
+//Dual Motor Speed
+void MotorSpeed(float left, float right)
+{
+ LeftMotor.speed(left);
+ RightMotor.speed(right);
+}
+//Servo Rotation
+void ServoRotate(float max, float min)
+{
+ MyServo.calibrate(0.00099,90); //Servo Calibration, Range and angle
+ MyServo = MyServo + MyServoPWM; //Here onwards we are telling the servo to increment slightly
+ if (MyServo >= max || MyServo <= min) //If it reaches fully left or right facing, invert and go back
+ {
+ MyServoPWM = -MyServoPWM;
+ }
+}
+//RFID check, Wait, Servo rotation and Ultrasound Detection combined
+void RFIDCheck(float waitTime)
+ {
+ Counter = 0;
+ float Range = 15; //Servo range, in cm
+ float time = waitTime / 15; //Here is dividing the wait time in 10, so that the RFID reader
+ while (Counter < 15) //has chance to detect a tag and interrupt in time
+ {
+ ServoRotate(1,0); //In this loop we put the servo rotate, so detection and adjustment
+ wait(time); //can take place in real time
+ Counter += 1;
+ if (Rfid.readable()) //If an RFID is detected, Stop the motors and light all LED's,
+ { //until the Mbed is reset
+ while(1)
+ {
+ MotorSpeed(0,0);
+ Led1 = 1;
+ Led2 = 1;
+ Led3 = 1;
+ Led4 = 1;
+ }
+ }
+ else if (Srf.read() <= Range && MyServo < 0.2) //If object is detected, these codes will change the motor speed
+ { //depening on where the servo has the ultrasound pointing.
+ MotorSpeed(GlobalMotor,GlobalMotor*1.2);
+ wait(0.2); //For example here we can see, if something is within the range
+ MotorSpeed(GlobalMotor*1.1,GlobalMotor); //specified earlier, and the servo is before 0.2 position,
+ break; //turn right slightly
+
+ }
+ else if (Srf.read() <= Range && MyServo < 0.4 && MyServo > 0.2) //This else if is for between different parameteres,
+ { //as the RFID readeris one the right, all obstacle
+ MotorSpeed(GlobalMotor,GlobalMotor*1.4);
+ wait(0.4); //detection leads to the Derbot moving to the right
+ MotorSpeed(GlobalMotor*1.2,GlobalMotor);
+ break;
+ }
+ else if (Srf.read() <= Range && MyServo < 0.6 && MyServo > 0.4)
+ {
+ MotorSpeed(GlobalMotor*-1.2,GlobalMotor*1.6);
+ wait (0.6);
+ MotorSpeed(GlobalMotor*1.4,GlobalMotor*-1.2);
+ break; //Using Break jumps out and back into moving normally for fast obstacle avoidance
+ }
+ else if (Srf.read() <= Range && MyServo < 0.8 && MyServo > 0.6) //As the obstacle moves more to the right, the harsher
+ { //the turning to the left will be to compensate
+ MotorSpeed(GlobalMotor*-1.6,GlobalMotor*1.6);
+ wait(0.8);
+ MotorSpeed(GlobalMotor*1.4,GlobalMotor*-1.2);
+ break;
+ }
+ else if (Srf.read() <= Range && MyServo > 0.8) //This is the most interesting else if for the obstacle detection,
+ { //as at this point and obstacle is detected almost at a less than
+ MotorSpeed(0,0); //30 degree angle, the obstacle must be right next to it's right
+ MotorSpeed(0.225,-0.255); //side. This means, in case the RFID is on the other side, it must
+ wait(1.2); //scan around by goin backwards and lining up with the other
+ MotorSpeed(-0.225,-0.255); //side. This is only for small objects, and moves a fixed value
+ wait (1.0);
+ MotorSpeed(0.225,-0.255);
+ wait(1.2);
+ break;
+ }
+ }
+}
+//The code for moving in a stright line then turning right 180 degress, to start or continue the sweep.
+void StraightRight()
+{
+ MotorSpeed(GlobalMotor,GlobalMotor);
+ RFIDCheck (3.5);
+ MotorSpeed(0,0);
+ RFIDCheck (0.5);
+ MotorSpeed(-0.23,0);
+ RFIDCheck (2.2);
+ MotorSpeed(0,0);
+ RFIDCheck (0.5);
+}
+//The code for moving in a stright line then turningleft 180 degress, to continue the sweep.
+void StraightLeft()
+{
+ MotorSpeed(GlobalMotor,GlobalMotor);
+ RFIDCheck (3.5);
+ MotorSpeed(0,0);
+ RFIDCheck (0.5);
+ MotorSpeed(0,-0.255);
+ RFIDCheck (2.1);
+ MotorSpeed(0,0);
+ RFIDCheck (0.5);
+}
+/*Shaft encoder functions: Commented OUT. Due to OPTO's failing.
+//Left shaft encoder counter
+void LeftEncoder()
+{
+ Counter1 += 1; //Counter for left opto
+}
+//Right shaft encoder counter
+void RightEncoder()
+{
+ Counter2 += 1; //Counter for right opto
+}
+//Shaft encoder equaliser
+void ShaftEncoder()
+{
+ LeftOpto.rise(&LeftEncoder); //Each time a rising or falling edge is detected, increment
+ RightOpto.rise(&RightEncoder); //the relvant counters.
+ LeftOpto.fall(&LeftEncoder);
+ RightOpto.fall(&RightEncoder);
+ if (Counter1 > Counter2) //This last section determines if one of the wheels is moving
+ { //faster than the other
+ RightMotor.speed(GlobalSpeed - 0.03);
+ LeftMotor.speed(GlobalSpeed);
+ }
+ else if (Counter2 > Counter1) //If one is moving faster, it will slow its speed marginally
+ {
+ LeftMotor.speed(GlobalSpeed - 0.03);
+ RightMotor.speed(GlobalSpeed);
+ }
+ else if (Counter1 == Counter2) //Quickly the statement is reached and the wheels will be
+ { //going at equal speeds to ensure straight directional movement
+ RightMotor.speed(GlobalSpeed);
+ LeftMotor.speed(GlobalSpeed);
+ }
+}
+*/
+//******************
+//THE MAIN FUNCTION
+//******************
+int main()
+{
+ while (1) //This is simple, a loop that work continously through the movement routine, in these
+ { //routines contains all of the tasks outlined in the report.
+ wait (0.5);
+ StraightRight();
+ StraightLeft();
+ StraightRight();
+ StraightLeft();
+ StraightRight();
+ //ShaftEncoder(); //This is commented out, due to it not being used, due to component failure
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Apr 28 10:02:39 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912