Сообщество Engee

Arduino: семисегментный индикатор

Автор
avatar-alexevsalexevs
Notebook

Пакет поддержки Arduino: цифровые выходы - семисегментный индикатор

Пример работы с несколькими цифровыми выходами Arduino MEGA. Подключаем и программируем работу семисегментного индикатора 5161AS.

Введение

В предыдущих примерах мы рассматривали работу с цифровым выходом Arduino. Теперь задействуем в Engee сразу несколько блоков цифрового выхода, закодировав в модели вывод последовательностей для индикации цифр на семисегментном индикаторе 5161AS.

В примере также используем Arduino Mega, также понадобятся резистор 330 Ом, соединительные провода, макетная плата.

Аппаратная часть

Схема соединений представлена ниже.

scheme.png

Подключения выполнены согласно таблице:

Сегмент

Номер контакта 5161AS

Цвет провода

Пин Arduino MEGA

A

7

красный

30

B

6

оранжевый

31

C

4

жёлтый

32

D

2

зелёный

33

E

1

голубой

34

F

9

синий

35

G

10

фиолетовый

36

dp

5

не подключен

не подключен

-

8 (3)

черный

GND

Модель примера

В модели примера блок EDM-Target-Arduino имеет те же настройки, что и в предыдущем примере. В качестве периферии контроллера используются 7 блоков записи цифрового сигнала в пины 30-36.

Эти блоки получают числовые значения от демультиплексора, на который блоком переключателя подаются закодированные последовательности (блоки 1 - 0). Переключатель управляется блоком счётчика со сбросом, последовательно изменяющим используемый вход переключателя.

model.png

Закодированные последовательности зажигаемых на индикаторе сегментов можно определить следующим кодом:

In [ ]:
]add LinearAlgebra # Устанавливаем библиотеку для создания единичной матрицы
In [ ]:
using LinearAlgebra
A,B,C,D,E,F,G = [Matrix{Int}(I, 7, 7)[:, i] for i in 1:7];
# В этой строке создаём единичную матрицу 7*7 и при помощи генератора (comprehension) передаём её столбцы в переменные
In [ ]:
# Последовательности для включения соответствующих сегментов в изображении числа определяем так:
one = B+C
two = A+B+G+E+D
three = A+B+G+C+D
four = F+G+B+C
five = A+F+G+C+E
six = A+F+G+E+D+C
seven = A+B+C
eight = A+B+C+D+E+F+G
nine = A+B+C+D+F+G
zero = collect(zeros(Int, 7));

Теперь эти переменные можно передать в константы модели, но для этого примера мы из встроили ("захардкодили") для наглядности.
Теперь перейдём к выполнению модели на Arduino.

Подготовка

При помощи этого блока кода автоматизируем запуск серверной программы Engee.Интеграции:

In [ ]:
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)
Пакет поддержки 'Engee-Device-Manager' установлен.
У вас установлена актуальная версия пакета поддержки 'Engee-Device-Manager'.
[ Info: Package is up to date. Starting...

Также за кадром, как обычно, запустим клиентскую программу Engee.Интеграции и подключим наше устройство.

Выполнение модели

Выполним модель в интерактивном режиме.

На записи видно, что определённая в модели логика управления индикатором, а также отображение на нём кодирующих последовательностей отрабатывает корректно.

Теперь в Engee можно при помощи модели этого примера легко запрограммировать индикацию чисел с Arduino.

Заключение

В этом примере мы использовали пакет поддержки Arduino - элемента платформы Engee.Интеграции для программирования цифровых выходов микроконтроллера и индикации числен на семисегментном индикаторе.