大数跨境
0
0

外国人三年前的古董级项目,有几个人能做出来?

外国人三年前的古董级项目,有几个人能做出来? DF创客社区
2018-07-10
1
导读:不服的进来~
 

你的无限手套还缺一点,就能打响指


作者: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开箱 | 弹球机

MechBattle 2018第二季招募开始

吃币机器人| 红白游戏机  

DIY树莓派游戏机 |Teleroomba 波士顿动力

 家庭萌宠Pando | DIY迷你装载机 

物联网项目精选 | Switch重度患者拯救指南 | 手相之诗

自制酸奶机 wifi 气象站 | 极简感应灯 | lululu时钟鹿


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

【声明】内容源于网络
0
0
DF创客社区
我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
内容 1282
粉丝 0
DF创客社区 我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
总阅读1.9k
粉丝0
内容1.3k