红明 发表于 2014-1-18 09:39:30

Arduino人间大炮 - 使用Leap Motion控制

本帖最后由 红明 于 2014-1-25 22:44 编辑

Arduino和Leap motion连接在同一台电脑上,通过Processin将手的位置传回,驱动Servo转动。



http://v.youku.com/v_show/id_XNjYyOTQyODA0.html

更新 2014-01-25
图中的LED Matrix替换为一个单色二极管。下面的图和代码也是依此更改。



原理:
Leap Motion捕捉手的位置,通过Processing取得部分数据,并传输给Arduino以控制两个舵机和一个LED。

主要硬件:
一个Arduino UNO
两个舵机Servo
一个红LED
一个200欧姆电Resistor
一个面包板
一包连接线
一个Leap Motion


与软硬件有关的网址
Leap Motion Dev社区
https://developer.leapmotion.com/

Processing
http://www.processing.org

LeapMotionForProcessing by Darius Morawiec
https://github.com/voidplus/leap-motion-processing

Arduino Servo
http://arduino.cc/en/reference/servo

连线图




Arduino代码
#include <Servo.h>

Servo leapservo;
Servo leapservo2;
int servopin=6;
int servo2pin=10;
int breadboardledpin = 4;

void setup(){

Serial.begin(9600);
leapservo2.attach(servo2pin);
leapservo.attach(servopin);
pinMode(breadboardledpin,OUTPUT);
}

void loop(){
if(Serial.available()){
    char buffer;
    Serial.readBytes(buffer,3);

    int leaphandx = buffer;
    if (leaphandx<=-76 && leaphandx >-128){
      leaphandx = 256-abs(leaphandx);
    }
    else if (leaphandx > -76 && leaphandx<0){
      leaphandx = 179;
    }
    else{
      leaphandx = buffer;
    }

    int leaphandy = buffer;
    if (leaphandy<=-76 && leaphandy >-128){
      leaphandy = 256-abs(buffer);
    }
    else if (leaphandy > -70 && leaphandy<0){
      leaphandy = 179;
    }
    else{
      leaphandy = buffer;
    }

    int breadboardled = buffer;
    if(breadboardled>=0 && breadboardled<110){
      digitalWrite(breadboardledpin,HIGH);
    }
    else{
      digitalWrite(breadboardledpin,LOW);
    }

    leapservo2.write(leaphandx);   
    leapservo.write(leaphandy);

}
Serial.flush();
}

Processing代码
import 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);
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();
    if (hand_position.x<20) {
      processhandx = 0;
    }
    else if (hand_position.x>=780) {
      processhandx = 179;
    }
    else {
      processhandx = map(hand_position.x, 20, 780, 0, 179);
    }

    if (hand_position.y<50) {
      processhandy = 0;
    }
    else if (hand_position.y>=450) {
      processhandy = 179;
    }
    else {
      processhandy = map(hand_position.y, 50, 450, 0, 179);
    }

    if (hand_position.z< -50) {
      processhandz = 0;
    }
    else if (hand_position.z>=50) {
      processhandz = 179;
    }
    else {
      processhandz = map(hand_position.z, -50, 50, 0, 179);
    }
   
    byte[] q = {
      byte(processhandx), byte(processhandy), byte(processhandz)
    };
    println(q);
   
    port.write(q);
}
}


红明 发表于 2014-1-25 20:18:32

bobo 发表于 2014-1-22 18:02
能公布一下代码和连接图吗?

你好,Bobo,我这几天在进行。。。算是程序员常说的“重构”吗,哈哈

之前只能传输两个值过来,舵机也会突然翻转,这几天慢慢可以稳定地重现手的位置、手指数量等的数量,身边的程序员都愿意帮忙,没有比这个更好的了。

明天下午,如果事情做完了,我就整理一下,分享给大家。

谢谢你。

红明 发表于 2014-1-26 14:33:10

Eric 发表于 2014-1-26 11:26
如果可以的话,能否同时检测到全身的动作数据,这样就可以同时控制一个人形机器人,就像铁甲钢拳的电影一样 ...

Leap Motion监测手的活动。

全身动作数据,得想别的办法,比如试试从Kinect取数据。

红明 发表于 2019-1-16 15:53:00

让生活更有趣 发表于 2018-10-9 11:42
楼主你好,我的情况同19楼,能否告知一下到哪里下载development这个库文件,万分感谢 ...

抱歉,时间太久,我也记不清楚了,刚才查了leapmotion和processing社区,没有发现对应的模块。

Ricky 发表于 2014-1-18 09:58:42

这个非常有意思。

bobo 发表于 2014-1-22 18:02:16

能公布一下代码和连接图吗?:)

红明 发表于 2014-1-25 22:47:49

更新好了。能演示,不过也仅仅是能演示。

下午尝试同时取手的位置、姿态和手指数量,一堆舵机,后来发现速度变慢。

年后再细细研究。

cj2q 发表于 2014-1-26 11:05:16

大户啊 那个感应装置买来多少钱

Eric 发表于 2014-1-26 11:26:54

如果可以的话,能否同时检测到全身的动作数据,这样就可以同时控制一个人形机器人,就像铁甲钢拳的电影一样,一定很爽啊!~~~

红明 发表于 2014-1-26 14:30:52

cj2q 发表于 2014-1-26 11:05
大户啊 那个感应装置买来多少钱

Leap Motion内测期间,提交了一个开发计划,审核通过后就能免费获得一个开发版,去年年初的事。现在淘宝上也有做代购的,5、6百块。

cj2q 发表于 2014-1-26 17:51:08

红明 发表于 2014-1-26 14:30
Leap Motion内测期间,提交了一个开发计划,审核通过后就能免费获得一个开发版,去年年初的事。现在淘宝 ...

楼主果然是技术型人才;P

何处不江南 发表于 2014-1-27 10:22:20

用这个控制机械手 更有搞头,楼主怎么看 哈哈

社区活动向导 发表于 2014-3-3 18:02:26

您好,您的项目已被推荐至 DF创客社区“梦幻3D打印机大奖”,有机会赢取3D打印机大奖。
https://mc.dfrobot.com.cn/thread-941-1-1.html

冰禾 发表于 2014-3-10 22:57:09

有意思有前途

hdc 发表于 2014-4-16 22:24:28

Leap Motion 听说真正的使用效果不怎么样?是不是

b1045851730 发表于 2016-3-3 17:53:30

import development.*;
这个development包不存在,在哪里可以找到

toooo477 发表于 2016-3-23 12:26:52

楼主你码代码都不注释一下嘛~:$

红明 发表于 2017-6-27 14:11:44

toooo477 发表于 2016-3-23 12:26
楼主你码代码都不注释一下嘛~

你好,最近再写代码,我都加注释了。因为过一段时间,我自己都不知道某一段的含义,哈哈。

小冬527 发表于 2017-8-1 20:47:01

楼主你好,找不到你的development的库

小冬527 发表于 2017-8-1 20:50:06

我最近在用leap motion控制机械臂,processing做上位机,arduino做下位机,和楼主你这个很像,所以就借用了您的代码进行测试,但是就是找不到这个development的库文件,能否告知一下,我应该怎么进行添加,谢谢啦

修正液 发表于 2018-10-7 21:18:27

楼主你好,processing中找不到development这个库,这个能在哪里下载呢?

让生活更有趣 发表于 2018-10-9 11:42:51

楼主你好,我的情况同19楼,能否告知一下到哪里下载development这个库文件,万分感谢
页: [1] 2
查看完整版本: Arduino人间大炮 - 使用Leap Motion控制