# Wall Follow
![[ultrasonic-robot.jpg]]
*My first embedded systems program!!*
```cpp
/**
* Author: David Ryan
* Created: 10/8/2020
* Modified: 10/12/2020
* Class: CSCE 236
* Prof: Jeffrey Falkinburg
*/
#include <Arduino.h>
#include "movment.h"
#include "globalValues.h"
#define FOWARD_SET B00011000 // defining bit masks for direction values
#define FOWARD_CLEAR B10000100
#define LEFT B00010100
#define RIGHT B10001000
void movment::moveFoward(int speed, int duration)
{
PORTD |= FOWARD_SET; // set direction to foward
PORTD &= ~FOWARD_CLEAR;
int tempSpeed = 0;
TCCR0A |= 1 << COM0A1; // connect pwm to pin on timer 0, channel A
TCCR0A |= 1 << COM0B1; // connect pwm to pin on timer 0, channel B
while (tempSpeed != speed)
{ // let the robot accelerate
OCR0A = tempSpeed; // set pwm duty
OCR0B = tempSpeed;
tempSpeed++; // increase pwm duty
delay(10);
}
delay(duration); // delay the duration requested
while (tempSpeed != 0)
{ // let the robot come to a stop
OCR0A = tempSpeed; // set pwm duty
OCR0B = tempSpeed;
tempSpeed--; // decrease pwm duty
delay(5);
}
}
void movment::turnLeft(int degree)
{
PORTD |= LEFT; // set direction to left
PORTD &= ~RIGHT;
TCCR0A |= 1 << COM0A1; // connect pwm to pin on timer 0, channel A
TCCR0A |= 1 << COM0B1; // connect pwm to pin on timer 0, channel B
OCR0A = turnSpeed; // set pwm duty
OCR0B = turnSpeed;
delay(degree * 17); // delay the duration requested
OCR0A = 0; // set pwm duty to 0
OCR0B = 0;
}
void movment::turnRight(int degree)
{
PORTD |= RIGHT; // set direction to right
PORTD &= ~LEFT;
TCCR0A |= 1 << COM0A1; // connect pwm to pin on timer 0, channel A
TCCR0A |= 1 << COM0B1; // connect pwm to pin on timer 0, channel B
OCR0A = turnSpeed; // set pwm duty
OCR0B = turnSpeed;
delay(degree * 17); // delay the duration requested
OCR0A = 0; // set pwm duty to 0
OCR0B = 0;
}
void movment::moveReverse(int speed, int duration)
{
PORTD |= FOWARD_CLEAR; // set direction to reverse
PORTD &= ~FOWARD_SET;
int tempSpeed = 0;
TCCR0A |= 1 << COM0A1; // connect pwm to pin on timer 0, channel A
TCCR0A |= 1 << COM0B1; // connect pwm to pin on timer 0, channel B
while (tempSpeed != speed)
{ // let the robot accelerate
OCR0A = tempSpeed; // set pwm duty
OCR0B = tempSpeed;
tempSpeed++; // increase pwm duty
delay(10);
}
delay(duration); // delay the duration requested
while (tempSpeed != 0)
{ // let the robot come to a stop
OCR0A = tempSpeed; // set pwm duty
OCR0B = tempSpeed;
tempSpeed--; // decrease pwm duty
delay(5);
}
}
```