0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样用Arduino将手势传感器和LED环组合

454398 ? 来源:工程师吴畏 ? 2019-08-14 10:33 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

步骤1:组件

1。 Arduino UNO

2。 usb cable

3. APDS9960手势传感器

4。 24 led neopixel led ring

5. 雄性 - 男性,男性 - 男性面包板电缆

6。 面包板

7. LED环的5 V电源(我正在使用4节电池)

8 。 要将新像素环连接到面包板,您需要将三个公引脚焊接到它:GND,PWR和控制引脚。为此你需要一个烙铁和助焊剂

这里的主要部件是APDS-9960手势传感器和24个新像素环。您可以根据需要切换不同的arduinos,usb线缆电源和面包板。

步骤2:组装和上传

汇编

在开始之前,请确保您拥有所有组件。我们将有一些很好的步骤:)我还将Fritzing原理图作为图片和fritzing格式附加。

1。将3个公引脚焊接到新像素环(GND,PWR,控制引脚)

2。将新像素环连接到面包板上

3。将APDS9960传感器连接到面包板

4。接地:电池组,arduino UNO,APDS9960和neopixel到面包板地面

5。连接电源:arduino UNO 3V至APDS9960电源引脚,neopixel至电池组电源

6。将neopixel控制引脚连接到arduino D6引脚

7。将APDS9960的SDA和SCL分别连接到A4和A5

8。将APDS9960中断引脚连接到arduino D2

代码上传

首先,您需要下载并安装必要的arduino库:

1。 Neopixel ring library

2。手势传感器库

如果您不知道如何安装arduino库,请查看本教程

在下一节中,我将把代码直接嵌入到本教程中,所以如果你愿意,你可以从那里复制并粘贴它。

最后使用usb线将arduino连接到电脑,将1.5伏电池放入电池组,然后将草图上传到arduino。

第3步:它是如何工作的?

在最后一部分中,我们将学习如何将这些组件组合在一起,如何使用它们的库以及我如何使用它们构建我的代码:

首先让我们快速浏览一下传感器和我们将使用的neopixel库API方法

1 。来自adafruit的 Neopixel API

从这个库我们将使用控制单个led颜色的方法并应用它们

- 包括库:

#include

- 声明库

#define NEOPIXED_CONTROL_PIN 6

#define NUM_LEDS 24

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- 初始化

#typically inside the setup block

void setup() {

strip.begin();

# maybe some other stuff here # 。..。

}

- 点亮单个像素然后应用所有修改条带(以某种方式呈现)

# set up pixel 0 to be red

strip.setPixelColor(0, strip.Color(255, 0, 0));

# set up pixel 1 to be green

strip.setPixelColor(1, strip.Color(0, 255, 0));

# set up pixel 2 to be blue

strip.setPixelColor(2, strip.Color(0, 0 255));

strip.show();

2。 APDS 9960手势传感器

从这个库我们将使用“读取手势”功能。此功能将能够区分左右,上下,近远命令。这里有一个技巧,我们不会连续询问传感器的最后一个手势。电路板能够通过已发现手势的中断“ping”。

- 包括库,类似于neopixel

- 将库声明为中断引脚,和中断标志

#define APDS9960_INT 2

SparkFun_APDS9960 apds = SparkFun_APDS9960();

int isr_flag = 0;

- 初始化库,通常在设置函数内

void setup()

{

# declare the interrupt pin as INPUT and attach a function to it

pinMode(APDS9960_INT, INPUT);

attachInterrupt(0, interruptRoutine, FALLING);

if ( apds.init() && apds.enableGestureSensor(true)) {

Serial.println(“APDS-9960 initialization complete”);

} else {

Serial.println(“Something went wrong during APDS-9960 init!”);

}

# initialize other things maybe

}

- 定义中断函数,这里我们只设置一个flag

void interruptRoutine() {

isr_flag = 1;

}

- 在循环函数内部定期检查标志以查看是否已检测到手势

void loop()

{

# check the flag

if( isr_flag == 1 ) {

# if the flag is set, remove the interrupt, make the necessary processing inside handleGesture() function

# and then reset the flag and reattach the interrupt

detachInterrupt(0);

handleGesture();

isr_flag = 0;

attachInterrupt(0, interruptRoutine, FALLING);

}

# some other code here maybe

}

- 定义handleGesture()函数我们在哪里可以要求最后一个手势

void handleGesture() {

# if no gesture is avalible return, this is only a safe check

if ( !apds.isGestureAvailable() ) {

return;

}

# reads the last gesture, compares with the known ones and print a message

switch ( apds.readGesture() ) {

case DIR_UP:

Serial.println(“UP”);

break;

case DIR_DOWN:

Serial.println(“DOWN”);

break;

case DIR_LEFT:

Serial.println(“LEFT”);

break;

case DIR_RIGHT:

Serial.println(“RIGHT”);

break;

case DIR_FAR:

Serial.println(“FAR”);

break;

}

}

现在让我们看看整个代码的运行情况:

所以我已经解释了手势传感器的基本API和新像素环现在让我们把事情放在一起:

算法运行如下:

- 初始化库(参见上面的代码)

- 创建一个led数组强度被称为“ledStates”。该阵列将包含24个LED强度,以150到2的递减方式排列

- 在主循环内部检查中断引脚是否已被修改,如果是,则需要更改LED的动画或颜色

- “handleGesture()”函数检查最后一个手势并为UP -DOWN手势调用函数“toggleColor”或为LEFT - RIGHT手势设置全局变量“ledDirection”

- “toggleColor()”函数只是改变一个名为“colorSelection”的全局变量,其中一个值为0,1,2

- 在主循环函数中也有另一个名为“animateLeds();”的函数。叫做。此函数检查是否超过100毫秒,如果是,则使用“rotateLeds()”函数旋转LED,然后重新绘制它们

- “rotateLeds()”将向前或向后“旋转”LED使用另一个名为“intermediateLedStates”的数组。

旋转“效果”将如下所示:

# after initialization

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

# after rotateLeds() is called

{0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

# after rotateLeds() is called again

{0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

# and so on

首先创建新阵列并复制新位置上的旧led强度(增加位置)或减少它)。之后用“intermediateLedStates”覆盖“ledStates”数组,这样过程将在100毫秒后继续。

#include “SparkFun_APDS9960.h”

#include “Adafruit_NeoPixel.h”

#include “Wire.h”

#define NEOPIXED_CONTROL_PIN 6

#define NUM_LEDS 24

#define APDS9960_INT 2

#define LED_SPEED_STEP_INTERVAL 100

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

SparkFun_APDS9960 apds = SparkFun_APDS9960();

unsigned long lastLedChangeTime = 0;

short ledDirection = 0;

short colorSelection = 0;

byte ledStates[] = {150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int isr_flag = 0;

void setup()

{

Serial.begin(9600);

Serial.println(“Program started”);

strip.begin();

pinMode(APDS9960_INT, INPUT);

attachInterrupt(0, interruptRoutine, FALLING);

if ( apds.init() && apds.enableGestureSensor(true)) {

Serial.println(“APDS-9960 initialization complete”);

} else {

Serial.println(“Something went wrong during APDS-9960 init!”);

}

lastLedChangeTime = millis();

Serial.println(“Init succesfully”);

}

void loop()

{

if( isr_flag == 1 ) {

detachInterrupt(0);

handleGesture();

isr_flag = 0;

attachInterrupt(0, interruptRoutine, FALLING);

}

animateLeds();

}

void interruptRoutine()

{

isr_flag = 1;

}

/**

* This will handle gestures from the APDS9960 sensor

* Up and Down gestures will call toggleColor function

* Left and Right gestures will change the led animation

*/

void handleGesture() {

if ( !apds.isGestureAvailable() ) {

return;

}

switch ( apds.readGesture() ) {

case DIR_UP:

Serial.println(“UP”);

toggleColor();

break;

case DIR_DOWN:

Serial.println(“DOWN”);

toggleColor();

break;

case DIR_LEFT:

ledDirection = 1;

Serial.println(“LEFT”);

break;

case DIR_RIGHT:

ledDirection = -1;

Serial.println(“RIGHT”);

break;

case DIR_FAR:

ledDirection = 0;

Serial.println(“FAR”);

break;

}

}

/**

* Change current leds color

* Each time this function is called will change the leds state

*/

void toggleColor()

{

if (colorSelection == 0) {

colorSelection = 1;

} else if (colorSelection == 1) {

colorSelection = 2;

} else {

colorSelection = 0;

}

}

/**

* The animation will run after LED_SPEED_STEP_INTERVAL millis

* First the rotateLeds function is called, then the leds colors are set using the strip api

*/

void animateLeds()

{

if (millis() - lastLedChangeTime 《 LED_SPEED_STEP_INTERVAL) {

return;

}

rotateLeds();

for (int i=0; i 《 NUM_LEDS; i++) {

strip.setPixelColor(i, getColor(ledStates[i]));

strip.show();

}

lastLedChangeTime = millis();

}

/**

* Using a secondary array “intermediateLedStates”, leds intensities are animated

* First the values from “ledStates” are copied on “intermediateLedStates” like so

* let‘s sat the “ledStates” array is {100, 80, 60, 0, 0, 0} and the ledDirection is 1

* then after this function is called “ledStates” array is {0, 100, 80, 60, 0, 0} simulating a rotation effect

*/

void rotateLeds()

{

byte intermediateLedStates[NUM_LEDS];

for (int i=0; i 《 NUM_LEDS; i++) {

intermediateLedStates[i] = 0;

}

for (int i=0; i 《 NUM_LEDS; i++) {

if (ledDirection == 1) {

if (i == NUM_LEDS -1) {

intermediateLedStates[0] = ledStates[i];

} else {

intermediateLedStates[i + 1] = ledStates[i];

}

} else {

if (i == 0) {

intermediateLedStates[NUM_LEDS - 1] = ledStates[i];

} else {

intermediateLedStates[i - 1] = ledStates[i];

}

}

}

for (int i=0; i 《 NUM_LEDS; i++) {

ledStates[i] = intermediateLedStates[i];

}

}

uint32_t getColor(int intensity)

{

switch (colorSelection) {

case 0:

return strip.Color(intensity, 0, 0);

case 1:

return strip.Color(0, intensity, 0);

default:

return strip.Color(0, 0, intensity);

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23875

    浏览量

    675406
  • Arduino
    +关注

    关注

    190

    文章

    6499

    浏览量

    192629
  • 手势传感器
    +关注

    关注

    1

    文章

    13

    浏览量

    12974
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Texas Instruments IWRL6432工业毫米波雷达传感器数据手册

    Texas Instruments IWRL6432工业毫米波雷达传感器是 基于调频连续波雷达技术的集成式单芯片毫米波传感器。这些传感器的工作频段为57GHz至63.9GHz,连续带宽为7GHz
    的头像 发表于 07-31 09:23 ?112次阅读
    Texas Instruments IWRL6432工业<b class='flag-5'>用</b>毫米波雷达<b class='flag-5'>传感器</b>数据手册

    基于锁相的无轴承同步磁阻电机无速度传感器检测技术

    使用场合。为实现无轴承同步磁阻电机高速超高速、低成本、实用化运行,提出了一种基于锁相法的无速度传感自检测技术。通过应用锁相原理,设计出无轴承同步磁阻电机无速度传感器,并基于 Mat
    发表于 07-29 16:22

    如何为您的应用选择光传感器

    ,到向安全系统发送可能的入侵警报。 本文讨论了在常见例中选择光传感器所需的功能,例如篡改检测、昼夜检测、LED 亮度调节、显示屏亮度调节和颜色调节。 篡改检测 篡改检测应用中的光传感器
    的头像 发表于 06-11 10:14 ?196次阅读
    如何为您的应用选择光<b class='flag-5'>传感器</b>

    德州仪器光传感器选择指南

    ,到向安全系统发送可能的入侵警报。本文讨论了在常见例中选择光传感器所需的功能,例如篡改检测、昼夜检测、LED 亮度调节、显示屏亮度调节和颜色调节。
    的头像 发表于 06-09 14:36 ?1675次阅读
    德州仪器光<b class='flag-5'>传感器</b>选择指南

    示波器测量传感器的放大电路及供电

    传感器放大电路的测量传感器信号一般都比较小,示波器直接测量可能难以检测,但传感器的主板上面都有信号放大部分,找到这个放大器的输出端,示波器就可以测量这个被放大后的信号。
    的头像 发表于 05-19 13:24 ?233次阅读
    <b class='flag-5'>用</b>示波器测量<b class='flag-5'>传感器</b>的放大电路及供电

    测量拉力什么传感器

    传感器。本文将带你从工作原理到实际应用,全面解析这项“拉力感知”技术。 ? 第一部分:拉力测量传感器概述 拉力测量传感器是一种用于测量物体所受拉力的装置。其核心功能是拉力信号转换为电
    的头像 发表于 04-17 16:18 ?299次阅读

    型压力传感器的研究和应用

    在科技日新月异的今天,传感器技术作为连接物理世界与数字世界的桥梁,正引领着众多领域的深刻变革。其中,型压力传感器以其独特的环形结构设计、卓越的精度和广泛的应用潜力,成为现代工业与科研领域不可或缺
    的头像 发表于 03-05 17:30 ?505次阅读
    <b class='flag-5'>环</b>型压力<b class='flag-5'>传感器</b>的研究和应用

    干簧管传感器属于什么传感器

    干簧管传感器,又称磁簧开关传感器或磁敏开关,是一种基于干簧管(Reed Switch)原理工作的传感器。作为一种重要的磁传感器,干簧管传感器
    的头像 发表于 01-30 15:33 ?1455次阅读

    基于滑模观测和锁相的无轴承感应电机无速度传感器控制

    电子发烧友网站提供《基于滑模观测和锁相的无轴承感应电机无速度传感器控制.pdf》资料免费下载
    发表于 12-19 14:04 ?0次下载

    光电传感器与激光传感器的对比

    传感器。它们通常包含一个光源(如LED)和一个光敏元件(如光电二极管或光电晶体管)。当物体通过光束时,光敏元件检测到光的变化,从而触发一个电信号。光电传感器可以是简单的对射型(发射
    的头像 发表于 12-17 17:03 ?1298次阅读

    工业传感器的应用领域 无线传感器网络的优势与挑战

    工业传感器的应用领域 1. 制造业 在制造业中,传感器用于监控生产线上的机器性能,包括温度、压力、湿度和振动等参数,以确保产品质量和生产效率。 2. 能源行业 传感器在能源行业中用于
    的头像 发表于 11-19 15:20 ?1185次阅读

    Cortex-A55国产处理_教学实验箱_操作案例分享:5-21 手势识别实验

    设计的。 PAJ7620U2 传感器 PAJ7620U2 传感器内部自带 LED 驱动(可发射红外线信号),内置有传感器感应阵列、目标信
    发表于 10-15 16:18

    触摸传感器的选择与设计解决方案

    触摸传感器是一种能够检测和响应触摸、手势或压力的器件,被广泛应用于许多不同的领域,这些传感器使用不同的技术来识别和记录设备与用户之间的交互。运用触摸传感器的触摸屏幕是智能手机和平板的主
    的头像 发表于 10-02 17:47 ?1073次阅读
    触摸<b class='flag-5'>传感器</b>的选择与设计解决方案

    使用OPT4003-Q1境光传感器进行光源检测

    电子发烧友网站提供《使用OPT4003-Q1境光传感器进行光源检测.pdf》资料免费下载
    发表于 08-28 09:31 ?2次下载
    使用OPT4003-Q1<b class='flag-5'>环</b>境光<b class='flag-5'>传感器</b>进行光源检测

    怎样用THS3201实现输出功率可调?

    怎样用THS3201实现输出功率可调?
    发表于 08-26 08:28