Contact me: hankecnc@gmail.com

推推 grbl 3年前 (2023-02-02) 249次浏览
关闭
AustinSaintAubin 打开了这个问题 2016 年 12 月 5 日 · 24条评论
关闭

创意:遥控装置(Playstation 3 Dualshock 控制器/SIXAXIS 控制器)#103

AustinSaintAubin 打开了这个问题 2016 年 12 月 5 日 · 24条评论

注释

贡献者
奥斯汀圣奥宾 评论了 2016 年 12 月 5 日  

手柄控制

目标:使用Playstation 3 控制器通过蓝牙无线控制 CNC。
理想情况下,我希望控制发生在主机设备(树莓派)上,而不仅仅是客户端。

使用无线游戏控制器(如 PS3 控制器)似乎是成本最低且最简单的解决方法之一。
集成 Node.js 库以获得支持看起来是最好的选择。我也看了

资源选项:


Playstation 控制器设置(连接硬件的一般指南)

到目前为止,这是我在带集成蓝牙的 Raspberry PI 3 上对 PS3 的了解。
下面只是展示了如何连接 PS3 控制器。

安装

# Install & Enable Bluetooth Tools
sudo apt-get install -y bluetooth libbluetooth3 libusb-dev
sudo systemctl enable bluetooth.service

# Add pi user to bluetooth group
sudo usermod -G bluetooth -a pi

配对工具

# Get and build the command line pairing tool (sixpair)
wget http://www.pabr.org/sixlinux/sixpair.c
gcc -o sixpair sixpair.c -lusb

### Connect PS3 over USB
# Get PS3 DS 
sudo ./sixpair

### Disonnect PS3 over USB
bluetoothctl
### Connect PS3 over USB
devices
agent on
trust MAC # Replace "MAC" with MAC of "Device 64:D4:BD:B3:9E:66 PLAYSTATION(R)3 Controller"
trust 64:D4:BD:B3:9E:66 
quit
### Disonnect PS3 over USB, you should now be able to connect wirelessly. To check this, first list everything in /dev/input:

测试控制器连接

# List Devices
ls /dev/input

### PS3 Controller: press the PS button, the lights on the front of the controller should flash for a couple of seconds then stop, leaving a single light on. If you now look again at the contents of /dev/input you should see a new device, probably called something like ‘js0’:

# List Devices
ls /dev/input

获取电池电量

cat "/sys/class/power_supply/sony_controller_battery_64:d4:bd:b3:9e:66/capacity"

操纵杆应用

# Install
sudo apt-get install joystick

# Usage / Test
jstest /dev/input/js0
 AustinSaintAubin 更改了标题 想法:遥控挂件(Playstation 3 Dualshock 控制器/SIXAXIS 控制器) 创意:遥控装置(Playstation 3 Dualshock 控制器/SIXAXIS 控制器) 2016 年 12 月 5 日
贡献者作者

我得到它的工作。真是他妈的坏蛋。我可以用 PS3 DS3 控制器通过蓝牙从覆盆子 pi 控制我的 CNC … 它的一切我希望它会。仍然有一些小错误。但是我早上有工作。
内测版:

Node.js DS3 控制器设置

# Install Tools
sudo apt-get install -y libudev-dev libusb-1.0-0-dev
sudo apt-get install -y build-essential git
sudo apt-get install -y gcc-4.8 g++-4.8 && export CXX=g++-4.8


# Set access to /usr/lib/node_modules
ls -ld /usr/lib/node_modules; stat --format '%a' /usr/lib/node_modules
sudo chmod a+w /usr/lib/node_modules  # chmod 777
ls -ld /usr/lib/node_modules; stat --format '%a' /usr/lib/node_modules

# Install Node-HID
#########sudo npm install -g node-hid --unsafe-perm
-- OR --
# Compile HID
cd ~/
git clone https://github.com/node-hid/node-hid.git
cd node-hid                                        # must change into node-hid directory
git submodule update --init                        # done on publish automatically
npm install -g  # npm install                      # rebuilds the module
node-pre-gyp rebuild                               # rebuilds the C code
node-pre-gyp install --fallback-to-build

# Install Node-dualshock-controller
#########sudo npm install -g dualshock-controller--unsafe-perm
-- OR --
# Compile HID
cd ~/
git clone https://github.com/rdepena/node-dualshock-controller.git
cd node-dualshock-controller                       # must change into node-hid directory
git submodule update --init                        # done on publish automatically
npm install -g  # npm install                      # rebuilds the module

# Set access to /usr/lib/node_modules
sudo chmod g-w,o-w /usr/lib/node_modules  # chmod 755
ls -ld /usr/lib/node_modules; stat --format '%a' /usr/lib/node_modules

# Test
node ~/node-dualshock-controller/examples/consolePrintDualShock3.js

Socket.io 客户端

sudo npm install -g socket.io-client

代码

用法:节点测试.js

test.js麻省理工学院许可证

var io = require('socket.io-client');
var token = 'YOUR_API_KEY'

var socket = io.connect('ws://localhost:8000', {
  'query': 'token=' + token
});

socket.on('connect', function() {
	 console.log('Socket IO Connected!');

	 // List ports
	socket.emit('list', function(data) {
		console.log('LIST: ' + data);
	});

	console.log('============================');

	// Open port
	socket.emit('open', '/dev/ttyUSB0', { baudrate: Number(115200) });

	// Close port
	//socket.send('close', '/dev/ttyUSB0');

	// Write
	//socket.send('write', '/dev/ttyUSB0', 'G0 X0 Y0 Z0\n'); // should contain a newline character
	//socket.send('write', '/dev/ttyUSB0', '?'); // No newline for Grbl realtime commands

	// Command
	//socket.emit('command', '/dev/ttyUSB0', 'homing');
	//socket.send('command', '/dev/ttyUSB0', 'cyclestart');
	//socket.send('command', '/dev/ttyUSB0', 'reset');
});


// Redirect user to the Sign In page
socket.on('error', function() {
	// Close port
	socket.send('close', '/dev/ttyUSB0');

	 // Disconnect
	 socket.destroy();
	 console.log('ERROR');
});


// =====================================================
// https://www.npmjs.com/package/dualshock-controller

var dualShock = require('dualshock-controller');

//pass options to init the controller.
var controller = dualShock(
	 {
		  //you can use a ds4 by uncommenting this line.
		  //config: "dualshock4-generic-driver",
		  //if using ds4 comment this line.
		  config : "dualShock3",
		  //smooths the output from the acelerometers (moving averages) defaults to true
		  accelerometerSmoothing : true,
		  //smooths the output from the analog sticks (moving averages) defaults to false
		  analogStickSmoothing : true
	 });

//make sure you add an error event handler
controller.on('connected', function() {
	console.log('connected');
});

controller.on('error', function(data) {
  console.log('error');
});

// ------------------------------------------

// Safty Switch
var psx = false;

controller.on('psxButton:press', function(data) {
	psx = true;
	console.log(data + '|' + psx);
});

controller.on('psxButton:release', function(data) {
	psx = false;
	console.log(data + '|' + psx);
});


// Homing
controller.on('start:press', function(data) {
	if (psx) {
		socket.emit('command', '/dev/ttyUSB0', 'homing');
		console.log('homing:' + data);
	}
});

// Reset
controller.on('select:press', function(data) {
	if (psx) {
		socket.emit('command', '/dev/ttyUSB0', 'reset');
		console.log('reset:' + data);
	}
});


// Cyclestart
controller.on('start:press', function(data) {
	if (!psx) {
		socket.emit('command', '/dev/ttyUSB0', 'cyclestart');
		console.log('cyclestart:' + data);
	}
});

// Feedhold
controller.on('select:press', function(data) {
	if (!psx) {
		socket.emit('command', '/dev/ttyUSB0', 'feedhold');
		console.log('feedhold:' + data);
	}
});

// ------------------------------------------

// Safty Switch
var r1 = false;

controller.on('r1:press', function(data) {
	r1 = true;
	console.log(data + '|' + r1);
});

controller.on('r1:release', function(data) {
	r1 = false;
	console.log(data + '|' + r1);
});

// Start
controller.on('triangle:press', function(data) {
	if (r1) {
		socket.emit('command', '/dev/ttyUSB0', 'start');
		console.log('start:' + data);
	}
});

// Stop
controller.on('square:press', function(data) {
	if (r1) {
		socket.emit('command', '/dev/ttyUSB0', 'stop');
		console.log('stop:' + data);
	}
});

// Pause
controller.on('circle:press', function(data) {
	if (r1) {
		socket.emit('command', '/dev/ttyUSB0', 'pause');
		console.log('pause:' + data);
	}
});

// Resume
controller.on('x:press', function(data) {
	if (r1) {
		socket.emit('command', '/dev/ttyUSB0', 'resume');
		console.log('resume:' + data);
	}
});

// ------------------------------------------

// Cyclestart
controller.on('triangle:press', function(data) {
	if (!r1 && !l1 && !psx) {
		socket.emit('command', '/dev/ttyUSB0', 'cyclestart');
		console.log('cyclestart:' + data);
	}
});

// Unlock
controller.on('square:press', function(data) {
	if (!r1 && !l1 && !psx) {
		socket.emit('command', '/dev/ttyUSB0', 'feedhold');
		console.log('feedhold:' + data);
	}
});


// Feed Hold
controller.on('circle:press', function(data) {
	if (!r1 && !l1 && !psx) {
		socket.emit('command', '/dev/ttyUSB0', 'feedhold');
		console.log('feedhold:' + data);
	}
});

// Unlock
controller.on('x:press', function(data) {
	if (!r1 && !l1 && !psx) {
		socket.emit('command', '/dev/ttyUSB0', 'unlock');
		console.log('unlock:' + data);
	}
});


// ------------------------------------------

// Probe
controller.on('x:press', function(data) {
	if (psx) {
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91');
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G38.2 Z-15.001 F120');
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G90');
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G10 L20 P1 Z15.001');
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91');
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G0 Z3');
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G90');

		console.log('probe:' + data);
	}
});

// ------------------------------------------

// [D Pad]

// Moddifter Switch
var l1 = false;

controller.on('l1:press', function(data) {
	l1 = true;
	console.log(data + '|' + l1);
});

controller.on('l1:release', function(data) {
	l1 = false;
	console.log(data + '|' + l1);
});

// Y Up
controller.on('dpadUp:hold', function(data) {
	if (!l1) {
		// Slow
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 Y1');
	}
	else {
		// Fast
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 Y10');
	}

	console.log('dpadUp:' + l1);
});

// Y Down
controller.on('dpadDown:hold', function(data) {
	if (!l1) {
		// Slow
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 Y-1');
	}
	else {
		// Fast
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 Y-10');
	}

	console.log('dpadDown:' + l1);
});

// X Right
controller.on('dpadRight:hold', function(data) {
	if (!l1) {
		// Slow
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 X1');
	}
	else {
		// Fast
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 X10');
	}

	console.log('dpadRight:' + l1);
});

// X Left
controller.on('dpadLeft:hold', function(data) {
	if (!l1) {
		// Slow
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 X-1');
	}
	else {
		// Fast
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'G91 G0 X-10');
	}

	console.log('dpadLeft:' + l1);
});

// ------------------------------------------

// Spendle ON State
var spindle = false;

// R2
var r2 = false;
controller.on('r2:press', function(data) {
	r2 = true;
	console.log(data + '|' + r2);
});
controller.on('r2:release', function(data) {
	r2 = false;
	console.log(data + '|' + r2);
});

// L2
var l2 = false;
controller.on('l2:press', function(data) {
	l2 = true;
	console.log(data + '|' + l2);
});
controller.on('l2:release', function(data) {
	l2 = false;
	console.log(data + '|' + l2);
});


// Start Spindle
controller.on('r2:press', function(data) {
	if (r2 && l2 && psx) {
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'M3 S1000');
		spindle = true;
		console.log('Spindle: ' + spindle);
	}
});
controller.on('l2:press', function(data) {
	if (r2 && l2 && psx) {
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'M3 S1000');
		spindle = true;
		console.log('Spindle: ' + spindle);
	}
});

// Stop Spendle
controller.on('r2:release', function(data) {
	if (!psx && spindle) {
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'M5');
		spindle = false;
		console.log('Spindle: ' + spindle);
	}
});
controller.on('l2:release', function(data) {
	if (!psx && spindle) {
		socket.emit('command', '/dev/ttyUSB0', 'gcode', 'M5');
		spindle = false;
		console.log('Spindle: ' + spindle);
	}
});

// ------------------------------------------

//sixasis motion events:
//the object returned from each of the movement events is as follows:
//{
//	 direction : values can be: 1 for right, forward and up. 2 for left, backwards and down.
//	 value : values will be from 0 to 120 for directions right, forward and up and from 0 to -120 for left, backwards and down.
//}

//right-left movement
controller.on('rightLeft:motion', function (data) {
	 //...doStuff();
});

//forward-back movement
controller.on('forwardBackward:motion', function (data) {
	 //...doStuff();
});
//up-down movement
controller.on('upDown:motion', function (data) {
	 //...doStuff();
});

//controller status
//as of version 0.6.2 you can get the battery %, if the controller is connected and if the controller is charging
controller.on('battery:change', function (value) {
	console.log('battery:change:' + value);
});
controller.on('connection:change', function (value) {
	console.log('connection:change:' + value);
});
controller.on('charging:change', function (value) {
	console.log('connection:change:' + value);
});


//connect the controller
controller.connect();

一天要做的事情太多了……

[]仍然需要一种方法来检测控制器何时连接,然后加载此脚本。还需要在与控制器的连接丢失时关闭脚本……然后它应该在连接/重新连接时加载。

合作者

你好@AustinSaintAubin,

这很酷。您想在示例目录或其他地方继续您的工作吗?如果您想成为合作者,请告诉我。

贡献者作者

我很想成为合作者!
我想在我把它冲掉之后,它会成为 CNC 工具集的一个很好的补充。

合作者

谢谢。我刚给你发了邀请。

您可以将代码更改推送到dev分支或创建一个新的开发分支,然后在完成后将其合并到master分支。

贡献者作者
奥斯汀圣奥宾 评论了 2016 年 12 月 10 日  

将做一次有一个工作测试版。

我需要帮助:

  • 获取令牌
    • 从同一设备上的另一个 node.js 应用程序获取令牌时出现问题。
    • 现在我必须从另一个会话中毕业……我如何握手然后获得令牌?

如果启用身份验证,使用身份验证能够指定用户名和密码的用途也很好。

当前带有静态令牌的测试代码:

var io = require('socket.io-client');
var token = 'YOUR_TOKEN'

var socket = io.connect('ws://localhost:8000', {
  'query': 'token=' + token
});

socket.on('connect', function() {
	 console.log('Socket IO Connected!');

	 // List ports
	socket.emit('list', function(data) {
		console.log('LIST: ' + data);
	});

	// Open port
	socket.emit('open', '/dev/ttyUSB0', { baudrate: Number(115200) });

创意:遥控装置(Playstation 3 Dualshock 控制器/SIXAXIS 控制器) #103

喜欢 (0)