如何使用Arduino和Matlab图形用户界面用RGB LED产生颜色

458 阅读9分钟

如何使用Arduino和Matlab图形用户界面用RGB LED产生颜色

Arduino是一个设计和制造单板微控制器和微控制器套件的倡议和用户社区。这些套件用于使用开源的硬件和软件制作数字设备。

Arduino板设计中使用了广泛的微处理器和控制器。这些板子有数字、和模拟输入/输出(I/O)引脚,与面包板和其他电路相连。

本教程将介绍一个使用Arduino Uno板控制的RGB LED产生任何颜色的方案。Arduino Uno板与MATLAB进行了接口。人们可以学习如何将Arduino Uno与Matlab接口,并了解如何从红、绿、蓝三原色产生不同的颜色。

Arduino板

Arduino板是一个开源的微控制器板,基于Arduino公司开发的微芯片ATmega328P 微控制器。这个微控制器的不同组件显示在下面的图片中。

Components

  • USB连接器。它帮助用户在对控制器进行编程时将板子连接到计算机或笔记本电脑上。
  • 电源。它用于向Arduino板提供外部电源。
  • 复位。这个按钮是用来在使用后重置Arduino的。
  • 微控制器Atmega328:它是微控制器。它管理着Arduino的功能。
  • 数字I/O。它们从Arduino的传感器收集数据,并将其写入其他组件(执行器)。
  • 串行输出(Tx)/输入(Rx)。它用于Arduino和计算机或其他连接设备之间的通信。
  • 模拟输入。在读取模拟传感器时使用。

在数字输入/输出中,引脚11、10、9、6、5、3有~ 符号。这是因为它们得到了脉冲宽度调制(PMW)的支持。在PMW的帮助下,它们可以在0-5V 范围内给出任何电压。这些引脚可以产生256种变化的直流电压,因为它是一个8位控制器(2^8) 。Arduino通过改变一个方波的占空比来产生这种电压变化。这就是所谓的PMW。

在Arduino IDE中,这些PMW引脚的电压可以通过analogwrite(pin, value) 。在Matlab中,我们使用命令writePMWVoltage(board, pin, value)

硬件实现

实现颜色生产的电路图如下所示。

Hardware implementation

上面的图片显示了我们如何将Arduino连接到面包板上。我们没有使用三个LED,即红、绿、蓝,而是使用一个被称为共阴极RGB LED的单个LED。

我们也有三个电阻来限制电流。我们的LED可以处理的最大电流是20mA ,每个颜色通道。

RGB LED的工作原理

有两种类型的RGB LED:共阳极和共阴极。顾名思义,对于共阳极来说,阳极是所有颜色通道的共同点。

同样地,阴极端子对于共同阴极的所有颜色通道来说是共同的。

RGB LEDs

LED是二极管。由于二极管有两个部分,P面和N面,由p-n结分开,P面是阳极,N面是阴极。

在我们的案例中,我们使用了公共阴极。如果我们想打开红色LED,我们在其终端/通道上施加5伏电压。这对绿色和蓝色都适用。

当使用共阳极类型时,我们将我们想要开启的颜色的终端接地。当我们想产生一种红色时,我们向红色终端提供5伏电压。它可以表示为RGB=[1 0 0] ,其中1代表最大电压,0代表无电压。这适用于所有的颜色。

我们必须混合RGB颜色来产生自定义颜色。一个产生自定义颜色的简单组合如下所示。

Producing custom colors

上面的图片显示,生产自定义颜色需要结合RGB颜色。例如,如果我们想产生一种黄色,我们要结合红色和绿色。因此,我们需要同时切换红色和绿色的颜色。它可以在程序中表示为RGB=[1 1 0]

在某些时候,我们不需要提供全部的电压。例如,如果我们想产生一种橙色,我们需要红色LED更亮,绿色更不亮。这可以表示为RGB=[1 0.4 0]

红色LED接收5伏电压,绿色接收总电压的40%。通过这种变化,我们可以得到任何颜色。

Arduino与Matlab的接口

要将Arduino与Matlab连接,你必须安装Arduino的硬件支持包。我们在附加组件中这样做,但它要求我们首先登录到我们的MathWorks帐户。

要做到这一点。

  • 点击附加组件并选择get hardware support package
  • 一旦你点击,你会得到一个包含所有支持包的窗口。
  • 筛选出Matlab support package for Arduino software ,并安装它。

Matlab的实现

我们将创建一个图形用户界面(GUI)来帮助控制这个实现的颜色。为了更好的理解,你可以通过文章"Getting started with graphical user interface"。

该GUI将如下图所示。

The GUI

GUI的各个组件的功能如下。

  • 板子打开。当我们按下这个按钮时,我们的板子就会连接到Matlab。
  • 选择颜色:在这个按钮组中,选择你希望LED产生的颜色类型。你也可以通过输入RGB的值来产生其他颜色,如前面所解释的。
  • 退出。退出Arduino板。

要在Matlab中打开GUI,在命令窗口中执行guide 命令。然后,打开一个空白的GUI,添加组件,形成如下所示的界面。

The designed GUI

属性检查器可以修改组件的背景颜色、字符串和标签。我们所要做的就是双击我们要修改的组件,属性检查器窗口就会打开。

一旦完成所有组件的修改,我们就可以保存GUI。它生成了GUI程序和回调函数。

回调函数是渲染我们GUI功能的函数。然后,我们为回调函数编写控制命令,以实现色彩制作。

让我们看一下每个按钮的回调函数。让我们从Board-ON

a = arduino();
handles.a = a;
handles.ON = 1;

if ~isempty(handles.a)==1
    set(handles.Board_ON, 'BackgroundColor', [0 1 0]);
end
guidata(hObject, handles)

我们需要声明板上的变量a = Arduino() 。之后,我们为板卡变量创建一个句柄handle.a

我们还为ON 条件创建一个句柄,当句柄为1时,板子就会打开。当句柄为0时,板子是关闭的。这就像一个链接的句柄。这个句柄是handles.ON

现在,让我们用一个if 语句来检查条件的有效性。我们可以使用~isempty(handles.a) 来检查棋盘是否被创建。如果它被创建(等于1),我们将按钮的背景颜色设置为绿色 [0 1 0]。然后我们用guidata(hObject, handles) 来更新手柄。

现在,让我们使用if 语句来检查条件的有效性。让我们使用~isempty(handles.a) 来检查电路板是否被创建。如果它被创建了(等于1),我们将按钮的背景颜色设置为绿色 [0 1 0]。然后我们用guidata(hObject, handles) 来更新手柄。

让我们从红色按钮开始。

if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 5); %red
    writePMWVoltage(handles.a, 'D5', 0); %green
    writePMWVoltage(handles.a, 'D3', 0); %blue
end

这段代码首先检查电路板是否被启用。我们使用writePMWVoltage() 函数来确定要产生的颜色。这个函数需要板子上的变量handle.a ,PIND6 ,以及要传递给引脚的电压,即5v。这是为所有单选按钮定义的颜色做的。

回调函数和单选按钮的代码是一样的。我们只需要改变通过每个颜色通道的电压来形成定义的颜色。

回调代码如下。

function radiobutton2_Callback(hObject, event data, handles)%Green color
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 0); %red
    writePMWVoltage(handles.a, 'D5', 5); %green
    writePMWVoltage(handles.a, 'D3', 0); %blue
end

function radiobutton3_Callback(hObject, eventdata, handles) %blue
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 0); %red
    writePMWVoltage(handles.a, 'D5', 0); %green
    writePMWVoltage(handles.a, 'D3', 5); %blue
end

function radiobutton4_Callback(hObject, eventdata, handles) %white
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 5); %red
    writePMWVoltage(handles.a, 'D5', 5); %green
    writePMWVoltage(handles.a, 'D3', 5); %blue
end

function radiobutton5_Callback(hObject, eventdata, handles) %magneta
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 5); %red
    writePMWVoltage(handles.a, 'D5', 0); %green
    writePMWVoltage(handles.a, 'D3', 5); %blue
end

function radiobutton7_Callback(hObject, eventdata, handles) % Cyan
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 0); %red
    writePMWVoltage(handles.a, 'D5', 5); %green
    writePMWVoltage(handles.a, 'D3', 5); %blue
end

function radiobutton8_Callback(hObject, eventdata, handles) %Yellow
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 5); %red
    writePMWVoltage(handles.a, 'D5', 5); %green
    writePMWVoltage(handles.a, 'D3', 0); %blue
end

function radiobutton9_Callback(hObject, eventdata, handles) %switch of lights
if handles.ON==1
    writePMWVoltage(handles.a, 'D6', 0); %red
    writePMWVoltage(handles.a, 'D5', 0); %green
    writePMWVoltage(handles.a, 'D3', 0); %blue
end

让我们看一下退出按钮的回调函数。

clear handles.a;
closereq();

clear handles.a 清除电路板上的变量。当这个变量被清除后,Arduino就会与Matlab断开连接。然后我们使用 函数退出GUI。在某些时候,我们可能需要创建自定义颜色。正如我们之前看到的,自定义颜色是由RGB颜色的组合形成的。closereq()

enter RGB for any color 文本字段的回调函数如下所示。

rgb = str2num(get(hObject, 'string'));
handles.R = rgb(1);
handles.G = rgb(2);
handles.B = rgb(3);
guidata(hObject, handles)

在这里,我们使用get() 函数获得输入。当你输入这个值时,它是字符串类型的。接下来,我们使用str2num 函数将这个输入值转换为一个数字。在这个转换之后,我们提取RGB值。

第一个值,RGB(1) ,被分配到红色通道。第二个值被分配给绿色,第三个值是用于蓝色。最后,我们更新了手柄。为了显示我们的自定义颜色,我们需要输入RGB值,然后点击OK

OK 按钮的回调函数是。

if handles.ON == 1
    writePMWVoltage(handles.a, 'D6', handles.R); %red
    writePMWVoltage(handles.a, 'D5', handles.G); %green
    writePMWVoltage(handles.a, 'D3', handles.B); %blue
end
set(handles.text10, 'BackgroundColor', [handles.R handles.G handles.B]);
guidata(hObject, handles)

在编写这个回调函数时,我们使用writePMWVoltage() 函数来检查电路板是否处于ON状态。这个函数接收板子的变量,PIN,和输入的输入值。

然后我们将文本字段text10backgroundcolor ,作为我们输入值产生的颜色。这意味着文本字段的背景颜色应该与RGB LED产生的颜色相同。

将你的Arduino和面包板布置成如下所示。

Arrangement

让我们运行我们的程序,看看输出情况。选择红色单选按钮,看看输出情况。

Red color

关灯单选按钮的行为如下图所示。

Light off

让我们使用我们的程序,通过输入[1 0.5 0.25] ,产生一个自定义的颜色。

Custom color

如图所示,RGB LED产生的颜色与文本字段color produced 的背景相同。

总结

Arduino硬件是一个微控制器。这个硬件可以使用Matlab或任何其他软件进行编程。Matlab使得与这种硬件的连接变得很容易。这是因为有了支持包,才有了这个工作。

Arduino广泛适用于科学工程领域。它适用于机器人领域,甚至是安全改进。