我一直想做一個(gè)Arduino項(xiàng)目,但在我的家人被邀請(qǐng)參加之前從未有任何好的想法?;ㄉ诘拿弊优蓪?duì)。有兩個(gè)星期的交付時(shí)間,我很好奇我是否可以計(jì)劃和執(zhí)行動(dòng)作敏感的LED動(dòng)畫帽。結(jié)果我可以!我可能有點(diǎn)過(guò)火,但總項(xiàng)目花費(fèi)大約80美元。通過(guò)實(shí)驗(yàn)和一些編碼,你可以少花錢。
戴著帽子的目標(biāo)如下:
讓一組燈從中心前移動(dòng)帽子到后面,每側(cè)有一盞燈
改變前后帽子傾斜所決定的燈光行程的速度
帽子樂(lè)隊(duì)允許燈光反轉(zhuǎn)向下傾斜(即模擬重力對(duì)燈光的影響)
根據(jù)帽子從左向右的傾斜度改變顏色
感覺(jué)震動(dòng),并顯示特殊效果
感覺(jué)佩戴者旋轉(zhuǎn),并顯示特殊效果
將其完全包含在帽子中
步驟1:需要的部件
我使用了以下主要組件(包括非聯(lián)屬亞馬遜鏈接):
Teensy LC微控制器 - 由于體積小,我在常規(guī)Arduino上選擇了它,它有一個(gè)特殊的連接來(lái)控制我的LED,以及st榮獲圖書(shū)館和社區(qū)支持。
基于Bosch BNO055的位置傳感器 - 老實(shí)說(shuō)是我發(fā)現(xiàn)的第一個(gè)文檔之一。有更便宜的選擇,但是一旦你弄清楚博世它會(huì)為你做很多事情你將不得不做的代碼
WS2812可尋址LED燈條 - 我選擇1米長(zhǎng)的144個(gè)LED每米。具有這種密度有助于燈光看起來(lái)更像是在移動(dòng),而不是按順序點(diǎn)亮單個(gè)元素。
以及以下次要組件:
帽子 - 任何帶帽帶的帽子都可以。這是來(lái)自當(dāng)?shù)厣痰甑?美元帽子。如果背面有接縫,則更容易接線。注意帽帶是否粘在一起,因?yàn)檫@也會(huì)造成一些額外的困難。這個(gè)是沿著頂部縫制的,但是底部很容易拉起來(lái)。
4.7K歐姆電阻器
3x AAA電池盒 - 使用3節(jié)AAA電池輸出電壓,完全符合電子設(shè)備所需的范圍,簡(jiǎn)化了操作。 AAA比AA更容易融入帽子,并且仍然具有很好的運(yùn)行時(shí)間。
小規(guī)格電線 - 我使用了之前LED項(xiàng)目中的一些實(shí)心電線。
烙鐵和焊料
一些與帽子內(nèi)部顏色相匹配的氨綸和線程
建議,但可選:
電池線的快速連接器
幫助工具,這些東西非常小且難以焊接
步驟2:修改帽子
你需要戴帽子的地方安裝電子設(shè)備和電池的地方。我的妻子專業(yè)從事服裝工作,所以我向她尋求建議和幫助。我們最終創(chuàng)造了兩個(gè)氨綸口袋。朝向前部的第一個(gè)較小的口袋像帽子本身一樣指向,這樣當(dāng)安裝電子設(shè)備時(shí),位置傳感器可以很好地固定到位,但如果需要可以很容易地移除。朝向后面的第二個(gè)口袋是將電池組固定到位。
口袋中播放的線條與帽子的顏色相匹配,所有的長(zhǎng)度都是冠線。根據(jù)帽子和材料的風(fēng)格,它是由YMMV用這種技術(shù)制成的。
我們還發(fā)現(xiàn)帽子帶在一側(cè)折疊成自己,并且在那個(gè)位置完全縫到帽子上。我們不得不移除原始接縫,以便在帶下運(yùn)行LED。在制作期間,它用銷釘固定,然后在完成時(shí)用匹配的線縫合。
最后,我們打開(kāi)帽子背面的接縫,如果它被帶子覆蓋。我們將LED附帶的線束穿過(guò)該接縫,并將條帶中的第一個(gè)LED排列在接縫上。然后我們將LED包裹在帽子周圍并將條帶向下切割,使最后一個(gè)LED緊挨著第一個(gè)LED。只需使用帽帶即可將LED燈條固定到位,但根據(jù)您的帶和材料,您可能需要通過(guò)縫合或粘合來(lái)固定LED。
步驟3:連線
Teensy電路板和LED可以在3.3V至5V的任何地方工作。這就是我選擇使用3節(jié)AAA電池的原因,4.5v的輸出電壓很好地適用于該范圍,并且它們具有足夠的運(yùn)行時(shí)間,因?yàn)槲覍ED編程為工作方式。你應(yīng)該能夠超過(guò)8小時(shí)的運(yùn)行時(shí)間。
接線電源
我將電池盒和LED的正極和負(fù)極引線連接在一起,然后焊接到適當(dāng)位置的Teensy上。電池的正極需要連接到圖中Teensy的右上方引腳(在電路板上標(biāo)記為Vin),負(fù)極可以連接到任何標(biāo)有GND的引腳。方便地,有一個(gè)直接位于電路板的另一側(cè),或緊鄰Vin引腳。電路板的完整引腳圖可以在本頁(yè)底部找到。在某些情況下,當(dāng)您訂購(gòu)電路板時(shí),會(huì)包含紙質(zhì)副本。
如果您計(jì)劃運(yùn)行一次只打開(kāi)幾個(gè)LED的代碼,您可以從Teensy為L(zhǎng)ED供電本身,通過(guò)使用3.3v輸出和GND,但是如果你試圖拉太多電力,你可能會(huì)損壞電路板。因此,為了給自己提供最多選擇,最好將LED直接連接到電池電源。
連接LED
我選擇了Teensy LC這個(gè)項(xiàng)目因?yàn)樗幸粋€(gè)引腳,可以更容易地連接可尋址的LED。在電路板的底部,左邊第二個(gè)引腳鏡像引腳#17,但也有3.3v。這被稱為上拉電阻,而在其他電路板上,您必須連接一個(gè)電阻器來(lái)提供該電壓。對(duì)于Teensy LC,您可以直接從該引腳連接到LED數(shù)據(jù)線。
接線位置傳感器
有些BNO055電路板的電壓要嚴(yán)格得多,只需3.3v。因此,我在Teensy上的專用3.3v輸出端連接了BNO055板上的Vin,這是右側(cè)的第3個(gè)引腳。然后,您可以將BNO055上的GND連接到Teensy上的任何GND。
BNO055位置傳感器使用I2c與Teensy通信。 I2c需要上拉,所以我將兩個(gè)4.7K歐姆電阻從Teensy上的3.3v輸出連接到引腳18和19.然后將引腳19連接到BNO055板上的SCL引腳,并將18連接到SDA引腳。/p》
接線提示/技巧
為了做這個(gè)項(xiàng)目,我使用的是實(shí)線而不是擱淺。實(shí)心焊絲的一個(gè)優(yōu)點(diǎn)是焊接到這樣的原型板上。您可以剝?nèi)ヒ恍╇娋€,將其彎曲90度,然后將其插入其中一個(gè)端子的底部,這樣電線的切割端就會(huì)粘在電路板上方。然后,您只需要少量焊料將其固定在端子上,您就可以輕松切除多余的焊料。
實(shí)心線可能更難以使用,因?yàn)樗鼉A向于保持彎曲的方式。然而,對(duì)于這個(gè)項(xiàng)目來(lái)說(shuō)這是一個(gè)優(yōu)勢(shì)。我切割和塑造我的電線,使得位置傳感器的方向一致,因?yàn)槲覐拿弊又胁迦氩⒁瞥穗娮釉赃M(jìn)行調(diào)整和編程。
步驟4:編程
現(xiàn)在所有東西都已組裝好,你需要一個(gè)Arduino兼容的編程工具。我使用了實(shí)際的Arduino IDE(適用于Linux,Mac和PC)。您還需要Teensyduino軟件與Teensy板接口。該項(xiàng)目大量使用FastLED庫(kù)來(lái)進(jìn)行LED的顏色和位置編程。
校準(zhǔn)
您要做的第一件事就是去Kris Winer為BNO055提供優(yōu)秀的GitHub存儲(chǔ)庫(kù)并下載他的BNO_055_Nano_Basic_AHRS_t3.ino草圖。在串行監(jiān)視器運(yùn)行時(shí)安裝該代碼,它將告訴您BNO055板是否正常聯(lián)機(jī)并通過(guò)其自檢。它還將引導(dǎo)您校準(zhǔn)BNO055,這將在以后為您提供更一致的結(jié)果。
花式LED草圖入門
專門附加了Fancy LED hat的代碼,也附加在我的GitHub存儲(chǔ)庫(kù)中。我計(jì)劃對(duì)代碼進(jìn)行更多調(diào)整,這些調(diào)整將發(fā)布在GitHub repo上。此文件反映了此Instructable發(fā)布時(shí)的代碼。下載并打開(kāi)草圖后,您需要更改一些內(nèi)容。要更改的大多數(shù)重要值都在#define語(yǔ)句的最頂層:
第24行:#define NUM_LEDS 89 - 將其更改為L(zhǎng)ED條上的實(shí)際LED數(shù)量
第28行:#define SERIAL_DEBUG false - 您可能希望將此設(shè)置為true,以便在串行監(jiān)視器上看到輸出
位置檢測(cè)代碼
位置檢測(cè)和大部分調(diào)整都從742行開(kāi)始,經(jīng)過(guò)802.我們從位置傳感器獲取俯仰,滾轉(zhuǎn)和偏航數(shù)據(jù)并將其用于設(shè)定值。根據(jù)電子設(shè)備的安裝方式,您可能需要更改這些設(shè)備。如果您將位置傳感器的芯片朝向帽子的頂部安裝,并且電路板上印有的X旁邊的箭頭指向帽子的前部,您應(yīng)該看到以下內(nèi)容:
Pitch正在點(diǎn)頭。
滾動(dòng)正在傾斜你的頭,例如觸摸你的耳朵
偏航是哪個(gè)方向。你面對(duì)的是(北方,西方等)。
如果您的電路板安裝在不同的方向,您需要交換俯仰/轉(zhuǎn)動(dòng)/偏航以使它們按照您的意愿行事。
要調(diào)整滾動(dòng)設(shè)置,您可以更改以下#define值:
ROLLOFFSET:在你的帽子穩(wěn)定并且盡可能居中的情況下,如果Roll不為0,請(qǐng)根據(jù)差異進(jìn)行更改。即如果您在帽子居中時(shí)看到在-20處滾動(dòng),請(qǐng)將其設(shè)為20。
ROLLMAX:用于滾動(dòng)測(cè)量的最大值。戴帽子,右耳向右肩移動(dòng),最容易找到。使用串行監(jiān)視器時(shí),您需要使用長(zhǎng)USB電纜。
ROLLMIN:用于滾動(dòng)測(cè)量的最低值,用于向左傾斜時(shí)
同樣,對(duì)于Pitch:
MAXPITCH - 查找時(shí)的最大值
MINPITCH - 向下看時(shí)的最小值
PITCHCENTER - 直視前的音高值
如果在文件頂部將SERIALDEBUG設(shè)置為true,則應(yīng)該看到Roll/Pitch/Yaw輸出的當(dāng)前值串行監(jiān)視器,以幫助調(diào)整這些值。
您可能想要更改的其他參數(shù)
MAX_LED_DELAY 35 - LED粒子可以最慢的移動(dòng)。這是以毫秒為單位。這是從燈串中的一個(gè)LED移動(dòng)到下一個(gè)LED的延遲。
MIN_LED_DELAY 10 - LED顆??梢砸苿?dòng)的禁食。如上所述它是以毫秒為單位。
結(jié)論
如果你走得這么遠(yuǎn),你應(yīng)該有一個(gè)功能齊全,充滿樂(lè)趣的, LED帽子!如果你想用它做更多的事情,下一頁(yè)有一些關(guān)于改變?cè)O(shè)置和做自己的事情的高級(jí)信息。以及我的其余代碼正在做什么的一些解釋。
步驟5:高級(jí)和可選:代碼內(nèi)部
影響和自旋檢測(cè)
影響/自旋檢測(cè)是使用BNO055的高G傳感器功能完成。您可以使用initBNO055()中的以下行來(lái)調(diào)整它的靈敏度:
第316行:BNO055_ACC_HG_DURATION - 事件必須持續(xù)多長(zhǎng)時(shí)間
第317行: BNO055_ACC_HG_THRESH - 需要有多大的影響
第319行:BNO055_GYR_HR_Z_SET - 轉(zhuǎn)速閾值
第320行:BNO055_GYR_DUR_Z - 轉(zhuǎn)動(dòng)甚至持續(xù)多長(zhǎng)時(shí)間
兩個(gè)值均為8位二進(jìn)制,目前影響設(shè)置為B11000000,即255中的192.
當(dāng)檢測(cè)到撞擊或旋轉(zhuǎn)時(shí),BNO055設(shè)置一個(gè)值,該值為代碼在循環(huán)的開(kāi)頭尋找:
// Detect any interrupts triggered, i.e. due to high G
byte intStatus = readByte(BNO055_ADDRESS, BNO055_INT_STATUS);
if(intStatus 》 8) {
impact();
} else if(intStatus 》 0) {
spin();
}
在代碼中查找上面的void impact()行以更改影響時(shí)的行為,或者使用void spin()來(lái)更改旋轉(zhuǎn)行為。
助手
我創(chuàng)建了一個(gè)簡(jiǎn)單的輔助函數(shù)(void setAllLeds()),用于快速將所有LED設(shè)置為單一顏色。一個(gè)用它來(lái)關(guān)閉它們:
setAllLeds(CRGB::Black);
或者你可以選擇FastLED庫(kù)識(shí)別的任何顏色:
setAllLeds(CRGB::Red);
還有一個(gè)fadeAllLeds ()函數(shù)將所有LED調(diào)暗25%。
粒子類
為了大大簡(jiǎn)化布線,我想使用單個(gè)LED串,但讓它們表現(xiàn)得像多個(gè)字符串。由于這是我的第一次嘗試,我希望盡可能簡(jiǎn)單,所以我將一個(gè)字符串視為兩個(gè),中間的LED將在那里進(jìn)行拆分。由于我們可以有偶數(shù)或奇數(shù),我們需要考慮到這一點(diǎn)。我從一些全局變量開(kāi)始:
/*
* Variable and containers for LEDs
*/
CRGB leds[NUM_LEDS];
static unsigned int curLedDelay = MAX_LED_DELAY;
static int centerLed = NUM_LEDS / 2;
static int maxLedPos = NUM_LEDS / 2;
static bool oddLeds = 0;
static bool particleDir = 1;
static bool speedDir = 1;
unsigned long dirCount;
unsigned long hueCount;
以及setup()中的一些代碼:
if(NUM_LEDS % 2 == 1) {
oddLeds = 1;
maxLedPos = NUM_LEDS/2;
} else {
oddLeds = 0;
maxLedPos = NUM_LEDS/2 - 1;
}
如果我們有奇數(shù),我們想要使用1/2點(diǎn)作為中間,否則我們想要1/2點(diǎn)-1。這很容易看到10或11個(gè)LED:
11個(gè)LED:帶整數(shù)的11/2應(yīng)該評(píng)估因?yàn)?到4是一半,6-10是另一半,5是在它們之間。我們?cè)谶@種情況下將#5視為兩者的一部分,即兩個(gè)虛擬LED串都是#1
10個(gè)LED:10/2是5.但是由于計(jì)算機(jī)從0開(kāi)始計(jì)算,我們需要?jiǎng)h除一個(gè)。那么我們一半有0 - 4,另一半有5 - 9。第一個(gè)虛擬字符串的#1將是4,第二個(gè)虛擬字符串的#1將是#5。
然后在我們的粒子代碼中,我們必須從我們的整體位置進(jìn)行一些計(jì)數(shù)到LED燈串的實(shí)際位置:
if(oddLeds) {
Pos1 = centerLed + currPos;
Pos2 = centerLed - currPos;
} else {
Pos1 = centerLed + currPos;
Pos2 = (centerLed -1) - currPos;
}
代碼還具有粒子可以改變方向的條件,因此我們還必須考慮到這一點(diǎn):
if(particleDir) {
if((currPos == NUM_LEDS/2) && oddLeds){
currPos = 0;
} else if((currPos == NUM_LEDS/2 - 1) && (!oddLeds)){
currPos = 0;
} else {
currPos++;
}
} else {
if((currPos == 0) && oddLeds){
currPos = centerLed;
} else if((currPos == 0) && (!oddLeds)){
currPos = centerLed - 1;
} else {
currPos--;
}
}
所以我們使用預(yù)期的方向(particleDir ),計(jì)算下一個(gè)應(yīng)該點(diǎn)亮的LED,但是我們還必須考慮我們是否已經(jīng)到達(dá)LED燈串的實(shí)際端點(diǎn),或者我們的中心點(diǎn),它們也作為每個(gè)虛擬串的結(jié)束。
一旦我們發(fā)現(xiàn)了這一切,我們會(huì)根據(jù)需要點(diǎn)亮下一個(gè)燈光:
if(particleDir) {
if(oddLeds) {
Pos1 = centerLed + currPos;
Pos2 = centerLed - currPos;
} else {
Pos1 = centerLed + currPos;
Pos2 = (centerLed -1) - currPos;
}
} else {
if(oddLeds) {
Pos1 = centerLed - currPos;
Pos2 = centerLed + currPos;
} else {
Pos1 = centerLed - currPos;
Pos2 = (centerLed -1) + currPos;
}
}
leds[Pos1] = CHSV(currHue, 255,255);
leds[Pos2] = CHSV(currHue, 255,255);
FastLED.show();
}
為什么要把它作為一個(gè)類?實(shí)際上,這非常簡(jiǎn)單,并不需要在課堂上。但是我有未來(lái)計(jì)劃更新代碼以允許一次發(fā)生多個(gè)粒子,并且有些工作正在逆向而其他粒子正在進(jìn)行中。我認(rèn)為使用多個(gè)粒子進(jìn)行自旋檢測(cè)有很多可能性。
-
led
+關(guān)注
關(guān)注
240文章
23065瀏覽量
657071
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論