我们继续使用Arduino的数字输出-这次我们将使用Arduino MEGA的16个引脚,将它们连接到1088BS LED矩阵以输出二进制图像。
在前面的例子中,我们已经看过使用数字引脚-在[Blink]的例子中(https://engee.com/community/ru/catalogs/projects/arduino-bystryi-start )和[七段指标]的例子(https://engee.com/community/ru/catalogs/projects/arduino-semisegmentnyi-indikator )。 在本例中使用LED矩阵,我们遵循增加显示离散数据维度的路径。
我们使用相同的Arduino MEGA微控制器和8x8 1088BS LED阵列。 您还需要2个模拟板,8个330欧姆电阻和连接线。
我们将根据下面的连接图来组装这个例子的设备.:
.png)
为了便于组装,可以依靠连接表。:
#
联络电话1088BS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
联络名称
R5
R7
C2
C3
R8
C5
R6
R3
R1
C4
C6
R4
C1
R2
C7
C8
Arduino引脚数
34
36
41
42
37
44
35
32
30
43
45
33
40
31
46
47
前缀R(rows)的触点负责为一行Led提供一定数量的高电压电平。 电压通过限流电阻施加到它们
前缀为C(columns)的触点负责为led提供预设的低电压电平编号。
为了使来自给定图像的所有必要Led根据矩阵的一次测量点亮,有必要实施动态指示。 在LED矩阵的情况下,这意味着一次可以仅在一列中点亮所需的Led。
静态图像由此由于在列之间切换的高频率而实现-这样的切换(闪烁)对于肉眼不再可见。
此外,为了避免在切换时产生模糊的图像,当Led不亮时,有必要在打开列之间暂停切换。 这将使您能够承受所需的时间来关闭上一步中的Led。
还有,为了对图像进行编码的方便,使用矩阵的指定行和列号是最方便的。 这将允许我们只设置点的坐标,它们的解释为一组位将由我们的模型执行。
所以,在示例模型中:
.png)
坐标的编码如下执行:
- 位的向量传送到对应于列C1-C8的数字输出块
(从最高位开始)。columns_code - 此向量使用块反转
和Bias ,由于低电压电平负责矩阵的列中的LED的点火。Unary minus - 位向量由块计算
在这种情况下,输入整数是数字的十进制表示,它按位划分为生成的向量。Integer to Bit Convertor - 这个数字是根据下面的值向量在插值表中确定的:
Y = 2 .^ (7:-1:0)
还有,在插值表中,零输入值对应于零输出值。
- 对于动态指示(顺序列切换),使用块
. 它在当前步骤和采样步骤设置要打开的列的值,以确定列之间的切换速度。on_column - 此外,为了使图像不被模糊,在包括的列的序列中的这些值之间传递零以擦除所有列。
- 此外,该块
将其值传输到块的控制输入on_column 传输定义当前列的Led的行的序列。multipirtswitch - 接下来,所选择的序列类似地通过一个插值表,在该插值表的输出处,输出序列的所有值被求和。 然后确定位的顺序,这将点亮或关闭当前列中的Led。
- 此序列按位传输到Arduino的数字输出,块R1-R8。
应该点亮Led的线路以块为单位定义 Constantmultiportswitch
.png)
因此,块的行中的序列数据 Constant
Col1 = zeros(8)
Col2 = vcat(zeros(5), [3,4,6])
Col3 = vcat(zeros(4), [2,3,6,7])
Col4 = vcat(zeros(6), [2,7])
Col5 = vcat(zeros(7), [7])
Col6 = vcat(zeros(4), [2,3,6,7])
Col7 = vcat(zeros(4), [3,4,5,6])
Col8 = zeros(8);
在这里,向量用零填充以保留输出值的维度。 用零补充的向量包含LED应为给定列点亮的行号。
使用这段代码,我们自动启动AnyMath服务器程序。综合服务:
import .engee.package as epkg
const PKGNAME = "Engee-Device-Manager"
function epkg_start(pkg::String)
if !epkg.isinstalled(pkg)
@info "Package not installed. Installing and Starting..."
epkg.install(pkg)
@info "Package is up to date. Starting..."
println("Ссылка для подключения к серверу:\n"*epkg.start(pkg))
else
updates = epkg.checkupdates(pkg)
if isnothing(updates)
@info "Package is up to date. Starting..."
println("Ссылка для подключения к серверу:\n"*epkg.start(pkg))
else
@info "Updates available. Reinstalling and Starting..."
epkg.update(pkg)
@info "Package is up to date. Starting..."
println("Ссылка для подключения к серверу:\n"*epkg.start(pkg))
end
end
end
epkg_start(PKGNAME)
同样在幕后,[像往常一样](https://engee.com/community/ru/catalogs/projects/bc465b1d-9127-43a4-b73a-de7999ea6510 ),让我们启动AnyMath客户端程序。集成和连接我们的设备.
现在让我们继续执行模型。 让我们在独立模式下运行它,因为由于平台特性,Arduino支持包在执行模型的采样频率上有物理限制。 采样时间限制设置为20毫秒,而该模型中完整的动态显示需要100微秒。
在动态显示期间模型的采样率对图像静态性质的影响在下面的记录中清晰可见。
<div>
<div样式="位置:相对;填充顶部:47.13%;">
<iframe src="https://exponenta.ru/storage/app/media/arduino_led_matrix.mp4"frameborder="0"allowfullscreen
style="position:absolute;top:0;left:0;width:100%;height:100%;"></iframe>
</div>
</div>
此外,工作的最终结果是静态图像的形式。:
.png)
与之前的初始示例相比,当前模型的另一个特点是,Arduino外围模块的端口以及模型中的常量和转换都在足以进行操作的数据类型方面进行了优化-该类型 UInt8CFunction
在这个例子中,我们能够使用Arduino MEGA的更多数字输出。 这就是我们如何能够控制动态显示在1088bs LED矩阵与二进制图像输出从AnyMath模型。