介绍:
从表面上看,这是一个非常简单的项目。它读取 3 个开关并驱动 2 个 LED 灯条。但是,这不是典型的独立 Arduino 项目。将其集成到现有电气系统中存在一些细微差别。
以下是构建此项目所需的技能和项目。
如果愿意深入研究自行车的电气系统,您需要找到并利用:
开关 12V 线
左转向信号线
右转信号线
刹车灯线
三个 12V 继电器(我选择了小型簧片式继电器)
5 v 电源能够持续 5 A(不是峰值额定值)
两个 - 5x8 WS2812 LED 矩阵(或您选择的矩阵)
性能板
用于连接所有电线的接线端子
金属丝
示意图注释
该项目的目标是将 Arduino 与自行车的电气系统完全隔离。这就是继电器用于触发 Arduino 引脚的原因。您可能可以使用分压器并避免使用继电器。
如果您有一辆带有 LED 转向灯的新型自行车,请检查您的灯的电压。它可能正好是 5V,所以可以直接馈入 Arduino 引脚。
你可能会觉得奇怪的是我使用模拟来读取刹车/转向信号。这样做只是为了简化原型板的焊接,所以我没有在 Arduino Nano 的一侧进行所有连接。
切换的 12V 输入线位于我自行车上现有的 10A 电路上。
不要给项目供电!每个 LED 矩阵可以消耗 2.5 A!如图所示,我有一个双输出电源,每个输出都能达到 4A,而且效果很好!两个 3 安培 BEC 电路可能也可以工作。如果您的 Arduino LED 在转向信号运行时闪烁,请使用 Arduino 专用电源,或为 Arduino 提供 12V 电源到 VIN 引脚。
构建电路板
我使用了 Adafruit perma 面包板(本质上是带有面包板痕迹的穿孔板)。我希望内置的痕迹能让构建更干净。这不是一个完美的解决方案,需要刮掉一些痕迹。
花时间设计PCB板
放入接头以便可以更换 Nano,但这也会增加构建的厚度
拓展一下我想试试 TI MSP430 而不是 Arduino
构建测试夹具
如果您正在修改代码,您将需要构建一个测试夹具,以便您可以在办公桌上进行开发和测试,而不是在连接到自行车的车库中进行这项工作。我建立了一个 3 按钮项目盒,为三个继电器中的每一个提供 9v。三个按钮分别代表:左、右、刹车信号,您可以测试所有组合。
Arduino项目
我很早就了解到,最好将 LED 动画封装在类库中。这使得动画可重复使用。
类库的缺点是编写起来有点痛苦。缺乏调试工具(我习惯于使用 Microsoft Visual Studio 和 Eclipse),而且当事情不正常时,几乎没有什么线索可以说明哪里出了问题。我的最佳建议是慢慢构建功能并保存备份副本。当您遇到问题时,请仔细检查您最近所做的更改。C/C++ 中最常见的灾难性错误可能是缓冲区溢出。
编译这个 Arduino 草图需要下载 4 个库:
Adafruit neopixel 库
BlinkLed
CascadeLed
尾灯
BlinkLed 类库
在类库的头文件中查看调用序列的详细信息。您还可以在草图中找到用于实例化和调用刹车灯和行车灯的示例。将一组像素传递给光和频率。
例子:
字节最大停止 = 25;
字节 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 类库
在类库的头文件中查看调用序列的详细信息。您还可以在草图中找到用于实例化和调用转向信号信号的示例。将二维像素阵列传递给光和频率。然后该类将循环遍历像素行并按该顺序点亮它们。
警告:为简单起见,我选择创建常量来定义数组大小。为了便于使用,这会消耗一些内存。如果您选择驱动每组超过 40 个像素,您可能需要更改定义在 CascadeLed\ArrayConstants.h 中的常量。
例子:
常量字节 maxrow = 5;
常量字节 maxcol = 8;
字节 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);
}
备注:
转向信号开关会中断像素动画,因为闪烁比一个动画序列更快。CascadeLed 类有一个超时值来吸收闪烁的“关闭”部分并假装信号仍然打开。这个伪开启被传递回主控制回路,因此它需要知道是否应该考虑开启或关闭转向信号,而不是使用当前引脚值。
全部0条评论
快来发表一下你的评论吧 !