Arduino+舵机控制器+LeapMotion,运行时舵机无反应
本帖最后由 红明 于 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;
Serial.readBytes(buffer,3);
int leaphandx=buffer;
intservox=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部分的代码
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(), 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();
booleanget_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));
}
} 另外,请问使用Arduino Mega这样的多串口控制板,能解决这个问题吗?
第一楼的问题,过去4天,在Google、Stackoverflow等地方查询,都没能找到解决办法,可能是我搜索的方向不对:L 您能不能把这几个模块拆开研究? 看看那个leap什么的能不能对手势有反应。 单独接舵机,看看舵机能不能动, 然后再连在一起测试。
硬邦邦的弄几段程序,谁知道是哪出的问题。 shihaipeng04 发表于 2014-2-28 20:44 static/image/common/back.gif
您能不能把这几个模块拆开研究? 看看那个leap什么的能不能对手势有反应。 单独接舵机,看看舵机能不能动, ...
谢谢你
1、之前直接将舵机接到Arduino UNO上,Leap Motion的数据能通过Processing正常传输到舵机,通过Serial串口,左右或上下,能在两个舵机上反应出来。
2、Arduino单接舵机控制板,使用SoftwareSerial,也能控制舵机
3、直接通过串口向舵机控制板输出数据,能控制舵机
不过,如果向一楼那样组合起来,Processing通过serial传输手的位置数据,同时SoftwareSerial传输数据到舵机控制板,舵机却不动了。
目前就卡在这里。
再次谢谢你的提示。 红明 发表于 2014-2-28 22:58 static/image/common/back.gif
谢谢你
1、之前直接将舵机接到Arduino UNO上,Leap Motion的数据能通过Processing正常传输到舵机,通过 ...
有些复杂,没有玩过。呵呵。 但是怎么好像哪里不太对劲呢? leap和processing通讯是用串口吧。 然后再和ard通讯?是不是串口已经被占领了啊? 我也是瞎猜,你继续研究。 有没有看过《Arduino and Kinect Projects》这本书?第13章讲kinect control delta robot。用的是kinect-processing-arduino,和你的差不多,可以参考一下 你的串口有问题吧,USB到Arduino也就是串口,Arduino 到舵机控制板,也用串口。你觉得是不是! 我的可以控制了。 164335413 发表于 2015-2-9 09:32 static/image/common/back.gif
我的可以控制了。
如何解决的
页:
[1]