< All Topics
Print

【運動】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(){}

Tags:
Table of Contents