Skip to content

Commit 7425258

Browse files
Added PWM and Encoder Code
1 parent e6d6cd0 commit 7425258

File tree

3 files changed

+109
-59
lines changed

3 files changed

+109
-59
lines changed

beachRover-v1-arduino/beachRover-v1-arduino.ino

Lines changed: 72 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,87 @@ long current_distance;
99
turn next_avoid = right_turn;
1010
bool avoided = true;
1111

12+
volatile double left_wheel_encoder_count = 0;
13+
volatile double right_wheel_encoder_count = 0.0;
14+
double prev_left_wheel_encoder_count = 0.0;
15+
double prev_right_wheel_encoder_count = 0.0;
16+
double distance_travelled = 0.0;
17+
unsigned long prev_time = -500;
18+
double left_wheel_speed = 0;
19+
double right_wheel_speed = 0;
20+
double current_speed = 0.0;
21+
bool forward = true;
22+
23+
void left_encoder_update() {
24+
left_wheel_encoder_count += .05;
25+
}
26+
27+
void right_encoder_update() {
28+
right_wheel_encoder_count += .05;
29+
}
30+
31+
1232
void setup() {
33+
34+
Serial.begin(9600);
35+
36+
//pinModes
1337
pinMode(LEFT_INPUT_1, OUTPUT);
1438
pinMode(LEFT_INPUT_2, OUTPUT);
1539
pinMode(RIGHT_INPUT_1, OUTPUT);
1640
pinMode(RIGHT_INPUT_2, OUTPUT);
1741
pinMode(LED_BUILTIN, OUTPUT);
42+
43+
//encoder interrupts
44+
attachInterrupt(digitalPinToInterrupt(2), left_encoder_update, RISING);
45+
attachInterrupt(digitalPinToInterrupt(3), right_encoder_update, RISING);
46+
}
47+
48+
double kalman(double prev_value, double new_value, double ratio) {
49+
return (prev_value * ratio) + (new_value * (1 - ratio));
1850
}
1951

2052
void loop() {
21-
current_distance = sr04.Distance();
22-
if (current_distance < 13 && avoided) {
23-
driveMotor(reverse_direction);
24-
delay(500);
25-
digitalWrite(LED_BUILTIN, HIGH);
26-
avoided = false;
27-
} else if (current_distance < 13 && !avoided) {
28-
driveMotor(next_avoid);
29-
delay(100);
53+
// current_distance = sr04.Distance();
54+
unsigned long current_time = millis();
55+
distance_travelled = (left_wheel_encoder_count + right_wheel_encoder_count) / 2;
56+
double current_left_wheel_speed = (left_wheel_encoder_count - prev_left_wheel_encoder_count) * 1000 * 60;
57+
left_wheel_speed = kalman(left_wheel_speed, current_left_wheel_speed, 0.8) / (current_time - prev_time);
58+
double current_right_wheel_speed = (right_wheel_encoder_count - prev_right_wheel_encoder_count) * 1000 * 60;
59+
right_wheel_speed = kalman(right_wheel_speed, current_right_wheel_speed, 0.8) / (current_time - prev_time);
60+
61+
prev_left_wheel_encoder_count = left_wheel_encoder_count;
62+
prev_right_wheel_encoder_count = right_wheel_encoder_count;
63+
prev_time = millis();
64+
// current_direction = kalman(current_direction, 180 + (left_wheel_speed - right_wheel_speed) * 5, 0.8);
65+
66+
if (forward) {
67+
driveMotor(0.5, current_speed);
68+
current_speed += 0.1;
69+
if (current_speed >= 1) {
70+
forward = false;
71+
}
3072
} else {
31-
avoided = true;
32-
driveMotor(straight);
33-
delay(100);
34-
digitalWrite(LED_BUILTIN, LOW);
35-
next_avoid = random(1, 3) == 1 ? left_turn : right_turn;
73+
driveMotor(0.5, current_speed);
74+
current_speed -= 0.1;
75+
if (current_speed <= 0) {
76+
forward = true;
77+
}
3678
}
79+
delay(100);
80+
// if (current_distance < 13 && avoided) {
81+
// driveMotor(reverse_direction);
82+
// delay(500);
83+
// digitalWrite(LED_BUILTIN, HIGH);
84+
// avoided = false;
85+
// } else if (current_distance < 13 && !avoided) {
86+
// driveMotor(next_avoid);
87+
// delay(100);
88+
// } else {
89+
// avoided = true;
90+
// driveMotor(straight);
91+
// delay(100);
92+
// digitalWrite(LED_BUILTIN, LOW);
93+
// next_avoid = random(1, 3) == 1 ? left_turn : right_turn;
94+
// }
3795
}
Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,42 @@
1-
#ifndef MOTOR_DRIVER_H
21
#include "motor_driver.h"
3-
#endif
42
#include<Arduino.h>
53

6-
int LEFT_INPUT_1 = 16;
7-
int LEFT_INPUT_2 = 17;
8-
int RIGHT_INPUT_1 = 14;
9-
int RIGHT_INPUT_2 = 15;
4+
int LEFT_INPUT_1 = 11;
5+
int LEFT_INPUT_2 = 10;
6+
int RIGHT_INPUT_1 = 9;
7+
int RIGHT_INPUT_2 = 6;
8+
9+
10+
void driveMotor(float angle, float speed) {
11+
if (speed > 1) {
12+
speed = 1;
13+
}
14+
if (speed < -1) {
15+
speed = -1;
16+
}
17+
if (angle > 1) {
18+
angle = 1;
19+
}
20+
if (angle < 0) {
21+
angle = 0;
22+
}
23+
24+
int left_motor_speed = angle * 255 * speed*2;
25+
int right_motor_speed = (1 - angle) * 255 * speed*2;
26+
Serial.println(left_motor_speed);
27+
if (speed > 0) {
28+
analogWrite(LEFT_INPUT_1, left_motor_speed);
29+
analogWrite(LEFT_INPUT_2, 0);
30+
analogWrite(RIGHT_INPUT_1, right_motor_speed);
31+
analogWrite(RIGHT_INPUT_2, 0);
32+
}
33+
else {
34+
analogWrite(LEFT_INPUT_1, 0);
35+
analogWrite(LEFT_INPUT_2, left_motor_speed * -1);
36+
analogWrite(RIGHT_INPUT_1, 0);
37+
analogWrite(RIGHT_INPUT_2, right_motor_speed * -1);
38+
}
39+
1040

1141

12-
void driveMotor(turn direction) {
13-
switch (direction) {
14-
case left_turn:
15-
digitalWrite(LEFT_INPUT_1, 1);
16-
digitalWrite(LEFT_INPUT_2, 1);
17-
digitalWrite(RIGHT_INPUT_1, 1);
18-
digitalWrite(RIGHT_INPUT_2, 0);
19-
break;
20-
case right_turn:
21-
digitalWrite(LEFT_INPUT_1, 1);
22-
digitalWrite(LEFT_INPUT_2, 0);
23-
digitalWrite(RIGHT_INPUT_1, 1);
24-
digitalWrite(RIGHT_INPUT_2, 1);
25-
break;
26-
case straight:
27-
digitalWrite(LEFT_INPUT_1, 1);
28-
digitalWrite(LEFT_INPUT_2, 0);
29-
digitalWrite(RIGHT_INPUT_1, 1);
30-
digitalWrite(RIGHT_INPUT_2, 0);
31-
break;
32-
case stop_moving:
33-
digitalWrite(LEFT_INPUT_1, 1);
34-
digitalWrite(LEFT_INPUT_2, 1);
35-
digitalWrite(RIGHT_INPUT_1, 1);
36-
digitalWrite(RIGHT_INPUT_2, 1);
37-
break;
38-
case reverse_direction:
39-
digitalWrite(LEFT_INPUT_1, 0);
40-
digitalWrite(LEFT_INPUT_2, 1);
41-
digitalWrite(RIGHT_INPUT_1, 0);
42-
digitalWrite(RIGHT_INPUT_2, 1);
43-
break;
44-
default:
45-
digitalWrite(LEFT_INPUT_1, 0);
46-
digitalWrite(LEFT_INPUT_2, 0);
47-
digitalWrite(RIGHT_INPUT_1, 0);
48-
digitalWrite(RIGHT_INPUT_2, 0);
49-
}
5042
}

beachRover-v1-arduino/motor_driver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ enum turn {
1111
reverse_direction
1212
};
1313

14-
void driveMotor(turn direction);
14+
void driveMotor(float angle,float speed);

0 commit comments

Comments
 (0)