精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    23146

    瀏覽量

    658562
  • Arduino
    +關注

    關注

    187

    文章

    6464

    瀏覽量

    186669
  • 手勢傳感器
    +關注

    關注

    1

    文章

    13

    瀏覽量

    12804
收藏 人收藏

    評論

    相關推薦

    Cortex-A55國產處理_教學實驗箱_操作案例分享:5-21 手勢識別實驗

    設計的。 PAJ7620U2 傳感器 PAJ7620U2 傳感器內部自帶 LED 驅動(可發射紅外線信號),內置有傳感器感應陣列、目標信
    發表于 10-15 16:18

    怎樣用THS3201實現輸出功率可調?

    怎樣用THS3201實現輸出功率可調?
    發表于 08-26 08:28

    怎樣用Arduino測試鋰電池容量

    本文詳細介紹了如何用Arduino測量鋰電池的容量。并附有電路圖和Arduino的程序代碼。
    的頭像 發表于 07-30 09:14 ?727次閱讀
    <b class='flag-5'>怎樣用</b><b class='flag-5'>Arduino</b>測試鋰電池容量

    安森美收購SWIR傳感器公司以增強智能傳感器產品組合

    提供商,該技術擴展了可檢測光譜,可以透視物體并捕捉以前無法實現的圖像。這項專利技術集成到安森美業界領先的 CMOS 傳感器中,顯著增強公司的智能傳感產品
    的頭像 發表于 07-04 11:38 ?665次閱讀
    安森美收購SWIR<b class='flag-5'>傳感器</b>公司以增強智能<b class='flag-5'>傳感器</b>產品<b class='flag-5'>組合</b>

    怎么表測量溫度傳感器的好壞

    原理和輸出信號與萬表的測量范圍和功能不完全匹配。 溫度傳感器的基本知識 溫度傳感器是一種溫度變化轉換為電信號的裝置。根據測量原理的不同,溫度傳感
    的頭像 發表于 06-19 15:06 ?2285次閱讀

    鴻蒙ArkTS聲明式開發:跨平臺支持列表 組合手勢

    手勢識別組合,即多種手勢組合為復合手勢,支持連續識別、并行識別和互斥識別。
    的頭像 發表于 06-19 09:33 ?379次閱讀
    鴻蒙ArkTS聲明式開發:跨平臺支持列表 <b class='flag-5'>組合</b><b class='flag-5'>手勢</b>

    基于毫米波雷達的手勢識別算法

    遠程手勢識別模型。然后,我們設計了一個CNN來學習點的特征以進行識別。(ii)我們利用毫米波雷達傳感器來實現所提出的模型,從而自動識別手勢。(iii)我們驗證了我們提出的模型在幾種現實世界情況下(例如
    發表于 06-05 19:09

    英飛凌推出用于Arduino的XENSIVTM傳感器擴展板

    全球功率系統和物聯網領域的半導體巨頭英飛凌科技股份公司,近日宣布推出一款專為Arduino用戶打造的XENSIV?傳感器擴展板。這款多功能工具,特別為智能家居和各類消費應用中的智能傳感器系統評估而設計。
    的頭像 發表于 05-10 10:50 ?614次閱讀

    英飛凌推出用于Arduino的XENSIV傳感器擴展板, 搭載英飛凌和Sensirion的智能家居應用傳感器

    的XENSIVTM傳感器擴展板,這是一款專為評估智能家居和各種消費應用中的智能傳感器系統而設計的多功能工具。這款創新型擴展板英飛凌豐富的傳感器產品與Sensirion的SHT35濕度
    發表于 05-07 16:35 ?817次閱讀
    英飛凌推出用于<b class='flag-5'>Arduino</b>的XENSIV<b class='flag-5'>傳感器</b>擴展板, 搭載英飛凌和Sensirion的智能家居應用<b class='flag-5'>傳感器</b>

    stm32f100怎樣用重映射功能?

    的是stm32f100c8t6b芯片,現在想用PB1映射為TIM1_CH3N,在調用GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM1)時, GPIO_PinAFConfig和GPIO_AF_TIM1都沒定義,st
    發表于 05-07 06:06

    英飛凌和盛思銳合作推出一款支持Arduino傳感器擴展板

    據麥姆斯咨詢報道,近期,英飛凌(Infineon)推出了一款支持Arduino傳感器擴展板,用于評估智能家居和其它消費類應用中的智能傳感器系統。
    的頭像 發表于 04-10 09:05 ?2248次閱讀

    如何連接Arduino聲音傳感器以控制帶有聲音的LED

    在本教程中,您將學習如何連接Arduino聲音傳感器以控制帶有聲音的LED。在本指南結束時,您將擁有一個可以正常工作的聲控LED
    的頭像 發表于 02-11 10:21 ?2785次閱讀
    如何連接<b class='flag-5'>Arduino</b>聲音<b class='flag-5'>傳感器</b>以控制帶有聲音的<b class='flag-5'>LED</b>

    如何設置Arduino霍爾效應傳感器

    在本指南中,您將學習如何設置Arduino霍爾效應傳感器,特別是US1881,以檢測磁場。這對于需要查找電機的轉速或機器中其他運動的項目非常有用。
    的頭像 發表于 02-11 10:14 ?1345次閱讀
    如何設置<b class='flag-5'>Arduino</b>霍爾效應<b class='flag-5'>傳感器</b>

    測量是激光傳感器還是超聲波傳感器

    測量是激光傳感器還是超聲波傳感器? 激光傳感器和超聲波傳感器都是常用的測量工具,它們在不同的場景下具有各自的優點和適用性。在進行測量選擇時
    的頭像 發表于 01-03 15:59 ?552次閱讀

    怎樣用ADAU1761設計DRC的壓縮/擴展?

    請問怎樣用ADAU1761設計DRC的壓縮/擴展。我在SigmaStudio 4.5的模塊中只找到RMS。如果ADAU1761設計DRC要怎樣
    發表于 11-28 06:41