Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Ritorna ai Tutorial

Materiale Occorrente

  • Controller PSx
  • Alimentatore da 9volt, altrimenti da voltaggio maggiore ma con un LM7809 collegato in modo tale che eroghi 9V
  • No. 2 Resistenze da 1K
  • Basetta

Collegamenti

  • Seguite questo schema per i collegamenti.

Come Procedere

*installate la libreria GPSX che troverete qui http://pspunch.com/pd/files/library/GPSX.zip
*Modificate il file GPSX.c sostituendo
#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.

Istruzioni
*Controllo se i tasti sono premuti

      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)

  • Controlla se un tasto è stato premuto nel caso di PRESSED, rilasciato nel caso di RELEASED, dall'ultimo updateState(). Ritornano 1 o 0.

      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)

  • Leggere i valori dei joystick analogici in modalità analogica. Ritornano un valore tra 0 e 255

      ANALOG_RIGHT_X(padNo)
      ANALOG_RIGHT_Y(padNo)
      ANALOG_LEFT_X(padNo)
      ANALOG_LEFT_Y(padNo)

  • Abilitare/disabilitare i motori

     PSX.motorEnable(padNo, Motor1Enable, Motor2Enable)

     Attributi:

     padNo         = PSX_PAD1 | PSX_PAD2

     Motor1Enable  = MOTOR1_ENABLE | MOTOR1_DISABLE

     Motor2Enable  = MOTOR2_ENABLE | MOTOR2_DISABLE

  • Velocità Motore.

     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.

  • Modalità analogica/digitale da programma

     PSX.mode(padNo, mode, lock)

     Attributi:

     padNo  = PSX_PAD1 | PSX_PAD2

     mode   = MODE_DIGITAL | MODE_ANALOG

     lock   = MODE_UNLOCK | MODE_LOCK

*Caricate questo codice per provare se tutto funziona.
#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:

http://www.youtube.com/watch?v=ig-4hq4jIvE