你的无限手套还缺一点,就能打响指
作者:Kurt E. Clothier
这是作者2015年的项目
当时还是用的树莓派B+
国内的小伙伴们
快来看看这款
古董级“物联网手势控制伺服电机”
能做出来的
请在留言区让我看见你们骄傲的双手哦!

安全可靠的实时数据流对于物联网而言至关重要。在见过诸多涉及相关应用程序或者“这边按下按钮,那边LED就会点亮”这一类的硬件的演示案例后,我和一个朋友希望做出互动性更好的东西,一种操纵时能感受到数据流的存在的方式。所以,我们决定创建一个关于运动控制的“事物”,它能模仿你的手部动作,并能基于手指位置显示对应颜色。希望本文能对你有所帮助!


针对部分源代码的概念性描述以及更加深入的讲解请参阅PubNub博客,完整的源代码可在GitHub Repo中找到,并且Instructable网站上还有专门的文章深刻阐述了LED矩阵驱动器电路。
第1步:所需零件和工具
整个项目涉及很多环节,这里我会尽力列出主要事项。
硬件准备:
Raspberry Pi - 作者选择了B+,推荐大家用新出的3B+,性能上大幅度提升,做项目更6
Leap Motion Controller
5V 电池电源
微型伺服电机 x4
微型伺服电机支架 x4
LED灯和电阻若干
RGB LED矩阵
电源开关
小按钮
位于伺服器上方的RGB矩阵使用定制驱动程序。整个项目的这部分相当先进,并且我还为其编写了单独的说明书。
软件和服务
PubNub - 数据流服务。适用于开发者的免费的沙盒模式!
Java SE - JDK 8 - 确保你的操作系统版本正确
Leap Motion Visualize(可视化工具应用程序)和Java SDK – 在此确认你的软件包与操作系统相匹配
PubNub Java SE SDK - 这需要进入项目库目录
Java IDE- 选择你最喜欢的,如JGrasp、NetBeans、IntelliJ或Eclipse
项目源代码资源库 - 托管在GitHub上
“树莓派”微型计算机板设置
PubNub Python库 - 这是在R Pi上设置PubNub的详解指南
网络互联 - WiFi或以太网均可。如果能ping通谷歌,将事半功倍。
所需工具
计算机 - 编写程序代码,访问Instructable等
电钻+钻头/驱动器 - 钻孔,拧螺丝等
Dremel旋转刀具 - 在外壳上开孔......有些朋友可能并不需要。
热胶枪 - 将某个东西粘到其它物体上,当然如果有,也可选择其他方式
烙铁+焊接 – 操作时不要吸入烟雾!
激光切割机 – 我们同样借助其他服务实现,若你拥有自己的机器,可以DIY。
螺丝刀、钳子 – 这些东西你应该是常备的!
第2步:项目概述
如前所述,这个工程涉及很多环节!概括来说,主要包括三部分:
带Leap Motion控制器的计算机 - 将数据发布至互联网
“盒子”里的树莓派 – 从互联网上订阅数据
PubNub - 安全连接这些事物的通信层。

计算机部分相当简单,“盒子”内部比较费事......
树莓派 - 主控制器,使用I2C总线与其他部分进行通信
ATmega328p矩阵驱动器电路 - 通过I2C总线接收命令,控制2个8x8 RGB矩阵电路
基于TLC5916的LED灌电路 – 通过ATmega328p进行控制,用于LED矩阵灌电流
Adafruit PWM驱动器 - 通过I2C总线接收相关命令,驱动4个伺服器
5V/5A电源 – 给整个系统供电

首先,我们需要设置用户计算机,以使用Leap Motion控制器。
第3步: Java和Leap Motion控制器设置
Java设置
我们将为Leap Motion控制器安装Java SDK,因此需要安装包含Java运行环境在内的Java开发工具集(JDK)。这非常简单,只需针对操作系统版本选择合适的软件包即可。
你无需安装任何软件程序,直接通过Java IDE运行源代码即可。这样你能自行编程、修改相关内容,以及深入学习!一旦安装了JDK,只需一种良好的IDE(集成开发环境)即可开始此项工作。部分常见的Java IDE包括Eclipse、IntelliJ和NetBeans。你可选择最喜欢的一种工具,或者直接随机挑选。设置库在不同工具中略有不同,因此你需要参考关于如何设置新项目的文档说明!
Java源代码
运行代码仅需单个Java文件即可,但必须安装Leap Motion和PubNub Java库...... GitHub项目资源库中包含必需的java文件。下文我们将进一步讨论代码。
Leap设置
Leap的设置过程较为复杂,并且不同系统的设置过程也不尽相同。这里不说明我使用的方法,只提供可参阅Leap Motion文献。如遇到任何困难,可随时寻求帮助。
1. 通过Leap Motion官网下载SDK、驱动程序和应用程序。
2. 安装Leap应用程序,此过程可能需要安装所有必要的驱动程序和进程。
3. 运行Leap Motion Diagnostic Visualizer(可视化工具诊断应用程序),确保Leap能正常工作。
4. 阅读Java SDK文档,特别是项目设置方面。
PubNub设置
最后一步是下载PubNub Java SDK。文档中会讲述如何将库添加到Java项目中。
第4步:Java源代码
如果你对java代码不感兴趣,可跳过这一步;但需要将你的个人PubNub密钥插入到代码中,这些代码才能正常运行!源代码请登录GitHub网站查看。
以下导入属于必需环节。如果这些程序导入出错,请检查你是否正确安装了SDK库。
import java.io.IOException;
import java.lang.Math;
import com.leapmotion.leap.*;
import com.pubnub.api.*;
import org.json.*;
首先需要保证你的项目能正常运行,这点非常重要,因为只有这样我们才能让所有的Leap活动都能在各自的线程中独立运行。我们首先设置项目main(主体),随后实施Runnable接口和初始化全局变量。我们需要着重关注全局变量“CHANNEL”,以及main(主体)中的一对密钥。
public class LeapToServo implements Runnable{
public static final String CHANNEL = "leap2pi";
// ... A Bunch of Code ...public static void main(String[] args) {
String pubKey = "Your_Publish_Key";
String subKey = "Your_Subscribe_Key";
// ... A bit more code ...
}
}
这些字符串的值是唯一的,你必须对其进行更改。信道名称设为保留为默认的“leap2pi”或其他字母数值。所有PubNub通信过程都必须通过这些信道予以实现,所以你最好使用唯一名称,以防止各项目相互干扰。密钥的发布和订阅是在你注册账户时PubNub向你提供的唯一个人标识符。请确保这些密钥的安全和私密性。这些密钥可防止其他人员在你的信道上展开会话。请注意,代码中可能会有一些地方专门使用了字符串“leap2pi”,而不是常量“CHANNEL”,因此所有这些实例位置都应相应更改。
Leap Motion每秒大约能捕获300帧数据。在每个框架内部,我们能够访问关于我们手部的海量信息,例如手指伸展的数量、俯仰角、偏航和手势。俯仰和偏航(手腕摇摆和倾斜)的Leap返回值通过弧度进行度量,但是这些可能对我们帮助不大。我们希望将这些数值转换为盒子PWM驱动程序的兼容格式。我们首先需要将弧度换算为度数,然后将度数转换为容许PWM数值(介于150至600之间)。这个范围对应通过12位伺服驱动器表示的典型伺服器工作范围(500 - 2000 us)。
基本公式为2500us / (2^13 -1) * (最小伺服值/最大脉宽),所以[500,2000] us映射[150,600] ...大致在代码范围内,这些转换采用以下方法进行处理。
public static int radiansToAdjustedDegrees(int radians){}public static double pitchDegreeToPWM(double degree){}public static double yawDegreeToPWM(double degree){}public static int normalizeDegree(int value){}
此外,代码的部分伺服和PWM术语可能有误,敬请谅解...并非所有项目参与人员都是这些学科的专家!
确保代码能正常工作的最佳方式是加载PubNub调试控制台。你可通过它输入信道名称,以及发布和订阅密钥。点击“订阅”,当你利用Java运行代码在Leap Motion控制器上移动你的手指时,订阅数据将实时显示在消息框中。
第5步:树莓派设置

当Java代码正常运行后,你就可以设置树莓派,以订阅这些数据并利用其驱动LED和伺服器了。你必须通过有效的网络连接对树莓派微型计算机进行配置;WiFi或以太网连接都可以,具体方式取决于你!如果你需要任何帮助,可参阅PubNub不久前发布的一篇文章,这篇文章非常实用。此外,你还可通过监视器和键盘直接在Pi上执行其中某个程序,或使用SSH远程执行。无论你采用何种方式,整个项目的最终目标都是建立一种单独的、无标题的设置程序,该程序能启动时自动运行必要的文件。
第一步:安装PubNub Python SDK。
打开一个终端,然后安装以下内容:
1. Python: pi@raspberrypi ~$ sudo apt-get install python-dev
2. pip: pi@raspberrypi ~$ sudo apt-get install python-pip
3. PubNub: pi@raspberrypi ~$ sudo pip install pubnub
这非常简单!现在我们需要在GitHub资源库的Pi目录中找到所有文件副本。最简单的方法是使用git克隆repo,然后删除其它所有我们不需要的东西:
1. > sudo apt-get install git
2. > git clone https://github.com/pubnub/LeapMotionServoBots.git
3. > cp -ar LeapMotionServoBots/Pi leap2pi
4. > rm -rf LeapMotionServoBots
现在,leap2pi目录内容应当与GitHub仓库Pi目录所发现的文件保持一致。最后,我们希望python脚本能够在启动时运行。我们希望运行以下两个python脚本:
· servo.py - The code which subscribes to PubNub and drives the LEDs and servos
· servo.py – 通过PubNub进行订阅并驱动LED和伺服器的代码
· shutown.py - A shutdown button monitor to turn the Pi off.
· shutown.py - 关闭监视器按钮,以关闭Pi。
这个过程非常简单,我们只需要以root用户身份对Linux系统文件进行编辑即可。首先,我们需要确保脚本是可执行的,然后打开rc.local文件进行编辑。
1. > chmod +x leap2pi/servo.py
2. > chmod +x leap2pi/shutdown.py
3. > sudo vi /etc/rc.local
你可自选任何编辑器类型,我倾向于vi。文件最后一行应该是“exit 0”,它允许文件彻底退出,以及Bash终端初始化。我们可在这里添加任意行命令,不过前提是它们还运行最终的“exit(退出)”命令。
在“exit 0”命令上方插入以下内容:
python leap2pi/servo.py &&
python leap2pi/shutdown.py &&
保存文件并退出,当启动时Pi会自动运行这些脚本。“&&”部分可确保每个命令都正常运行。如果把它关掉,bash终端将永远无法加载,所以你将无限期地被锁定在你的Pi之外!
步骤6:Pi与伺服驱动器之间的连接

Pi可直接驱动伺服器,但是这个过程并不容易。这里有一个专用的PWM通道,但我们总共需要4个这样的通道。每个通道都能伪装成软件,但有点麻烦。作为一台微型计算机,Pi在高层处理方面比低层控制要容易太多。当然,你也可以使用任何PWM驱动程序来执行此步骤,我采用的是Adafruit的16通道/12位驱动程序。诚然它有可能造成误杀,但对ATtiny24进行编程,可在I2C总线上通信时更容易向4台伺服器发送相关指令。我希望你能够独创建属于自己的驱动程序,不过说明指南没有相关介绍!
你能在网上找到教你使用这块板子的很多教学示例,并且你还需要其它额外的源代码文件。这些文件可在源代码资源库的Pi目录中查找 – 文件命名为“Adafruit ...”,它们将告知Pi是如何与PWM驱动程序通信的。
将Pi连接到主板非常容易。你可在引脚3和引脚5上找到Pi的I2C线路,但是如果没有开始这一步,则需要启用I2C通信通道。重要的输入引脚都会被标记为“OE”,其含义是低电平有效的“输出已启用”。只有当该引脚保持低电平时,伺服器才能正常运行。它能直接接地,或通过Pi的其它IO引脚进行驱动。在此项目中,我实际上是通过使用I2C数据线连接到R Pi的ATmega328p矩阵驱动电路对其进行驱动的。
在该图中,伺服器被连接到PWM驱动器的通道1。在这个项目中,你应按照以下要求设置伺服器:
· 通道0是左偏航(平移)
· 通道1是左倾斜(倾斜)
· 频道2是右偏航(平移)
· 频道3是右倾斜(倾斜)
第7步:仔细查看Servo.py
如果你精通Python,那么控制伺服器的python代码就变得异常简单。我个不擅长这种语言,当然无关紧要。你可在GitHub上读取servo.py文件副本。
与Java代码一样,你需要将你的个人PubNub发布和订阅密钥,以及通信信道名称都存放在此处。
启动时Pi将在执行以下操作:
1. 重置AVR矩阵驱动电路。
2. 通过你的密钥初始化PubNub
3. 订阅PubNub信道“leap2pi”
如果遇到死循环,请检查输出模式开关(稍后再作详细阐述)
在引擎盖下方,PubNub库正在处理所有艰苦的工作。这种订阅调用操作可处理所有事情,我们只需指定部分回调即可 - 这些是在事件发生时调用的函数。
#Subscribe to subchannel, set callback function to _callback and set error fucntion to _error pubnub.subscribe(channels=channel, callback=_callback, error=_error, connect=_connect, reconnect=_reconnect, disconnect=_disconnect)
连接回调应清楚明晰(连接、重连等),但是大部分动作都是对“回调”进行正确命名。这个功能实际上对我们从订阅信道所接收的消息将非常有用。如上所述,盒子通过连接到几条IO线路的滑动开关,选择数个输出模式。
· MIRROR - 机器人将对你的动作进行镜像操作;因此,你的左手能反向控制右侧机器人
· DISABLED - 伺服器将无任何响应
· CLONE - 机器人将克隆你的动作;因此你的左手能直接控制左侧机器人
这些模式的控制逻辑以及I2C驱动语句将在_callback函数中进行处理。
该文件唯一需要注意的是,其它事项都是采用GPIO引脚4作为输出引脚。该引脚驱动将蓝色LED阵列接地的MOSFET栅极。此引脚在启用PubNub的连接时使用,因此LED可作为连接指示器。这是无标题设置的重要领域,目前已经有部分迹象表明我们已经成功连接到互联网!

第8步:近距离查看Shutdown.py
这个脚本的执行过程相对上一个脚本更加容易,但是其重要性同样是不言而喻的。由于树莓派是一台具有完整功能的计算机,因此应该妥善关闭。如果紧紧是停止供电,该计算机就有可能出现驱动故障、数据丢失和内存损坏等问题。
为解决这个问题,我在盒子背面安装了一个带RGB LED指示器的简易按钮。按下此按钮并保持一秒钟时间,直至LED变为蓝色。这将命令Pi在释放按钮时重启。再次按住该按钮几秒钟,LED将变为红色,即表示完全关闭。

该功能完全通过shutdown.py脚本进行处理。在“死循环”中,可能会发生以下情况:
(1)休眠0.25秒
(2)检查按钮是否按下(引脚应当处于低电平状态)
(3)死循环
按下按钮,休眠1秒钟
重新检查引脚以查看该按钮是否仍处于按压状态
如果按钮仍然处于按压状态,我们可能要重新启动...如果没有,请继续检查!
将RGB LED设置为蓝色
再休眠2秒时间
重新检查引脚,看看按钮是否仍然处于按压状态
如果按钮仍然处于按压状态,我们需要关机!
将RGB LED设置为红色
如果没有,请重新启动!
第9步:创建盒子

为搭建这个物理盒,我们的朋友Eric利用Illustrator软件绘制了几个矢量文件(请参阅附件)。这些文件被邮寄至激光切割公司 (Ponoko),后者通过矢量图纸向我们回寄了一堆采用激光切割的木头和丙烯酸。这些材料固然非常棒,但最让我惊喜的还是能亲手组装它们。
如果你仔细观察,会发现自己需要在丙烯酸树脂(以及木头)上钻出一系列的导孔,然后再通过细螺丝将这些块状材料安装在一起。如果你不希望采用此种方式,可随意搭建任何想要的外壳形状。注意应采用零件清单的支架将电路组件牢固地安装到该基座上。我还在盒子后面追加了几个开孔,分别用于电源插座、按钮和RGB LED。
最重要的是安装伺服钻机。当它们移动时,钻机会导致所有轻质安装框架翻倒或掉落。因此将其牢牢固定在坚固表面显得至关重要,为此我们选择带盖板的盒子!
伺服器本身安装在Lynxmotion铝合金框架上,但我必须稍微弯曲翼片以使伺服器与之匹配,因为它们比这些安装件设计时适配的伺服器规格稍小。
最终视频:
*欢迎转发朋友圈。如需转载,请注明出处和原作者。
项目干货戳这里
物联网体重计 | Vision Kit开箱 | 弹球机
DIY树莓派游戏机 |Teleroomba | 波士顿动力|
物联网项目精选 | Switch重度患者拯救指南 | 手相之诗
自制酸奶机 | wifi 气象站 | 极简感应灯 | lululu时钟鹿

点击“阅读原文”,了解更多创客项目!

