Car/TaiChi/moveTaiChi.cpp

205 lines
5.0 KiB
C++
Raw Normal View History

2021-02-10 20:13:28 +08:00
#include <Arduino.h>
2021-02-13 12:29:42 +08:00
#include "moveTaiChi.h"
2021-02-10 20:13:28 +08:00
Move::Move()
{
global_speed_rate = DEFAULT_GLOBAL_SPEED_RATE;
current_move = STOP;
2021-02-14 12:40:23 +08:00
current_speed_rate = 0.0;
2021-02-10 20:13:28 +08:00
}
2021-02-14 12:40:23 +08:00
Move::Move(double global_speed_rate)
2021-02-10 20:13:28 +08:00
{
Move();
this->global_speed_rate = global_speed_rate;
}
//设置全局速度比率
2021-02-14 12:40:23 +08:00
void Move::SetGlobalSpeedRate(double global_speed_rate)
2021-02-10 20:13:28 +08:00
{
this->global_speed_rate = global_speed_rate;
}
//获取当前运动方向
uint8_t Move::GetCurrentMove(void)
{
return current_move;
}
//获取当前运动速度比率
2021-02-14 12:40:23 +08:00
double Move::GetCurrentSpeedRate(void)
2021-02-10 20:13:28 +08:00
{
return current_speed_rate;
}
//控制某个轮子转动
2021-02-14 12:40:23 +08:00
void Move::Wheel(uint8_t wheel, uint8_t rotation, double speed_rate)
2021-02-10 20:13:28 +08:00
{
uint8_t pin_in1, pin_in2, pin_ena;
switch (wheel)
{
case LEFT_A_WHEEL:
{
pin_in1 = LEFT_L298N_IN1;
pin_in2 = LEFT_L298N_IN2;
pin_ena = LEFT_L298N_ENA;
} break;
case LEFT_B_WHEEL:
{
pin_in1 = LEFT_L298N_IN3;
pin_in2 = LEFT_L298N_IN4;
pin_ena = LEFT_L298N_ENB;
} break;
case RIGHT_A_WHEEL:
{
pin_in1 = RIGHT_L298N_IN1;
pin_in2 = RIGHT_L298N_IN2;
pin_ena = RIGHT_L298N_ENA;
} break;
case RIGHT_B_WHEEL:
{
pin_in1 = RIGHT_L298N_IN3;
pin_in2 = RIGHT_L298N_IN4;
pin_ena = RIGHT_L298N_ENB;
}
}
if (rotation == STOP_ROTATION) //停止转动
{
digitalWrite(pin_in1, LOW);
digitalWrite(pin_in2, LOW);
return; //结束函数
}
2021-02-14 12:40:23 +08:00
analogWrite(pin_ena, speed_rate * global_speed_rate * 255.0); //设置 PWM 波,即转速
2021-02-10 20:13:28 +08:00
if (rotation == FORWARD_ROTATION) //向前转动
{
digitalWrite(pin_in1, LOW);
digitalWrite(pin_in2, HIGH);
}
else //向后转动
{
digitalWrite(pin_in1, HIGH);
digitalWrite(pin_in2, LOW);
}
}
//前进
2021-02-14 12:40:23 +08:00
void Move::Forward(double speed_rate)
2021-02-10 20:13:28 +08:00
{
Wheel(LEFT_A_WHEEL, FORWARD_ROTATION, speed_rate);
Wheel(LEFT_B_WHEEL, FORWARD_ROTATION, speed_rate);
Wheel(RIGHT_A_WHEEL, FORWARD_ROTATION, speed_rate);
Wheel(RIGHT_B_WHEEL, FORWARD_ROTATION, speed_rate);
current_move = FORWARD;
2021-02-14 12:40:23 +08:00
current_speed_rate = speed_rate;
2021-02-10 20:13:28 +08:00
}
//后退
2021-02-14 12:40:23 +08:00
void Move::Backward(double speed_rate)
2021-02-10 20:13:28 +08:00
{
Wheel(LEFT_A_WHEEL, BACKWARD_ROTATION, speed_rate);
Wheel(LEFT_B_WHEEL, BACKWARD_ROTATION, speed_rate);
Wheel(RIGHT_A_WHEEL, BACKWARD_ROTATION, speed_rate);
Wheel(RIGHT_B_WHEEL, BACKWARD_ROTATION, speed_rate);
current_move = BACKWARD;
2021-02-14 12:40:23 +08:00
current_speed_rate = speed_rate;
2021-02-10 20:13:28 +08:00
}
//向前左转
2021-02-14 12:40:23 +08:00
void Move::ForLeftward(double speed_rate, double turn_speed_rate)
2021-02-10 20:13:28 +08:00
{
2021-02-14 12:40:23 +08:00
Wheel(LEFT_A_WHEEL, FORWARD_ROTATION, turn_speed_rate * speed_rate);
Wheel(LEFT_B_WHEEL, FORWARD_ROTATION, turn_speed_rate * speed_rate);
2021-02-10 20:13:28 +08:00
Wheel(RIGHT_A_WHEEL, FORWARD_ROTATION, speed_rate);
Wheel(RIGHT_B_WHEEL, FORWARD_ROTATION, speed_rate);
current_move = FORLEFTWARD;
2021-02-14 12:40:23 +08:00
current_speed_rate = speed_rate;
2021-02-10 20:13:28 +08:00
}
//向前右转
2021-02-14 12:40:23 +08:00
void Move::ForRightward(double speed_rate, double turn_speed_rate)
2021-02-10 20:13:28 +08:00
{
Wheel(LEFT_A_WHEEL, FORWARD_ROTATION, speed_rate);
Wheel(LEFT_B_WHEEL, FORWARD_ROTATION, speed_rate);
2021-02-14 12:40:23 +08:00
Wheel(RIGHT_A_WHEEL, FORWARD_ROTATION, turn_speed_rate * speed_rate);
Wheel(RIGHT_B_WHEEL, FORWARD_ROTATION, turn_speed_rate * speed_rate);
2021-02-10 20:13:28 +08:00
current_move = FORRIGHTWARD;
2021-02-14 12:40:23 +08:00
current_speed_rate = speed_rate;
2021-02-10 20:13:28 +08:00
}
//向后左转
2021-02-14 12:40:23 +08:00
void Move::BackLeftward(double speed_rate, double turn_speed_rate)
2021-02-10 20:13:28 +08:00
{
2021-02-14 12:40:23 +08:00
Wheel(LEFT_A_WHEEL, BACKWARD_ROTATION, turn_speed_rate * speed_rate);
Wheel(LEFT_B_WHEEL, BACKWARD_ROTATION, turn_speed_rate * speed_rate);
2021-02-10 20:13:28 +08:00
Wheel(RIGHT_A_WHEEL, BACKWARD_ROTATION, speed_rate);
Wheel(RIGHT_B_WHEEL, BACKWARD_ROTATION, speed_rate);
current_move = BACKLEFTWARD;
2021-02-14 12:40:23 +08:00
current_speed_rate = speed_rate;
2021-02-10 20:13:28 +08:00
}
//向后右转
2021-02-14 12:40:23 +08:00
void Move::BackRightward(double speed_rate, double turn_speed_rate)
2021-02-10 20:13:28 +08:00
{
Wheel(LEFT_A_WHEEL, BACKWARD_ROTATION, speed_rate);
Wheel(LEFT_B_WHEEL, BACKWARD_ROTATION, speed_rate);
2021-02-14 12:40:23 +08:00
Wheel(RIGHT_A_WHEEL, BACKWARD_ROTATION, turn_speed_rate * speed_rate);
Wheel(RIGHT_B_WHEEL, BACKWARD_ROTATION, turn_speed_rate * speed_rate);
2021-02-10 20:13:28 +08:00
current_move = BACKRIGHTWARD;
2021-02-14 12:40:23 +08:00
current_speed_rate = speed_rate;
2021-02-10 20:13:28 +08:00
}
//制动
void Move::Stop(void)
{
Wheel(LEFT_A_WHEEL, STOP_ROTATION);
Wheel(LEFT_B_WHEEL, STOP_ROTATION);
Wheel(RIGHT_A_WHEEL, STOP_ROTATION);
Wheel(RIGHT_B_WHEEL, STOP_ROTATION);
current_move = STOP;
current_speed_rate = 0;
2021-02-14 12:40:23 +08:00
}
//向某方向运动
void Move::MoveDirection(uint8_t direction, double speed_rate, double turn_speed_rate)
{
switch (direction)
{
case FORWARD: Forward(speed_rate); break;
case BACKWARD: Backward(speed_rate); break;
case FORLEFTWARD: ForLeftward(speed_rate, turn_speed_rate); break;
case FORRIGHTWARD: ForRightward(speed_rate, turn_speed_rate); break;
case BACKLEFTWARD: BackLeftward(speed_rate, turn_speed_rate); break;
case BACKRIGHTWARD: BackRightward(speed_rate, turn_speed_rate); break;
case STOP: Stop();
}
2021-02-10 20:13:28 +08:00
}