@@ -9,29 +9,87 @@ long current_distance;
99turn next_avoid = right_turn;
1010bool 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+
1232void 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
2052void 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}
0 commit comments