How can we help you today?
【運動】P3x搖桿(鎖址式) | dual2s (2025)
簡介
GoX系列機器人(GoSUMO、GoARM、GoJoga足球….)的核心控制器為dual2s。我們提供的程式範例中,控制GoX系列機器人的通訊模式主要有三種:【APP控制模式、PS2x控制模式(速配式)、PS3x控制模式(鎖址式)】,如圖所示。
👉本單元將針對【P3x搖桿模式(鎖址式)】提供程式範例。

函數庫

檔案下載
PS3x搖桿函數庫下載:載點。
GoX輪型運動基礎概念
本單元程式範例提供兩組運動模式:抓地胎、麥克納姆輪。抓地胎共4種運動模式、麥克納姆輪共有10種運動模式。如下圖表。

搖桿按鍵功能介紹
P2x / P3x搖桿,兩種相同。此處以P3x搖桿為範例。
橘色表示P3x搖桿才具有之功能。

範例程式一、抓地胎
GoX在【抓地胎】模式時,目前有4種運動方向:前進、後退、左旋轉、右旋轉。運動速度由【搖桿推值】決定。
積木程式範例 – 抓地胎模式
本範例下載傳送門,👉【XML檔案】。

Arduino C – 抓地胎模式
#include <dual2s.h>
#include <Ps3Controller.h>
//DC電機GPIO
#define PIN_MOTO_1A 14
#define PIN_MOTO_1B 32
#define PIN_MOTO_2A 12
#define PIN_MOTO_2B 33
#define PIN_MOTO_3A 25
#define PIN_MOTO_3B 26
#define PIN_MOTO_4A 23
#define PIN_MOTO_4B 22
//蜂鳴器GPIO
#define PIN_BUZZER 15
//超音波GPIO
#define PIN_USC_FRONT_ECHO 13
#define PIN_USC_FRONT_TRIG 27
#define PIN_USC_RIGHT_ECHO 5
#define PIN_USC_RIGHT_TRIG 4
#define PIN_USC_LEFT_ECHO 19
#define PIN_USC_LEFT_TRIG 18
//短距紅外線GPIO
#define PIN_IR_LEFT 34
#define PIN_IR_MIDDLE 35
#define PIN_IR_RIGHT 39
//供電偵測GPIO
#define PIN_BATTERY 36
//預設使用的PWM通道
#define PWM_CH_BUZZER 7
#define PWM_CH_M1A 8
#define PWM_CH_M1B 9
#define PWM_CH_M2A 10
#define PWM_CH_M2B 11
#define PWM_CH_M3A 12
#define PWM_CH_M3B 13
#define PWM_CH_M4A 14
#define PWM_CH_M4B 15
GoSUMO gs;
Buzzer bz(PIN_BUZZER, PWM_CH_BUZZER);
unsigned long lastRecTime_P3x = 0; // 記錄上次收到 PS3 訊號的時間
// 描述此函式...
void onConnect() {
bz.alarm();
}
// 描述此函式...
void notify() {
if (Ps3.data.analog.stick.ry <= -5 && Ps3.data.analog.stick.rx == 0) {
gs.act(GoSUMO::FORWARD, map(Ps3.data.analog.stick.ry,-5,-128,100,1023));
}
if (Ps3.data.analog.stick.ry >= 5 && Ps3.data.analog.stick.rx == 0) {
gs.act(GoSUMO::BACKWARD, map(Ps3.data.analog.stick.ry,5,127,100,1023));
}
if (Ps3.data.analog.stick.rx <= -5 && Ps3.data.analog.stick.ry == 0) {
gs.act(GoSUMO::GO_RIGHT, map(Ps3.data.analog.stick.rx,-5,-128,100,1023));
}
if (Ps3.data.analog.stick.rx >= 5 && Ps3.data.analog.stick.ry == 0) {
gs.act(GoSUMO::GO_LEFT, map(Ps3.data.analog.stick.rx,5,127,100,1023));
}
if (Ps3.data.analog.stick.rx >= -5 && Ps3.data.analog.stick.rx <= 5 && Ps3.data.analog.stick.ry >= -5 && Ps3.data.analog.stick.ry <= 5) {
gs.stop();
}
}
void setup()
{
Ps3.attach(notify);; //設定按鍵變更時的回呼函式
Ps3.attachOnConnect(onConnect);//設定成功連線時的回呼函式
Ps3.begin("20:00:00:00:11:22"); // 啟動 P3x搖桿的藍牙位址
bz.alarm();
}
void loop(){}
範例程式二、麥克納姆輪
GoX在【抓地胎】模式時,目前有10種運動方向:前進、後退、左旋轉、右旋轉、右前橫移、左前橫移、右後橫移、左後橫移、右橫移、左橫移。運動速度由【搖桿推值】決定。

積木程式範例 – 麥克納姆輪
本範例下載傳送門,👉【XML檔案】。

Arduino C – 麥克納姆輪模式
#include <dual2s.h>
#include <Ps3Controller.h>
//DC電機GPIO
#define PIN_MOTO_1A 14
#define PIN_MOTO_1B 32
#define PIN_MOTO_2A 12
#define PIN_MOTO_2B 33
#define PIN_MOTO_3A 25
#define PIN_MOTO_3B 26
#define PIN_MOTO_4A 23
#define PIN_MOTO_4B 22
//蜂鳴器GPIO
#define PIN_BUZZER 15
//超音波GPIO
#define PIN_USC_FRONT_ECHO 13
#define PIN_USC_FRONT_TRIG 27
#define PIN_USC_RIGHT_ECHO 5
#define PIN_USC_RIGHT_TRIG 4
#define PIN_USC_LEFT_ECHO 19
#define PIN_USC_LEFT_TRIG 18
//短距紅外線GPIO
#define PIN_IR_LEFT 34
#define PIN_IR_MIDDLE 35
#define PIN_IR_RIGHT 39
//供電偵測GPIO
#define PIN_BATTERY 36
//預設使用的PWM通道
#define PWM_CH_BUZZER 7
#define PWM_CH_M1A 8
#define PWM_CH_M1B 9
#define PWM_CH_M2A 10
#define PWM_CH_M2B 11
#define PWM_CH_M3A 12
#define PWM_CH_M3B 13
#define PWM_CH_M4A 14
#define PWM_CH_M4B 15
GoSUMO gs;
Buzzer bz(PIN_BUZZER, PWM_CH_BUZZER);
unsigned long lastRecTime_P3x = 0; // 記錄上次收到 PS3 訊號的時間
// 描述此函式...
void notify() {
if (Ps3.data.button.circle) {
gs.act(GoSUMO::GO_RIGHT, 800);
}
if (Ps3.data.button.square) {
gs.act(GoSUMO::GO_LEFT, 800);
}
if (Ps3.data.analog.stick.ry <= -5 && Ps3.data.analog.stick.rx == 0) {
gs.act(GoSUMO::FORWARD, map(Ps3.data.analog.stick.ry,-5,-128,100,1023));
}
if (Ps3.data.analog.stick.ry <= -5 && Ps3.data.analog.stick.rx >= 5) {
gs.act(GoSUMO::RF_TVL, map(Ps3.data.analog.stick.rx,5,127,100,1023));
}
if (Ps3.data.analog.stick.ry <= -5 && Ps3.data.analog.stick.rx <= -5) {
gs.act(GoSUMO::LF_TVL, map(Ps3.data.analog.stick.rx,-5,-128,100,1023));
}
if (Ps3.data.analog.stick.ry >= 5 && Ps3.data.analog.stick.rx == 0) {
gs.act(GoSUMO::BACKWARD, map(Ps3.data.analog.stick.ry,5,127,100,1023));
}
if (Ps3.data.analog.stick.ry >= 5 && Ps3.data.analog.stick.rx >= 5) {
gs.act(GoSUMO::RB_TVL, map(Ps3.data.analog.stick.rx,5,127,100,1023));
}
if (Ps3.data.analog.stick.ry >= 5 && Ps3.data.analog.stick.rx <= -5) {
gs.act(GoSUMO::LB_TVL, map(Ps3.data.analog.stick.rx,-5,-128,100,1023));
}
if (Ps3.data.analog.stick.rx <= -5 && Ps3.data.analog.stick.ry == 0) {
gs.act(GoSUMO::R_TVL, map(Ps3.data.analog.stick.rx,-5,-128,100,1023));
}
if (Ps3.data.analog.stick.rx >= 5 && Ps3.data.analog.stick.ry == 0) {
gs.act(GoSUMO::L_TVL, map(Ps3.data.analog.stick.rx,5,127,100,1023));
}
if (Ps3.data.analog.stick.rx >= -5 && Ps3.data.analog.stick.rx <= 5 && Ps3.data.analog.stick.ry >= -5 && Ps3.data.analog.stick.ry <= 5) {
gs.stop();
}
}
// 描述此函式...
void onConnect() {
bz.alarm();
}
void setup()
{
Ps3.attach(notify);; //設定按鍵變更時的回呼函式
Ps3.attachOnConnect(onConnect);//設定成功連線時的回呼函式
Ps3.begin("20:00:00:00:11:22"); // 啟動 P3x搖桿的藍牙位址
bz.alarm();
}
void loop(){}