桌面彩色互动台灯

2020-05-141.8万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用Arduino Nano、WS2812 RGB灯带和红外手势传感器制作一款桌面彩色互动台灯。项目包括3D建模、硬件组装、电路焊制和软件编程。通过调整手势传感器的阈值,提高了手势识别的准确率。最终效果是一个可以通过手势控制颜色变化的互动台灯,适合初学者和STEM教育场景。

桌面彩色互动台灯

你的桌面上会不会缺少这样一个机器人宠物呢?
在你工作时绝不会打扰你,你休息时它任你摆布
我就一直很想要一款这样的机器人,无奈市场上的那些小型互动机器人太贵了,买不起

最近发现了一款红外手势传感器,立马就想着是不是可以动手实现我想要的互动机器人了在经历了一番折腾之后

于是,它就诞生啦

桌面彩色互动台灯图1
桌面彩色互动台灯图2

接下来,揭秘一下制作过程吧!

制作材料

1、Arduino Nano V3        ×1
2、WS2812 RGB 全彩灯带        ×1
3、红外手势传感器(带RGB/环境光检测)        ×1
4、微型双路1.5A直流电机驱动模块                ×1
5、3.7V电池 新型锂子化学聚合充电锂电池        ×2
6、微型金属减速电机        ×2
7、杜邦线(母母头) ×20
8、3PI miniQ 小车橡胶轮        ×2
9、3PI miniQ 小车万向轮       ×2

硬件部分

3D建模

在Fusion 360中设计车主体、灯架和电机固定支架等部分,(后来知道有现成的固定支架,但模型已经画好打印出来了就不想改了)
桌面彩色互动台灯图29桌面彩色互动台灯图28桌面彩色互动台灯图27

从光神王市场上找到了一款月球灯模型,灯罩部分用3D Bulider挖了两个槽,让它可以和车主体部分的尺寸吻合起来

桌面彩色互动台灯图30

第一次建模,献丑了


下载附件桌面彩色互动小车.zip

主体部分组装

把打印好的车体和电机、轮子组装起来
桌面彩色互动台灯图31桌面彩色互动台灯图32桌面彩色互动台灯图4桌面彩色互动台灯图3

组装完成!
桌面彩色互动台灯图5桌面彩色互动台灯图6

电路焊制

根据连线图:
桌面彩色互动台灯图33
把电路焊制在洞洞板上,
桌面彩色互动台灯图8
桌面彩色互动台灯图7

用杜邦线将电机、红外手势传感器、灯带与电路连接起来。
要注意的是,Nano的GND引脚数量不满足所需,为了焊接的方便,Nano左侧一排引脚中的RST引脚由于未被使用,因此在焊制排针的时候,RST引脚没有与边上的排针焊在一起,而是将RST引脚浮空,排针引脚与相邻的GND连在了一起,解决了GND引脚不足的问题。
当然如果有其它办法可以将GND引脚拓展到足够的数量也是没有问题的。
红外手势传感器用螺丝和螺帽固定好,最后把电路塞到车里,整理一下线。
桌面彩色互动台灯图10桌面彩色互动台灯图11

电池

为了向电机提供足够的电流和电压,采用了两块3.7V锂电池串联,为什么没有直接用7.4V锂电池而用了两块电池串联呢?省空间。
串联方法:将电池的PH头去掉,改换为杜邦线的母头,再用热缩管将铜丝裸露部分包裹起来。

桌面彩色互动台灯图34

至此,硬件部分基本做完了,灯罩和灯架3D打印时间比较久,这段时间里我们可以先编写小灯的控制程序。

软件部分

在开始软件部分前,首先需要安装好Arduino IDE,
然后把下面两个压缩包解压出来的文件夹放到C:\Program Files (x86)\Arduino\libraries目录下(Arduino默认安装路径是这个)


下载附件APDS-9960红外手势传感器库文件.zip
下载附件DFRobot_NeoPixel库文件.zip

调教红外手势传感器:

先来研究一下这款红外手势传感器可以识别哪些手势
当手进入感应区域,进入方向将会被记录,同时中断会被触发,等待手离开感应区,离开方向被记录,然后计算输出对应的手势。总共可以识别的手势包括上、下、左、右、远、近六种。
那,感应区域有多大呢,其实是可以自己设置的
桌面彩色互动台灯图12

首先打开C:\Program Files (x86)\Arduino\libraries\SparkFun_APDS9960\SparkFun_APDS9960.h,然后在SparkFun_APDS9960.h文件里调整一下手进入感应范围的阈值DEFAULT_GPENTH,就能让识别区域处在期望的范围内了。

注意:DEFAULT_GPENTH值域为0-255,越接近0意味着距离越远。我将手进入阈值DEFAULT_GPENTH设为100,大约距离传感器15cm处触发手势识别中断

桌面彩色互动台灯图13

除了感应区域,我们还需要调整一下识别灵敏度,默认值下的灵敏度太低了,好多次都识别失败,因此我更改了灵敏度,大大提高了识别正确率。此处的识别正确率以习惯的挥手速度为准,灵敏度越低意味着挥手速度要越慢。

在SparkFun_APDS9960.h文件里找到#define GESTURE_THRESHOLD_OUT,将后面的数值改小,手势识别的灵敏度就会相应提高,这里我设置成5。
再找到SparkFun_APDS9960.h文件里的#define GESTURE_SENSITIVITY_1,将后面数值改小,对上、下、左、右手势的识别灵敏度会进一步提高,这里我设置成了30。

至于#define GESTURE_SENSITIVITY_2对应的远、近手势识别的灵敏度在测试时感觉已经足够,因此没有做调整。

桌面彩色互动台灯图14

我们可以在手势传感器例程里尝试一下效果:
打开刚才红外手势传感器库文件的位置,找到GestureTest.ino
默认路径C:\Program Files (x86)\Arduino\libraries\SparkFun_APDS9960\examples\GestureTest\GestureTest.ino
按照刚才的接线图,确认已经把红外手势传感器部分的电路接好了,就可以直接上传程序,打开串口查看打印信息,如果误识别次数较多可以再调节一下上述几个阈值,直到正确识别率大于90%以上。

桌面彩色互动台灯图15

调教电机驱动

两个N20电机都是通过HR8833电机驱动芯片来控制工作的,两个电机分别由IA1、IA2和IB1、IB2引脚来控制的。以IA1,IA2为例:当IA2置低电平,IA1输入PWM信号,则PWM信号的高电平部分的占空比可以控制转速,电机正转;当IA1置高电平,IA2输入PWM信号,则PWM信号的低电平部分的占空比可以控制转速,电机正转;当IA1置低电平,IA2输入PWM信号,则PWM信号的高电平部分的占空比可以控制转速,电机反转;当IA2置高电平,IA1输入PWM信号,则PWM信号的低电平部分的占空比可以控制转速,电机反转;
下表可以很清晰地反映这两者的关系:

Ix1 Ix2 功能 描述
PWM 0 Forward PWM,fast decay 正向PWM调速,采用电流快衰减方式,高电平占空比为调速比
1 PWM Forward PWM,slow decay 正向PWM调速,采用电流慢衰减方式,低电平占空比为调速比
0 PWM Reverse PWM,fast decay 反向PWM调速,采用电流快衰减方式,高电平占空比为调速比
PWM 1 Reverse PWM,slow decay 反向PWM调速,采用电流慢衰减方式,低电平占空比为调速比

以下是电机驱动芯片的控制例程,可以对照看一下安装在车主体上之后的电机运动方向,然后自行定义一下前进、后退、左转、右转四个指令对应的电机控制指令。

/*
* @file Motor driver HR8833-Test.ino
* @brief HR8833-Test.ino  Motor control program
*
* control motor positive inversion
*
* @author lei.wu@dfrobot.com
* @version  V1.0
* @date  2016-4-13
*/
const int IA1=10;
const int IA2=12;
const int IB1=11;
const int IB2=13;

void setup() {
     pinMode(IA1, OUTPUT);
     pinMode(IA2, OUTPUT);
     pinMode(IB1, OUTPUT);
     pinMode(IB2, OUTPUT);
}

void loop() {
MA1_Forward(200);//MA1路电机正转,PWM调速
delay(1000);
MA2_Backward(200);//MA2路电机反转,PWM调速
delay(1000);
MB1_Forward(200);//MB1路电机正转,PWM调速
delay(1000);
MB2_Backward(200);//MB2路电机反转,PWM调速
delay(1000);
}

void MA1_Forward(int Speed1) //正向快衰模式,Speed1值越大,电机转动越快
{
     analogWrite(IA1,Speed1);
     digitalWrite(IA2,LOW);  
  }

void MA2_Backward(int Speed1) //反向慢衰模式,Speed2值越小,电机转动越快
{   
    int Speed2=255-Speed1;
    analogWrite(IA1,Speed2);
    digitalWrite(IA2,HIGH);
}

void MB1_Forward(int Speed1)
{
     analogWrite(IB1,Speed1);
     digitalWrite(IB2,LOW);  
}

void MB2_Backward(int Speed1)
{   
    int Speed2=255-Speed1;
    analogWrite(IB1,Speed2);
    digitalWrite(IB2,HIGH);   
} 

编写控制程序

在传感器和电机驱动芯片都调试完成之后,我们就可以开始编写综合的逻辑控制程序了。以下是我根据所需要的功能以及逻辑关联而画出来的程序框图

桌面彩色互动台灯图16
下载附件colorful_interactive_lamp_nano.zip

烧写程序

选择开发板 Arduino Nano
桌面彩色互动台灯图22
点击上传
桌面彩色互动台灯图17
上传成功!
桌面彩色互动台灯图18
此时灯光已经点亮,红外手势传感器也已开始工作
桌面彩色互动台灯图19

合盖固定

自己想办法把灯带从盖子上的小洞里穿过去,卡在灯带槽里,要是固定不牢或者怕灯带掉出来,也可以适当抹点胶。用螺丝将车主体和灯架固定住,
桌面彩色互动台灯图9
桌面彩色互动台灯图20桌面彩色互动台灯图21

盖上脑阔,大功告成啦!






创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(15)
20060606
20060606
电池怎么充电
神会找你
神会找你
作者
回复20060606
[md]充电的话需要增加一个[锂电池充电器](https://www.dfrobot.com.cn/goods-668.html),给外壳留一个USB孔位就好了[/md]
DFS1w2cb8o8
DFS1w2cb8o8
厉害厉害
面包板
面包板
看到OZOBOT的宝莲灯机器人也想自己做一个
793433466
793433466
加上一个蜂鸣器有音效搭配就更棒了
gada888
gada888
萌萌的小灯
DFBJkfQuocU
DFBJkfQuocU
学习学习
youjingisland
youjingisland
很可爱了
DFrJ5KYVQaH
DFrJ5KYVQaH
很详细,想学习
rzegkly
rzegkly
互动彩灯的创意很棒
神会找你
神会找你
作者
哈哈哈哈感谢大家捧场
hnyzcj
hnyzcj
赞yi
gray6666
gray6666
很棒,建议批量上市众筹
DFHJM_IpFmV
DFHJM_IpFmV回复gray6666
嗯,是应该这样!
DFByOXbISQB
DFByOXbISQB
萌萌哒的白头发机器人
rzyzzxw
rzyzzxw
这个好,太优秀。
teu
teu
学习了,顶一个。
- 没有更多了 -