极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25649|回复: 8

Arduino+舵机控制器+LeapMotion,运行时舵机无反应

[复制链接]
发表于 2014-2-28 15:23:01 | 显示全部楼层 |阅读模式
本帖最后由 红明 于 2014-2-28 15:22 编辑

整个结构如下图所示,我希望实现这样的功能,通过LeapMotion捕捉手的位置,Processing将数据通过串口Serial传给Arduino UNO,Arduino通过Softwareserial控制舵机。


第一阶段,直接从Arduino传输控制数据,可控制舵机转动。

  1. #include <SoftwareSerial.h>
  2. #define rxPin 10
  3. #define txPin 11

  4. SoftwareSerial mySerial(rxPin,txPin);
  5. void setup(){
  6.   Serial.begin(9600);
  7.   mySerial.begin(9600);
  8. }

  9. void loop(){
  10.   move(1,600,2,600,3,600,1000);
  11.   move(1,1500,2,1500,3,1500,1000);
  12.   move(1,2000,2,2000,3,2000,1000);
  13. }

  14. void move(int servo_number1,int servo_position1,int servo_number2,int servo_position2,int servo_number3,int servo_position3,int servo_time){
  15.   mySerial.print("#");
  16.   mySerial.print(servo_number1);
  17.   mySerial.print("P");
  18.   mySerial.print(servo_position1);
  19.   mySerial.print("#");
  20.   mySerial.print(servo_number2);
  21.   mySerial.print("P");
  22.   mySerial.print(servo_position2);
  23.   mySerial.print("#");
  24.   mySerial.print(servo_number3);
  25.   mySerial.print("P");
  26.   mySerial.print(servo_position3);
  27.   mySerial.print("T");
  28.   mySerial.print(servo_time);
  29.   mySerial.print("\r\n");
  30.   delay(servo_time);
  31. }
复制代码


第二阶段,启动Processing,把Leapmotion数据传输给Arduino,这时舵机就无反应了。

是不是因为同时用了Serial和SoftwareSerial?

Arduino的代码(原始代码在家里的机器里,不过基本是这样的)


  1. #include <SoftwareSerial.h>
  2. #define rxPin 10
  3. #define txPin 11

  4. SoftwareSerial mySerial(rxPin,txPin);
  5. void setup(){
  6.   Serial.begin(9600);
  7.   mySerial.begin(9600);
  8. }
  9. void loop(){
  10.   if(Serial.available()){
  11.     char buffer[3];
  12.     Serial.readBytes(buffer,3);
  13.     int leaphandx=buffer[0];
  14.     int  servox=map(leaphandx,0,127,600,2000);
  15.     if(mySerial.available()){
  16.       mySerial.print("#");
  17.       mySerial.print(1);
  18.       mySerial.print("P");
  19.       mySerial.print(servox);
  20.       mySerial.print("T");
  21.       mySerial.print(100);
  22.       mySerial.print("\r\n");
  23.       delay(1000);
  24.     }
  25.   }
  26. }

复制代码


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]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-2-28 15:25:21 | 显示全部楼层
另外,请问使用Arduino Mega这样的多串口控制板,能解决这个问题吗?

第一楼的问题,过去4天,在Google、Stackoverflow等地方查询,都没能找到解决办法,可能是我搜索的方向不对
回复 支持 反对

使用道具 举报

发表于 2014-2-28 20:44:46 | 显示全部楼层
您能不能把这几个模块拆开研究? 看看那个leap什么的能不能对手势有反应。 单独接舵机,看看舵机能不能动, 然后再连在一起测试。

硬邦邦的弄几段程序,谁知道是哪出的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 22:58:34 | 显示全部楼层
shihaipeng04 发表于 2014-2-28 20:44
您能不能把这几个模块拆开研究? 看看那个leap什么的能不能对手势有反应。 单独接舵机,看看舵机能不能动, ...

谢谢你

1、之前直接将舵机接到Arduino UNO上,Leap Motion的数据能通过Processing正常传输到舵机,通过Serial串口,左右或上下,能在两个舵机上反应出来。

2、Arduino单接舵机控制板,使用SoftwareSerial,也能控制舵机

3、直接通过串口向舵机控制板输出数据,能控制舵机

不过,如果向一楼那样组合起来,Processing通过serial传输手的位置数据,同时SoftwareSerial传输数据到舵机控制板,舵机却不动了。

目前就卡在这里。

再次谢谢你的提示。
回复 支持 反对

使用道具 举报

发表于 2014-2-28 23:37:44 | 显示全部楼层
红明 发表于 2014-2-28 22:58
谢谢你

1、之前直接将舵机接到Arduino UNO上,Leap Motion的数据能通过Processing正常传输到舵机,通过 ...

有些复杂,没有玩过。呵呵。 但是怎么好像哪里不太对劲呢? leap和processing通讯是用串口吧。 然后再和ard通讯?是不是串口已经被占领了啊? 我也是瞎猜,你继续研究。
回复 支持 反对

使用道具 举报

发表于 2014-3-4 17:14:33 | 显示全部楼层
有没有看过《Arduino and Kinect Projects》这本书?第13章讲kinect control delta robot。用的是kinect-processing-arduino,和你的差不多,可以参考一下
回复 支持 反对

使用道具 举报

发表于 2014-9-5 09:17:15 | 显示全部楼层
你的串口有问题吧,USB到Arduino  也就是串口,Arduino 到舵机控制板,也用串口。你觉得是不是!
回复 支持 反对

使用道具 举报

发表于 2015-2-9 09:32:38 | 显示全部楼层
我的可以控制了。
回复 支持 反对

使用道具 举报

发表于 2015-12-15 12:45:12 | 显示全部楼层
164335413 发表于 2015-2-9 09:32
我的可以控制了。

如何解决的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 14:48 , Processed in 0.072797 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表