介紹:
從表面上看,這是一個(gè)非常簡單的項(xiàng)目。它讀取 3 個(gè)開關(guān)并驅(qū)動 2 個(gè) LED 燈條。但是,這不是典型的獨(dú)立 Arduino 項(xiàng)目。將其集成到現(xiàn)有電氣系統(tǒng)中存在一些細(xì)微差別。
以下是構(gòu)建此項(xiàng)目所需的技能和項(xiàng)目。
如果愿意深入研究自行車的電氣系統(tǒng),您需要找到并利用:
開關(guān) 12V 線
左轉(zhuǎn)向信號線
右轉(zhuǎn)信號線
剎車燈線
三個(gè) 12V 繼電器(我選擇了小型簧片式繼電器)
5 v 電源能夠持續(xù) 5 A(不是峰值額定值)
兩個(gè) - 5x8 WS2812 LED 矩陣(或您選擇的矩陣)
性能板
用于連接所有電線的接線端子
金屬絲
示意圖注釋
該項(xiàng)目的目標(biāo)是將 Arduino 與自行車的電氣系統(tǒng)完全隔離。這就是繼電器用于觸發(fā) Arduino 引腳的原因。您可能可以使用分壓器并避免使用繼電器。
如果您有一輛帶有 LED 轉(zhuǎn)向燈的新型自行車,請檢查您的燈的電壓。它可能正好是 5V,所以可以直接饋入 Arduino 引腳。
你可能會覺得奇怪的是我使用模擬來讀取剎車/轉(zhuǎn)向信號。這樣做只是為了簡化原型板的焊接,所以我沒有在 Arduino Nano 的一側(cè)進(jìn)行所有連接。
切換的 12V 輸入線位于我自行車上現(xiàn)有的 10A 電路上。
不要給項(xiàng)目供電!每個(gè) LED 矩陣可以消耗 2.5 A!如圖所示,我有一個(gè)雙輸出電源,每個(gè)輸出都能達(dá)到 4A,而且效果很好!兩個(gè) 3 安培 BEC 電路可能也可以工作。如果您的 Arduino LED 在轉(zhuǎn)向信號運(yùn)行時(shí)閃爍,請使用 Arduino 專用電源,或?yàn)?Arduino 提供 12V 電源到 VIN 引腳。
構(gòu)建電路板
我使用了 Adafruit perma 面包板(本質(zhì)上是帶有面包板痕跡的穿孔板)。我希望內(nèi)置的痕跡能讓構(gòu)建更干凈。這不是一個(gè)完美的解決方案,需要刮掉一些痕跡。
花時(shí)間設(shè)計(jì)PCB板
放入接頭以便可以更換 Nano,但這也會增加構(gòu)建的厚度
拓展一下我想試試 TI MSP430 而不是 Arduino
構(gòu)建測試夾具
如果您正在修改代碼,您將需要構(gòu)建一個(gè)測試夾具,以便您可以在辦公桌上進(jìn)行開發(fā)和測試,而不是在連接到自行車的車庫中進(jìn)行這項(xiàng)工作。我建立了一個(gè) 3 按鈕項(xiàng)目盒,為三個(gè)繼電器中的每一個(gè)提供 9v。三個(gè)按鈕分別代表:左、右、剎車信號,您可以測試所有組合。
Arduino項(xiàng)目
我很早就了解到,最好將 LED 動畫封裝在類庫中。這使得動畫可重復(fù)使用。
類庫的缺點(diǎn)是編寫起來有點(diǎn)痛苦。缺乏調(diào)試工具(我習(xí)慣于使用 Microsoft Visual Studio 和 Eclipse),而且當(dāng)事情不正常時(shí),幾乎沒有什么線索可以說明哪里出了問題。我的最佳建議是慢慢構(gòu)建功能并保存?zhèn)浞莞北尽.?dāng)您遇到問題時(shí),請仔細(xì)檢查您最近所做的更改。C/C++ 中最常見的災(zāi)難性錯(cuò)誤可能是緩沖區(qū)溢出。
編譯這個(gè) Arduino 草圖需要下載 4 個(gè)庫:
Adafruit neopixel 庫
BlinkLed
CascadeLed
尾燈
BlinkLed 類庫
在類庫的頭文件中查看調(diào)用序列的詳細(xì)信息。您還可以在草圖中找到用于實(shí)例化和調(diào)用剎車燈和行車燈的示例。將一組像素傳遞給光和頻率。
例子:
字節(jié)最大停止 = 25;
字節(jié) StopPix[MAXSINGLEROW] = { 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 27, 28, 29, 30, 31, 35, 36 , 37, 38, 39};
BlinkLed LStopLed = BlinkLed(&lstrip, &StopPix, maxstop, R, G, B, 19);
BlinkLed RStopLed = BlinkLed(&rstrip, &StopPix, maxstop, R, G, B, 19);
CascadeLed 類庫
在類庫的頭文件中查看調(diào)用序列的詳細(xì)信息。您還可以在草圖中找到用于實(shí)例化和調(diào)用轉(zhuǎn)向信號信號的示例。將二維像素陣列傳遞給光和頻率。然后該類將循環(huán)遍歷像素行并按該順序點(diǎn)亮它們。
警告:為簡單起見,我選擇創(chuàng)建常量來定義數(shù)組大小。為了便于使用,這會消耗一些內(nèi)存。如果您選擇驅(qū)動每組超過 40 個(gè)像素,您可能需要更改定義在 CascadeLed\ArrayConstants.h 中的常量。
例子:
常量字節(jié) maxrow = 5;
常量字節(jié) maxcol = 8;
字節(jié) Rightpix[MAXROW][MAXCOL] = { { 0, 1, 2, 3, 4, 5, 6, 7}, { 8, 9, 10, 11, 12, 13, 14, 15}, {16, 17 , 18, 19, 20, 21, 22, 23}, {24, 25, 26, 27, 28, 29, 30, 31}, {32, 33, 34, 35, 36, 37, 38, 39}} ;
CascadeLed RightLed = CascadeLed(&rstrip, &Rightpix, maxrow, maxcol, RT, GT, BT, 80, 900);
TailLight.ino Arduino 草圖
這里不多說。控制回路非常簡單:
void loop() {
byte leftpin = (analogRead(LEFTPIN) > 50);
byte brakepin = (analogRead(BRAKEPIN) > 50);
byte rightpin = (analogRead(RIGHTPIN) > 50);
// animate or clear the turn signals
// PsudoOn is true when pin is high or between turn signal blinks (pin is actually low)
bool lPsudoOn = LeftLed.Blink(leftpin);
bool rPsudoOn = RightLed.Blink(rightpin);
// animate or clear the brake lights LStopLed.Blink(brakepin); RStopLed.Blink(brakepin);
// only turn on running lights. Let the overlays turn it off // Clear will interfere with overlapping lights
if (!lPsudoOn && !brakepin) LRunLed.Set(true);
if (!rPsudoOn && !brakepin) RRunLed.Set(true);
}
備注:
轉(zhuǎn)向信號開關(guān)會中斷像素動畫,因?yàn)殚W爍比一個(gè)動畫序列更快。CascadeLed 類有一個(gè)超時(shí)值來吸收閃爍的“關(guān)閉”部分并假裝信號仍然打開。這個(gè)偽開啟被傳遞回主控制回路,因此它需要知道是否應(yīng)該考慮開啟或關(guān)閉轉(zhuǎn)向信號,而不是使用當(dāng)前引腳值。
-
繼電器
+關(guān)注
關(guān)注
132文章
5350瀏覽量
148935 -
電氣系統(tǒng)
+關(guān)注
關(guān)注
1文章
356瀏覽量
24265 -
Arduino
+關(guān)注
關(guān)注
188文章
6469瀏覽量
187109
發(fā)布評論請先 登錄
相關(guān)推薦
評論