基于Arduino Nano R3实现摩托车尾灯的设计方案

描述

  介绍:

  从表面上看,这是一个非常简单的项目。它读取 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 类有一个超时值来吸收闪烁的“关闭”部分并假装信号仍然打开。这个伪开启被传递回主控制回路,因此它需要知道是否应该考虑开启或关闭转向信号,而不是使用当前引脚值。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分