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