本帖最后由 红明 于 2014-2-28 15:22 编辑
整个结构如下图所示,我希望实现这样的功能,通过LeapMotion捕捉手的位置,Processing将数据通过串口Serial传给Arduino UNO,Arduino通过Softwareserial控制舵机。
第一阶段,直接从Arduino传输控制数据,可控制舵机转动。
- #include <SoftwareSerial.h>
- #define rxPin 10
- #define txPin 11
- SoftwareSerial mySerial(rxPin,txPin);
- void setup(){
- Serial.begin(9600);
- mySerial.begin(9600);
- }
- void loop(){
- move(1,600,2,600,3,600,1000);
- move(1,1500,2,1500,3,1500,1000);
- move(1,2000,2,2000,3,2000,1000);
- }
- void move(int servo_number1,int servo_position1,int servo_number2,int servo_position2,int servo_number3,int servo_position3,int servo_time){
- mySerial.print("#");
- mySerial.print(servo_number1);
- mySerial.print("P");
- mySerial.print(servo_position1);
- mySerial.print("#");
- mySerial.print(servo_number2);
- mySerial.print("P");
- mySerial.print(servo_position2);
- mySerial.print("#");
- mySerial.print(servo_number3);
- mySerial.print("P");
- mySerial.print(servo_position3);
- mySerial.print("T");
- mySerial.print(servo_time);
- mySerial.print("\r\n");
- delay(servo_time);
- }
复制代码
第二阶段,启动Processing,把Leapmotion数据传输给Arduino,这时舵机就无反应了。
是不是因为同时用了Serial和SoftwareSerial?
Arduino的代码(原始代码在家里的机器里,不过基本是这样的)
- #include <SoftwareSerial.h>
- #define rxPin 10
- #define txPin 11
- SoftwareSerial mySerial(rxPin,txPin);
- void setup(){
- Serial.begin(9600);
- mySerial.begin(9600);
- }
- void loop(){
- if(Serial.available()){
- char buffer[3];
- Serial.readBytes(buffer,3);
- int leaphandx=buffer[0];
- int servox=map(leaphandx,0,127,600,2000);
- if(mySerial.available()){
- mySerial.print("#");
- mySerial.print(1);
- mySerial.print("P");
- mySerial.print(servox);
- mySerial.print("T");
- mySerial.print(100);
- mySerial.print("\r\n");
- delay(1000);
- }
- }
- }
复制代码
Processing部分的代码
[pre lang="proceesing" line="1"]dimport processing.serial.*;
import de.voidplus.leapmotion.*;
import development.*;
Serial port;
LeapMotion leap;
float processhandx;
float processhandy;
float processhandz;
void setup() {
size(800, 500, P3D);
background(255);
noStroke();
fill(50);
println(Serial.list());
port = new Serial(this, Serial.list()[0], 9600);
leap = new LeapMotion(this);
}
void draw() {
background(100);
int fps = leap.getFrameRate();
for (Hand hand : leap.getHands()) {
hand.draw();
PVector hand_position = hand.getPosition();
PVector hand_dynamics = hand.getDynamics() ;
int finger_count = hand.countFingers();
boolean get_finger = hand.hasFingers();
println(hand_position.x,hand_position.y,hand_position.z);
if (hand_position.x<20) {
processhandx = 0;
}
else if (hand_position.x>=780) {
processhandx = 127;
}
else {
processhandx = map(hand_position.x, 20, 780, 0, 127);
}
if (hand_position.y<50) {
processhandy = 0;
}
else if (hand_position.y>=450) {
processhandy = 127;
}
else {
processhandy = map(hand_position.y, 50, 450, 0, 127);
}
if (hand_position.z< -50) {
processhandz = 0;
}
else if (hand_position.z>=50) {
processhandz = 127;
}
else {
processhandz = map(hand_position.z, -50, 50, 0, 127);
}
println(int(processhandx));
port.write(int(processhandx));
}
}[/code] |