PlayStation Controller library
Dependents: PSController_Sample coba_stick_PS2 basehybrid_PSPAD Base_Hybrid_V3 ... more
PlayStation Controller
SONY プレイステーション2用コントローラーを mbed に接続して使えるライブラリです。
SPI 機能を使います。
サードパーティ製や、VSTONE製のコントローラー(VS-C1、VS-C3)も使用できます。
ピンアサイン
PS PAD
========================= | 9 8 7 | 6 5 4 | 3 2 1 | -----------------------
PS PAD | VS-C3 | Signal | mbed |
1 | 3 | DAT | MISO |
2 | 4 | CMD | MOSI |
3 | +5-7V | ||
4 | 10 | GND | GND |
5 | 9 | +3V | +3.3V |
6 | 5 | SEL | CS |
7 | 6 | CLK | SCK |
8 | |||
9 | ACK |
PS_PAD.cpp
- Committer:
- okini3939
- Date:
- 2013-12-11
- Revision:
- 0:6eeefcf5a37a
- Child:
- 1:840370e1dcce
File content as of revision 0:6eeefcf5a37a:
/* * PlayStation Controller library * Copyright (c) 2013 Hiroshi Suga */ #include "PS_PAD.h" PS_PAD::PS_PAD (PinName mosi, PinName miso, PinName sck, PinName cs) : _spi(mosi, miso, sck), _cs(cs) { _spi.format(8, 3); _spi.frequency(250000); _cs = 1; _vib1 = 0; _vib2 = 0; } PS_PAD::PS_PAD (SPI &spi, PinName cs) : _spi(spi), _cs(cs) { _spi.format(8, 3); _spi.frequency(250000); _cs = 1; _vib1 = 0; _vib2 = 0; } int PS_PAD::init () { const char enter_config_mode[5] = {0x01, 0x43, 0x00, 0x01, 0x00}; const char enable_analog_mode[9] = {0x01, 0x44, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00}; const char enable_vibration[9] = {0x01, 0x4d, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff}; const char exit_config_mode[9] = {0x01, 0x43, 0x00, 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A}; char buf[10]; send(enter_config_mode, 5, buf); if (buf[2] == 0xff) { return -1; } wait_ms(16); send(enable_analog_mode, 9, buf); wait_ms(16); send(enable_vibration, 9, buf); wait_ms(16); send(exit_config_mode, 9, buf); wait_ms(16); return 0; } int PS_PAD::poll () { const char poll_command[9] = {0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; int i; char cmd[10], buf[10]; memcpy(cmd, poll_command, 9); cmd[3] = _vib1; cmd[4] = _vib2; send(cmd, 9, buf); if (buf[2] == 0xff) { return -1; } for (i = 0; i < 6; i ++) { _pad[i] = buf[3 + i]; } return 0; } int PS_PAD::read (TYPE t) { switch (t) { case PAD_LEFT: return _pad[0] & 0x80 ? 0 : 1; case PAD_BOTTOM: return _pad[0] & 0x40 ? 0 : 1; case PAD_RIGHT: return _pad[0] & 0x20 ? 0 : 1; case PAD_TOP: return _pad[0] & 0x10 ? 0 : 1; case PAD_START: return _pad[0] & 0x08 ? 0 : 1; case ANALOG_LEFT: return _pad[0] & 0x04 ? 0 : 1; case ANALOG_RIGHT: return _pad[0] & 0x02 ? 0 : 1; case PAD_SELECT: return _pad[0] & 0x01 ? 0 : 1; case PAD_SQUARE: return _pad[1] & 0x80 ? 0 : 1; case PAD_X: return _pad[1] & 0x40 ? 0 : 1; case PAD_CIRCLE: return _pad[1] & 0x20 ? 0 : 1; case PAD_TRIANGLE: return _pad[1] & 0x10 ? 0 : 1; case PAD_R1: return _pad[1] & 0x08 ? 0 : 1; case PAD_L1: return _pad[1] & 0x04 ? 0 : 1; case PAD_R2: return _pad[1] & 0x02 ? 0 : 1; case PAD_L2: return _pad[1] & 0x01 ? 0 : 1; case ANALOG_RX: if (_pad[2] < 0x80) { return (_pad[2] - 0x7f) * 100 / 0x7f; } else { return (_pad[2] - 0x7f) * 100 / 0x7f; } case ANALOG_RY: if (_pad[3] < 0x80) { return (_pad[3] - 0x7f) * 100 / 0x7f; } else { return (_pad[3] - 0x7f) * 100 / 0x7f; } case ANALOG_LX: if (_pad[4] < 0x80) { return (_pad[4] - 0x7f) * 100 / 0x7f; } else { return (_pad[4] - 0x7f) * 100 / 0x7f; } case ANALOG_LY: if (_pad[5] < 0x80) { return (_pad[5] - 0x7f) * 100 / 0x7f; } else { return (_pad[5] - 0x7f) * 100 / 0x7f; } } return 0; } int PS_PAD::vibration (int v1, int v2) { _vib1 = v1 ? 1 : 0; if (v2 < 0) v2 = 0; if (v2 > 0xff) v2 = 0; _vib2 = v2; poll(); return 0; } int PS_PAD::send (const char *cmd, int len, char *dat) { int i; _cs = 0; wait_us(10); for (i = 0; i < len; i ++) { dat[i] = __rbit(_spi.write(__rbit(cmd[i] << 24)) << 24); wait_us(10); } _cs = 1; return i; }