本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

专为自行车设计的语音控制转向灯,让骑行变得更安全

发布时间:2022-05-22
分享到:

专为自行车设计的语音控制转向灯,让骑行变得更安全

发布时间:2022-05-22
分享到:

进入交通时要考虑的一个好习惯是在转弯或改变车道之前警告道路上的其他用户您将要采取的方向。这种习惯有助于更顺畅的交通流量,并减少不知情的司机的突然移动。事实上,汽车、摩托车、卡车、公共汽车和您能想到的大多数车辆都包含某种转向信号装置。尽管自行车是道路上最易受攻击的车辆之一,但自行车通常没有这种内置信号装置。事实上,骑自行车的人要么不做转弯提示,要么如果他们提示了,他们需要将手从车把上松开,以便向其他司机做手势但这些举动总归都不太安全。

在市场上可以找到一些自行车的附加转向信号灯,但它们通常需要骑手按下按钮来激活它们并再次按下以关闭它们,这与摩托车类似。而且很容易忘记关闭它们。因此我设计了这款语音控制转向灯 ,虽然这是一种最初为自行车设计的语音控制转向信号灯概念,但也可以扩展到其他车辆。该项目功能:使用机器学习算法来教微型微控制器理解语音内容,并通过打开相应的转向信号灯来提示周围来车及时反应,达到安全骑行的目标。

硬件补给:

  • Arduino Nano 33 BLE Sense×    1    
  • 防水WS2813 RGB LED灯条防水    
  • Seeed Studio防水WS2813 RGB LED灯条防水×    1  如果您调整设置,任何可寻址 RGB LED 灯条都是兼容的。使用长度:20 厘米。
  • 连接线套件,22 AWG×    1    
  • 塑料尺,30 厘米/12 英寸×    1    
  • 音频/视频电缆组件,3.5 毫米 4 极插头,3.5 毫米立体声电话插孔×    2    
  • 自行车手表支架×    1    
  • SparkFun 低电流锂离子电池组 - 2.5Ah (USB)×    1    
  • SparkFun USB micro-B 电缆 - 6 英尺×    1    
  • 电缆扎带,双面    ×    1    

视频演示:

控制板

要使用的微控制器板是Arduino Nano 33 BLE Sense :一款经济实惠的板,具有运行频率为 64 MHz 的 32 位 ARM® Cortex™-M4 CPU、一堆内置传感器,包括数字麦克风和蓝牙低能源 (BLE) 连接。

然而,使该板成为该项目的优秀候选者的原因在于它可以使用微型机器学习 (TinyML) 在其上运行边缘计算应用程序。简而言之,在使用 TensorFlow Lite 创建机器学习模型后,您可以使用 Arduino 集成开发环境 (IDE) 轻松地将它们上传到开发板。

边缘的语音识别不需要将语音流发送到云服务器进行处理,从而抑制网络延迟。此外,它离线运行,因此您可以确定您的转向信号灯在通过隧道时不会停止工作。最后但同样重要的是,它保护了用户隐私,因为您的声音不会存储或发送到任何地方。

训练机器学习模型
单词识别模型是使用Edge Impulse创建的,Edge Impulse是一个嵌入式机器学习开发平台,专注于提供令人惊叹的用户体验 (UX)、出色的文档和开源软件开发工具包 (SDK)。他们的网站说:

Edge Impulse 专为软件开发人员、工程师和领域专家设计,用于在没有机器学习博士学位的情况下在边缘设备上使用机器学习解决实际问题。
这意味着您可以对机器学习知之甚少,甚至可以成功开发您的应用程序。

您可以使用本教程作为使用 Edge Impulse 进行音频分类的起点。以下步骤将描述如何定制该项目以满足 VoiceTurn 的特定需求。

您需要做的第一件事是在 Edge Impulse 上注册以创建免费的开发者订阅。在帐户确认步骤之后,登录并创建一个项目。系统将提示您一个向导,询问您希望创建的项目类型。点击音频:

在下一步中,您可以在三个选项之间进行选择。第一个是通过连接支持麦克风的开发板自己构建自定义音频数据集。这个过程需要记录大量的音频数据才能获得可接受的结果,所以我们暂时忽略它。第二个选项是上传现有的音频数据集,第三个选项是遵循教程。在Import existing data选项中单击Go to the uploader以继续使用 VoiceTurn。

我们将使用的音频数据集是Google Speech Commands Dataset ,它由 65,000 个 30 个短单词组成的一秒长的话语,由数千个不同的人组成。您可以从此链接下载此数据集的第 2 版

可以认为只需要与单词left和right对应的录音子集来训练模型。然而,正如来自 Google Brain 的 Pete Warden 在描述用于收集和评估数据集的方法的文章中所述:

在真实产品中发现关键词的一个关键要求是区分包含语音的音频和不包含语音的剪辑。
因此,我们还将使用_background_noise_文件夹中包含的音频记录子集,以便用一些背景噪声来丰富我们的模型。此外,我们将使用来自关键字识别预建数据集的噪声文件夹中的音频来补充噪声数据库,该数据集可作为 Edge Impulse 文档的一部分。

拥有一个包含单词left和right以及一些背景噪音的数据集是不够的,因为我们还需要为模型提供额外的单词。这样,如果听到另一个单词,它不会被分类为left或right ,而是会进入另一个类别。为此,我们可以从我们下载的第一个数据集中随机选择一组录音。请注意,额外录音的总量应该与每个感兴趣单词的录音总量相似。

收集录音后,将它们上传到您的 Edge Impulse 项目中。请注意,您需要上传 4 个不同的数据集,每个数据集对应一个不同的类别。浏览你的文件,手动输入标签,分别是Left ,Right ,noise和other ,并确保选择Automatically split between training and testing 。这将留出大约 20% 的样本用于之后的模型测试。点击开始上传。

如您所见,您上传的所有音频样本都可以查看和收听。确保它们的持续时间都为一秒。如果它们较长,请单击音频样本行右侧的点,然后单击拆分样本,将片段长度设置为 1000 毫秒。

结果,您现在应该分别看到训练和测试数据的总持续时间,以及分为四类的数据:

您还可以仔细检查测试数据的持续时间是否约为总数据集持续时间的 20%。

下一步是设计一个脉冲,它是对输入语音数据执行的整套操作,直到单词被分类。单击左侧菜单上的创建脉冲。我们的冲动将包括一个对数据进行切片的输入块、一个对它们进行预处理的处理块和一个将它们分类为先前定义的四个标签之一的学习块。单击添加输入块并添加时间序列数据块,将窗口大小设置为 1000 毫秒。然后,单击添加处理块并添加音频梅尔频率倒谱系数 (MFCC) 块,适用于人类语音数据。这个块产生输入数据的简化形式,更容易被下一个块处理。最后,单击添加学习块并添加分类 (Keras)块,这是执行分类并提供输出的神经网络 (NN)。

可以配置处理和学习块。单击左侧菜单上的MFCC ,您将看到与信号处理阶段相关的所有参数。在这个项目中,我们将保持简单并信任该块的默认参数。单击顶部的Generate features ,然后单击Generate features按钮以生成与音频窗口对应的 MFCC 块。作业完成后,系统将提示您使用功能浏览器,这是数据集的 3D 表示。此工具可用于快速检查您的样本是否很好地划分为您之前定义的类别,以便您的数据集适合机器学习。在此页面上,您还可以看到数据信号处理 (DSP) 阶段处理数据所需的时间估计,以及在微控制器中运行时的 RAM 使用情况。

现在您可以单击左侧菜单上的NN 分类器并开始训练您的神经网络,这是一组能够识别其学习数据中的模式的算法。观看此视频快速了解神经网络的工作原理及其一些应用。我们将保持大部分默认神经网络设置不变,但我们会将最小置信度等级略微提高到 0.7。这意味着在训练期间,只有置信概率高于 70% 的预测才会被视为有效。启用数据增强并将添加噪声设置为高,以使我们的神经网络在现实生活场景中更加健壮。点击开始训练在页面的底部。训练完成后,您将看到模型的准确度,该模型使用分配用于验证的训练数据的 20% 的子集计算得出。您还可以检查混淆矩阵,它是一个表格,显示了正确分类词与错误分类词的平衡,以及对设备性能的估计。

您现在可以使用新数据测试刚刚训练的模型。可以将 Arduino 板连接到 Edge Impulse以执行数据的实时分类。但是,我们将使用我们在数据采集步骤中留下的测试数据来测试模型。单击左侧菜单上的模型测试,然后单击对所有测试数据进行分类。您将收到有关模型性能的反馈。此外,特征资源管理器将允许您检查未正确分类的样本发生了什么,因此您可以在需要时重新标记它们或将它们移回训练以优化您的模型。

最后,您可以构建一个包含您的模型并准备好部署在微控制器中的库。单击左侧菜单上的部署,选择创建Arduino 库并转到页面底部。在这里,可以启用EON™ 编译器以降低精度为代价提高设备性能。但是,由于 Arduino Nano 33 BLE Sense 的内存使用率不是很高,我们可以禁用此选项,以便以尽可能高的精度执行。最后选择Quantized (int8)选项并单击Build按钮下载包含您的 library 的 .zip 文件。

VoiceTurn Edge Impulse 项目是公开的,因此您可以直接克隆它并根据需要进行处理。

检查单词是如何分类的
您可以使用 Arduino IDE 将使用 Edge Impulse 构建的库部署到您的板上。如果尚未安装,请从Arduino 软件页面下载最新版本。之后,您需要添加支持 Arduino Nano 33 BLE Sense 板的驱动程序包。打开 Arduino IDE 并单击工具 > 板 > 板管理器

在搜索框中写入nano 33 ble sense并安装Arduino Mbed OS Nano Boards包。

现在您的 IDE 已准备好与您的开发板一起使用。将您的 Arduino Nano 33 BLE Sense 连接到您的计算机并应用以下设置:

单击Tools > Board > Arduino Mbed OS Nano Boards并选择Arduino Nano 33 BLE作为您的板。
单击工具 > 端口并选择您的板连接到的串行端口。这将根据您的操作系统和特定端口而有所不同。
要将VoiceTurn 库添加到您的 Arduino IDE,请单击Sketch > Include Library > Add.ZIP Library...并转到保存库.zip文件的路径。之后,点击File > Examples > VoiceTurn_inferencing > nano_ble33_sense_microphone_continuous打开Edge Impulse 提供的语音推理程序。

您已经可以通过单击位于 Arduino IDE 左上角的两个图标来编译并上传该程序到您的开发板。上传后,点击右上角的串行监视器图标,您将看到之前开发的机器学习分类器的输出。您可以通过说出剩下的话来测试程序的准确性!对!并检查程序计算的属于一组或另一组的概率。您也可以尝试说其他单词并检查它们是否正确分类在其他组中。

如果您想了解有关连续音频采样的更多信息,请查看 Edge Impulse 文档中的本教程。

用于微控制器的 TensorFlow Lite
此时您可能想知道:您没有提到您将使用 TensorFlow 吗?好吧,正如TensorFlow 博客中这篇有趣的文章中提到的那样,Edge Impulse 固有地使用 TensorFlow :

Edge Impulse 利用 TensorFlow 生态系统来训练、优化深度学习模型并将其部署到嵌入式设备。
如果我们回顾这个项目的前面步骤,我们训练了一个词分类模型,然后执行了量化(int8)优化,最后构建了一个 Arduino 库以部署在我们的板上。文章还指出:

开发人员可以选择导出使用 TensorFlow Lite for Microcontrollers 解释器的库来运行模型。
简而言之,之前使用 Edge Impulse 开发的VoiceTurn_inferencing库使用TensorFlow Lite for Microcontrollers解释器来运行词分类器机器学习模型。

确实很容易自己验证这个库使用 TensorFlow Lite for Microcontrollers 来运行分类器。在您的 Arduino IDE 中,单击File > Preferences并检查Sketchbook 位置。在文件资源管理器中,转到此位置并使用文本编辑器打开VoiceTurn_inferencing/src/VoiceTurn_inferencing.h 。在第 41 行,您会发现:

#include "edge-impulse-sdk/classifier/ei_run_classifier.h"

现在回到src文件夹并再次使用文本编辑器打开edge-impulse-sdk/classifier/ei_run_classifier.h 。在第 45 行,您会发现:

#include "edge-impulse-sdk/tensorflow/lite/micro/micro_interpreter.h"
其中指的是使用 TensorFlow Lite for Microcontrollers 库。事实上,TensorFlow Litelibrary 是 Edge Impulse SDK 的一部分,包括其 Micro C++ 子库。

构建硬件
转向信号灯由两个 LED 灯条组成:一个在左侧,另一个在自行车右侧。我使用了由 WS2813 LED 组成的可寻址 RGB LED 灯条。如果您注意接线并随后调整代码,则可以使用其他 LED 灯条。首先要做的是切割 LED 灯条,使其具有所需的长度。在这种情况下,我为每边使用了一块 10 厘米,对应于 6 个 LED。注意按虚线切割 LED 灯条,以免损坏电触点。

现在作为可选步骤,在您选择的标尺或平面上钻两个孔。如果您想严格遵守项目尺寸,请使用 30 厘米长(大约 12 英寸)的表面,分别在 11.5 厘米和 18.5 厘米的位置钻孔。使用旋转工具,将平面放置在两个高度相似的物体之间,以便为钻头留出一些自由空间,以免损坏您的工作台。

为了能够将 LED 灯条连接到设置的其余部分,我们需要将连接线添加到它们的引脚上。首先,使用剪刀去除覆盖电触点的一小部分果冻材料。然后,使用烙铁和助焊剂将三根连接线焊接到每个 LED 灯条的引脚上。我建议遵循通常的颜色代码,以便将红线焊接到 5V 引脚,将黑线焊接到 GND 引脚。关于其他引脚,我在右侧使用黄线,在左侧使用绿线。WS2813 LED灯条虽然有四个引脚,但DI(数据输入)和BI(备用输入)可以焊接在一起为了简单起见。完成此步骤后,取下 LED 灯条后面的胶带,分别将它们粘贴到 0-10 厘米和 20-30 厘米位置的平面上。如果您在上一步中在表面上钻孔,请将电线穿过它们。如果没有,只需将它们放在边界周围。

整体设置将分为两部分,它们将使用 3.5 毫米插孔/插头连接器相互连接。抓住相应的电缆并将它们切割成大约 20%-80% 的比例长度,这样您最终将得到一根电缆长度为 80% 的电缆包含来自另一根电缆的插孔,而另一根电缆长度为 80% 的电缆包含另一根电缆的插头电缆。去除一小部分外部涂层,您会看到每条电缆由 4 个连接组成:三根电线和屏蔽层。将所有屏蔽线卷在一起,以便更容易焊接。

抓住包含3.5 毫米插孔的长电缆并按如下方式焊接电线(如果颜色代码不同,请根据您的需要进行调整):

  • 电缆的红线连接到两个 LED 灯条 (5V) 的两条红线。
  • 电缆的绿线连接到左侧 LED 灯条 (DI-BI) 的绿线。
  • 电缆的黄线连接到右侧 LED 灯条 (DI-BI) 的黄线。
  • 从电缆到两个 LED 灯条 (GND) 的两条黑线的屏蔽层。

因此,您应该已经完成​​了设置的第一部分,包括包含转向信号灯的平面和一条末端在 3.5 毫米插孔上的电缆。用胶带或散热管单独覆盖电气触点,避免电气触点相互接触。

设置的另一部分更易于构建。抓住包含 3.5 毫米插头的长电缆,按照与上一步相同的颜色代码和Arduino 引脚将电线焊接到 Arduino 板上:

  • Arduino 3V3 引脚的红线。
  • 绿线连接到 Arduino 的 D4 引脚。
  • 黄色线连接到 Arduino 的 D7 引脚。
  • 黑线连接到 Arduino 的一个 GND 引脚。

您可以在原理图部分找到接线图。

我们可以设法进行如此简单的设置,因为我们使用的是仅包含几个 LED 的短 LED 灯条。如果您使用较长的 LED 灯条,您可能需要使用外部电源为它们供电,而不是使用 Arduino 板的 3V3 引脚,以不超过后者支持的最大电流。如果这样做,请记住在 LED 灯条的 5V 和 GND 连接之间焊接一个 1000 μF 电容器,以确保电源电压的稳定性。

向代码添加功能
我们之前在 Arduino 串行监视器中检查了我们所说的单词是如何分类到四个预定义组中的。构建硬件后,现在是时候添加所需的功能了,在说出与该侧相对应的单词后打开其中一个转向信号灯。

首先,您需要安装 VoiceTurn 所需的库来控制我们将用于转向信号的可寻址 LED 灯条。单击草图>包含库>管理库

在搜索框中写入NeoPixel并安装 Adafruit NeoPixel 库。

我们将使用在前面的步骤中构建和导入的VoiceTurn_inferencing库提供的nano_ble33_sense_microphone_continuous示例程序。

每个方向,左或右都需要一个 LED 灯条,每个 LED 灯条总共有 6 个 LED。此外,Arduino 板的内置 RGB LED 将用于让骑手快速了解板是准备好听单词还是仍在使用转向信号灯。在程序的开始部分定义引脚排列,记住在构建硬件部分时用于绿色和黄色导线的引脚:

/* LED strip pinout */
#define LED_PIN_LEFT 4
#define LED_PIN_RIGHT 7
#define LED_COUNT 6

/* Built-in RGB LED pinout */
#define RGB_GREEN 22
#define RGB_RED 23
#define RGB_BLUE 24

在已包含的其他库旁边包含 NeoPixel 库:

#include <Adafruit_NeoPixel.h>
通过定义 LED 的数量、它们连接到的数据引脚和灯条类型来声明两个 LED 灯条。在这里,我们将使用NEO_GRB + NEO_KHZ800灯条类型,因为这是对应于 WS2812 LED 灯条和类似产品的类型。如果您使用不同的 LED 灯条类型,您可以在库文档的帮助下修改它。

/* LED strips for left and right signals */
Adafruit_NeoPixel left(LED_COUNT, LED_PIN_LEFT, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel right(LED_COUNT, LED_PIN_RIGHT, NEO_GRB + NEO_KHZ800);
声明两个常数,这将有助于调整光信号的持续时间。这period大致是 LED 打开和下一个 LED 也打开之间所需的等待时间:此时间设置得越高,动画越慢。该cycles变量是指每次检测到左右单词时动画将重复的次数。

static int period = 100;
static int cycles = 3;
现在在setup()函数中,添加以下代码行来初始化两个 LED 灯条并将它们的亮度级别设置为 20% 左右。后者充当软件驱动的电流控制,因此我们确保不会烧坏 LED 或超过 Arduino 板支持的最大电流,即使没有电阻器焊接到条形引脚。

// Initialization of LED strips:
left.begin();
right.begin();
left.show();
right.show();

// Set BRIGHTNESS to about 2/5 (max = 255)
left.setBrightness(100);
right.setBrightness(100);
将内置 RGB LED引脚初始化为OUTPUT.

pinMode(RGB_RED, OUTPUT);
pinMode(RGB_GREEN, OUTPUT);
pinMode(RGB_BLUE, OUTPUT);
您可能知道,loop()函数内部的代码包含将反复执行的程序指令。在函数的开头添加以下行,以向骑自行车的人表明电路板正在监听。该rgb_green()函数将在之后创建。

rgb_green(); // Shows the board is READY
之后,进行词分类并将程序输出存储在result.classification变量中。该变量按照我们在使用 Edge Impulse 训练机器学习模型时使用的标记顺序进行索引。请记住,我们按顺序使用了标签Left 、Right 、noise和other 。因此,包含左组result.classification[0]对应的信息, 是口语单词属于左组的概率。同理,包含Right组对应的信息,是口语属于Right的概率result.classification[0].valueresult.classification[1]result.classification[1].value团体。索引 2 和 3 分别对应于噪声组和其他组,尽管我们不会在本项目中使用它们。

如果检测到单词的概率高于某个阈值,我们希望激活相应的 LED 灯条。对于这个项目,左侧​​单词的阈值概率设置为 80%,右侧单词的阈值概率设置为 85% ,以尽可能避免误报。阈值是不同的,因为它们是根据使用 Edge Impulse 执行的模型测试阶段的输出进行调整的。在所有机器学习处理完成后,将这段代码添加到函数的末尾。loop()

// 0 -> LEFT; 1 -> RIGHT
if (result.classification[0].value >= 0.80) {
  turn(left);
}
if (result.classification[1].value >= 0.85) {
  turn(right);
}
唯一要添加到程序中的是负责激活 LED 灯条和控制内置 RGB LED 的功能。该turn()函数接收要激活的 LED 灯条作为输入参数,并按照类似于现代汽车中的动画的方式以橙色逐个打开 LED。一旦预定义的循环次数完成,LED 灯条就会关闭。此外,在使用 LED 灯条时将内置 RGB LED 设置为红色,并在功能结束时将其关闭,从而警告骑车人程序的状态。在函数完成后,将此函数添加到程序的末尾。loop()

static void turn(Adafruit_NeoPixel& strip) {
  rgb_red(); // Shows the board is BUSY
  for (int i = 0; i < cycles; i++) {
    for (int j = 0; j < strip.numPixels(); j++) {
      strip.setPixelColor(j, strip.Color(255, 104, 0)); // Color: Orange
      strip.show();
      delay(period);
    }
    strip.clear();
    strip.show();
    delay(2 * period);
  }
  rgb_off(); // The board has FINISHED lighting the LED strip
}
最后添加三个简单的函数来控制内置的 RGB LED。

void rgb_red() {
  digitalWrite(RGB_RED, HIGH);
  digitalWrite(RGB_GREEN, LOW);
  digitalWrite(RGB_BLUE, LOW);
}

void rgb_green() {
  digitalWrite(RGB_RED, LOW);
  digitalWrite(RGB_GREEN, HIGH);
  digitalWrite(RGB_BLUE, LOW);
}

void rgb_off() {
  digitalWrite(RGB_RED, LOW);
  digitalWrite(RGB_GREEN, LOW);
  digitalWrite(RGB_BLUE, LOW);
}
如果您编译程序,将其上传到 Arduino 板并将硬件连接到您的板,您将能够自己测试 VoiceTurn 设置。说完就走了!,左侧转向信号灯应该被激活,然后说对了!右侧转向信号灯也应如此。

如果您的测试没有预期的那么成功,您可能需要根据您的需要调整词分类过程的敏感度。您可以通过调整两个参数来做到这一点:

  • 单词检测概率,最初设置为 85%:通过降低此数字,您将增加设备响应您的声音的次数,但也会增加误报的数量。
  • 程序开头定义的EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW常数:这是模型窗口被细分的片数。您可以在此链接中找到有关此参数的更多信息。

我已经在代码部分包含了指向包含项目代码的 GitHub 存储库的链接,所以如果你在某个时候迷路了,或者如果你想直接尝试我的代码,请检查一下。

在自行车上设置 VoiceTurn

VoiceTurn 的概念验证已在自行车上进行。塑料扎带已用于将所有组件连接到其上,因此可以轻松安装和拆卸该装置,而无需对自行车进行任何永久性修改。如果您希望永久安装该设置,您可以使用其他方式。

第一部分由 Arduino 板和连接到它的两条电缆组成:一条包含焊接到 Arduino 引脚并在 3.5 毫米插头上结束的电线,以及将板插入移动电源的 micro-USB 到 USB 电缆。已经放置了几个电缆扎带,将上述两条电缆连接到后制动电缆。两条电缆的刚性足以使 Arduino 板保持在浮动和稳定的位置,麦克风面向骑手。

我们需要将两条电缆固定到自行车上,以便 3.5 毫米插头可以到达自行车的后部,USB 插头可以到达座椅,那里将容纳电池。电缆已沿自行车车架的顶部固定。

现在将自行车手表支架放在座杆周围,这样我们就获得了一个平坦的表面,上面放置着包含转向信号灯的尺子。使用一对交叉排列的电缆扎带将装置的另一部分固定到手表安装位置的座杆上。将剩余的电线也固定到座杆上。

将 3.5 毫米插孔连接到其相应的插头,并将剩余的电缆连接在自行车车架周围,这样您在骑行时就不会无意中拉出。

最后,将充电宝放在座椅下方的空隙处,用扎带将其固定,然后将 USB 数据线连接到它,这样 VoiceTurn 就可以使用了。

总结
现在是时候自己构建和尝试 VoiceTurn 了。您甚至可以不断改进它:使用 Arduino 的内置 BLE 连接减少布线,添加诸如Hey Bike 之类的唤醒词!,扩展词集添加更多功能......有很多可能性。

我希望你喜欢这个项目,不要忘记留下你的评论和反馈!

VoiceTurn - 接线图如下 代码请点击下载


接线:
- 红色(电源电压):从 Arduino 的 3V3 引脚到两个 LED 灯条的 5V 引脚。
- 绿色(数据,左侧):从 Arduino 的 D4 引脚到左侧 LED 灯条的数据输入引脚 (DI)。
- 黄色(数据,右):从 Arduino 的 D7 引脚到右侧 LED 灯条的数据输入引脚 (DI)。
- 黑色(接地):从 Arduino 的 GND 引脚到两个 LED 灯条的 GND 引脚。

3.5 毫米插孔 - 插头 4 针连接器和电缆将设置分为两个模块,以便于处理和安装。

* 以上内容翻译自网络,原作者阿尔瓦罗·冈萨雷斯-维拉,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论