Materiale Occorrente
Collegamenti
Come Procedere
#define DAT_PIN 7 // CTL1 Data #define CMD_PIN 6 // CTL2 Command // CTL3 9V for Motor (Optional) // CTL4 GND // CTL5 VCC #define AT1_PIN 5 // CTL6 Attention (PAD1) #define CLK_PIN 4 // CTL7 Clock // CTL8 N/C #define ACK_PIN 3 // CTL9 ACK #define AT2_PIN 2 // CTL6 Attention (PAD2)
con
#define DAT_PIN 2 // CTL1 Data #define CMD_PIN 3 // CTL2 Command // CTL3 9V for Motor (Optional) // CTL4 GND // CTL5 VCC #define AT1_PIN 4 // CTL6 Attention (PAD1) #define CLK_PIN 5 // CTL7 Clock // CTL8 N/C #define ACK_PIN 6 // CTL9 ACK #define AT2_PIN 9 // CTL6 Attention (PAD2)
o come meglio preferite, con questa libreria non avrete libertà di scelta sui pin nel pde. Modificandola deciderete voi quali pin usare. Con questa libreria, teoricamente si possono ricevere dati da 2 manopole, per decidere da quale manopola ricevere i dati basta cambiare la variabile padNo. In questo tutorial verrà utilizzato soltanto un padNo = PSX_PAD1.
IS_DOWN_LEFT(padNo) IS_DOWN_DOWN(padNo) IS_DOWN_RIGHT(padNo) IS_DOWN_UP(padNo) IS_DOWN_START(padNo) IS_DOWN_STICK_RIGHT(padNo) IS_DOWN_STICK_LEFT(padNo) IS_DOWN_SELECT(padNo)
IS_DOWN_SQUARE(padNo) IS_DOWN_CROSS(padNo) IS_DOWN_CIRCLE(padNo) IS_DOWN_TRIANGLE(padNo) IS_DOWN_R1(padNo) IS_DOWN_L1(padNo) IS_DOWN_R2(padNo) IS_DOWN_L2(padNo)
PRESSED_LEFT(padNo) PRESSED_DOWN(padNo) PRESSED_RIGHT(padNo) PRESSED_UP(padNo) PRESSED_START(padNo) PRESSED_STICK_RIGHT(padNo) //gli stick sono i joistick PRESSED_STICK_LEFT(padNo) PRESSED_SELECT(padNo)
PRESSED_SQUARE(padNo) PRESSED_CROSS(padNo) PRESSED_CIRCLE(padNo) PRESSED_TRIANGLE(padNo) PRESSED_R1(padNo) PRESSED_L1(padNo) PRESSED_R2(padNo) PRESSED_L2(padNo)
RELEASED_LEFT(padNo) RELEASED_DOWN(padNo) RELEASED_RIGHT(padNo) RELEASED_UP(padNo) RELEASED_START(padNo) RELEASED_STICK_RIGHT(padNo) RELEASED_STICK_LEFT(padNo) RELEASED_SELECT(padNo)
RELEASED_SQUARE(padNo) RELEASED_CROSS(padNo) RELEASED_CIRCLE(padNo) RELEASED_TRIANGLE(padNo) RELEASED_R1(padNo) RELEASED_L1(padNo) RELEASED_R2(padNo) RELEASED_L2(padNo)
ANALOG_RIGHT_X(padNo) ANALOG_RIGHT_Y(padNo) ANALOG_LEFT_X(padNo) ANALOG_LEFT_Y(padNo)
PSX.motorEnable(padNo, Motor1Enable, Motor2Enable)
Attributi:
padNo = PSX_PAD1 | PSX_PAD2
Motor1Enable = MOTOR1_ENABLE | MOTOR1_DISABLE
Motor2Enable = MOTOR2_ENABLE | MOTOR2_DISABLE
PSX.motor(padNo, Motor1OnOff, uint8_t Motor2Speed)
Attributi:
padNo = PSX_PAD1 | PSX_PAD2
Motor1OnOff = MOTOR1_ON | MOTOR1_OFF
Motor2Speed = uint8_t between 0 to 255 (0x00 to 0xFF)
Nota: La vibrazione dei motori potrebbe servire da feedback, quando magari stiamo pilotando un robot con un sensore. Se ad esempio il robot si avvicina troppo ad un oggetto, oppure sta per finire la superficie su cui sta viaggiando, manda l'impulso di far vibrare la manopola e noi sappiamo che dobbiamo fermarci.
PSX.mode(padNo, mode, lock)
Attributi:
padNo = PSX_PAD1 | PSX_PAD2
mode = MODE_DIGITAL | MODE_ANALOG
lock = MODE_UNLOCK | MODE_LOCK
#include <GPSXClass.h> #undef round //serve per non far fallire la compilazione int asd =0; void setup() { Serial.begin(9600); PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_LOCK); PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE); // Poll current state once. PSX.updateState(PSX_PAD1); } void loop() { PSX.updateState(PSX_PAD1); int data1 = ANALOG_RIGHT_X(PSX_PAD1); int data2 = ANALOG_RIGHT_Y(PSX_PAD1); int data3 = ANALOG_LEFT_X(PSX_PAD1); int data4 = ANALOG_LEFT_Y(PSX_PAD1); if (IS_DOWN_CIRCLE(PSX_PAD1)) { PSX.motor(PSX_PAD1, MOTOR1_ON, ANALOG_RIGHT_X(PSX_PAD1)); } if (PRESSED_CIRCLE(PSX_PAD1)) { Serial.println("Pressed circle"); } if (RELEASED_CIRCLE(PSX_PAD1)) { Serial.println("Released circle"); PSX.motor(PSX_PAD1, MOTOR1_OFF, 0); } if (PRESSED_SQUARE(PSX_PAD1)) { Serial.println("Pressed square"); PSX.mode(PSX_PAD1, MODE_DIGITAL, MODE_UNLOCK); } if (RELEASED_SQUARE(PSX_PAD1)) { Serial.println("Released square"); } if (PRESSED_CROSS(PSX_PAD1)) { Serial.println("Pressed cross"); PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_UNLOCK); PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE); } if (RELEASED_CROSS(PSX_PAD1)) { Serial.println("Released cross"); } if (IS_DOWN_TRIANGLE(PSX_PAD1)) { PSX.motor(PSX_PAD1,MOTOR1_ON ,ANALOG_LEFT_X(PSX_PAD1)); } if (PRESSED_TRIANGLE(PSX_PAD1)) { Serial.println("Pressed triangle"); } if (RELEASED_TRIANGLE(PSX_PAD1)) { Serial.println("Released triangle"); PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00); } if (PRESSED_UP(PSX_PAD1)) { Serial.println("Pressed Up"); } if (RELEASED_UP(PSX_PAD1)) { Serial.println("Released Up"); } if (PRESSED_DOWN(PSX_PAD1)) { Serial.println("Pressed Down"); } if (RELEASED_DOWN(PSX_PAD1)) { Serial.println("Released Down"); } if (PRESSED_LEFT(PSX_PAD1)) { Serial.println("Pressed Left"); } if (RELEASED_LEFT(PSX_PAD1)) { Serial.println("Released Left"); } if (PRESSED_RIGHT(PSX_PAD1)) { Serial.println("Pressed Right"); } if (RELEASED_RIGHT(PSX_PAD1)) { Serial.println("Released Right"); } if (PRESSED_CROSS(PSX_PAD1)) { Serial.println("Pressed cross"); PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_UNLOCK); PSX.motorEnable(PSX_PAD1, MOTOR1_ENABLE, MOTOR2_ENABLE); } if (RELEASED_CROSS(PSX_PAD1)) { Serial.println("Released cross"); } if (IS_DOWN_TRIANGLE(PSX_PAD1)) { PSX.motor(PSX_PAD1, MOTOR1_ON, ANALOG_LEFT_X(PSX_PAD1)); } if (PRESSED_TRIANGLE(PSX_PAD1)) { Serial.println("Pressed triangle"); } if (RELEASED_TRIANGLE(PSX_PAD1)) { Serial.println("Released triangle"); PSX.motor(PSX_PAD1, MOTOR1_OFF, 0x00); } if (PRESSED_R2(PSX_PAD1)) Serial.println("Pressed R2"); if (RELEASED_R2(PSX_PAD1)) Serial.println("Released R2"); if (PRESSED_R1(PSX_PAD1)) Serial.println("Pressed R1"); if (RELEASED_R1(PSX_PAD1)) Serial.println("Released R1"); if (PRESSED_L2(PSX_PAD1)) Serial.println("Pressed L2"); if (RELEASED_L2(PSX_PAD1)) Serial.println("Released L2"); if (PRESSED_L1(PSX_PAD1)) Serial.println("Pressed L1"); if (RELEASED_L1(PSX_PAD1)) Serial.println("Released L1"); if (PRESSED_SELECT(PSX_PAD1)) Serial.println("Pressed Select"); if (RELEASED_SELECT(PSX_PAD1)) Serial.println("Released Select"); if(PRESSED_STICK_RIGHT(PSX_PAD1)){ Serial.println("analog right x= "); Serial.println(data1); Serial.println("analog right y= "); Serial.println(data2); } if(RELEASED_STICK_RIGHT(PSX_PAD1)) Serial.println("Released Right Stick"); if(PRESSED_STICK_LEFT(PSX_PAD1)){ Serial.println("analog left x= "); Serial.println(data3); Serial.println("analog left y= "); Serial.println(data4); } if(RELEASED_STICK_LEFT(PSX_PAD1)) Serial.println("Released Left Stick"); if(PRESSED_START(PSX_PAD1)){ Serial.println("analog right x= "); Serial.println(data1); Serial.println("analog right y= "); Serial.println(data2); Serial.println("analog left x= "); Serial.println(data3); Serial.println("analog left y= "); Serial.println(data4); } if(RELEASED_START(PSX_PAD1)) Serial.println("Released Start"); }
Ecco un video: