3 #include <ESP32Servo.h> 4 #include "esp32-hal-ledc.h" 6 #ifndef __CodeRacer_H__ 7 #define __CodeRacer_H__ 10 #define FUN_MIN_PAUSE_MS 120000 // minimum and maximum pause between to rounds fun 11 #define FUN_MAX_PAUSE_MS 300000 12 #define LED_SWITCH_MS 50 // speed of knight rider lights 14 #define H_BUTTON_PIN 17 15 #define BUTTON_BOUNCING_TIME_MS 200 // bouncing delay 17 #define H_SERVO_PIN 16 18 #define H_SERVO_LEFT_POS 145 // left position of the servo 19 #define H_SERVO_CENTER_LEFT 100 // left-center position of the servo 20 #define H_SERVO_RIGHT_POS 35 // right position of the servo 21 #define H_SERVO_CENTER_RIGHT 80 // right-center position of the servo 22 #define H_SERVO_CENTER_POS 90 // center position of the servo 23 #define H_SERVO_SWEEP_LEFT_POS 140 // most left sweep position of the servo 24 #define H_SERVO_SWEEP_RIGHT_POS 40 // most right sweep position of the servo 25 #define SERVO_SWEEP_TO_LEFT_STEP 5 // sweep step to the left 26 #define SERVO_SWEEP_TO_RIGHT_STEP -5 // sweep step to the right 27 #define SERVO_SWEEP_MS 10 // duration of time betwee to sweep steps 28 #define SERVO_MAX_POSITION 170 // maximum servo position 29 #define SERVO_MIN_POSITION 10 // minimum servo position 30 #define SERVO_SET_1TICK_POSITION_DELAY_MS 3 // minimum duration of time between two servo steps 33 #define H_US_TRIG_PIN 12 34 #define H_US_ECHO_PIN 14 35 #define H_US_STOP_DISTANCE_CM 25 // if the measured distance is smaller the racer maybe stopped 36 #define US_MAX_ECHO_TIME_US 6000 // timeout for ultrasonic sensor measurements - this is about 100cm 39 #define H_DRIVE_RIGHT_SPEED 255 // default speed of right side drive. 0 ...255 40 #define H_DRIVE_LEFT_SPEED 255 // default speed of left side drive. 0 ...255 41 #define H_DRIVE_RIGHT_ENABLE_PIN 2 42 #define H_DRIVE_RIGHT_FWRD_PIN 4 43 #define H_DRIVE_RIGHT_BACK_PIN 15 44 #define H_DRIVE_LEFT_ENABLE_PIN 21 45 #define H_DRIVE_LEFT_FWRD_PIN 22 46 #define H_DRIVE_LEFT_BACK_PIN 23 47 #define H_RACER_TURN_LEFT_FOR_MS 400 // duration of time the racer will turn to left 48 #define H_RACER_TURN_RIGHT_FOR_MS 400 // duration of time the racer will turn to right 50 #define DRIVE_PWM_LEFT_CHANNEL 5 // PWM-channel for left side drive 51 #define DRIVE_PWM_RIGHT_CHANNEL 6 // PWM-channel for right side drive 54 #define H_LED_FRWD_PIN 26 55 #define H_LED_STOP_PIN 25 56 #define H_LED_LEFT_PIN 33 57 #define H_LED_RIGHT_PIN 27 59 static volatile bool coderracer_activ =
false;;
60 static volatile unsigned long button_last_pressed_at_ms = millis();
81 uint8_t _us_trigger_pin;
83 uint8_t _drive_left_frwd_pin;
84 uint8_t _drive_left_back_pin;
85 uint8_t _drive_left_enable_pin;
86 uint8_t _drive_right_frwd_pin;
87 uint8_t _drive_right_back_pin;
88 uint8_t _drive_right_enable_pin;
89 uint8_t _led_frwd_pin;
90 uint8_t _led_stop_pin;
91 uint8_t _led_left_pin;
92 uint8_t _led_right_pin;
95 int8_t _servo_sweep_step;
96 uint8_t _servo_position;
97 unsigned long _servo_position_set_at_ms;
98 unsigned long _servo_position_eta_in_ms;
101 uint8_t _drive_left_speed;
102 uint8_t _drive_right_speed;
103 unsigned long _turn_left_for_ms;
104 unsigned long _turn_right_for_ms;
107 bool _coderacer_stopped_at_min_distance;
108 bool _coderacer_stop_at_distance_enabled;
109 unsigned long _usonic_stop_distance_cm;
110 unsigned long _usonic_stop_distance_us;
111 unsigned long _usonic_distance_us;
112 unsigned long _usonic_distance_cm;
115 unsigned long _last_led_switched_at_ms;
117 uint8_t _last_led_on;
118 unsigned long _servo_look_around_at_ms;
121 unsigned long _min_distance_cm;
123 unsigned long _drive_set_at_ms;
125 bool _coderracer_activ;
131 static void _set_button_state();
132 void _analog_write(uint8_t pin, uint8_t speed);
133 unsigned long _servo_set_position(uint8_t position);
137 bool coderacer_fun_enabled;
139 uint8_t servo_center_pos;
140 uint8_t servo_left_pos;
141 uint8_t servo_right_pos;
142 uint8_t servo_sweep_left_pos;
143 uint8_t servo_sweep_right_pos;
148 CodeRacer(uint8_t button_pin, uint8_t servo_pin,
149 uint8_t us_trigger_pin, uint8_t us_echo_pin,
150 uint8_t drive_left_frwd_pin, uint8_t drive_left_back_pin, uint8_t drive_left_enable_pin,
151 uint8_t drive_right_frwd_pin, uint8_t drive_right_back_pin, uint8_t drive_right_enable_pin,
152 uint8_t led_frwd_pin, uint8_t led_stop_pin, uint8_t led_left_pin, uint8_t led_right_pin);
162 bool stopped_at_min_distance();
163 unsigned long usonic_distance_cm();
164 unsigned long usonic_distance_us();
165 uint8_t servo_position();
166 unsigned long servo_position_set_at_ms();
167 unsigned long servo_position_eta_in_ms();
168 uint8_t drive_left_speed();
169 uint8_t drive_right_speed();
170 unsigned long turn_left_for_ms();
171 unsigned long turn_right_for_ms();
175 void drive_forward();
176 void drive_forward(uint8_t left_speed, uint8_t right_speed);
177 void drive_backward();
178 void drive_backward(uint8_t left_speed, uint8_t right_speed);
180 void turn_left(
unsigned long turn_for_ms);
181 void turn_left(
unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed);
183 void turn_right(
unsigned long turn_for_ms);
184 void turn_right(
unsigned long turn_for_ms, uint8_t left_speed, uint8_t right_speed);
186 void start_stop_at_min_distance();
187 void start_stop_at_min_distance(
unsigned long min_distance_cm);
188 void stop_stop_at_min_distance();
192 void set_leds_left_stop_frwd_right(ledstate leftled, ledstate stopled, ledstate frwdled, ledstate rightled);
193 void set_leds_all(ledstate alleds);
194 void set_leds_all_off();
195 void set_leds_all_on();
198 void drives_settings(uint8_t drive_left_speed, uint8_t drive_right_speed,
unsigned long turn_left_ms,
unsigned long turn_right_ms);
199 void set_drives_states_left_right(drivestate stateleft, drivestate stateright);
200 void set_drive_left_state(drivestate state);
201 void set_drive_right_state(drivestate state);
202 void set_drive_state(drivestate state, uint8_t frwdpin, uint8_t backpin);
203 void set_drives_speed_left_right(uint8_t speedleft, uint8_t speedright);
204 void set_drive_left_speed(uint8_t speed);
205 void set_drive_right_speed(uint8_t speed);
206 void set_drive_speed(uint8_t speed, uint8_t enablepin);
207 void set_drives_stop_left_right();
210 unsigned long usonic_measure_cm();
211 unsigned long usonic_measure_us();
212 unsigned long usonic_measure_cm(
unsigned long max_echo_run_time_us);
213 unsigned long usonic_measure_us(
unsigned long max_echo_run_time_us);
214 unsigned long usonic_measure_single_shot_cm();
215 unsigned long usonic_measure_single_shot_us();
216 unsigned long usonic_measure_single_shot_cm(
unsigned long max_echo_run_time_us);
217 unsigned long usonic_measure_single_shot_us(
unsigned long max_echo_run_time_us);
218 void usonic_set_stop_distance_cm(
unsigned long stop_distance_cm);
219 void usonic_set_stop_distance_us(
unsigned long stop_distance_us);
222 void servo_settings(uint8_t pos_center, uint8_t pos_left, uint8_t pos_right, uint8_t sweep_left_pos, uint8_t sweep_right_pos);
223 uint8_t servo_set_position_wait(uint8_t position);
224 unsigned long servo_set_position(uint8_t position);
225 void servo_set_to_right();
226 void servo_set_to_left();
227 void servo_set_to_center();
236 void servo_einstellungen(uint8_t winkel_mitte, uint8_t winkel_links, uint8_t winkel_rechts, uint8_t schwenk_links, uint8_t schwenk_rechts);
237 void motor_einstellungen(uint8_t motor_links_tempo, uint8_t motor_rechts_tempo,
unsigned long drehung_links_ms,
unsigned long drehung_rechts_ms);
246 unsigned long abstand_messen();
247 void servo_schwenk();