1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #ifndef __MOVEMENTS_H__
- #define __MOVEMENTS_H__
- #include "driver/gpio.h"
- #include "esp_log.h"
- #include "esp_timer.h"
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "oscillator.h"
- //-- Constants
- #define FORWARD 1
- #define BACKWARD -1
- #define LEFT 1
- #define RIGHT -1
- #define BOTH 0
- #define SMALL 5
- #define MEDIUM 15
- #define BIG 30
- // -- Servo delta limit default. degree / sec
- #define SERVO_LIMIT_DEFAULT 240
- // -- Servo indexes for easy access
- #define RIGHT_PITCH 0
- #define RIGHT_ROLL 1
- #define LEFT_PITCH 2
- #define LEFT_ROLL 3
- #define BODY 4
- #define HEAD 5
- #define SERVO_COUNT 6
- class Otto {
- public:
- Otto();
- ~Otto();
- //-- Otto initialization
- void Init(int right_pitch, int right_roll, int left_pitch, int left_roll, int body, int head);
- //-- Attach & detach functions
- void AttachServos();
- void DetachServos();
- //-- Oscillator Trims
- void SetTrims(int right_pitch, int right_roll, int left_pitch, int left_roll, int body,
- int head);
- //-- Predetermined Motion Functions
- void MoveServos(int time, int servo_target[]);
- void MoveSingle(int position, int servo_number);
- void OscillateServos(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
- double phase_diff[SERVO_COUNT], float cycle);
- //-- HOME = Otto at rest position
- void Home(bool hands_down = true);
- bool GetRestState();
- void SetRestState(bool state);
- // -- 手部动作
- void HandAction(int action, int times = 1, int amount = 30, int period = 1000);
- // action: 1=举左手, 2=举右手, 3=举双手, 4=放左手, 5=放右手, 6=放双手, 7=挥左手, 8=挥右手,
- // 9=挥双手, 10=拍打左手, 11=拍打右手, 12=拍打双手
- //-- 身体动作
- void BodyAction(int action, int times = 1, int amount = 30, int period = 1000);
- // action: 1=左转, 2=右转
- //-- 头部动作
- void HeadAction(int action, int times = 1, int amount = 10, int period = 500);
- // action: 1=抬头, 2=低头, 3=点头, 4=回中心, 5=连续点头
- private:
- Oscillator servo_[SERVO_COUNT];
- int servo_pins_[SERVO_COUNT];
- int servo_trim_[SERVO_COUNT];
- int servo_initial_[SERVO_COUNT] = {180, 180, 0, 0, 90, 90};
- unsigned long final_time_;
- unsigned long partial_time_;
- float increment_[SERVO_COUNT];
- bool is_otto_resting_;
- void Execute(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
- double phase_diff[SERVO_COUNT], float steps);
- };
- #endif // __MOVEMENTS_H__
|