ArduinoにおけるPS1コントローラの導入 | ..あちゃ! no mic's

..あちゃ! no mic's

クラウドファンディング予定~2026年度
何度でもチャレンジ!
ただいまソーラーピックアップのテスト中

SANTA no Mix

ロボザックとArduinoとプレイステーション1(PlayStation1)のコントローラでツクル、ロボットアーム。
いよいよ終盤にさしかかった。

ArduinoのPSXLibraryのダウンロード


RaspberryPiの環境下で作成した。
ダウンロードしたZipファイルをXarchiveで解凍する。
端末から

sudo cp -r /home/pi/Downloads/PsX /usr/share/arduino/libraries/

PsXの中にはexamplesもついているので、それで、まずテストを行うとよいかもしれない。




プレステのコネクタ
 ____________ 
 [①②③|④⑤⑥|⑦⑧⑨]
   ―――――――――

①・・・data
②・・・command
③・・・7.2V DUALSHOCK
④・・・GND
⑤・・・3.3V
⑥・・・attention
⑦・・・clock
⑧・・・none
⑨・・・acknowlodge



ソースコードは以下の通り。

#include <Psx.h>                                          
#include <Servo.h>
                                                         
#define dataPin 8
#define cmndPin 9
#define attPin 11
#define clockPin 10

//#define OPEN 0
//#define CLOSE 90

Psx Psx;                                                  
unsigned int data = 0; 
int deg = 90;
int ang = 90;
int clip = 90;

Servo robo0;
Servo robo1;
Servo robo2;
Servo robo3;
Servo robo4;

void setup(){
  
  robo0.attach(2,600,1500);
  robo1.attach(3,544,1500);
  robo2.attach(4,544,1500);
  robo3.attach(5,544,1500);
  robo4.attach(6,544,1500);
  
  Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 10);                             
//  Serial.begin(9600);
  
//    robo0.write(90);
    robo1.write(90);
    delay(10);
    robo2.write(90);
    delay(10);
    robo3.write(90);
    delay(10);
    robo4.write(90);
    delay(10);
}
void loop(){
  
  data = Psx.read();                                  
 //Serial.println(data);
  
  if (data & psxUp)                                       
  {
    deg = deg + 1;
    robo1.write(deg);
    delay(10);
    robo2.write(deg);
    delay(10);
    robo3.write(deg);
    delay(10);
  }
  else if (data & psxDown)
  {
    deg = deg - 1;
    robo1.write(deg);
    delay(10);
    robo2.write(deg);
    delay(10);
    robo3.write(deg);
    delay(10);
  }
  else if (data & psxLeft)
  {
    ang = ang - 1;
    robo4.write(ang);
    delay(10);
  } 
 else if (data & psxRight)
  {
    ang = ang + 1;
    robo4.write(ang);
    delay(10);
  }  
 else if (data & psxX)
 {
   clip = clip - 1;
   robo0.write(clip);
   delay(0);
 }  
 else if (data & psxO)
 {
   clip = clip + 1;
   robo0.write(clip);
   delay(0);
 } 
delay(20); 
}
注)電源は大容量のモノを用意しないとUSBからの給電では動作が不安定だった。