first commit
This commit is contained in:
227
SONAR_MOTOR/SONAR_MOTOR.ino
Executable file
227
SONAR_MOTOR/SONAR_MOTOR.ino
Executable file
@@ -0,0 +1,227 @@
|
||||
#include <AFMotor.h>
|
||||
|
||||
int trigPin = 10; // Trigger
|
||||
int echoPin = 11; // Echo
|
||||
long duration, cm, inches;
|
||||
#define TRIG_PIN 10 // Pin A4 on the Motor Drive Shield connected to the ultrasonic sensor
|
||||
#define ECHO_PIN 11 // Pin A5 on the Motor Drive Shield connected to the ultrasonic sensor
|
||||
#define MAX_DISTANCE_POSSIBLE 1000 // sets maximum useable sensor measuring distance to 1000cm
|
||||
#define MAX_SPEED 120 // sets speed of DC traction motors to 120/256 or about 47% of full speed - to reduce power draining.
|
||||
#define MOTORS_CALIBRATION_OFFSET 3 // this sets offset to allow for differences between the two DC motors
|
||||
#define COLL_DIST 20 // sets distance at which the Obstacle avoiding Robot stops and reverses to 10cm
|
||||
#define TURN_DIST COLL_DIST+10 // sets distance at which the Obstacle avoiding Robot looks away from object (not reverse) to 20cm (10+10)
|
||||
|
||||
AF_DCMotor leftMotor(1, MOTOR12_1KHZ); // create motor #1 using M1 output on Motor Drive Shield, set to 1kHz PWM frequency
|
||||
AF_DCMotor rightMotor(2, MOTOR34_1KHZ); // create motor #2, using M2 output, set to 1kHz PWM frequency
|
||||
|
||||
int pos = 0; // this sets up variables for use in the sketch (code)
|
||||
int maxDist = 0;
|
||||
int maxAngle = 0;
|
||||
int maxRight = 0;
|
||||
int maxLeft = 0;
|
||||
int maxFront = 0;
|
||||
int course = 0;
|
||||
int curDist = 0;
|
||||
String motorSet = "";
|
||||
int speedSet = 0;
|
||||
|
||||
//-------------------------------------------- SETUP LOOP ----------------------------------------------------------------------------
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
//Define inputs and outputs
|
||||
pinMode(trigPin, OUTPUT);
|
||||
pinMode(echoPin, INPUT);
|
||||
delay(2000); // delay for two seconds
|
||||
checkRoute(); // run the CheckRoute routine to find the best Route to begin travel
|
||||
motorSet = "FORWARD"; // set the director indicator variable to FORWARD
|
||||
moveForward(); // run function to make Obstacle avoiding Robot move forward
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//---------------------------------------------MAIN LOOP ------------------------------------------------------------------------------
|
||||
void loop() {
|
||||
checkForward(); // check that if the Obstacle avoiding Robot is supposed to be moving forward, that the drive motors are set to move forward - this is needed to overcome some issues with only using 4 AA NiMH batteries
|
||||
checkRoute(); // set ultrasonic sensor to scan for any possible obstacles
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void checkRoute() {
|
||||
int curLeft = 0;
|
||||
int curFront = 0;
|
||||
int curRight = 0;
|
||||
int curDist = 0;
|
||||
delay(120); // wait 120milliseconds for servo to reach position
|
||||
for (pos = 144; pos >= 36; pos -= 18) // loop to sweep the servo (& sensor) from 144-degrees left to 36-degrees right at 18-degree intervals.
|
||||
{
|
||||
delay(90); // wait 90ms for servo to get to position
|
||||
checkForward(); // check the Obstacle avoiding Robot is still moving forward
|
||||
curDist = readPing(); // get the current distance to any object in front of sensor
|
||||
if (curDist < COLL_DIST) { // if the current distance to object is less than the collision distance
|
||||
checkCourse(); // run the checkCourse function
|
||||
break; // jump out of this loop
|
||||
}
|
||||
if (curDist < TURN_DIST) { // if current distance is less than the turn distance
|
||||
changeRoute(); // run the changeRoute function
|
||||
}
|
||||
if (curDist > curDist) {
|
||||
maxAngle = pos;
|
||||
}
|
||||
if (pos > 90 && curDist > curLeft) {
|
||||
curLeft = curDist;
|
||||
}
|
||||
if (pos == 90 && curDist > curFront) {
|
||||
curFront = curDist;
|
||||
}
|
||||
if (pos < 90 && curDist > curRight) {
|
||||
curRight = curDist;
|
||||
}
|
||||
}
|
||||
maxLeft = curLeft;
|
||||
maxRight = curRight;
|
||||
maxFront = curFront;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void setCourse() { // set direction for travel based on a very basic distance map, simply which direction has the greatest distance to and object - turning right or left?
|
||||
if (maxAngle < 90) {
|
||||
turnRight();
|
||||
}
|
||||
if (maxAngle > 90) {
|
||||
turnLeft();
|
||||
}
|
||||
maxLeft = 0;
|
||||
maxRight = 0;
|
||||
maxFront = 0;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void checkCourse() { // we're about to hit something so move backwards, stop, find where the empty Route is.
|
||||
moveBackward();
|
||||
delay(500);
|
||||
moveStop();
|
||||
setCourse();
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void changeRoute() {
|
||||
if (pos < 90) {
|
||||
lookLeft(); // when current position of sensor is less than 90-degrees, it means the object is on the right hand side so look left
|
||||
}
|
||||
if (pos > 90) {
|
||||
lookRight(); // when current position of sensor is greater than 90-degrees, it means the object is on the left hand side so look right
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
int readPing() { // read the ultrasonic sensor distance
|
||||
// delay(70);
|
||||
// unsigned int uS = sonar.ping();
|
||||
// int cm = uS / US_ROUNDTRIP_CM;
|
||||
// return cm
|
||||
return distance();
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void checkForward() {
|
||||
if (motorSet == "FORWARD") {
|
||||
leftMotor.run(FORWARD); // ensure motors are going forward
|
||||
rightMotor.run(FORWARD);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void checkBackward() {
|
||||
if (motorSet == "BACKWARD") {
|
||||
leftMotor.run(BACKWARD); // ensure motors are going backward
|
||||
rightMotor.run(BACKWARD);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// In some cases, the Motor Drive Shield may just stop if the supply voltage is too low (due to using only four NiMH AA cells).
|
||||
// The above functions simply remind the Shield that if it's supposed to go forward, then ensure it is going forward and vice versa.
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void moveStop() {
|
||||
leftMotor.run(RELEASE); // stop the motors.
|
||||
rightMotor.run(RELEASE);
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void moveForward() {
|
||||
motorSet = "FORWARD";
|
||||
leftMotor.run(FORWARD); // turn it on going forward
|
||||
rightMotor.run(FORWARD); // turn it on going forward
|
||||
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) // slowly bring the speed up to avoid loading down the batteries too quickly
|
||||
{
|
||||
leftMotor.setSpeed(speedSet + MOTORS_CALIBRATION_OFFSET);
|
||||
rightMotor.setSpeed(speedSet);
|
||||
delay(5);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void moveBackward() {
|
||||
motorSet = "BACKWARD";
|
||||
leftMotor.run(BACKWARD); // turn it on going forward
|
||||
rightMotor.run(BACKWARD); // turn it on going forward
|
||||
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) // slowly bring the speed up to avoid loading down the batteries too quickly
|
||||
{
|
||||
leftMotor.setSpeed(speedSet + MOTORS_CALIBRATION_OFFSET);
|
||||
rightMotor.setSpeed(speedSet);
|
||||
delay(5);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void turnRight() {
|
||||
motorSet = "RIGHT";
|
||||
leftMotor.run(FORWARD); // turn motor 1 forward
|
||||
rightMotor.run(BACKWARD); // turn motor 2 backward
|
||||
delay(400); // run motors this way for 400ms
|
||||
motorSet = "FORWARD";
|
||||
leftMotor.run(FORWARD); // set both motors back to forward
|
||||
rightMotor.run(FORWARD);
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void turnLeft() {
|
||||
motorSet = "LEFT";
|
||||
leftMotor.run(BACKWARD); // turn motor 1 backward
|
||||
rightMotor.run(FORWARD); // turn motor 2 forward
|
||||
delay(400); // run motors this way for 400ms
|
||||
motorSet = "FORWARD";
|
||||
leftMotor.run(FORWARD); // turn it on going forward
|
||||
rightMotor.run(FORWARD); // turn it on going forward
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void lookRight() {
|
||||
rightMotor.run(BACKWARD); // looking right? set right motor backwards for 400ms
|
||||
delay(400);
|
||||
rightMotor.run(FORWARD);
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
void lookLeft() {
|
||||
leftMotor.run(BACKWARD); // looking left? set left motor backwards for 400ms
|
||||
delay(400);
|
||||
leftMotor.run(FORWARD);
|
||||
}
|
||||
int distance() {
|
||||
// The sensor is triggered by a HIGH pulse of 10 or more microseconds.
|
||||
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
|
||||
digitalWrite(trigPin, LOW);
|
||||
delayMicroseconds(5);
|
||||
digitalWrite(trigPin, HIGH);
|
||||
delayMicroseconds(10);
|
||||
digitalWrite(trigPin, LOW);
|
||||
|
||||
// Read the signal from the sensor: a HIGH pulse whose
|
||||
// duration is the time (in microseconds) from the sending
|
||||
// of the ping to the reception of its echo off of an object.
|
||||
pinMode(echoPin, INPUT);
|
||||
duration = pulseIn(echoPin, HIGH);
|
||||
|
||||
// Convert the time into a distance
|
||||
cm = (duration/2) / 29.1; // Divide by 29.1 or multiply by 0.0343
|
||||
inches = (duration/2) / 74; // Divide by 74 or multiply by 0.0135
|
||||
|
||||
Serial.print(inches);
|
||||
Serial.print("in, ");
|
||||
Serial.print(cm);
|
||||
Serial.print("cm");
|
||||
Serial.println();
|
||||
|
||||
return cm;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user