Arduino {code}racer API
... better know the details.
CodeRacer.h
1 #include "Arduino.h"
2 #include <algorithm> // std::swap
3 #include <ESP32Servo.h> // Servo drive support for ESP32
4 #include "esp32-hal-ledc.h" // Part of ESP32 board files - Analog output
5 
6 #ifndef __CodeRacer_H__
7 #define __CodeRacer_H__
8 
9 //----- Fun stuff ---------
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
13 //----- Button ------------
14 #define H_BUTTON_PIN 17
15 #define BUTTON_BOUNCING_TIME_MS 200 // bouncing delay
16 //----- Servo -----
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
31 
32 //----- Ultrasonic sensor -----
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
37 
38 //----- Drives -----
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
49 
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
52 
53 //----- LEDs -----
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
58 
59 static volatile bool coderracer_activ = false;;
60 static volatile unsigned long button_last_pressed_at_ms = millis();
61 
62 enum ledstate {
63  LEDOFF,
64  LEDON
65 };
66 
67 enum drivestate {
68  DRIVESTOP,
69  DRIVEFRWD,
70  DRIVEBACK
71 };
72 
73 //--- this is as preparation of the class creation
74 class CodeRacer {
75 
76  private:
77 
78  //pins
79  uint8_t _button_pin;
80  uint8_t _servo_pin;
81  uint8_t _us_trigger_pin;
82  uint8_t _us_echo_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;
93 
94  //servo variables
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;
99 
100  //drives variables
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;
105 
106  // ultrasonic variables
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;
113 
114  //fun stuff variables
115  unsigned long _last_led_switched_at_ms;
116  uint8_t _led_count;
117  uint8_t _last_led_on;
118  unsigned long _servo_look_around_at_ms;
119 
120 
121  unsigned long _min_distance_cm;
122  bool _drive;
123  unsigned long _drive_set_at_ms;
124  bool _servo_sweep;
125  bool _coderracer_activ;
126 
127  //objects
128  Servo* _servo;
129  Servo* _servo_dummy;
130 
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);
134 
135  public:
136  //properties
137  bool coderacer_fun_enabled;
138 
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;
145  //methods
146  CodeRacer();
147 
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);
153 
154  void set_inactive();
155  void set_active();
156 
157  void begin();
158 
159  // getters
160  bool is_active();
161  bool is_driving();
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();
172 
173  // higher level {code}racer services
174  void stop_driving();
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);
179  void turn_left();
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);
182  void turn_right();
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);
185 
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();
189 
190 
191  // LEDs
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();
196 
197  // Drives
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();
208 
209  // Ultrasonic sensor
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);
220 
221  // Servo drive
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();
228  void servo_sweep();
229 
230  // just for fun
231  void kitt();
232  void look_around();
233 
234  // previous OBSOLETE german language definitions of the methods - still needed to support MakerLab Murnau {code}racer project
235  // - but use the english ones for new implementations
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);
238  void anhalten();
239  void vorwaerts();
240  void rueckwaerts();
241  void links();
242  void rechts();
243  void servo_rechts();
244  void servo_links();
245  void servo_mitte();
246  unsigned long abstand_messen();
247  void servo_schwenk();
248  bool start_stop();
249 };
250 
251 
252 
253 #endif