analogWrite(Right_motor_go, 120); //PWM比例0~255調速,左右輪差異略增減 右電機減速
analogWrite(Left_motor_go, 180); //PWM比例0~255調速,左右輪差異略增減
}
void front_detection()
{
//此處循環次數減少,為了增加小車遇到障礙物的反應速度
for (int i = 0; i <= 5; i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
// servopulse(servopin, 90); //模擬產生PWM
}
}
void left_detection()
{
for (int i = 0; i <= 15; i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
// servopulse(servopin, 175); //模擬產生PWM
}
}
void right_detection()
{
for (int i = 0; i <= 15; i++) //產生PWM個數,等效延時以保證能轉到響應角度
{
// servopulse(servopin, 5); //模擬產生PWM
}
}
void loop()
{
int temp = 0;
PS2_Ctrol();
switch (g_carstate)
{
case enRUN: run(); break;
case enLEFT: left(); break;
case enRIGHT: right(); break;
//case enBACK: back(); break;
default: break;
}
switch (g_servostate)
{
case 0: if (temp != 0) {
temp = 0;
front_detection();
} break;
case 1: if (temp != 1) {
temp = 1;
left_detection();
} break;
case 2: if (temp != 2) {
temp = 2;
right_detection();
} break;
default: break;
}
delay(50);
}
void PS2_Ctrol(void)
{
int X1, Y1, X2, Y2;
if (error == 1) //skip loop if no controller found
return;
if (type != 1) //skip loop if no controller found
return;
//DualShock Controller
ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
if (ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if (ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
if (ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
g_carstate = enRUN;
}
else if (ps2x.Button(PSB_PAD_RIGHT)) {
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
g_carstate = enRIGHT;
}
else if (ps2x.Button(PSB_PAD_LEFT)) {
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
g_carstate = enLEFT;
}
else if (ps2x.Button(PSB_PAD_DOWN)) {
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
g_carstate = enBACK;
}
else
{
g_carstate = enSTOP;
}
vibrate = ps2x.Analog(PSAB_CROSS); //this will set the large motor vibrate speed based on how hard you press the blue (X) button
if (ps2x.NewButtonState())
{ //will be TRUE if any button changes state (on to off, or off to on)
if (ps2x.Button(PSB_L3))//停止
{
g_carstate = enSTOP;
Serial.println("L3 pressed");
}
if (ps2x.Button(PSB_R3)) //復位
{
front_detection();
Serial.println("R3 pressed");
}
if (ps2x.Button(PSB_L2)) //加速
{
Serial.println("L2 pressed");
control += 50;
if (control > 255)
{
control = 255;
}
}
if (ps2x.Button(PSB_R2))
{
Serial.println("R2 pressed");
control -= 50;
if (control < 50)
{
control = 100;
}
}
if (ps2x.Button(PSB_TRIANGLE)) //點燈
{
Serial.println("Triangle pressed");
digitalWrite(Led, !digitalRead(Led)); //反轉電平
}
}
if (ps2x.ButtonPressed(PSB_CIRCLE))//滅火 //will be TRUE if button was JUST pressed
{
Serial.println("Circle just pressed");
digitalWrite(Fire, !digitalRead(Fire)); //反轉電平
}
if (ps2x.NewButtonState(PSB_CROSS))//鳴笛 //will be TRUE if button was JUST pressed OR released
{
Serial.println("X just changed");
// whistle();
}
if (ps2x.ButtonReleased(PSB_SQUARE))//唱歌 //will be TRUE if button was JUST released
{
Serial.println("Square just released");
//PlayTest();
}
if (ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1))
{ //print stick values if either is TRUE
Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC);
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC);
Y1 = ps2x.Analog(PSS_LY);
X1 = ps2x.Analog(PSS_LX);
Y2 = ps2x.Analog(PSS_RY);
X2 = ps2x.Analog(PSS_RX);