Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Slightly modified version of: modifications: PWM frequency is set to not interfere with the 40kHz of the sensor. MAX_SPEED reduced, Timings of movements modified
- SparkFun Inventor’s Kit
- Circuit 5C - Autonomous Robot
- This robot will drive around on its own and react to obstacles by backing up and turning to a new direction.
- This sketch was adapted from one of the activities in the SparkFun Guide to Arduino.
- Check out the rest of the book at
- https://www.sparkfun.com/products/14326
- This sketch was written by SparkFun Electronics, with lots of help from the Arduino community.
- This code is completely free for any use.
- View circuit diagram and instructions at: https://learn.sparkfun.com/tutorials/sparkfun-inventors-kit-experiment-guide---v40
- Download drawings and code at: https://github.com/sparkfun/SIK-Guide-Code
- */
- #define MAX_SPEED 200
- //distance variables
- const int trigPin = 6;
- const int echoPin = 5;
- //the left motor will be controlled by the motor B pins on the motor driver
- const int PWMB = 3; //speed control pin on the motor driver for the left motor
- const int BIN2 = 8; //control pin 2 on the motor driver for the left motor
- const int BIN1 = 10; //control pin 1 on the motor driver for the left motor
- //the right motor will be controlled by the motor A pins on the motor driver
- const int AIN1 = 13; //control pin 1 on the motor driver for the right motor
- const int AIN2 = 12; //control pin 2 on the motor driver for the right motor
- const int PWMA = 11; //speed control pin on the motor driver for the right motor
- int switchPin = 7; //switch to turn the robot on and off
- float distance = 0; //variable to store the distance measured by the distance sensor
- /********************************************************************************/
- void setup()
- {
- pinMode(trigPin, OUTPUT); //this pin will send ultrasonic pulses out from the distance sensor
- pinMode(echoPin, INPUT); //this pin will sense when the pulses reflect back to the distance sensor
- pinMode(switchPin, INPUT_PULLUP); //set this as a pullup to sense whether the switch is flipped
- //set the motor contro pins as outputs
- pinMode(AIN1, OUTPUT);
- pinMode(AIN2, OUTPUT);
- pinMode(PWMA, OUTPUT);
- pinMode(BIN1, OUTPUT);
- pinMode(BIN2, OUTPUT);
- pinMode(PWMB, OUTPUT);
- Serial.begin(9600); //begin serial communication with the computer
- Serial.print("To infinity and beyond!"); //test the serial connection
- }
- /********************************************************************************/
- void loop()
- {
- //DETECT THE DISTANCE READ BY THE DISTANCE SENSOR
- distance = getDistance();
- // Set timer2 period to 31,74 kHz - this is the period of the motor drivers - not in interference with 40kHz of the untrasound sensor
- TCCR2B = TCCR2B & 0b11111000 | 0b00000001;
- Serial.print("Distance: ");
- Serial.print(distance);
- Serial.println(" in"); // print the units
- if(digitalRead(switchPin) == LOW){ //if the on switch is flipped
- if(distance < 20){ //if an object is detected
- //back up and turn
- Serial.print(" ");
- Serial.print("BACK!");
- //stop for a moment
- rightMotor(0);
- leftMotor(0);
- delay(1000);
- //back up
- rightMotor(-MAX_SPEED);
- leftMotor(-MAX_SPEED);
- delay(300l*255l/MAX_SPEED); //amount of time that the robot will back up when it senses an object - depends on MAX_SPEED
- //stop for a moment
- rightMotor(0);
- leftMotor(0);
- delay(100);
- //turn to the right
- rightMotor(-MAX_SPEED);
- leftMotor(MAX_SPEED);
- delay(300l*255l/MAX_SPEED); //amount that the robot will turn once it has backed up - depends on MAX_SPEED
- }else{ //if no obstacle is detected drive forward
- Serial.print(" ");
- Serial.print("Moving...");
- rightMotor(MAX_SPEED);
- leftMotor(MAX_SPEED);
- }
- } else{ //if the switch is off then stop
- //stop the motors
- rightMotor(0);
- leftMotor(0);
- }
- delay(50); //wait 50 milliseconds between readings
- }
- /********************************************************************************/
- void rightMotor(int motorSpeed) //function for driving the right motor
- {
- if (motorSpeed > 0) //if the motor should drive forward (positive speed)
- {
- digitalWrite(AIN1, HIGH); //set pin 1 to high
- digitalWrite(AIN2, LOW); //set pin 2 to low
- }
- else if (motorSpeed < 0) //if the motor should drive backwar (negative speed)
- {
- digitalWrite(AIN1, LOW); //set pin 1 to low
- digitalWrite(AIN2, HIGH); //set pin 2 to high
- }
- else //if the motor should stop
- {
- digitalWrite(AIN1, LOW); //set pin 1 to low
- digitalWrite(AIN2, LOW); //set pin 2 to low
- }
- analogWrite(PWMA, abs(motorSpeed)); //now that the motor direction is set, drive it at the entered speed
- }
- /********************************************************************************/
- void leftMotor(int motorSpeed) //function for driving the left motor
- {
- if (motorSpeed > 0) //if the motor should drive forward (positive speed)
- {
- digitalWrite(BIN1, HIGH); //set pin 1 to high
- digitalWrite(BIN2, LOW); //set pin 2 to low
- }
- else if (motorSpeed < 0) //if the motor should drive backwar (negative speed)
- {
- digitalWrite(BIN1, LOW); //set pin 1 to low
- digitalWrite(BIN2, HIGH); //set pin 2 to high
- }
- else //if the motor should stop
- {
- digitalWrite(BIN1, LOW); //set pin 1 to low
- digitalWrite(BIN2, LOW); //set pin 2 to low
- }
- analogWrite(PWMB, abs(motorSpeed)); //now that the motor direction is set, drive it at the entered speed
- }
- /********************************************************************************/
- //RETURNS THE DISTANCE MEASURED BY THE HC-SR04 DISTANCE SENSOR
- float getDistance()
- {
- float echoTime; //variable to store the time it takes for a ping to bounce off an object
- float calcualtedDistance; //variable to store the distance calculated from the echo time
- //send out an ultrasonic pulse that's 10ms long
- digitalWrite(trigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(trigPin, LOW);
- echoTime = pulseIn(echoPin, HIGH); //use the pulsein command to see how long it takes for the
- //pulse to bounce back to the sensor
- calcualtedDistance = echoTime / 148.0; //calculate the distance of the object that reflected the pulse (half the bounce time multiplied by the speed of sound)
- return calcualtedDistance; //send back the distance that was calculated
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement