movements.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef __MOVEMENTS_H__
  2. #define __MOVEMENTS_H__
  3. #include "driver/gpio.h"
  4. #include "esp_log.h"
  5. #include "esp_timer.h"
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "oscillator.h"
  9. //-- Constants
  10. #define FORWARD 1
  11. #define BACKWARD -1
  12. #define LEFT 1
  13. #define RIGHT -1
  14. #define BOTH 0
  15. #define SMALL 5
  16. #define MEDIUM 15
  17. #define BIG 30
  18. // -- Servo delta limit default. degree / sec
  19. #define SERVO_LIMIT_DEFAULT 240
  20. // -- Servo indexes for easy access
  21. #define RIGHT_PITCH 0
  22. #define RIGHT_ROLL 1
  23. #define LEFT_PITCH 2
  24. #define LEFT_ROLL 3
  25. #define BODY 4
  26. #define HEAD 5
  27. #define SERVO_COUNT 6
  28. class Otto {
  29. public:
  30. Otto();
  31. ~Otto();
  32. //-- Otto initialization
  33. void Init(int right_pitch, int right_roll, int left_pitch, int left_roll, int body, int head);
  34. //-- Attach & detach functions
  35. void AttachServos();
  36. void DetachServos();
  37. //-- Oscillator Trims
  38. void SetTrims(int right_pitch, int right_roll, int left_pitch, int left_roll, int body,
  39. int head);
  40. //-- Predetermined Motion Functions
  41. void MoveServos(int time, int servo_target[]);
  42. void MoveSingle(int position, int servo_number);
  43. void OscillateServos(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
  44. double phase_diff[SERVO_COUNT], float cycle);
  45. //-- HOME = Otto at rest position
  46. void Home(bool hands_down = true);
  47. bool GetRestState();
  48. void SetRestState(bool state);
  49. // -- 手部动作
  50. void HandAction(int action, int times = 1, int amount = 30, int period = 1000);
  51. // action: 1=举左手, 2=举右手, 3=举双手, 4=放左手, 5=放右手, 6=放双手, 7=挥左手, 8=挥右手,
  52. // 9=挥双手, 10=拍打左手, 11=拍打右手, 12=拍打双手
  53. //-- 身体动作
  54. void BodyAction(int action, int times = 1, int amount = 30, int period = 1000);
  55. // action: 1=左转, 2=右转
  56. //-- 头部动作
  57. void HeadAction(int action, int times = 1, int amount = 10, int period = 500);
  58. // action: 1=抬头, 2=低头, 3=点头, 4=回中心, 5=连续点头
  59. private:
  60. Oscillator servo_[SERVO_COUNT];
  61. int servo_pins_[SERVO_COUNT];
  62. int servo_trim_[SERVO_COUNT];
  63. int servo_initial_[SERVO_COUNT] = {180, 180, 0, 0, 90, 90};
  64. unsigned long final_time_;
  65. unsigned long partial_time_;
  66. float increment_[SERVO_COUNT];
  67. bool is_otto_resting_;
  68. void Execute(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
  69. double phase_diff[SERVO_COUNT], float steps);
  70. };
  71. #endif // __MOVEMENTS_H__